JSP:
- 为弥补 Servlet 的缺陷,SUN公司在Servlet的基础上推出了JSP(Java Server Pages)技术作为解决方案。
- JSP是简化Servlet编写的一种技术,它将Java代码和HTML语句混合在同一个文件中编写(文件扩展名必须为.jsp),只对网页中要动态产生的内容采用Java代码编写,而对固定不变的静态内容采用静态HTML页面的方式编写。
- JSP看上去是HTML,但是其本质是Servlet
- 在JSP页面中编写的Java代码需要嵌套在<%和%>中,称之为脚本片段(Scriptlets),没有嵌套在<%和%>之间的内容被称之为JSP的模版元素。
- JSP可以放在Web应用的任何位置,WEB-INF以及其子目录除外. 其中WEB-INF目录下的页面不能被客户端浏览器直接访问.
JSP的运行原理
- WEB容器(Servlet引擎)接收到以.jsp为扩展名的URL的访问请求时,它会把该访问请求交给JSP引擎去处理。
- 每个JSP 页面在第一次被访问时,JSP引擎将它翻译成一个Servlet源程序,再把这个Servlet源程序编译成Servlet的class类文件,然后再由WEB容器(Servlet引擎)像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序。
- 在WEB应用程序正式发布之前,其中的所有JSP页面预先编译成Servlet程序。
- *.jsp --- > tomcat -- > 翻译成 -- > *.java ----- > *.class 最后运行的是*.class。
JSP 脚本片段和声明
- JSP脚本片断(scriptlet)是指嵌套在<%和%>之中的一条或多条Java程序代码。
- 在JSP脚本片断中,可以定义变量、执行基本的程序运算、调用其他Java类、访问数据库、访问文件系统等普通Java程序所能实现的功能。
- 在JSP脚本片断可以直接使用JSP提供的隐式对象来完成WEB应用程序特有的功能。
- JSP脚本片断中的Java代码必须严格遵循Java语法。因为脚本片断中的Java代码将被原封不动地搬移进由JSP页面所翻译成的Servlet的_jspService方法中。
- 一个JSP页面可以有多个scriptlet,这些scriptlet中的代码可以相互访问。
- 单个scriptlet中的Java语句可以不完整,但多个scriptlet组合后的语句必须是完整的。通常用于判断语句或循环语句中。
- JSP声明 将Java代码封装在<%! 和%>之中,它里面的代码将被插入进Servlet的_jspService方法的外面。所以,JSP声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法 。
- 多个静态代码块、变量和函数可以定义在一个JSP声明中,也可以分别单独定义在多个JSP声明中。
- JSP隐式对象的作用范围仅限于Servlet的_jspService方法,所以在JSP声明中不能使用这些隐式对象。
JSP注释和JSP表达式
JSP注释格式:<%-- --%>
JSP表达式将java变量或表达式结果输出到客户端的一种简化方式。将输出内容封装在<%= 和 %> 中,注意表达式后不能有分号。
JSP指令
JSP指令为JSP引擎设计,不产生可见输出,只是通知引擎如何处理JSP页面的其他部分。
格式:<%@ 指令 属性名=”value” %>
<@ page contentType=”text/html;charset=utf-8”%>
指令目前定义三种,分别是page,include,taglib。
page指令定义JSP页面的各种属性:
include指令用于通知JSP引擎翻译当前JSP页面时,将其他文件的内容合并到这个JSP页面并转换成Servlet源文件。(这种在源文件级别引入的方式称为静态引入)。
<%@ include file=”relativeURL” %>
taglib指令用来导入JSTL标签库,下文再提。
JSP九大内置对象&四大作用域
九大对象
Object page
HttpServletRequest request
HttpServletResponse response
HttpSession session
ServletContext application
PageContext pageContext
JspWriter out
ServletConfig config
Throwable exception
pageContext对象:
- pageContext对象封装当前JSP页面的运行信息,它提供了返回JSP页面的其他隐式对象的方法。
- PageContext类中定义了一个setAttribute方法来将对象存储进pageContext对象内部的一个HashMap对象中,同时也定义了一个getAttribute方法来检索存储在该HashMap对象中的对象。
- PageContext类除了可以存储和检索自身中的属性对象外,还定义了可以存储和检索其他域范围内的属性对象的方法。
- getPage方法返回page隐式对象
- getRequest方法返回request隐式对象
- getResponse方法返回response隐式对象
- getSession方法返回session隐式对象
- getServletContext方法返回application隐式对象
- getServletConfig方法返回config隐式对象
- getOut方法返回out隐式对象
- getException方法返回exception隐式对象
EL表达式:
用于输出结果;语法——${属性名}。
输出简化过程:
<% out.print(request.getAttribute("name")); %>
<!-- 被以下方式替换了 -->
<%=request.getAttribute("name")%>
<!--又被以下El表达式替换了 -->
${name}
注:当name不设值时,${name} 的取值为“”空字符串,而<%=request.getAttribute(“name”)%>为null
EL表达式的功能
- 11个内置对象
- 从某个范围内取属性值
- 支持运算符
11个内置对象:
对象名 |
作用 |
使用 |
pageScope |
表示pageContext的域对象 |
${pageScope} |
requestScope |
表示request的域对象 |
${requestScope} |
sessionScope |
表示session的域对象 |
${sessionScope} |
applicationScope |
表示application的域对象 |
${applicationScope} |
param |
获取get请求的参数(地址?后的内容)值 |
${param.参数名} ${paramValues} |
paramValues |
||
header |
获取http请求头 |
${header} ${headerValues} |
headerValues |
||
initParam |
获取配置信息 |
${initParam} |
cookie |
表示cookie |
${cookie} |
pageContext |
最重要的对象- 工具类,可获取其他对象 例如${pageContext.request} |
${pageContext} |
pageContext用来构建路径:
<base href="${pageContext.request.contextPath }/">
从某个范围内取属性值:
未指定范围时,El表达式从四个域中通过属性名去找数据,按照从小到大的顺序查找,分别是page,request,session,application。如果找不到,会显示空字符串。如果多个域中有相同属性名,则当找到第一个时就会终止查找。
也可指定范围, ${pageScope.name}; ${requestScope.name}; ${sessionScope.name};
${applicationScope.name}.
当取数组或者列表时,需要指定下标,不能遍历。例如,${arr[0]}; ${list[1]}. 如果要遍历整个集合,我们需要使用jstl的foreach标签,之后再说。
获取map,bean类型数据,直接使用:${map.key}; ${user.name}.
支持运算符:
语法:${运算表达式}
常见运算符:==(eq), !=(ne), <(lt), >(gt), <=(le), >=(ge), &&(and), ||(or) , !(not)
判断是否为空: ${empty name}, 是空返回true,否则返回false。
JSTL标签语言
Java Standard Tag Library,是apache对EL表达式的扩展,非内置,使用需导包。
JSTL标签库包括五个,分别是
1、core:核心标签库 核心标签,执行一些输出,设置值,可遍历
2、fmt:格式化标签库 格式化标签,可格式化日期、数字等
3、sql:数据库标签库 用于在页面执行sql
4、xml:xml标签库 操作XML的标签
5、JSTL函数 字符串处理函数
JSP页面中使用taglib指令导入对应的标签库:
<%@ taglib prefix="c" uri=”http://java.sun.com/jsp/jstl/core “ %>
prefix="c":指定标签库的前缀
uri="http://java.sun.com/jstl/core":指定标签库的uri
core标签
c:out 输出信息到页面,相当于${}, 当输出内容为null或空串时,输出default中的值
<c:out value="${name}" default="没有值"></c:out>
c:set 设置属性,scope取值四大域对象page、request、session、application,默认page
<c:set var="cset" value="hello c:set" scope="request"></c:set>
c:remove 移除属性
<c:remove var="cset" scope="request"/>
<a href="${curl}">GO</a> <!—获取值 -->
c:url 输出路径
<c:url var="curl" value="/index.jsp"></c:url>
c:if 判断
<c:if test=”${empty name}”>name为空</c:if>
c:choose 判断 相当于if elseif else
<c:choose>
<c:when test=”${param.score<60}”>相对于if(score<60)</c:when>
<c:when test=”${param.score<90}”>相当于else if(score<90)</c:when>
<c:otherwise>相当于else</c:otherwise>
</c:choose>
c:forEach 遍历
Items |
要被循环的信息 |
begin |
开始的元素(0=第一个元素,1=第二个元素) |
end |
最后一个元素(0=第一个元素,1=第二个元素) |
step |
每一次迭代的步长 |
var |
声明当前条目的变量名称 |
varStatus |
代表循环状态的变量名称 .count:循环元素的个数 .index:循环元素的下标 .first:是否为第一个元素 .last:是否为最后一个元素 .current:当前元素 |
<c:forEach items="${userList }" var="user" varStatus="num">
<tr class="row${num.index % 2 +1}">
<td>
<input type="checkbox" name="item" >${user.id }
</td>
<td>${user.username }</td>
<td>${user.pwd }</td>
<td><c:if test="${user.sex == '1'}">男</c:if>
<c:if test="${user.sex == '0'}">女</c:if>
</td>
<td>
<a href="#">查看详情</a>
<a href="${pageContext.request.contextPath }/user/ /${user.id}">修改</a>
</td>
</tr>
</c:forEach>