十五、JSP
1.JSP与Servlet在服务器中是同级关系,JSP底层还是使用的Servlet,他是将Servlet与HTML封装之后的脚本代码。
2..jsp中,JAVA代码和HTML可以相互嵌套。
3.JSP页面中的注释,推荐用 <!-- --> 这种HTML注释,还有一种<%-- --%>是jsp特有注释。
4.JSP中的JAVA代码:
(1)JSP表达式:<%= %>,合法内容:变量、变量加运算符组成的表达式、有返回值的函数。
(2)JSP小脚本:<% %>,合法内容:能够写在JAVA中的代码都可以作为小脚本。
(3)JSP声明:<%! %>,合法内容:成员属性或方法的声明。
(4)示例:
<%@page pageEncoding="utf-8"%>
<%-- 1.先写HTML/CSS/JS --%>
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>我的第一个JSP</title>
</head>
<body>
<%-- 2.3 JSP声明 --%>
<%!
public int lifang(int n){
return n*n*n;
}
%>
<ul>
<%-- 2.在写JAVA --%>
<%-- 2.1 JSP脚本 --%>
<%
for(int i = 0 ; i <100 ; i++){
%>
<%-- 2.2 JSP表达式 --%>
<li><%=lifang(i) %></li>
<%
}
%>
</ul>
</body>
</html>
5.JSP指令:<%@指令名 属性=值 %>
(1)page指令:
导包:<%@page import=java.lang.*,java.sql.* %>
设置页面属性:<%@page contentType=”text/html;charset=utf-8” %>
设置容器读取文件时的解码:<%@page pageEncoding=”utf-8” %>
(2)include指令:在JSP页面转换成Servlet时,能够将其他文件包含进来。可以包含JSP文件也可以包含静态HTML文件。语法:<%include file=”file-url”%>。JSP中include指令的使用:将其他页面公共的部分抽取出来,单独写成一个JSP页面,再通过<%@inclue file=”url”%>指令,引入到其他页面中。连接路径是引用页面相对于被引用页面的路径,建议写成绝对路径。
十六、JSP页面中的内置对象
1.JSP创建成Servlet过程:
(1)创建内置对象
(2)write HTML
(3)保留JAVA语句
(4)print
2.response(HTTPServletResponse)
3.request(HTTPServletRequest)
4.out(JSPWrite)
5.config(ServletConfig)
6.application(ServletContext)
7.exception(Throwable):JSP发生的异常,只有在发生异常时可以用。
8.session(HTTPSession)
9.page(Object):当前页面,相当于this。
10.pageContext(PageContext):页面环境,用于给页面提供数据。该对象中引用了其他的8个对象。使用: ${pageContext.request.contextPath},可以通过pageContext取到其他内置对象,再取到他们的方法。
十七、MVC模式,作用是降低代码之间的耦合度,便于团队开发和维护。
1.业务层(model):用来处理业务。
2.视图层(view):用来展示数据。
3.控制层(control):出来处理请求。
十八、转发与重定向
1.转发:通常在查询页面使用
步骤:1.绑定数据
req.setAttribute("target_name", obj);
2.获取转发器,并转发
req.getRequestDispatcher("path").forward(req, res);
(1)1次请求
(2)地址不变
(3)两个组件可以通过request共享数据,因为是一个请求,一个request
(4)只能在项目内部转发数据,不能向外部共享数据
2.重定向:通常在
(1)2此请求
(2)地址改变
(3)因为2此请求有两个request,因此2个组件无法共享数据
(4)可以重定向到外部
十九、EL表达式“${}”:一套简单的计算规则,用于给JSP标签的属性赋值,也可以直接输出出来。用EL表达式,在JSP中写代码不用导包。
1.作用:
(1)访问Bean属性
(2)输出简单的运算结果
(3)获取请求的参数
2.语法:
(1)对象.属性
(2)对象[“属性”]
等价于:req.getAttribute(“对象”).get属性()
属性名称都要小写,小写默认访问该对象的get属性方法。
3.取值范围和顺序:默认,EL会按照顺序依次充4个范围(隐含对象)内取值。
(1)page
(2)request
(3)session
(4)application
可以指定取值范围:语法: 隐含对象+Scope.对象.属性
sessionScope.student.name
applicationScope.student.name
4.在取数的同时做运算:
(1)算数: + = * / %
(2)关系: > < >= <= == !=
(3)逻辑: && ||
(4)判空: empty
5.获取请求参数值:${param.key } / ${paramValues.key}
等价于:request.getParam(“key”)/request.getParamValues(“key”)
6.示例:
<%@page pageEncoding="utf-8" %>
<!doctype html>
<html>
<head>
<meta charset="utf-8"/>
<title>EL运算表达式</title>
</head>
<body>
<h1>EL</h1>
<p>姓名:${student.name }</p>
<p>年龄:${student['age'] }</p>
<p>兴趣:${student.interests[2] }</p>
<p>课程:${student.course.ID }</p>
<p>范围:${requestScope.student.name }</p>
<p>年龄+10:${student.age+10 }</p>
<p>年龄大于20么:${student.age>20 }</p>
<p>年龄是否在20~30岁之间:${student.age>20 && student.age<30 }</p>
<p>判空empty:${empty student }</p>
<p>判空null:${student==null }</p>
<p>参数:${param.code }</p>
</body>
</html>
二十、JSTL(JSP Standard Tag Library):JSP标准标签库
1.使用JSTL:
(1)将JSTL对应的jar包拷贝到WEB-INF/lib文件下。
(2)使用taglib指令导入要使用的JSP标签:
<%@taglib uri=”” prefix=”” %>
uri:JSP标签的命名空间(可以再JSTL的jar包中<uri>标签一致)
prefix:命名空间的前缀与库文件中<short-name>标签的内容一致。
2.if标签:
<c:if test=”判断条件” var=”” scope””>执行内容</c:if>
3.choose标签:
<c:choose>
<c:when test=”判断条件1”>执行内容1</c:when>
<c:when test=”判断条件2”>执行内容2</c:when>
...
<c:otherwise>执行内容</c:otherwise>
</c:choose>
4.forEach标签:
<c:forEach var=”” items=”” varStatus=””>执行内容</c:forEach>
等价于: for(var:items){执行内容}
var:每次遍历的数据的名字(随便取个名字)
items:要遍历的数组
varStatus:用来声明循环状态对象的名字,该对象中包含index(循环的下标,从0开始),count(循环的次数,从1开始)等属性。
5.自定义标签:
(1)编写JAVA类,继承于SimpleTagSupport类。
(2)重写doTag方法。
(3)配置标签说明文件。
6.翻译JSP时通过标签查找到对应JSTL函数的过程:

7.示例:
<%@page pageEncoding="utf-8" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html>
<head>
<meta charset="utf-8"/>
<title>JSTL</title>
</head>
<body>
<h1>JSTL</h1>
<p>
<p>
<c:if test="${student.sex=='M'}">男</c:if>
<c:if test="${student.sex=='F'}">女</c:if>
</p>
<p>
<c:choose>
<c:when test="${student.sex=='M'}">男</c:when>
<c:otherwise>女</c:otherwise>
</c:choose>
</p>
<p>
<c:forEach items="${student.interests}"
var="its" varStatus="s">
${s.index } ${its }
</c:forEach>
</p>
</p>
</body>
</html>
二十一、Web页面访问资源规则

二十二、异常的配置方式(在web.xml里面配置)
1.根据异常类型指定错误页面
(1)exception-type:异常类型
(2)location:转发的页面路径(绝对路径),转发只局限在项目内部,服务器会自动补充项目名,所以写路径时不需要写项目名。
(3)示例:
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/WEB-INF/error.jsp</location>
</error-page>
2.根据异常编号指定错误页面
(1)error-code:异常编号
(2)location:同上
(3)示例:
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/error.jsp</location>
</error-page>
二十三、状态管理
1.HTTP协议是一种无状态协议,即每次连接只是处理一个请求,下次请求时需要重新连接,导致服务器在下次请求时没有记住这个用户。
2.在登录(或某种请求)时希望服务器记住此用户,以便后续处理一些特殊业务,就需要服务器记住用户访问过的这种状态。
3.状态就是一份数据,用于记录浏览器曾经访问过服务器的数据。
4.使用Cookie在浏览器保存状态,只要是同一个浏览器,无论是创建的几个Servlet,这个存入浏览器的Cookie都可以被访问到。
(1)Cookie c1 = new Cookie(“name”, “value”);
(2)设置过期时间,一旦设置了这个时间,浏览器就会把Cookie存到硬盘上,直到超出这个时间则删除此Cookie:c1.setMaxAge(int seconds); seconds为零时,表示删除Cookie,seconds为负数时,表示缺省值,cookie会存到内存中。
(3)将Cookie存入浏览器:res.addCookie(c1); 存入浏览器后,浏览器每次访问服务器,都会自动将此cookie发送给服务器。
(4)在JSP上读取Cookie:
① 在JSP脚本中通过request读取。
② 通过EL读取:${cookie.name.value},name替换成实例化Cookie时的name值,value为属性值。
(5)Cookie编解码:
编码:Cookie c = new Cookie(“city”,URLEncoder.encode(“北京”,”utf-8”));
解码:String value = URLDecoder.decode(c.getValue,”utf-8”);
5.默认下,只有对应的有效路径,浏览器才会发送对应的Cookie给服务器,Cookie只对其父级路径及其以下路径有效。也可以给Cookie设置路径,使其对指定路径下都有效。设置路径: setPath(“url”);
二十四、Session
1.在JSP中用EL表达式取值:${name},name为绑定Session时所设定的值。
2.删除Session对象: void invalidate();
3.设置session空闲时间:如果不设置,缺省时间为30分钟。在web.xml里面,添加标签,设置Minutes单位为分钟,在此期间,Tomcat定时(几分钟)检查Session是否空闲超时,如果超时则删除session,在空闲期间曾访问过服务器,则session视为活动,空闲时间重新计时。加入设置为1分钟,则删除session的时间可能为3分钟左右。
<session-config>
<session-timeout>Minutes</session-timeout>
</session-config>
也可设置缺省时间,setMaxInactiveInterval(int seconds);
二十五、Filter过滤器
1.过滤器可以再请求和响应阶段进行拦截,目的是在拦截的位置进行业务。
2.过滤器类实现 javax.servlet.Filter 接口:
(1)destory()方法:销毁Filter时调用。
(2)init(FilterConfig arg0)方法:初始化Filter。
(3)doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2)方法:开始过滤。
3.在web.xml中配置Filter,与配置Servlet类似,url-pattern标签中写要过滤的Servlet的访问路径,也可以预制参数:
<filter>
<filter-name>filter</filter-name>
<filter-class>web.TestFilter</filter-class>
<init-param>
<param-name>cs</param-name>
<param-value>leshan</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>要过滤的servlet访问路径</url-pattern>
</filter-mapping>
4.Filter使用过程:
(1)在部署Servlet(启动Tomcat)时,实例化Filter、初始化(调用init()方法)Filter。
(2)FilterChain对请求有绝对管理权,可以允许/拒绝请求继续执行,调用FilterChain的doFilter(req,res)方法表示允许请求执行,否则拒绝请求。
5.一个Servlet可以添加多个Filter组件,多个Filter时串联的,由FilterChain(过滤链)连接,只要其中一个Filter没有执行FilterChain的doFilter(req,res)方法,则后面的Filter不再执行。
6.请求之前按照正序调用Filter,请求之后按照倒序调用Filter。Filter中的doFilter(req,res,chain)方法中,在doFilter(req,res)之前的语句,为调用Servlet之前执行,在doFilter(req,res)之后的语句,在调用Servlet之后执行。
7.多个Filter的执行,以web.xml中filter-mapping标签顺序为准。
8.实例化和初始化多个Filter的顺序貌似是执行顺序的倒序?
9.在Filter中预制参数:
(1)在web.xml中的filter标签下添加预制参数属性:
<init-param>
<param-name>cs</param-name>
<param-value>leshan</param-value>
</init-param>
(2)在Filter的初始化方法init(FilterConfig fc)中使用fc.getInitParameter("param_name")方法获取预制参数。