JSP总结
JSP
JSP从前端角度来看就是一个网页,从后端角度看来,是一个继承了Servlet
的类.
JSP指令
<%@ 指令名字 %>
page指令
page指令的属性如下:
- language: 表明jsp页面中支持的编程语言
- contentType: 表明这个JSP文件的类型.
- pageEncoding: 表明JSP文件内容编码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
- extends: 表明指定jsp翻译成java文件后,继承的父类是谁,一般不用改
- import: 用来导包,一般不用手写
- session: 可选值true和false,用于控制在这个jsp页面里面,是否能够直接使用session对象
- errorPage: 指定错误的页面页面路径
- isErrorPage: 表明此页面到底是否为错误页面
include指令
include命令用于包含另外一个jsp的内容.
静态包含:把另外一个页面的所有内容拿过来一起输出.
<%@ include file="other02.jsp"%>
taglib指令
<%@ taglib prefix="" uri=""%>
uri: 标签库路径
prefix : 标签库的别名
JSP动作标签
<jsp:include page=""></jsp:include>
<jsp:param value="" name=""/>
<jsp:forward page=""></jsp:forward>
jsp:include
动态包含: 不是把包含的页面所有元素标签全部拿过来输出,而是把它的运行结果拿过来。
<jsp:include page="other02.jsp"></jsp:include>
jsp:forward
请求转发:
<jsp:forward page=""other02.jsp""></jsp:forward>
这行代码等同于:
request.getRequestDispatcher("other02.jsp").forward(request, response);
jsp:param
在包含或跳转某个页面的时候,加入这个参数
<jsp:forward page="other02.jsp">
<jsp:param value="beijing" name="address"/>
</jsp:forward>
在other02.jsp中显示参数
<br>收到的参数是:<br>
<%= request.getParameter("address")%>
JSP内置对象
内置对象: 可以直接在jsp页面中使用这些对象,不用创建.
作用域对象
作用域对象可以存值,他们的取值范围有限定. 可以使用setAttribute和getAttribute.
- pageContext -->PageContext
作用域仅限于当前的页面. - request -->HttpServletRequest
作用域仅限于一次请求. - session -->HttpSession
作用域限于一次会话(多次请求与响应) - application -->ServletContext
作用域为整个工程
其他内置对象
- exception --> Throwable
- page -->Object
是这个jsp翻译成的java类的实例对象 - out --> JspWriter
jsp里的内容其实也是out对象输出的, - response --> HttpServletResponse
- config --> ServletConfig
EL表达式
EL表达式是为了简化jsp里面写的java代码
写法格式: ${表达式 }
如果从作用域中取值,会先从小的作用域开始取.如果没有,就在大一层的作用域中取值.若所有作用域都取不到,则不显示.
EL表达式示例
-
取出4个作用域中存放的值。
<% pageContext.setAttribute("name", "page"); request.setAttribute("name", "request"); session.setAttribute("name", "session"); application.setAttribute("name", "application"); %> 按普通手段取值<br> <%= pageContext.getAttribute("name")%> <%= request.getAttribute("name")%> <%= session.getAttribute("name")%> <%= application.getAttribute("name")%> <br>使用EL表达式取出作用域中的值<br> ${ pageScope.name } ${ requestScope.name } ${ sessionScope.name } ${ applicationScope.name }
-
取出域中所存的数组
<% String [] a = {"aa","bb","cc","dd"}; pageContext.setAttribute("array", a); %> <br>使用EL表达式取出作用域中所存数组的值<br> ${array[0] } , ${array[1] },${array[2] },${array[3] }
-
取出域中所存的集合
<% Map map = new HashMap(); map.put("name", "zhangsna"); map.put("address","北京.."); map.put("address.aa","深圳.."); pageContext.setAttribute("map", map); %> <br>使用EL表达式取出作用域中所存集合的值<br> ${map.name} , ${map.age} , ${map.address} , ${map["address.aa"]}
取值细节:
- 要先向域中存值,才能取得值
- 向集合中取值方式:
- 如果所取的集合是有下标的,那么直接使用[]
- 如果没有下标,直接使用.的方式去取
JSTL
简化jsp的代码编写,替换 <%%> 写法,一般与EL表达式配合.
JSTL的导入
- 导入jar文件到工程的WebContent/Web-Inf/lib jstl.jar standard.jar
- 在jsp页面上,使用taglib 指令,来引入标签库
- 注意: 如果想支持 EL表达式,那么引入的标签库必须选择1.1的版本,1.0的版本不支持EL表达式.
上边有jsp路径的都是1.1版本,一般我们引入的都是核心库/core
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
JSTL常用标签
<c:set></c:set>
<c:if test=""></c:if>
<c:forEach></c:forEach>
c:set
c:set
用来向域中声明一个变量
<!-- 声明一个对象name,对象的值zhangsan,存储到了session -->
<c:set var="name" value="zhangsan" scope="session"></c:set>
${sessionScope.name }
C:if
<c:if test="EL表达式判断条件"></c:if>
判断test里的表达式是否满足.若满足,执行c:if
标签中的输出.c:if
是没有else的。
<c:set var="age" value="18" ></c:set>
<c:if test="${ age > 26 }">
年龄大于了26岁...
</c:if>
<c:if test="${ age <= 26 }">
年龄小于了26岁...
</c:if>
可以用var
属性和scope
属性为判断结果赋值并存储.
<c:if test="${ age > 26 }" var="flag" scope="session">
年龄大于了26岁...
</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", 28));
list.add(new User("wangwu", 38));
list.add(new User("maliu", 48));
list.add(new User("qianqi", 58));
pageContext.setAttribute("list", list);
%>
遍历集合中元素,
items表示被遍历的对象,必须写el表达式
var接收遍历出来的每一个元素
<c:forEach var="user" items="${list}">
姓名:${user.name}, 年龄:${user.age}
</c:forEach>