注意事项:
- 设置属性时使用public 声明属性,调用时使用 类名.属性名 进行操作
Servlet
- Servlet生命周期:
- Servlet对象仅在第一次请求时创建,所有客户端共享这一个对象。任何时候同一个servlet类都只有一个servlet对象。
- HttpServlet中init方法,仅在创建servlet时执行一次。
- service方法负责调用doGet. doPost方法,每次请求都会执行。
- destroy方法当servlet被销毁时执行。当服务器停机. 重启. 重新加载项目servlet被销毁。
- 注意:servlet中的成员变量(类的属性)是所有客户端共享。
- HttpServletRequest——请求,用来获取客户端发送的数据。
- HttpServletRequest.getParameter("input表单的name值")方法获取。
- 获取复选框的值:getParameterValues("input表单的name值")。
- getParameter方法返回String,getParameterValues方法返回的是String[]数组。
- HttpServletRequest.getPramarter("参数名"). getParameterValues("参数名") 获取请求传递的参数值。
- getRequstDispatch("资源地址")该方法返回Dispatch对象,利用Dispatch对象的forward(request,response)方法实现服务器跳转.
- 地址栏传参(超链接传递参数):
- 通过response对象获取输出流(PrintWriter),通过HttpServletResponse.getWriter()方法获取。
- request范围存储数据:
- 使用requst.setAttribute("key",Object对象)方法存储,使用requst.getAttribute("key")方法获取存储对象,返回的是Object类型需要自行转型,如果key对应的对象不存在返回null.
- request范围存储数据:
- HttpServletResponse.sendRedirect("资源地址")方法实现客户端跳转(页面重定向)
<a href="请求资源地址?参数名=值&参数名=值&参数名=值">xxxx</a>
JSP
-
注释:
<%-- --%>
浏览器查看源代码看不到
-
<%=有结果返回的表达式(返回结果必须是基本数据类型或字符串)%>
- JSP输出语法,=后面只能跟一个表达式,不能以
;
结尾。
- JSP输出语法,=后面只能跟一个表达式,不能以
-
<% java语句 %>
- java代码片段语法,可以写多个java语句,必须以
;
结尾。 - 写在
<% %>
中java语句相当于写在servlet的doGet. doPost方法中。
- java代码片段语法,可以写多个java语句,必须以
-
<%! %>
- 在
<%! %>
中声明的变量是全局变量,相当于在servlet类中声明一个属性 - 在<%! %>中声明的方法,相当于在servlet中声明了一个方法。
- 声明变量和方法时注意顺序,先声明后使用。
- 在
-
当jsp代码与html混合书写时,注意结束符问题。
JSP指令:
-
page指令
- 写在第一行
- contentType属性相当于html中的meta标签,用来设置html页面信息。
- pageEncoding属性用来设置java. jsp字符集。
- import属性用来导包,多个包用,分隔。
- errorPage属性用来设置当jsp页面出现异常时跳转的页面。
- isErrorPage属性用来设置当前页面为错误页面。
-
include指令
- 静态包含指令。可以书写在任意地方。 该指令会将被包含的文件原封不动的插入到书写include指令的地方。被包含文件必须是文本信息的文件. 当被包含文件中有java代码时不会在被包含页面中执行。
- includ指令通过file属性导入被包含文件。
-
taglib指令
- 导入标签库。
- uri属性指定标签库的资源地址
- prifix属性指定标签库别名。
JSP动作
- 语法:
<jsp:动作名>
-
<jsp:forward page="跳转页面">
跳转动作(服务器跳转)
-
<jsp:include page="页面">
动态包含,获取指定页面执行后的结果。
-
<%@include file="">
静态包含,把指定页面拷贝到当前页面后执行当前页面。动态包含:相当于每个jsp页面编译一个独立的servlet,无法实现变量. 方法等的共享。 静态包含:相当于将所有jsp页面整合成一个servlet,可以使用其他页面定义的变量. 方法。
-
<jsp:param>
<jsp:forward page="test.jsp">
<jsp:param value="tom" name="username"/> ----------- -------------- <jsp:param name="age"> 12 </jsp:param>
</jsp:forward>
- 等价于
<jsp:forward page="test.jsp?username=tom&age=12">
- 等价于
-
<jsp:useBean id="变量名" class="包名.类名" scope="4个范围">
- id,表示变量名
- class,指定变量类型,首先根据类型及变量名去指定范围找有无相应对象,有直接返回该对象,无就创建一个新的对象存储到指定范围。
- scope,表示Bean的存储范围。page. request. Session. application。默认是page范围。
type,作用与class相同。不同点在与如果在指定范围内没有找到对象,不会创建新对象(报异常)。beanName,类似于id。给javaBean起个名。推荐用id。
-
<jsp:setProperty name="Bean的id" property="对象的属性名" param="input表单的name属性值" value="值" >
-
<jsp:setProperty name="person" property="*"/>
- 给Bean对象赋值,如果property和param值一致自动赋值。可以使用*通配符批量赋值。
- 给Bean对象赋值,如果property和param值一致自动赋值。可以使用*通配符批量赋值。
-
<jsp:getProperty name="Bean的id" property="对象的属性名">
- 获取Bean的属性值。
<jsp:setProperty>
.<jsp:getProperty>
实际上就是调用Bean对象的setter. getter方法。
JSP中的异常处理
- try/catch/finally/throws/throw
- 在局部代码里处理异常。
- errorPage, isErrorPage
- 在整个页面处理异常。
- errorPage
- 形如:
<%@page errorPage="error.jsp"%>
- 表示:需要错误处理的页面
- 形如:
- isErrorPage
- 形如:
<%@page isErrorPage="true"%>
- 指示:错误页面。
- 其中,有一个隐式对象exception可用: <%=exception%> 产生(隐含)内建对象exception,可通过它获得异常信息 <%=exception.getMessage() %> //把异常信息打印出来
- 形如:
- 声明的方式处理异常
- 在整个应用处理异常。(范围比前两种更大)
- 配置: 在web.xml进行配置异常处理
<error-page> <exception-type>java.lang.ArithmeticException</exception-type> <location>/MathError.jsp</location> </error-page>
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
- Java中的异常,有2种
- 受查异常(Checked Exception)
- 非受查异常(Unchecked Exception) Java中的RuntimeException及其子类是不需要处理的(try/catch) 因为所有的RuntimeException总是可以通过优化代码来避免,因此,这种异常被称为"Unchecked Exception"。
- 三种异常处理方式同时启动用,那个优先级高? 作用域越小,优先级越高。
- 注意:要使得页面自动跳转到错误页面,必须关闭浏览器的"显示友好HTTP错误信息"选项。
-
public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { /*只处理这两种兼容的异常*/ …… }
jsp9个内置对象:
类型 | 对象名 | 功能 |
---|---|---|
JspWriter | out | 往浏览器写内容 |
HttpServletRequest | request | Http请求对象. |
HttpServletResponse | response | Http响应对象 |
PageContext | pageContext | JSP的页面上下文 |
HttpSession | session | 会话对象 |
ServletContext | application | 应用上下文 |
ServletConfig | config | JSP的ServletConfig |
Object | page | 页面实现类的对象(例如:this) |
Exception | exception | 含有指令<%@page isErrorPage="true"%> |
- 范围对象
-
其中,有4个是范围对象
-
pageContext,request,session,application
-
对应
<jsp:useBean/>
指令的scope分别是:page,reqeust,session,application -
也就是说,指定不同scope的bean对象(Java Bean)会被绑定到不同的范围对象中
-
选择范围对象的原则:作用域的范围越小越好;因为作用域小的生命周期短,有利于性能提高。
-
例如:
<jsp:useBean id="stu" class="vo.Student" scope="page"/>
- 表示stu对象被绑定到javax.servlet.jsp.PageContext对象(pageContext)中,
- 其等价的代码
<% Student stu = pageContext.getAttribute("stu"); if(stu==null) { stu=new Student(); pageContext.setAttribute("stu",stu); } %>
-
pageContext对象:
- 每一个jsp页面对应着一个pageContext。一般地,在实际应用中,主要是使用它来存取属性。另外,pageContext对象能够存取其他隐含对象。
-
PageContext对象提供取得属性的方法
- Object getAttribute(String name, int scope) 回传name 属性(范围为scope;类型为Object)
- Enumeration getAttributeNamesInScope(int scope)
- 回传所有属性范围为scope 的属性名称,回传类型为Enumeration
- int getAttributesScope(String name)回传属性名称为name 的属性范围
- void removeAttribute(String name) 移除属性名称为name 的属性对象
- void removeAttribute(String name, int scope) 移除属性名称为name,范围为scope 的属性对象
- void setAttribute(String name, Object value, int scope) 指定属性对象的名称为name. 值为value. 范围为scope
- Object findAttribute(String name) 寻找在所有范围中属性名称为name 的属性对象
-
PageContext对象取得其他隐含对象的方法
- Exception getException() 回传目前网页的异常,不过此网页要为error page,
- JspWriter getOut() 回传目前网页的输出流,例如:out
- Object getPage() 回传目前网页的Servlet 实体(instance),例如:page
- ServletRequest getRequest() 回传目前网页的请求,例如:request
- ServletResponse getResponse() 回传目前网页的响应,例如:response
- ServletConfig getServletConfig() 回传目前此网页的ServletConfig 对象,例如:config
- ServletContext getServletContext() 回传目前此网页的执行环境(context),例如:application
- HttpSession getSession() 回传和目前网页有联系的会话(session),例如:session
-
pageContext对象存取其他隐含对象属性的方法,此时需要指定范围的参数。
- Object getAttribute(String name, int scope)
- Enumeration getAttributeNamesInScope(int scope)
- void removeAttribute(String name, int scope)
- void setAttribute(String name, Object value, int scope)
- 其中,范围参数有四个,分别代表四种范围:
- PAGE_SCOPE
- REQUEST_SCOPE
- SESSION_SCOPE
- APPLICATION_SCOPE
-
request 对象
- request 对象包含所有请求的信息, 如:请求的来源. 标头. cookies和请求相关的参数值等等。
- request 对象实现javax.servlet.http.HttpServletRequest接口的,
所提供的方法可以将它分为四大类:
-
储存和取得属性方法;
方法 功能 void setAttribute(String name, Object value) 设定name属性的值为value Enumeration getAttributeNamesInScope(int scope) 取得所有scope 范围的属性 Object getAttribute(String name) 取得name 属性的值 void removeAttribute(String name) 移除name 属性的值 -
取得请求参数的方法
方法 功能 String getParameter(String name) 取得name 的参数值 Enumeration getParameterNames() 取得所有的参数名称 String [] getParameterValues(String name) 取得所有name 的参数值 Map getParameterMap() 取得一个要求参数的Map -
能够取得请求HTTP 标头的方法
方法 功能 String getHeader(String name) 取得name 的标头 Enumeration getHeaderNames() 取得所有的标头名称 Enumeration getHeaders(String name) 取得所有name 的标头 int getIntHeader(String name) 取得整数类型name 的标头 long getDateHeader(String name) 取得日期类型name 的标头 Cookie [] getCookies() 取得与请求有关的cookies -
其他的方法
方法 功能 String getContextPath() 取得Context 路径(即站台名称) String getMethod() 取得HTTP 的方法(GET. POST) String getProtocol() 取得使用的协议 (HTTP/1.1. HTTP/1.0 ) String getQueryString() 取得请求的参数字符串,不过,HTTP的方法必须为GET String getRequestedSessionId() 取得用户端的Session ID String getRequestURI() 取得请求的URL,但是不包括请求的参数字符串 String getRemoteAddr() 取得用户的IP 地址 String getRemoteHost() 取得用户的主机名称 int getRemotePort() 取得用户的主机端口 String getRemoteUser() 取得用户的名称 void getCharacterEncoding(String encoding) 设定编码格式,用来解决窗体传递中文的问题
-
-
session 对象
- session对象表示目前个别用户的会话(session)状况。
- session对象实现javax.servlet.http.HttpSession接口,HttpSession接口所提供的方法:
方法 功能 long getCreationTime() 取得session产生的时间,单位是毫秒 String getId() 取得session 的ID long getLastAccessedTime() 取得用户最后通过这个session送出请求的时间 long getMaxInactiveInterval() 取得最大session不活动的时间,若超过这时间,session 将会失效 void invalidate() 取消session 对象,并将对象存放的内容完全抛弃 boolean isNew() 判断session 是否为"新"的会话 void setMaxInactiveInterval(int interval) 设定最大session不活动的时间,若超过这时间,session 将会失效
-
application对象
- application对象最常被使用在存取环境的信息。
- 因为环境的信息通常都储存在ServletContext中,所以常利用application对象来存取ServletContext中的信息。
- application 对象实现javax.servlet.ServletContext 接口,ServletContext接口容器所提供的方法
方法 功能 int getMajorVersion() 取得Container主要的Servlet API版本 int getMinorVersion() 取得Container次要的Servlet API 版本 String getServerInfo() 取得Container的名称和版本 String getMimeType(String file) 取得指定文件的MIME 类型 ServletContext getContext(String uripath) 取得指定Local URL的Application context String getRealPath(String path) 取得本地端path的绝对路径 void log(String message) 将信息写入log文件中 void log(String message, Throwable throwable) 将stack trace 所产生的异常信息写入log文件中
-
其他对象:
-
page 对象
- page对象代表JSP本身,更准确地说page对象是当前页面转换后的Servlet类的实例。
- 从转换后的Servlet类的代码中,可以看到这种关系: Object page = this;
- 在JSP页面中,很少使用page对象。
-
response 对象
- response 对象主要将JSP 处理数据后的结果传回到客户端。
- response 对象是实现javax.servlet.http.HttpServletResponse 接口。response对象所提供的方法。
- 设定表头的方法
方法 功能 void addCookie(Cookie cookie) 新增cookie void addDateHeader(String name, long date) 新增long类型的值到name标头 void addHeader(String name, String value) 新增String类型的值到name标头 void addIntHeader(String name, int value) 新增int类型的值到name标头 void setDateHeader(String name, long date) 指定long类型的值到name标头 void setHeader(String name, String value) 指定String类型的值到name标头 void setIntHeader(String name, int value) 指定int类型的值到name标头 - 设定响应状态码的方法
方法 功能 void sendError(int sc) 传送状态码(status code) void sendError(int sc, String msg) 传送状态码和错误信息 void setStatus(int sc) 设定状态码 - 用来URL 重写(rewriting)的方法
- String encodeRedirectURL(String url) 对使用sendRedirect()方法的URL予以编码
- String encodeRedirectURL(String url) 对使用sendRedirect()方法的URL予以编码
-
out 对象
- out对象的类型是javax.servlet.jsp.JspWriter,该类从java.io.Writer类派生,以字符流的形式输出数据。
- out对象实际上是PrintWriter对象的带缓冲的版本(在out对象内部使用PrintWriter对象来输出数据),
- 可以通过page指令的buffer属性来调整缓冲区的大小,默认的缓冲区是8kb。
- out 对象能把结果输出到网页上。
- out主要是用来控制管理输出的缓冲区(buffer)和输出流(output stream)。
方法 功能 void clear( ) 清除输出缓冲区的内容 void clearBuffer( ) 清除输出缓冲区的内容 void close( ) 关闭输出流,清除所有的内容 int getBufferSize( ) 取得目前缓冲区的大小(KB) int getRemaining( ) 取得目前使用后还剩下的缓冲区大小(KB) boolean isAutoFlush( ) 回传true表示缓冲区满时会自动清除;false表示不会自动清除并且产生异常处理
-
exception对象
- 若要使用exception 对象时,必须在page 指令中设定:<%@ page isErrorPage="true" %>才能使用。
- exception提供的三个方法:
- getMessage()
- getLocalizedMessage()
- printStackTrace(new java.io.PrintWriter(out))
-
config 对象
- config 对象里存放着一些Servlet 初始的数据结构。
- config 对象实现于javax.servlet.ServletConfig 接口,它共有下列四种方法:
- public String getInitParameter(name)
- public java.util.Enumeration getInitParameterNames( )
- public ServletContext getServletContext()
- public Sring getServletName()
-
-
常用方法
-
ServletContext
- getAttribute
- setAttribute
- removeAttribute
- getServletPath
- getRealPath
-
HttpServletRequest
- getAttribute
- setAttribute
- removeAttribute
- getSession
- getCookies
- setCharacterEncoding
-
HttpServletResponse
- addCookie
- encodeURL
- encodeRedirectURL
- setCharacterEncoding
-
HttpSession
- getAttribute
- setAttribute
- removeAttribute
- invalidate
- setMaxInactiveInterval
-
-
Cookie
- 写在硬盘上的文件,由浏览器管理。Cookie中以键值对方式存储字符串。一个站点可以设置多个Cookie。
- 常用方法:
- getName
- getValue
- setMaxAge(int 秒)。
- 添加Cookie到客户端使用response.addCookie方法。
乱码的解决:
- jsp. tomcat. servlet. 数据库同一字符集
-
jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
-
tomcat
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="8444"/>
-
servlet
- req.setCharacterEncoding("utf-8");
- resp.setCharacterEncoding("utf-8");
-
数据库
- 创建数据库时指定
-
EL表达式
- 语法:${表达式},el只能用于jsp页面中,<% %>不能用. js脚本不推荐用。标签中可以用。
- 例子:
表达式 值 ${-168.18} -168.18 ${3.8e-18} 3.8e-18 //科学计数法 ${3.14159265} 3.14159265 ${"Hello JSP EL!"} Hello JSP EL! 等价于 <%="Hello JSP EL!"%> ${'Hello JSP EL...'} ${true} //can be TRUE? true ${false} //can be FALSE? false ${str==null} true //布尔值的表达式
EL 运算符
类别 | 运算符 |
---|---|
算术运算符 | +, -, *, /(或 div), %(或 mod) |
关系运算符 | ==(或 eq), !=(或 ne), <(或 lt), >(或 gt), <=(或 le), >=(或 ge) |
逻辑运算符 | &&(或 and), ||(或 or), !(或 not) |
验证运算符 | empty |
-
其中,empty 判断一个变量是否为null或是否包含有效数据
- if(name==null||name.equlas("")) 等价于 ${empty name} -> true
-
例子:
表达式 值 ${3+5.1} 8.1 ${"Hello"+",Tarena!"} 报错! // EL的"+"没有字符串连接功能 ${5*2} 10 ${9.3/3} 3.1 ${9.3 div 3} 3.1 ${8 div 0} Infinity // 表示无穷大 ${9%2} 1 ${9 mod 2} 1 ${8*6>68?"Yes":"No"} No //三目表达式 ${empty name} true //对范围对象内的变量或对象进行判空 -
<% String name=""; request.setAttribute("name",name); //如果没有 setAttribute ,则必定是空%>
-
变量和JavaBean属性数据输出
- 表达式语言输出变量,是到范围对象(pageContext,request,session,application)中查找相应属性。而非直接在页面中查找实例或局部变量。
- 表达式语言查找变量的顺序是:
- pageContext
- request
- session
- application
- 所有范围都未找到时,赋值null
-
对象属性. 数组. 集合数据输出
- el取值有两个操作符
.
和[]
,.
用于单个对象或属性[]
用于数组集合取值。
- user对象
${user["name"]} ${user['name']} //拿属性时,单引跟双引等价 ${user.name} //这种方法同样可以
- list集合. 数组
${aList[0]} //使用下标来取值 ${aList[1]} //取得对象的引用地址 还可以嵌套:${aList[1]['name']} ${aList[3]} //下标越界,不会报错;只是取不出值
- map键值对
${map.date} ${map["date"]} //这两个等效 ${map.aList[0]} ${map["aList"][0]}//这两个也等效 ${map.aList[1][name]} //嵌套取值
- el取值有两个操作符
-
el提供了自己的一套隐含对象,方便在页面内对各种常用数据信息的访问.
EL隐藏对象 JSP隐藏对象 pageScope pageContext requestScope request sessionScope session applicationScope appication param request.getParameter(), ${param.username} paramValues request.getParameterValues, ${paramValues.like[0]} header request.getHeader() 按照key-value的形式取出;value:是一个String类型的值:${header["host"]} , ${header["accept"]}, ${header["user-agent"]} headerValues 按照key-value的方式取出,但是headerValues里面的value是一个String类型的数组 cookie request.getCookies() initParam context param web.xml <context-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </context-param>
${initParam.server}
JSTL(JSP Standard Tag Library )
- 减少java代码,简化页面编写;功能封装,提高可重用性
-
如何使用JSTL
- 对于Java EE之前(即J2EE规范1.4及之前版本)
- 复制jstl的jar包(jstl.jar,standard.jar)到/WEB-INF/lib
- 在使用jstl功能的jsp页面中增加指令
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> //核心标签库
<%@taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%> //数据库标签库
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> //prefix 表前缀(可改,但通常按这写的用); uri 指向标签库的入口
- Java EE规范把jstl作为规范的一部分
- 所以现在的jstl-1.2已经包含了原来的jstl.jar , standard.jar
- 对于Java EE之前(即J2EE规范1.4及之前版本)
-
core:核心标签库
- 在JSTL中,一般用途的标签主要是指具有输出,设置变量,和错误处理等功能的标签,他们在jsp中使用比较频繁,它们有:
-
<c:set>
- 语法:
这个标签用于在某个范围(page,request,session,application)里面设置特定的值, (默认为page),或者设置某个已经存在的javabean的属性。<c:set value="value" var="varName" [scope= "{page|request|session|application}"]/ > <c:set value="value" target="target" property="propertyName"/ >
- 例子:
<c:set var="counter" value="200"/> ${counter}//输出
<c:set var="tarena">Tarena It Traning Ltd.</c:set>
${tarena}可以指定范围,默认是page
<c:set value="20" var="maxIdelTime" scope="session"/>
${maxIdelTime}设置JavaBean的值
<jsp:useBean id="girl" class="vo.SuperGirl"/>
<c:set value="Shirly" target="({girl}" property="name"/> <td>girl.name</td> <td>){girl.name}</td>
- 语法:
-
<c:catch>
-
它的作用是捕捉由嵌套在它里面的标签所抛出来的异常。类似于
<%try{}catch{}%>
-
语法:
<c:catch [var="varName"]>nested actions</c:catch>
-
例子
<c:catch var="error"> <% Integer.parseInt("abc"); %> </c:catch>
<%
try{
Integer.parseInt("abc");
}catch(Exception error){
}
%> //等价<c:out value="({error}"/> <c:out value="){error.message}"/>
<c:out value="${error.cause}"/>
-
-
<c:if>
- 控制语句
- 语法:
注:没有 else<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]> Body内容 </c:if>
- 例子
<c:set var="age" value="16"/> <c:if test="${age<18}"> <h1 align=center>您尚未成年,不能进入游戏中心!</h1> </c:if>
-
<c:choose>
- 控制语句
- 例子:
<c:set var="tax" value="5000" /> <c:choose>
<c:when test="${tax <=0}">
您今年没有纳税!
</c:when><c:when test="({tax<=1000&&tax>0}"> 您今年缴纳的税款为){tax},加油!
</c:when><c:when test="({tax<=3000&&tax>1000}"> 您今年缴纳的税款为){tax},再接再励哦!
</c:when><c:otherwise>
您今年纳税超过了3000元,多谢您为国家的繁荣富强作出了贡献!
</c:otherwise></c:choose>
-
<c:forEach>
- 循环
- 语法
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]> Body 内容 </c:forEach>
- items : 需要迭代的集合
- var : 迭代时取集合里的值
- 例子
<% List aList=new ArrayList(); aList.add("You"); aList.add("are"); aList.add("a"); aList.add("beautiful"); aList.add("girl"); request.setAttribute("aList",aList); %>
<center>
<table border=1><c:forEach var="word" items="${aList}"> <tr> <td> ${word} </td> </tr> </c:forEach>
</table>
</center><c:forEach items='({header}' var='h'> <tr> <td> <li>Header name:<c:out value="){h.key}"/>
</li>
</td><td> <li>Header value:<c:out value="${h.value}"/> </li> </td>
</tr>
</c:forEach>//另外一种用法: (类似 for 循环)
<c:forEach var="count" begin="10" end="100" step="10">
<tr>
<td>
<c:out value="${count}"/><br>
</td>
</tr>
</c:forEach>
- 在JSTL中,一般用途的标签主要是指具有输出,设置变量,和错误处理等功能的标签,他们在jsp中使用比较频繁,它们有:
过滤器
-
Servlet过滤器是Servlet的一种特殊用法,主要用来完成一些通用的操作。比如编码的过滤,判断用户的登陆状态等等。
-
Servlet过滤器的适用场合:
- 认证过滤
- 登录和审核过滤
- 图像转换过滤
- 数据压缩过滤
- 加密过滤
- 令牌过滤
- 资源访问触发事件过滤
-
filter 其实是一个“servlet chaining”(servlet 链)。 一个 filter 包括:
- 在 servlet 被调用之前截获;
- 在 servlet 被调用之前检查 servlet request;
- 根据需要修改 request 头和 request 数据;
- 根据需要修改 response 头和 response 数据;
- 在 servlet 被调用之后截获.
-
Servlet过滤器接口的构成:
- 所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。这个接口含有3个过滤器类必须实现的方法:
- init(FilterConfig cfg) 这是Servlet过滤器的初始化方法,性质等同与servlet的init方法。
- doFilter(ServletRequest,ServletResponse,FilterChain) 完成实际的过滤操作,当请求访问过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器
- destroy() Servlet容器在销毁过滤器实例前调用该方法,这个方法中可以释放Servlet过滤器占用的资源。,性质等同与servlet的destory()方法。
- 所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。这个接口含有3个过滤器类必须实现的方法:
-
Servlet过滤器的创建步骤:
- 实现javax.servlet.Filter接口的servlet类
- 实现init方法,读取过滤器的初始化函数
- 实现doFilter方法,完成对请求或过滤的响应
- 调用FilterChain接口对象的doFilter方法,向后续的过滤器传递请求或响应
- 在web.xml中配置Filter
<filter> <filter-name>myfilter</filtername> <filter-class>com.filter.MyFilter</filter-class> </filter>
<filter-mapping>
<filter-name>myfilter</filter-name>
<url-parten>*.do</url-parten>
</filter-mapping>
-
Filter 有4种类型,主要体现在
中的 属性: <dispatcher>REQUEST</dispatcher>
默认,客户端的直接的请求,才触发该过滤器<dispatcher>FORWARD</dispatcher>
servlet 调用forward(req,resp)时触发<dispatcher>INCLUDE</dispatcher>
servlet 调用 include(req,resp)时触发<dispatcher>ERROR</dispatcher>
发生错误,跳转到错误页面时触发
监听器(Listener)
-
它可以监听客户端的请求. 服务端的操作等。通过监听器,可以自动激发一些操作。
-
如:监听在线的用户数量。当增加一个session时,就激发sessionCreated(HttpSessionEvent se),给在线人数加1
-
监听器的种类 : 一共分三大类型,有 8 种 listener:
- 监听 servlet context
- 生命周期事件
- 接口: javax.servlet.ServletContextListener
- 内容: servlet 上下文已经被创建,并且可以用来向其第一个请求- 提供服务,或者 servlet 上下文即将关闭
- 属性的改变
- 接口: javax.servlet.ServletContextAttributeListener
- 内容: 在 servlet 上下文中,增加. 删除或者替换属性
- 生命周期事件
- 监听 servlet session
- 生命周期事件
- 接口: javax.servlet.http.HttpSessionListener
- 内容: 对一个 HttpSession 对象进行创建. 失效处理或者超时处理
- 属性改变
- 接口: javax.servlet.http.HttpSessionAttributeListener
- 内容: 在 servlet 会话中,增加. 删除或者替换属性
- 会话迁移
- 接口: javax.servlet.http.HttpSessionActivationListener
- 内容: HttpSession 被激活或者钝化
- 对象绑定
- 接口: javax.servlet.http.HttpSessionBindingListener
- 内容: 对 HttpSession 中的对象进行绑定或者解除绑定
- 生命周期事件
- 监听 servlet request
- 生命周期
- 接口: javax.servlet.ServletRequestListener
- 内容: 一个 servlet 请求开始由 web 组件处理
- 属性改变
- 接口: javax.servlet.ServletRequestAttributeListener
- 内容: 在 ServletRequest 中,增加. 删除或者替换属性
- 生命周期
- 监听 servlet context
-
监听器创建步骤:
- 根据监听事件继承或实现相应的监听器类或接口Listener。
- 重写监听器方法。
- 在web.xml中配置。
mylistener com.listener.MyListener
Ajax——异步传输
-
XMLHttpRequest对象实现Ajax,
-
属性:
- readystate——标明是否成功与服务器实现异步传输,返回4表示成功。
- status——标明异步的请求的HTTP状态,返回200表示连接正常。
- onreadystatechange设置回调函数
-
方法:
- open(url)——初始化异步传输内容
- send()——将请求发送给服务器
- responseXML——以XML方式接收服务器返回数据
- responseText——以文本的方式接收服务器返回数据
-
使用Ajax的步骤:
- 创建XmlHttpRequest对象(注意浏览器)
- 准备请求地址和数据
- open方法初始化异步请求
- 设置回调函数
- send发送请求
- 回调函数接收返回数据(responseText. responseXML)
- 通过js处理
-
通过jquery方式实现:
- 导入jquery
- 通过$.post(url,回调函数,"type"). $.get(url,回调函数,"type")实现异步传输,$.ajax
- 在回调函数中声明参数,该参数表示服务器返回的数据。
- type——xml, html, script, json, text