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取值细节
-
从域中取值,要先往域中存值;
-
取值时如果指定了作用域,则只到指定作用域中找,找不到也不会报错;
如:${pageScope.name}
如果没有指定作用域,则先从pageScope里找,如果没有找到,再依次从requestScope,sessionScope,applicationScope里找。
如:${name}
-
取值方式
如果有下标,则直接使用[ ]。
<% 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如何使用
-
导入jstl.jar和standard.jar文件到工程的WebContent/Web-Inf/lib;
-
在jsp页面上,使用taglib 指令,来引入标签库;
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-
注意:如果想支持 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