zoukankan      html  css  js  c++  java
  • JSP&EL&JSTL

    JSP&EL&JSTL

    1.Jsp

    1.1什么是JSP

    Java Server Page,从用户角度看待,就是一个网页,从程序员角度看,其实是一个java类,它继承了servlet,所以可以直接说jsp就是一个Servlet。

    1.2为什么会有JSP

    html 多数情况下用来显示静态内容 ,一成不变的。但是有时候我们需要在网页上显示一些动态数据,比如:查询所有的学生信息,根据姓名去查询具体某个学生。这些动作都需要去查询数据库,然后在网页上显示。html是不支持写java代码,jsp里面可以写java代码。另外jsp最后会被翻译成一个java类,这个Java 类,实际上就是一个HttpServlet。翻译成 java文件存放在:tomcat目录/work/Catalina/localhost/项目名/org/apache/jsp里面。

    1.3三大指令集

    1.3.1page

    • 作用

      用于设置当前页面的一些信息。

    • 怎么用

      默认创建好jsp,就会在jsp文件第一行加入该指令了。

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      
    • 常用属性

      • language

        language="java"表示jsp页面中可以写java代码。

      • contentType

        contentType="text/html;charset=UTF-8"表示当前页面的内容类型以及使用的编码。这个属性其实是告诉浏览器的。

      • pageEncoding

        页面内容编码。

      • session

        表示页面中是否可以直接使用session对象,其实对应背后的是,jsp翻译成java后,在代码里面时候会调用getSession()创建内置session对象。默认是true,表示会创建session对象。

      • isELIgnored

        表示页面中是否忽略EL表达式,通俗的说是:页面能够识别jsp表达式。

      • errorPage

        表示该界面如果有错误,那么会跳转到哪个页面去。要求的值是一个页面地址。

      • isErroPage

        用于表示当前页面是否是错误页面。

    1.3.2include

    • 作用

      可以嵌套另外一个jsp页面的内容。

    • 怎么用

      <%@include file="login.jsp%>表示引入login.jsp的内容。 该行代码可以写在body里面。

    • 原理

      假如是在A页面上使用 <%@ include file="B.jsp" %>,从页面上看,确实是两个 jsp 的内容组合到一起了。但是从背后翻译成的 java文件看,里面做了很多重复的标签输出。其实就是既输出A.jsp,也输出了 B.jsp

    1.3.3taglib

    • 作用

      用于导入标签库,多用于引入JSTL标签库。

    • 怎么用

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

      uri: 表示标签库路径地址;
      prefix : 表示别名,或称之为前缀。

    1.4JSP动作标签

    <jsp:forward page=""></jsp:forward>
    <jsp:include page="login.htm"></jsp:include>
    <jsp:param name="" value=""></jsp:param>
    

    1.4.1jsp:forward

    跳转页面使用,其实是请求转发的简写方式。与request.getRequestDispatcher("").forward(request, response)等同。

    1.4.2jsp:include

    作用与上面的 include 指令是相同的,都可以包含某一个jsp页面进来显示,但是两者还是有区别的:

    include 指令:把jsp的网页源码全部包含进来;

    jsp:include 动作标签:只会包含jsp的运行结果。

    1.4.3jsp:param

    用于指定参数的意思,jsp:param可以在其他两个动作标签里嵌套使用,如:

    <jsp:forward page="index.jsp">
        <jsp:param name="name" value="zhangsan"/>        
    </jsp:forward>
    <%--取值--%>
    <%=request.getParameter("name")%>
    include的动作也是如此,在此不做赘述。
    

    1.5JSP九大内置对象

    内置对象,即可以直接在jsp页面中使用而无需创建。

    九大内置对象里有四个为作用域对象,分别为pageContext,request,session,application。

    四个作用域对象作用域比较:

    pageContext(page当前页面)<request(request一次请求)<session(session一次会话)<application(application当前工程)
    

    作用对象可以存取值,但取值范围有限。setAttribute和getAttribute。

    • pageContext

      对应的类型是PageContext,作用域为当前页面。一般用该对象来存取值以及获取其它八个内置对象(但其它八个内置对象也都可直接使用,所以这个作用一般较为少用)。

    • request

      对应类型为HttpServletRequest,作用域为一次请求中,常用于在jsp页面存取值和跳转。

    • session

      对应类型为HttpSession,作用域为一次会话(多次请求和响应)内有效。

    • application

      对应类型为ServletContext,作用域为整个工程,当服务器关闭后就失效了。

    • response

      对应类型为HttpServletResponse,用于跳转页面及页面内容输出。

    • out

      对应类型为JspWriter,out.write("啦啦啦")。

    response可以获取到PrintWrite来输出内容,那么两者有什么区别呢?

    out的内容其实是先写到response的缓冲区,然后先输出response自身要输出的内容,再输出out的内容。

    • config

      对应类型为ServletConfig,用于获取Servlet配置的一些参数。

    • exception

      对应类型为Throwable,JSP页面默认不创建该对象,只有在page指令里面写上了isErrorPage="true" 才会创建。连起来解释的话,就是:只有错误的页面,才会创建该对象。使用该对象,可以在错误的页面上,输出错误的信息。

    • page

      对应类型为Object,该对象是jsp页面翻译成的Java类的实例,类似Java类中的this。

    2.EL表达式

    EL表达式,即Expression Language,作用是为了简化jsp中的java代码。

    • 语法格式

      ${表达式}

    2.1取出作用域中存放的值

    如果从作用域中取值,会先从小的作用域开始取,如果没有,就往下一个作用域取。一直把四个作用域取完都没有,就没有显示。

    2.1.1如果域中存放的是单个值

    	<%
    		pageContext.setAttribute("name", "page");
    		request.setAttribute("name", "request");
    		session.setAttribute("name", "session");
    		application.setAttribute("name", "application");
    	%>
    	
    	<!--按普通手段取值-->
    	<%= pageContext.getAttribute("name")%>
    	<%= request.getAttribute("name")%>
    	<%= session.getAttribute("name")%>
    	<%= application.getAttribute("name")%>
    	
    	<!--使用EL表达式取出作用域中的值-->
    	${ pageScope.name }
    	${ requestScope.name }
    	${ sessionScope.name }
    	${ applicationScope.name }
    

    2.1.2如果域中存放的是数组

    	<%
            String[] a={"aa","bb","cc","dd"};
            pageContext.setAttribute("array",a);
        %>
        <%--使用EL表达式取出数组的值--%>
        ${array[0]},${array[1]},${array[2]},${array[3]}
    

    2.1.3如果域中存放的是集合

    <%--集合--%>
    <%
        List list=new ArrayList();
        list.add("aa");
        list.add("bb");
        list.add("cc");
    	pageContext.setAttribute("list",list);
    %>
    <%--使用EL表达式取出集合的值--%>
    ${list[0]},${list[1]},${list[2]}
    

    2.1.4如果域中存放的是Map集合

    	<%
          		Map map = new HashMap();
          		map.put("name", "zhangsna");
          		map.put("age",18);
          		map.put("address","北京..");
       		    pageContext.setAttribute("map", map);
       	%>
    	<%--使用EL表达式取出Map集合的值--%>	
       	${map.name } , ${map.age } , ${map.address }  , 
    

    2.2取值细节

    1. 从域中取值,要先往域中存值;

    2. 取值时如果指定了作用域,则只到指定作用域中找,找不到也不会报错;

      如:${pageScope.name}
      

      如果没有指定作用域,则先从pageScope里找,如果没有找到,再依次从requestScope,sessionScope,applicationScope里找。

      如:${name}
      
    3. 取值方式

      如果有下标,则直接使用[ ]。

      <%
      	String [] array = {"aa","bb","cc"}
      	session.setAttribute("array",array);
      %>
      ${ array[1] }<!--这里array说的是attribute的name--> 
      

      如果没有下标,则用.方式去取。

      <%
      	User user = new User("zhangsan",18);
      	session.setAttribute("u", user);
      %>
      ${ u.name },${ u.age } 
      <!--
      一般使用EL表达式,用的比较多的,都是从一个对象中取出它的属性值,比如取出某一个学生的姓名。
      -->
      

    2.3EL十一个内置对象

    3.JSTL

    JSP Standard Tag Library,JSP标准标签库。

    简化jsp的代码编写。替换<%%>写法。一般与EL表达式配合。

    3.1如何使用

    1. 导入jstl.jar和standard.jar文件到工程的WebContent/Web-Inf/lib;

    2. 在jsp页面上,使用taglib 指令,来引入标签库;

      <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      
    3. 注意:如果想支持 EL表达式,那么引入的标签库必须选择1.1的版本,1.0的版本不支持EL表达式。

    3.2常用标签

    • c:set

      <%--声明一个对象age,值为22,存储到session域中,默认存到page域中--%>
      <c:set var="age" value="22" scope="session"/>
      
    • c:if

      <%--判断是否满足test判断条件,如果满足,则输出c:if标签里的内容。c:if标签没有else--%>
      <c:if test="${sessionScope.age>20}">
           年龄大于20岁
      </c:if>
      <c:if test="${sessionScope.age<=20}">
           年龄小于20岁
      </c:if>
      输出为:年龄大于20岁
      
      
      <%--定义一个变量flag,去接收前面表达式的值,然后存到session域中--%>
      <c:if test="${sessionScope.age>20}" var="flag" scope="session">
           ${flag}
      </c:if>
      输出为:true
      
    • c:forEach

      <%--从1开始遍历到10,得到的结果,赋值给i,并存储到page域中(默认),step表示增幅为2--%>
      <c:forEach begin="1" end="10" var="i" step="2">
          ${i}
      </c:forEach>
      输出:1 3 5 7 9
      
      <%
          User user1=new User("zhangsan",18);
          User user2=new User("lisi",20);
          User user3=new User("wanger",30);
          List list=new ArrayList();
          list.add(user1);
          list.add(user2);
          list.add(user3);
          pageContext.setAttribute("list",list);
      %>
      <%--items:表示遍历哪一个对象,注意,这里必须写EL表达式。 
      	var: 遍历出来的每一个元素用user去接收。
          注意:User类中必须提供name和age属性的get方法--%>
      <c:forEach var="user" items="${list}">
          ${user.name},${user.age}
      </c:forEach>
      输出:zhangsan,18 lisi,20 wanger,30
      
  • 相关阅读:
    【Hadoop 分布式部署 五:分布式部署之分发、基本测试及监控】
    【Hadoop 分布式部署 四:配置Hadoop 2.x 中主节点(NN和RM)到从节点的SSH无密码登录】
    【Hadoop 分布式部署 三:基于Hadoop 2.x 伪分布式部署进行修改配置文件】
    【Hadoop 分布式部署 二:分布式环境预备工作(主机名 IP地址等设置)】
    【Hadoop 分布式部署 一 :分布式部署准备虚拟机 】
    Java基础 【类之间的关系】
    Java基础 【自动装箱和拆箱、面试题】
    java算法 第七届 蓝桥杯B组(题+答案) 3.凑算式
    java算法 第七届 蓝桥杯B组(题+答案) 2.生日蜡烛
    java算法 第七届 蓝桥杯B组(题+答案) 1.煤球数目
  • 原文地址:https://www.cnblogs.com/ALiWang/p/13850450.html
Copyright © 2011-2022 走看看