JSP & EL & JSTL
JSP
Java Server Page
- 什么是jsp
从用户的角度讲,就是一个网页,从程序员的角度看待,她继承了servlet,所以可以直接说servlet是一个Servlet
- 为什么会有jsp
html多数情况下用来显示静态内容,但是有时候我们需要在网页上显示一些动态数据,比如:查询所有的学生信息,根据姓名去查询具体某个学生。
这些动作都需要去查询数据库,然后再网页上显示,html是不支持写java代码的,但是jsp里面可以写java代码。
怎么用JSP
JSP指令
指令格式
<%@ 指令名称 %>
3个指令
-
page指令
- language
表明jsp页面中可以写java代码
- contentType
表明文件类型,告诉浏览器是什么类型的能美容,以及用的什么解码
contentType="text/html; charset=UTF-8" text/html MIMEType 这是一个文本文件,html网页 audio/mpeg 这是一个MP3音频文件 video/mp4 这是一个MP4视频文件 ... ... 查看%tomcatHOME%/conf/web.xml
- pageEncoding
jsp内容编码
- extends
用于指定jsp翻译成java文件后,继承的父类是谁,一般不用改
- import
导入包使用
- session
可选值有true & false
用于控制这个jsp页面里面,能够直接使用sessio对象
具体的区别是,翻译后的Java文件中,如果值是true,那么代码里面会有getSession()的调用,如果是false,那么不会有该方法,即无法使用session。- errorPage
指的是错误的页面,值需要给出错误时跳转的页面路径
- isErrorPage
声明某一页面是否是发生错误后跳转到的页面
-
include指令
包含另外一个jsp的内容进来,几把另一个页面的所有标签全部包含进来
<%@ include file="index02.jsp" %>
- taglib指令
<%@ taglib prefix="" uri="" %>
uri:标签路径
prefix:标签库的别名
jsp动作标签
- jsp:include
<jsp:include page=""></jsp:include>
包含指定的页面,这里是动态包含,即不把包含的页面所有元素标签全部拿过来输出,而是把它的运行结果拿过来。
- jsp:forward
<jsp:forward page=""></jsp:forward>
前往哪一个页面,相当于请求转发
<% request.getRequestDispatcher("index02.jsp").forward(request, response);%>
-
jsp:param
<jsp:param value="" name=""/>
在包含某个页面的时候,后者再跳转某一个页面的时候,加入这个参数
- 在index.jsp中发布参数
<jsp:forward page="index02.jsp"> <jsp:param value="beijing" name="address"/> </jsp:forward>
- 在index02.jsp中获取参数
<%= request.getParameter("adress") %>
- 在index.jsp中发布参数
jsp内置对象
所谓内置对象,就是我们可以直接在jsp页面中使用这些对象,不用创建
- pageContext
- request
- session
- application
以上四个是作用域
- 作用域
表示这些对象可以存值,但取值范围有限 setAttribute 和 getAttribute
<!-- 使用作用域来存储数据 -->
<%
pageContext.setAttribute("name", "pageContext");
request.setAttribute("name", "request");
session.setAttribute("name", "session");
application.setAttribute("name", "application");
%>
<!-- 取出四个数据域的值 -->
<%= pageContext.getAttribute("name") %>
<%= request.getAttribute("name") %>
<%= session.getAttribute("name") %>
<%= application.getAttribute("name") %>
- 四个作用域的区别
- pageContext 【PageContext】
作用域仅限于当前页面
- request 【HttpServletRequest】
作用域仅限于一次请求,只要服务器对该请求做出了响应(重定向),这个域中存的值就没有了。
- session 【HttpSession】
作用域仅限于一次会话(多次请求与响应)当中
- application 【ServletContext】
整个工程中都可以访问,服务关闭后就不能访问
- 其他对象
- exception 【Throwable】
在页面配置为
<%@ isErrorPage="true" %>
时才能使用- page 【object】
就是这个jsp翻译成的java类的实例对象
- config 【ServletCoonfig】
- out 【JspWriter】
- response 【HttpServletResponse】
EL表达式
取值方法
- 普通取值方法
!-- 使用作用域来存储数据 -->
<%
pageContext.setAttribute("name", "pageContext");
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 }
- 使用EL表达式取数组中的值
<%
String [] a = {"aa","bb","cc"};
pageContext.setAttribute("array", a);
%>
${array[0] } ${array[1] } ${array[2] }
- 使用EL表达式取集合中的值
<%
List list = new ArrayList();
list.add("11");
list.add("22");
list.add("33");
pageContext.setAttribute("list", list);
%>
${list[0] } ${list[1] } ${list[2] } ${list[3] }
- 使用EL表达式取Map中的值
<%
Map map = new HashMap();
map.put("name", "张三") ;
map.put("age", 18) ;
map.put("addrss", "beijing");
pageContext.setAttribute("map", "map");
%>
${map.name } ${map.age } ${map.address }
取值细节
- 1.如果值是有下标的,那么直接使用[]
<%
String [] a = {"aa","bb","cc"};
pageContext.setAttribute("array", a);
%>
${array[0] } --->这里的array是arribute里面的name
- 2.如果没有下标,直接用 . 的方式去取
<%
User user = new User("zhangsan",18);
session.setAttribute("u",user);
%>
${ u.name } ${ u.age }
EL表达式的11个内置对象
- JSP 相关
- pageContext
对应于当前页面的chuli
- 作用域 相关
- pageScope
与页面作用域属性的名称和值相关联的Map类
- requestScope
与请求作用域属性的名称和值相关联的Map类
- sessionScope
与会话作用域属性的名称和值相关联的Map类
- applicationScope
与应用程序作用域属性的名称和值相关联的Map类
- 请求参数 相关
- param
按名称存储请求餐宿的主要指的Map类
- paramvalue
间请求参数的所有值作为String数组存储的Map类
- 请求头 相关
- header
按名称存储请求头主要参数的Map类
- headerValue
将请求头的所有值作为String数组存储的Map类
- Cookie 相关
- ookie
按名称存储请求附带的Cookie的Map类
- 初始化参数 相关
- initParam
按名称存储Web应用程序上下文初始化参数的Map类
JSTL
全称 : JSP Standard tag Library
讲话jsp的代码编写,使用taglib指令来引入标签库
JSTL的使用
- 导入jar文件到工程的WebContent/Web-Inf/lib
- jstl.jar
- standar.jar
2.在jsp页面上,使用taglib指令
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
常用标签
<c:set></c:set>
<c:if test=""></c:if>
<c:forEach></c:forEach>
- c:set
<!-- 声明一个对象name,对象的值为zhangsan -->
<!-- 对象默认存储到page,这里我们指定为session -->
<c:set var="naem" value="zhangsan" scope="Session"></c:set>
${ sessionScope.name };
- c:if
判断test里的表达式是否满足,如果满足,就执行c:if标签中的输出
<c:set var="age" value="18"></c:set>
<c:if test="${ age > 16 }">
年龄大于16
</c:if>
<!-- 定义一个变量名,去接收前面表达式的值,存在session域中,并打印 -->
<c:set var="age" value="18"></c:set>
<c:if test="${age > 16 }" var="flag" scope="session">
${ sessionScope.flag }
</c:if>
- c:forEach
<!-- 从1开始遍历到10,得到的结果,赋值给i,并且存储到page域中,增幅(step)为2 -->
<c:forEach begin="1" end="10" var="i" step="2" >
${ i }
</c:forEach>
<%
List list = new ArrayList();
list.add(new User("zhangsan",18));
list.add(new User("lisi",16));
list.add(new User("wangwu",17));
pageContext.setAttribute("list",list);
%>
<!-- items : 表示遍历哪一个对象,这里必须写EL表达式 -->
<!-- value : 便利出来的每一个元素用user去接收 -->
<c:forEach var="user" items="${list }">
姓名 : ${user.name }
年龄 : ${user.age }
</c:forEach>