介绍:
JSP全名为Java Server Pages,其根本是一个简化的Servlet设计,他实现了Html语法中的java扩张。JSP与Servlet一样,是在服务器端执行的。通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序段,然后将执行结果连同JSP文件中的HTML代码一起返回给客户端。插入的Java程序段可以操作数据库、重新定向网页等,以实现建立动态网页所需要的功能。
指令
<%@ 指令内容 %>
page 指令
<%@ page contentType="text/html;charset=UTF-8" language="java" session="false"%>
contentType
其实即使说这个文件是什么类型,告诉浏览器我是什么内容类型,以及使用什么编码
language
表明 jsp 页面中可以写 java 代码
pageEncoding
jsp 内容编码extends
用于指定 jsp 翻译成 java 文件后,继承的父类是谁,一般不用改。import
导包使用的,一般不用手写。session
值可选的有 true | false .
用于控制在这个 jsp 页面里面,能否直接使用 session 对象。
具体的区别是: 如果该值是 true , 那么在代码里面会有 getSession()的调用
如果是 false : 那么就不会有该方法调用,也就是没有 session 对象了。在页面上自然也就不能使用 session 了。errorPage
指的是发生错误时要跳转的的页面, 值需要给错误的页面路径
isErrorPage
上面的 errorPage 用于指定错误的时候跑到哪一个页面去。 那么这个 isErroPage , 就是声明某一个页面到底是不是错误的页面。
include (静态包含)
将被包含的文件的源码加入到了本 JSP 程序中,然后再进行编译。
` <%@ include file="other02.jsp"%>`
设置引入的 jsp 页面,必须写相对路径
- 逻辑: 把另外一个页面的所有内容拿过来一起编译运行输出。 所有的标签元素都包含进来。
taglib
<%@ taglib prefix="" uri=""%>
- uri: 标签库路径
- prefix : 标签库的别名
jsp 动作 (动态) 标签
<jsp:include page=""></jsp:include>
(include 动态包含)
include 行为用于运行时包含某个文件,如果被包含的文件为 JSP 程序,则先会执行 JSP 程序,然后在把执行的结果包含进来。
- 这是在本页面中引入”other.jsp“这个页面的执行结果
<jsp:include page="other.jsp"></jsp:include>
<jsp:forward page=""></jsp:forward>
实现请求转发功能 (可带参数)
page
: 需要跳转到的页面或者 servlet 请求路径<jsp:param name="*" value="*"/>
参数行为,带一些参数过去,name & value
是以键值对的形式带过去的
<jsp:forward page="HttpServlet">
<jsp:param name="name" value="test"/>
</jsp:forward>
也可以写成:
<jsp:param name=""value="" />
</jsp:forward page="*.jsp">
// 跳转到目标 js 页面后然后再:
request.getParameter("name");
// 来获取接受到信息
// 等同于以下 javaServlet 中的转发代码
<%
// 请求转发
request.getRequestDispatcher("*.jsp").forward(request,respone);
%>
include 指令和 include 行为的区别?
它们俩的作用相同,区别在于:
- include 指令 (include file) 是将被包含的文件的源码加入到了本 JSP 程序中,然后在进行编译,属于静态包含,
- 而 include 行为 (include page) 只是将被包含的文件的运行结果包含进自己。属于动态包含。
### JSP 内置对象
内置对象就是我们可以直接在 JSP 页面中使用这些对象,不用创建- request:HttpServletRequest 的对象 *
- response:HttpServletResponse 的对象 *
- session:HttpSession 的对象 *
- application:代表当前应用 是 ServletContext 的对象 *
- pageContext:页面的上下文。可以获取其他的对象
- config:jsp 对的 servlet 对应 ServletConfig 的对象
- out:JspWrite 对象。out.print() 将字符串直接打印在浏览器
- page:指当前 jsp 对应 servlet 的对象引用
exception:必须在 jsp 声明一个指令
---
JSP 作用域对象
作用域
表示这些对象可以存值,他们的取值范围有限定。 setAttribute 和 getAttribute
四大作用域:(从上到下作用域范围依次是从小到大)
pageContext 【PageContext】
作用域仅限于当前的页面。它还可以获取到其他八个内置对象。
request 【HttpServletRequest】
作用域仅限于一次请求, 只要服务器对该请求做出了响应。 这个域中存的值就没有了。
session 【HttpSession】
作用域限于一次会话(多次请求与响应) 当中。
application 【ServletContext】
整个工程都可以访问, 服务器关闭后就不能访问了。
使用作用域来存储数据:
// 使用作用域来存储数据 <br>
<%
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")%>
### EL 表达式
为了简化 jsp 代码,具体一点就是为了简化在 jsp 里面写的 java 代码。
写法格式
${表达式}
EL 表达式的
.
或者[]
的作用:获取域中对象的属性值,若属性值含有特殊的字符,则可以使用[]
如:`${emp.first.Name}`(错误) `${emp["firstName"]}`(正确)
- 如果从作用域中取值,会由小到大,如果没有,就往下一个作用域取。若四个作用域取完都没有,就无显示。
- EL 表达式可以自动类型转化,也可以进行简单的算术运算
- EL 表达式判断某个值是否为空:
${empty *}
例如:${!empty list}
//list非空
一般使用 EL 表达式,用的比较多的,都是从一个对象中取出它的属性值,比如取出某一个学生的姓名。
如何使用
- 取出 4 个作用域中存放的值。
<%
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}
- 如果域中所存的是数组
<%
String [] a = {"aa","bb","cc","dd"};
pageContext.setAttribute("array", a);
%>
使用 EL 表达式取出作用域中数组的值 <br>
${array[0] } , ${array[1] },${array[2] },${array[3] }
如果域中所存的是集合
使用 EL 表达式取出作用域中集合的值 <br>
${li[0] } , ${li[1] },${li[2] },${li[3] }
取出 Map 集合的值
<% Map map = new HashMap(); map.put("name", "zhangsna"); map.put("age",18); map.put("address","北京.."); map.put("address.aa","深圳.."); pageContext.setAttribute("map", map); %> 使用 EL 表达式取出作用域中 Map 的值 <br> ${map.name} , ${map.age} , ${map.address} , ${map["address.aa"] }
取值细节
从域中取值, 得先存值。
<% //pageContext.setAttribute("name", "zhangsan"); session.setAttribute("name", "lisi..."); %> ${pageScope.name} // 直接指定到这个作用域里面去找这个 name ${name} // 先从 page 里面找,没有去 request 找,再去 session,去 application <br> ${sessionScope.name} // 指定从 session 中取值
- 取值方式
如果这份值是有下标的,那么直接使用 []
<% 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 表达式 的 11 个内置对象。
${对象名. 成员}
- pageContext
作用域相关对象 - pageScope
- requestScope
- sessionScope
- applicationScope
头信息相关对象
- header
- headerValues
参数信息相关对象
- param
- paramValues
- cookie
全局初始化参数 - initParam
JSTL
全称 : JSP Standard Tag Library jsp 标准标签库
简化 jsp 的代码编写。 替换 <%%> 写法。 一般与 EL 表达式配合
怎么使用
- 导入 jar 包 (jstl.jar && standard.jar) 并添加进工程。
- 在 jsp 页面上,使用 taglib 指令,来引入标签库
- 注意: 如果想支持 EL 表达式,那么引入的标签库必须选择 1.1 的版本,1.0 的版本不支持 EL 表达式。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
使用基础
常用标签
<c:out value="${*}"></c:out>
<c:set></c:set>
<c:if test=""></c:if>
<c:forEach></c:forEach>
c:out :获取域中的属性值,并且对打印到页面的特殊字符进行转换
c:set
<!-- 声明一个对象 name, 对象的值 zhangsan , 存储到了 page(默认) , 指定是 session -->
<c:set var="name" value="zhangsan" scope="session"></c:set>
${sessionScope.name}
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>
------------------------------
定义一个变量名 flag 去接收前面表达式的值,然后存在 session 域中
<c:if test="${age > 26}" var="flag" scope="session">
年龄大于了 26 岁...
</c:if>
c:forEach
<c:forEach items="${requestScope.cusMap}" var="cusMap" begin="0" end="4" step="1" varStatus="status">
//items: 要遍历的数组 / 集合
// 步数:${status.step},
// 开始的索引:${status.begin},
// 结束索引:${status.end},
// 当前的个数:${status.count},
// 当前的对象:${status.current},
// 是否为首个:${status.first},
// 是否为结尾:${status.last},
// 集合的索引:${status.index},
//${cusMap.key}, ${cusMap.value.id}
从 1 开始遍历到 10 ,得到的结果 ,赋值给 i , 并且会存储到 page 域中, step , 增幅为 2,
<c:forEach begin="1" end="10" var="i" step="2">
${i}
</c:forEach>
-----------------------------------------------
<!-- items : 表示遍历哪一个对象,注意,这里必须写 EL 表达式。
var: 遍历出来的每一个元素用 user 去接收。 -->
<c:forEach var="user" items="${list}">
${user.name} ----${user.age}
</c:forEach>
总结:
在我们开发中,经常要用到的 6 个行为是:
<jsp:include > 动态包含
<jsp:forward> 请求转发
<jsp:param> 设置请求参数
<jsp:useBean> 创建一个对象
<jsp:setProperty> 给指定的对象属性赋值
<jsp:getProperty> 取出指定对象的属性值