重温JSP的来龙去脉

一.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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值