重温JSP的来龙去脉

来源:互联网 发布:java语言的执行模式 编辑:程序博客网 时间:2024/06/07 17:32

一.jsp的简介

  • jsp(java server pages)java服务器端的页面,sun公司用于开发动态网站的技术
    servlet,jsp就是servlet,最终会在访问jsp页面的时候编译成servlet,放到tomcat的..\work\Catalina\localhost目录里面.

  • jsp的组成: html+java代码+jsp自身的一些东西

  • 在jsp里面嵌入java代码有三种方式
    第一种方式 <%! %> 定义成员变量
    第二种方式 <%= %> 输出语句
    第三种方式 <% %> 嵌入java代码

二、jsp的注释

  • jsp的组成: html+java代码+jsp自身的一些东西
    第一,html的注释
<!-- -->
第二,java注释. 有三种:单行 ,多行 ,文档注释第三,jsp自身的注释 <%-- jsp自身的注释 --%>
  • 注释的使用范围
    (1)在jsp的源代码阶段,三种注释都存在
    (2)在jsp编译成servlet之后,存在html的注释和java的注释
    (3)通过浏览器访问jsp之后,在浏览器显示的内容里面只存在html的注释

三、 jsp的指令

  • 写法: <%@ 指令的名称 属性=”属性值” %>
  • jsp里面有三个指令(page,include,taglib)

  • 第一个 page指令
    (1)设置页面的一些内容
    (2)写法 <%@ page 属性=”属性值”%>
    (3)属性

    1). language:jsp支持的语言类型,目前java
    2). extends:jsp最终会编译成servlet,编译成的类继承的类(一般不需要修改,直接使用默认)

    3).session:是否可以在jsp里面直接使用session对象,true或者false,默认的值是true
    4).import:
    导入包 ,列如<%@ page import=”java.util.List,java.util.ArrayList”%>
    5).buffer:缓冲区的大小
    6).autoFlush:超出缓冲区是否会正常输出
    7).errorPage:当执行jsp时候,出现异常,通过这个属性可以设置跳转的页面
    8).isErrorPage:在错误页面中是否显示错误信息,值是true和false,当值设置成true之后,在生成serlvet里面,创建exception对象,显示错误信息。默认值是false
    9).contentType:设置浏览器编码
    10).pageEncoding:jsp编译成servlet采用的编码方式
    11).isELIgnored:jsp里面是否忽略el表达式,默认是不忽略(可以使用el表达式)。如果把这个属性的值设置成true之后,把el表达式当做普通的文本内容输出

  • 第二个 include指令(静态包含)
    (1)使用jsp包含其他的jsp页面,跟Android中的include属性相似
    (2)写法 <%@ include file=”要包含的页面”%>
    (3)注意事项
    *注意一:在被包含的页面里面,直接写内容就可以了
    * 注意二:在被包含的路径后面不能加参数
    * 注意三:file属性的值不能为一变量
    (4)使用include指令包含 多个jsp文件,最终会被编译成一个servlet(相当于代码复制 ,..\work\Catalina\localhost目录)

  • 第三个 taglib指令
    (1)和jstl标签库一起使用,替代jsp页面中 <% %>
    (2)写法 <%@ taglib uri=”jstl标签库的路径” prefix=”标签库的别名”%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

四、jsp的内置对象(*)

(1)什么是内置对象:在jsp中生成好的一些现有的对象,直接拿来使用
(2)jsp里面有九个内置对象
1) 、 request : 是servlet里面的HttpServletRequest,代表请求,得到表单提交的数据,是域对象
2)、response:是servlet里面的HttpServletResponse,代表响应,向页面输出内容
3)、session:是servlet里面HttpSession,是域对象
4)、config :是servlet里面的ServletConfig,获取初始化的参数,获取servlet名称
5)、application:是servlet里面的ServletContext,获取全局初始化参数,域对象,获取web项目中的文件
6)、exception:当在页面中使用page指令里面的属性 isErrorPage=”true”,生成异常对象,通过这个对象里面 getMessage()得到异常信息
7)、page:当前对象
8)、out:输出对象
** 通过out输出和使用response.getWriter()使用的是一个对象吗?
不是。out使用的是 JspWriter,response.getWriter()使用PrintWriter

* 在jsp中分别使用out输出和response.getWriter()输出,会产生两个缓冲区,一个是out缓冲区,一个是response缓冲区,使用out输出内容,会把内容放到out缓冲区里面,但是out缓冲区不能直接向页面输出,需要把内容先放到response,通过response进行输出。

9)、pageContext:(*******
(1)本身也要一个域对象(只有jsp里面有这个对象,servelet中没有对应的)
* 向pageContext域对象里面设置值

        <%        pageContext.setAttribute("page", "pagevalue");         %>

*从pageContext里面获取值

 <%=pageContext.getAttribute("page") %>

*使用el表达式获取域对象里面的值

   ${page }
(2)向其他的域对象里面设置值    application、session、request、pageContext    * 方法:setAttribute(java.lang.String name, java.lang.Object value, int scope)     有三个参数:第一参数是名称,第二个参数是值    第三个参数是域的范围(使用pageContext里面的常量表示)    * 创建jsp,分别向四个域对象设置值(3)从其他的域对象里面获取值    * 方法  getAttribute(java.lang.String name, int scope)    有两个参数:第一参数是名称,第二个参数域的范围(使用pageContext里面的常量表示)    * 重要的方法 findAttribute(java.lang.String name)    ** **如果多个域对象的名称是相同的,使用这个方法得到是域范围小的里面的值**(4)通过这个pageContext对象获取其他的八个内置对象
<%        //得到request对象        pageContext.getRequest();        //得到response对象        pageContext.getResponse();        //得到session对象        pageContext.getSession();        ......           %>
*四个域对象作用范围application: 范围是整个web项目session:范围是一次会话request:范围一次请求pageContext:范围当前页面      

五、jsp的动作标签

5.1 有六个动作标签(1)<jsp:forward>:实现转发的操作    * <jsp:forward page="/jsp/hello.jsp"></jsp:forward>(2)<jsp:include>:页面包含(动态包含)    * <jsp:include page="hello.jsp"></jsp:include>    * 多个的jsp会编译成几个servlet?    多个jsp会编译成多个servlet(3)<jsp:param>:传递参数,用在包含路径的标签里面5.2 另外三个动作标签(操作javabean的标签)(1)<jsp:useBean> (2)<jsp:setProperty>(3)<jsp:getProperty>
<!--设置要封装的javabean  --> <jsp:useBean id="user" class="com.jrt.test.bean.User"></jsp:useBean> <!--数据封装  name="user"表示当前对象--> <jsp:setProperty property="name" name="user"/> <jsp:setProperty property="age" name="user"/> <!--获取数据  自动输出到页面-->  <jsp:getProperty property="name" name="user"/> <jsp:getProperty property="age" name="user"/>

还有一种封装javabean的方式(BeanUtils 要导入依赖jar包)

//创建javabean对象        User user = new User();        //进行数据的封装        try {            BeanUtils.populate(user, request.getParameterMap());        } catch (Exception e) {            e.printStackTrace();        } 

六、el表达式

6.1 作用:获取域对象里面的值6.2 使用el表达式获取域对象里面的值(1)写法: ${名称}(2)创建jsp页面,在页面中分别向四个域对象设置值,使用el表达式获取值    <!-- 分别向四个域对象里面设置值 -->    <%    application.setAttribute("app", "appvalue");    session.setAttribute("app", "sessionvalue");    request.setAttribute("app", "requestvalue");    pageContext.setAttribute("app", "pagevalue");     %>     <!-- 使用el表达式获取域对象里面的值 -->     <!-- 得到applicat里面的值 -->     ${applicationScope.app }     <br/>     <!-- 得到session里面的值 -->     ${sessionScope.app }     <br/>     <!-- 得到request里面的值 -->     ${requestScope.app }     <br/>     <!-- 得到pageContext值 -->     ${pageScope.app } (3)*如果多个域对象名称是相同的,如果使用 ${名称}得到域范围小的里面的值 (4)分别使用传统方式和el表达式获取域对象里面的值,如果属性名称不存在的情况下,输出的默认值如下: *使用传统方式(getAttribute)得到null *使用el表达式得到空字符串     <%=request.getAttribute("xxx") %> <!--输出 null  -->     <hr/>     ${xxx } <!--输出 空字符串 -->

6.3 向域对象里面放数组,集合(list和map)、对象,使用el表达式获取值

(1)向域对象里面放数组
  <!-- 向域对象里面放数组,使用el表达式获取域对象里面数组的值 -->        <%        //创建数组        String[] arr = {"lucy","jack","mary"};        //把数组放到域对象里面 request        request.setAttribute("arr100", arr);         %>         <!-- el获取域对象里面数组的值 -->         ${arr100[2] }
   * 通过下标得到域对象数组的值,数组的下标从0开始的,如果写的下标超出了数组的访问,得到空字符串(2)向域对象里面放list集合
     <%        //创建list集合        List<String> list = new ArrayList<String>();        list.add("zhangsan");        list.add("lisi");        list.add("wangwu");        //把list集合放到域对象里面        request.setAttribute("list", list);          %>         <!-- el获取域对象里面list集合的值 -->         ${list[2] }
(3)向域对象里面放map集合   * 根据map的key得到value
 <!-- 向域对象里面放map集合,使用el表达式获取域对象里面map集合的值 -->        <%        //创建map集合        Map<String,String> map = new HashMap<String,String>();        map.put("aaa", "AAA");        map.put("bbb", "BBB");        map.put("ccc", "CCC");        //把map集合放到request域对象里面        request.setAttribute("map", map);         %>         <!-- 使用el表达式获取域对象里面map集合的值  -->         ${map.aaa }
(4)向域对象里面放对象
    <!-- 向域对象放javabean对象,使用el表达式获取域对象里面对象的属性的值 -->         <%        //创建user对象        User user = new User();        user.setUsername("女神");        user.setAge(18);        user.setAddr("火星");        //把user对象放到域对象里面        request.setAttribute("user", user);          %>          <!-- 使用el表达式获取域对象里面对象的属性的值 -->          ${user.username }          ${user.age }          ${user.addr }

七、Jstl标签库

7、jstl (JavaServerPages Standard Tag Library)jsp的标准标签库7.1 和jsp里面taglib指令一起使用,替代页面中的<% %>    * <%@ taglib uri="jstl标签库的路径" prefix="标签库别名"%>7.2 jstl里面的标签  if标签, choose标签,forEach标签7.3 如果想要使用jstl标签,首先导入jar包

jstl常用标签的使用
1、c:if标签

<!--条件判断  -->   <!--条件判断  -->    <c:set var="a" value="5"></c:set><!--定义变量  -->    <c:if test="${a!=5 }"><!--判断条件  -->         a=${a}<!--输出结果  -->    </c:if>

2、c:choose标签

<!--switch判断  -->    <c:set var="a" value="5"></c:set>    <c:choose><!--switch  -->         <c:when test="a==4"><!--case  -->             a=4         </c:when>         <c:when test="a==5">             a=5         </c:when>         <c:otherwise><!--default  -->             a=5         </c:otherwise>    </c:choose>

3、c:forEach标签

  • 遍历域对象中数组的值
  • 遍历域对象中list集合的值
  • 遍历域对象中set集合的值
  • 遍历域对象中map集合的值
  • 遍历域对象中多个对象的值
 <!--遍历数组  -->      <%String[] arr={"zhangsan","lisi","wangwu"};        request.setAttribute("arr",arr);      %>        <!--for(String s:arr){}  -->      <c:forEach var="a" items="${arr}">            ${a}      </c:forEach>      <hr/>      <!--遍历list集合  -->      <% List<String> list=new ArrayList<String>();          list.add("aaa");          list.add("bbb");          list.add("ccc");          request.setAttribute("list", list);      %>      <c:forEach var="item" items="${list}" >            ${item }      </c:forEach>      <hr/>      <!--遍历set  -->      <% Set<String> set=new HashSet<String>();         set.add("1");         set.add("2");         set.add("3");         request.setAttribute("set", set);      %>       <c:forEach var="item" items="${set}" >            ${item }      </c:forEach>      <hr/>      <!--遍历map  -->       <% Map<String,String> map=new HashMap<String,String>();       map.put("key1","Value1");       map.put("key2","Value2");       map.put("key3","Value3");       request.setAttribute("map", map);      %>      <!--var="entrySet" 相当于java中map.entrySet()  -->      <c:forEach var="entrySet" items="${map}">          ${entrySet.key}          ${entrySet.value}<br/>      </c:forEach>      <hr/>      <!--遍历域对象中多个对象的值  -->       <%          User user1=new User();         user1.setName("小马哥");         user1.setAge(43);         User user2=new User();         user2.setName("东哥");         user2.setAge(41);         List<User> users=new ArrayList<User>();         users.add(user1);         users.add(user2);         request.setAttribute("users", users);      %>      <c:forEach var="user" items="${users}">           ${user.name}           ${user.age}<br/>      </c:forEach>
原创粉丝点击