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
    
posted @ 2020-10-21 09:08  ALiWang1123  阅读(161)  评论(0编辑  收藏  举报