Download presentation
Presentation is loading. Please wait.
1
Servlet技术
2
Servlet技术 要点 Http协议 Servlet基础 Servlet生命周期 Servlet API 会话管理 Filtering
2007-3 Servlet技术
3
B/S编程模型 B/S编程模型 Browser(客户端)(client) 客户端-服务器端通信协议:http 服务器(Server)端
代理客户发送http请求 接收服务器端响应 显示html文本 客户端-服务器端通信协议:http 服务器(Server)端 处理客户端的请求 发回http响应 http 客户机 Web 服务器 2007-3 Servlet技术
4
HTTP协议 简介 HTTP: HyperText Transfer Protocol,超文本传输协议,在RFC2616中定义
应用层协议,基于tcp/IP 版本:HTTP1.1 Http的缺省端口是80,ftp:20,21 2007-3 Servlet技术
5
HTTP协议 HTTP 通信的四个阶段 特点:无状态 1.客户机打开到服务器的连接 2. 客户机向服务器发出请求request
3. 服务器响应该请求response 4. 连接关闭 特点:无状态 2007-3 Servlet技术
6
HTTP协议 HTTP 通信的四个阶段 2007-3 Servlet技术 1. 连接到服务器 2. 发送请求 3. 发送响应 4. 关闭连接
客户机 Web 服务器 2007-3 Servlet技术
7
HTTP – 举例 URL(Uniform Resource Locator,统一资源定位符):协议名+DNS名+请求的文件名(MIME)
浏览器向DNS服务器询问 的IP地址 DNS的回复是 浏览器与 上的80端口建立一个TCP连接 浏览器发送一个请求,要求获取文件/home/index.html TCP连接被释放 浏览器显示/home/index.html中所有的文本 浏览器取回并显示该文件中的所有图片 2007-3 Servlet技术
8
Http请求 浏览器代理用户发出Http请求 地址栏:(get) 表单提交(post) http://www.google.cn/
表单提交(post) 2007-3 Servlet技术
9
Http请求 表单提交http请求示例: <font size="5" color="990000">请登录</font><hr> <form name=“frmManage” method="get" action="loginValidator.jsp" > <font size="3" color="990000"> <label>用户名</label> <input type="text" name="UserName" ><br> <label>密 码</label> <input type="password" name="Password" ><br> <input type="submit" value="登录" /> <font> </form> 在js中: frmManage.submit(); 相当于: &Password= 2007-3 Servlet技术
10
Http请求 请求数据 请求头等:浏览器及客户端相关信息,如: 用户数据 http协议版本(1.1) 浏览器? 支持哪些类型文档类型?
支持哪些字符集? 客户机地址是多少? 用户数据 请求文件(资源) 请求参数 形式:名字=值 两种方法(method): Get Post 2007-3 Servlet技术
11
Http请求 Get方法与Post方法发送请求示例 Get方法示例: GET /myapp/loginValidator.jsp?
UserName=tom&Password= HTTP/1.1 Host: [其它请求头] BODY EMPTY Post方法示例: POST /ibm-demo/loginValidator.jsp HTTP/1.1 Host UserName=tom&Password=123456 2007-3 Servlet技术
12
Http请求 Get与Post方法的区别 因此: Get方法:用户数据作为 URL 中的查询字符串传递给服务器,而body中的数据为空
Post方法:用户数据在body中传输给服务器 因此: Get方法所传输的数据量有限制,Post方法则没有限制 Get方法所传输的数据在url中可见,post则不可见 2007-3 Servlet技术
13
Http请求 http请求小结: 通过地址栏发出的请求总是Get方法 Form表单发出的请求: Method=“Get” :
Method=“Post”; 示例: <form name=“frmManage” method="get" action="loginValidator.jsp" > <form name=“frmManage” method=“post" 2007-3 Servlet技术
14
HTTP响应 Http响应 响应头,如 响应数据:html文档 http协议 文档类型 状态 示例: HTTP/1.1 200 OK
Content-Type:text/html [其它响应头] [下面是返回给客户端的html代码] <html> <head><title>登录验证</title></head> <body> <font size="5" color="990000">你的输入是</font><hr> <font size="3" color="990000"> <label>用户名:tom</label><br> <label>密 码:1233</label> </font> </body> </html> 2007-3 Servlet技术
15
Http小结 http是B-S之间传输数据的协议 http请求 http响应 请求头相关 用户相关数据 响应头相关 响应数据:html文档
Get/Post方法 用户相关数据 请求资源可以是:html,jsp,servlet 输入数据 传输形式:name=value http响应 响应头相关 响应数据:html文档 2007-3 Servlet技术
16
动态技术 动态技术 服务器端动态处理常见技术 web服务器只能向客户提供静态的资源,但动态处理更为重要
Cgi(Common Gateway Interface):公共网关接口 PHP(HyperText Preprocessor):超文本处理器 ASP(Active Server Page):活动服务器页面 Servlet(JSP-Java Server Page):java 服务器页面 2007-3 Servlet技术
17
Servlet基础 Servlet技术规范 程序员所写Servlet 定义了容器功能
是一个 Java类 实现了Servlet接口 在容器上运行 请求的入口,实现业务系统功能 获取用户输入参数 完成业务功能 生成输出(响应) 2007-3 Servlet技术
18
Servlet基础 容器与Servlet 2007-3 Servlet技术 Web 容器 请求 Servlet 响应 客户机
数据库 http 服务器 Servlet Web 容器 2007-3 Servlet技术
19
Servlet基础 基于容器/Servlet的请求与响应 客户机将 HTTP 请求发送给 Web 服务器
Web 服务器将该请求转发给 Servlet容器 Servlet容器[做很多事],将请求转发给Servlet Servlet 处理该请求 Servlet产生输出发送给容器 Servlet容器将输出转为http响应发送给 Web 服务器 Web 服务器将http响应转发给客户机 浏览器根据响应显示页面 2007-3 Servlet技术
20
Servlet基础 Eclipse下Servlet开发示例 开发工具完成了: 在web.xml中的配置 完成了类WelcomeServlet
2007-3 Servlet技术
21
Servlet基础 Web.xml是web应用的部署描述文件
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns=" xmlns:xsi=" xsi:schemaLocation=" </web-app> <!ELEMENT web-app (icon?, display-name?, description?, distributable?, context-param*, filter*, filter-mapping*, listener*, servlet*, servlet-mapping*, session-config?, mime-mapping*, welcome-file-list?, error-page*, taglib*, resource-env-ref*, resource-ref*, security-constraint*, login-config?, security-role*, env-entry*, ejb-ref*, ejb-local-ref*)> 2007-3 Servlet技术
22
Servlet基础 Servlet类在web.xml中的配置 容器通过这个配置获取Servlet的信息,从而管理Servlet对象 示例:
<description>WelcomeServlet</description> <display-name>WelcomeServlet</display-name> <servlet-name>WelcomeServlet</servlet-name> <servlet-class>servlet.WelcomeServlet</servlet-class> </servlet> <servlet-mapping> <url-pattern>/servlet/WelcomeServlet</url-pattern> </servlet-mapping> 注意请求url与<url-pattern>间的关系: servlet/WelcomeServlet <url-pattern>/*.action</url-pattern> a.action 2007-3 Servlet技术
23
Servlet基础 WelcomeServlet代码基本结构 import javax.servlet.*;
import javax.servlet.http.*; public class WelcomeServlet extends HttpServlet { public void init() throws ServletException { System.out.println("WelcomeServlet Servlet init!"); } public void destroy() { super.destroy(); // Just puts "destroy" string in log System.out.println("WelcomeServlet Servlet destroy!"); public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2007-3 Servlet技术
24
Servlet基础 WelcomeServlet代码分析
javax.servlet,javax.servlet.http是Serevlet两个主要包,定义了Servlet API WelcomeServlet继承了HttpServlet,这是一个基于http的实现了Servlet接口的类,从而WelcomeServlet也实现了Servlet接口, WelcomeServlet对象由容器创建 Init destroy doGet doPost方法由容器调用,这些方法是回调方法 doGet,doPost方法相应于http请求的Get,Post方法 容器在调用doGet(doPost)方法时,已创建好HttpServletRequest及HttpServletResponse对象供用户使用 2007-3 Servlet技术
25
Servlet基础 WelcomeServlet doGet代码
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("gb2312"); PrintWriter out = response.getWriter(); out.println("<HTML>"); out.println(" <HEAD><TITLE>欢迎Servlet</TITLE></HEAD>"); out.println(" <BODY BGCOLOR='#CCCCFF'>"); out.println("<H3><I><CENTER>Servlet生成的样HTML</CENTER></I></H3>"); out.println("<HR>"); out.println(“<H2><I><CENTER>欢迎您进入Servlet编程世界!祝你成 功!</CENTER></I></H2>"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } 2007-3 Servlet技术
26
Servlet基础 WelcomeServlet doGet代码分析
用户通过response(响应对象)响应客户端请求,容器根据response对象生成http响应发送给客户端 响应头 用户通过response上的一些方法设置相应头,如 response.setCharacterEncoding("gb2312"); 响应数据 用户通过下列方法 PrintWriter out = response.getWriter();获得一个out对象,通过out.print方法设置响应数据 2007-3 Servlet技术
27
Servlet基础 HttpServletRequest对象 示例 容器在获得http请求之后创建 是http请求的抽象与封装
获得请求头信息,用request上的一些特殊方法,如 request.getMethod() 获得用户提交数据 request.getParameter(“name”);//获得名为”name”的参数值 request.getParameterValues(“name”);//获得同名name的一组参数值 示例 2007-3 Servlet技术
28
Servlet基础 HttpServletRequest对象,示例:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("gb2312"); PrintWriter out = response.getWriter(); String name = request.getParameter(“userName”); String age = request.getParameter(“userAge”); out.println(“你的姓名是:”+name+”,年龄是:”+age); out.println("<HR>"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } 2007-3 Servlet技术
29
Web 容器 web容器功能: 生成相关对象由 Servlet使用 管理 Servlet 生命周期,提供Servlet的运行环境
将响应从 Servlet 转发到 Web 服务器 2007-3 Servlet技术
30
Web 容器实现 IBM 的 Web Sphere Application Server BEA 的 Web Logic
Sun Microsystems 的 iPlanet Application Server Sun 的 J2EE Reference Implementation Jakarta TomCat Server Jboss 2007-3 Servlet技术
31
Servlet基础小结 Servlet基础小结 Web.xml:部署描述文件 容器 Servlet
配置web应用,如描述了Servlet配置 容器通过它获得应用程序的配置信息 容器 管理servlet对象 调用servlet对象上的方法 Servlet 必须实现Servlet接口 在doGet/doPost方法中 通过HttpServletRequest获取用户请求信息 完成业务功能 通过HttpServletResponse作出响应 2007-3 Servlet技术
32
Servlet生命周期 容器管理Servlet 依据 Web.xml
接口Servlet(init() destroy() service()) 管理 创建Servlet对象 时机: 容器启动时,且配置了: <load-on-startup>1</load-on-startup> 第一次使用的时候 调用doGet doPost destroy()方法, 关闭容器时,长时间不使用 2007-3 Servlet技术
33
Servlet生命周期 测试:容器启动时创建了Servlet对象(HelloWorld.java) <init-param>
<servlet-name>HelloWorld</servlet-name> <servlet-class>servlet.HelloWorld</servlet-class> <init-param> <param-name>username</param-name> <param-value>sa</param-value> </init-param> <param-name>password</param-name> <load-on-startup>1</load-on-startup> </servlet> public void init() throws ServletException { System.out.println("helloWorld Servlet init!"); } 2007-3 Servlet技术
34
Servlet配置信息 Servlet配置信息 配置信息在web.xml中完成 配置信息抽象为接口ServletConfig
容器在 Servlet 的初始化过程中将创建 ServletConfig 对象,并传递给 Servlet ServletConfig接口: public String getInitParameter(String); Enumeration getInitParameterNames(); public ServletContext getServletContext(); public java.lang.String getServletName(); 2007-3 Servlet技术
35
Servlet配置信息 在程序中使用ServletConfig对象
获得ServletConfig对象:一般在init方法中获取,并将之作为一个成员变量 获得Servlet初始化参数 public void init() throws ServletException { // Put your code here ServletConfig sc = this.getServletConfig(); } 在doGet方法或doPost方法中: String username = sc.getInitParameter("username"); String password = sc.getInitParameter("password"); 2007-3 Servlet技术
36
线程和Servlet 问题:多个用户并发对同一个Servlet发出请求,容器应该如何处理? 多线程,单实例(缺省方法) 多实例,单线程
Servlet需实现SingleThreadModel标志接口 具体实现 请求排队 实例池 2007-3 Servlet技术
37
Servlet 的类层次结构 Servlet <<接口>> GenericServlet HttpServlet
2007-3 Servlet技术
38
Servlet 接口 Servlet接口 是Web 容器和 Servlet 之间的合约 所有 Servlet 都应直接或间接实现这个接口
public void init(ServletConfig config) throws ServletException public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException public void destroy() public ServletConfig getServletConfig() public java.lang.String getServletInfo() 2007-3 Servlet技术
39
Generic Servlet 类 定义以下方法 抽象类,提供 servlet 接口的基本实现
public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable 定义以下方法 public init() public void log(String ) public void log(String,Throwable) public abstract void service(ServletRequest req, ServletResponse res) throws ServletException,java.io.IOException public ServletConfig getServletConfig(); public ServletContext getServletContext(); 2007-3 Servlet技术
40
HttpServlet 类 特定于 HTTP 的 Servlet 接口实现
对于每种类型的 HTTP 请求方法,HttpServlet 类提供相应的 doXxx()方法 service方法中调用相应的doXxx()方法 程序员重写doXxx()方法 一般不重写service方法 2007-3 Servlet技术
41
HttpServletRequest 该类是客户端http请求信息的抽象与封装 请求头相关信息 用户相关数据信息 其它 请求资源 提交的数据
获得session对象:request.getSession()-HttpSession 获得请求分派对象 request作用域 request. setCharacterEncoding(“gb2312”); 2007-3 Servlet技术
42
HttpServletRequest 获得http请求头相关信息 getHeader(String):获得给定名的头信息
getHeaderNames:获得请求所包含的所有头名 getMethod():获得请求的方法 getCookies():获得cookie信息 示例(显示当前所有请求的头名及头信息): Enumeration headerNames = request.getHeaderNames(); while(headerNames.hasMoreElements()){ String headerName = (String) headerNames.nextElement(); out.println(headerName+"="); out.println((request.getHeader(headerName)); out.println("<br>"); } 2007-3 Servlet技术
43
HttpServletRequest 获得http请求头相关信息 CGI的等价物
例QUERY_STRING:getQueryString 方法 书5.7节及示例程序清单5.7 示例: String[][] variables = {{“AUTH_TYPE”,request.getAuthType()}, {“CONTENT_LENGTH”,request.getContentLength(),…}; for(int i=0;i<variables.length;i++) { String varName = variables[i][0]; String varValue = variables[i][1]; …… } 2007-3 Servlet技术
44
HttpServletRequest 获得用户相关数据信息:
示例: http request. getScheme() Localhost request.getServerName() request.getServerPort() /demo request.getContextPath() /login.jsp request.getServletPath(); /demo/login.jsp request.getRequesURI() request.getRequestURL() name=tom&age= request.getQueryString() 2007-3 Servlet技术
45
HttpServletRequest 获得用户数据信息 获得用户提交数据
request.getParameter(“name”);//获得名为”name”的参数值 request.getParameterValues(“name”);//获得同名name的一组参数值,返回类型是String[] 2007-3 Servlet技术
46
HttpServletRequest 获得用户提交数据
<form name=“frmManage” method=“post" action="loginAction” > 姓名:<input type="text" name=“name" ><br> 受好:<input type="checkbox" name="favor" value="1"/>听音乐 <input type="checkbox" name="favor" value="2"/>看电影 <input type="checkbox" name="favor" value="3"/>玩游戏 <input type="checkbox" name="favor" value="4"/>上网聊天 <br> <input type=“submit” value=“登录” /> </form> 在loginAction中: request.getParameter(“name”);//获得用户输入的姓名 request.getParameterValues(“favor”);//获得用户选择的所有受好 2007-3 Servlet技术
47
HttpServletRequest 获得用户提交数据,其它相关方法 获得body中的数据 getParameterMap()-Map
getParameterNames()-Enumeration 获得body中的数据 getReader()-BufferReader,作为字符数据 getInputStream-ServletInputStream,作为二进制数据 2007-3 Servlet技术
48
HttpServletRequest 获得请求分派对象 请求分派?一个请求由多个web组件完成
rquest.getRequestDispatcher(String)-RequestDispatcher 请求分派?一个请求由多个web组件完成 SeveletA,在ServletB,ServletC的帮助下,完成任务,由ServletA生成响应,include(包含) ServletA->ServletB->ServletC,由ServletC生成响应,forward(转发) 2007-3 Servlet技术
49
RequestDispatcher RequestDispatcher接口
include(ServletRequest,ServletResponse) forward(ServletRequest,ServletResponse) 2007-3 Servlet技术
50
RequestDispatcher include示例,在ServletA中包含HeaderServlet与FooterServlet
在ServletA的doGet(doPost)方法中: ServletContext context = getServletContext(); RequestDispatcher rd = context.getRequestDispatcher("/servlet/HeaderServlet"); //包含头部 rd.include(request,response); out.println(“in servletA”); //包含尾部 RequestDispatcher rd1 = context.getRequestDispatcher("/servlet/FooterServlet"); rd1.include(request,response); 2007-3 Servlet技术
51
RequestDispatcher forward示例:在ServletAction中根据处理结果将请求转发至成功页面或失败页面
在ServletAction的doGet(doPost)方法中: ServletContext context = getServletContext(); RequestDispatcher rd = null; //进行处理 If(ok) { rd = context.getRequestDispatcher("/success.jsp"); }else{ rd = context.getRequestDispatcher("/fail.jsp"); } rd.forward(request,response); 2007-3 Servlet技术
52
Request作用域 同一request,如通过requestDispatcher转发的请求 方法:
request.setAttribute(“name”,value); 理解value是一个Object,如 value = “tom” value = new User() request.getAttribute(“name”) 将Object强制转换为实际类型 (String) request.getAttribute(“name”) (User) request.getAttribute(“name”) 2007-3 Servlet技术
53
Request作用域 Request作用域示例 在ServletAction的doGet(doPost)方法中:
Error error = new Error(); request.setAttribute(“error”,errorObject); RequestDispatcher rd = request.getRequestDispatcher(“/fail.jsp”); rd.forward(request,response); 则在fail.jsp中可以获得出错对象,从而显示出错信息: <% Error error = (Error) request.getAttribute(“error”); out.println(“出错信息:”+error.getMessage()); %> 2007-3 Servlet技术
54
HttpServletResponse 通过HttpServletResponse设定Http响应 设置响应状态 设置响应头 响应文本
首先设置响应头 response.setContentType("text/html; charset=GBK"); 获得输出对象 文本:PrintWriter out = response.getWriter(); 二进制:ServletOutputStream out = response.getOutPutStream() 构造输出内容:out.println(“…”) 提交输出: out.flush() 关闭out 2007-3 Servlet技术
55
HttpServletResponse 构造响应示例 在doGet(doPost)方法中:
response.setContentType(“text/html; charset=GBK ”);//1设置响应头 PrintWriter out = response.getWriter();//2.获得输出对象 out.println(“<HTML>”);//3.构造输出 out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.print(" Hello World! "); out.println(", 欢迎你"); out.println(" </BODY>"); out.println("</HTML>"); out.flush();//4.向容器提交输出 out.close();//5.关闭输出流 2007-3 Servlet技术
56
HttpServletResponse Http状态码:用于服务器将请求的状态传送给客户机 设置状态码的方法:
: 临时状态码 : 请求成功 :重定向 :客户端错误 :服务器端错误 设置状态码的方法: setStatus(int sc) HttpServletResponse中静态变量定义Http状态码: SC_OK SC_MOVED_TEMPORARILY SC_NOT_FOUND SC_INTERNAL_SERVER_ERROR 500 2007-3 Servlet技术
57
HttpServletResponse 设置状态码 response.setStatus(int sc) 发送错误消息 例
response.sendError(int,String) 例 response.sendError(HttpServletResponse.SC_NOT_FOUND,”你所要查找的网页不存在!”) 2007-3 Servlet技术
58
HttpServletResponse 设置响应头:setHeader(“name”,value); 常见响应报头
Content-Type:定义响应文档的MIME(Multipurpose Internet Mail Extension)类型,由maintype/subtype组成 有专门的方法设置该响应报头:setContentType 示例:(p142) response.setContentType(“text/html; charset=GBK ”);//最常见形式 response.setContenType(“application/vnd.ms-excel”);//excel文档 response.setHeader("Content-Type", "application/vnd.ms-excel; charset=GBK"); response.setContenType(“image/jpeg”);//图形图像 2007-3 Servlet技术
59
HttpServletResponse 使用servlet生成jpeg图像关键代码
response.setContentType(“image/jpeg”);//1.设定响应的文档是图像 //生成JPEG图像 int width=60, height=20; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//2.创建BufferedImage对象 Graphics g = image.getGraphics();//3.获得图形对象 //4.使用g上的相关方法生成图形? ………………………………… // //5.输出图象到页面 ImageIO.write(image, "JPEG", response.getOutputStream());? 2007-3 Servlet技术
60
HttpServletResponse 重定向 方法一: 方法二: 示例 设置状态码,如302 设置响应头:location
sendRedirect 示例 response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); response.setHeader("Location"," response.sendRedirect(" 2007-3 Servlet技术
61
HttpServletResponse 告诉浏览器不要缓存页面
response.setHeader(“Cache-control”,”no-cache”); response.setHeader(“pragma”,”no-cache”); 2007-3 Servlet技术
62
HttpServletResponse 页面重新刷新 response.setIntHeader(“Refresh”,10);
response.setHeader(“Refresh”,” 10 ,url= 2007-3 Servlet技术
63
Cookie cookie 是 Web 服务器发送给客户机的一段文本信息,它存储在客户机的硬盘上,对于发送给同一服务器的后续请求,由客户机返回 服务器通过cookie的响应头将cookie发送给客户机,其形式为名称=值 客户机则以文件的形式将cookie存放在本地硬盘上,具体存储位置与浏览器相关 HTTP/ OK Set-Cookie:CustomerID=1234;domain=abc.com;path=/sales 2007-3 Servlet技术
64
Cookie 使用Cookie 创建cookie对象: 在响应中加入cookie: 通过request取回cookie
Cookie color = new Cookie(“color”,”red”); 在响应中加入cookie: response.addCookie(color); 通过request取回cookie Cookie[] cookie = request.getCookies(); 2007-3 Servlet技术
65
Cookie示例 Cookie使用示例: 示例:记录用户访问次数 Cookie[] c = request.getCookies();
int count = 1; if(c!=null) { for(int i=0;i<c.length;i++) { Cookie accountCookie = c[i]; if(accountCookie.getName().equals("accountCount")) { count = Integer.parseInt(accountCookie.getValue())+1; break; } response.addCookie(new Cookie("accountCount",String.valueOf(count))); 2007-3 Servlet技术
66
会话管理 HTTP 协议特点:无状态协议 在线购物特点:服务器应能识别出每个客户的不同的购物车
每个客户端请求,对服务器而言都是新的 服务器不记住客户端的任何信息 这样的协议适用于在web上快速获取信息,同时,HTTP协议不支持维护客户机状态 在线购物特点:服务器应能识别出每个客户的不同的购物车 会话:<input type=“hiddent” name=“”> 会话是在指定阶段来自同一客户的一系列的HTTP请求 会话跟踪:将一个请求与会话关联的过程 会话管理:对容器要求 识别来自同一客户的请求 维护每个客户的状态 2007-3 Servlet技术
67
会话管理 会话应用 交互式应用程序 Web 应用程序的个性化 在线购物 个性化是指应用程序能区别对待不同的客户 2007-3
Servlet技术
68
会话管理技术 一般原理 常用技术 使用session进行会话管理 会话唯一标识:sessionID Cookie 隐藏表单域 url重写
<input type=“hidden” name=“sessionID” value=“…”/> url重写 使用session进行会话管理 2007-3 Servlet技术
69
Session对象 通过request对象获取Session对象
HttpSession session = request.getSession(); 容器: 1、Servlet通知容器,它需要Session对象; 2、容器创建sessionID,它是客户这次会话的唯一标识; 3、容器创建HttpSession对象,Servlet获得这个对象 2007-3 Servlet技术
70
容器进行的会话管理 Web 容器 2007-3 Servlet技术 请求 1(UserName, Password) …
ValidatorServlet … 调用方法 getSession() Session Id=123456 请求 2 (SessionId=123456) 请求 3 (SessionId=123456) 客户机 Web 服务器 由容器生成的 Session Id=123456。 2007-3 Servlet技术
71
会话超时阶段 定义:来自参与会话的客户机的两个连续请求之间的最长允许空闲时间称为会话超时阶段 <session-config>
<session-timeout>10</session-timeout> </session-config> session.setMaxInactiveInterval(10); 2007-3 Servlet技术
72
HttpSession 接口 Session接口 setAttribute(String, Object)
getAttribute(String) getID(); getMaxInactiveInterval() setMaxInactiveInterval(int) isNew() invalidate() getAttributeNames() -Enumeration removeAttribute(String name) 2007-3 Servlet技术
73
Session示例 登录 Index Servlet及LoginAction Servlet //在LoginAction中:
//根据用户名与密码,查找用户是否合法 if(合法) { User user = …; HttpSession session = request.getSession(); session.setAttribute(“user”,user); }else { //让用户重新登录 } //在index中 User user = (User) session.getAttribute(“user”); if( user != null) {//用户已登录成功 //转向显示用户信息页面 }else{ //转向用户登录页面 2007-3 Servlet技术
74
Session示例 购物车设计 货物项:CatalogItem 项目订单:ItemOrder 购物车:ShoppingCart
public class CatalogItme { String itemID; String name; String desc; double cost; } public class ItemOrder { CatalogItem item; int numItems; public class ShoppingCart { List<ItemOrder> itemsOrdered; public void addItem(String itemId) {} public void removeItem(String itemId) {} public void setNumOrdered(String itemId,int numOrdered){} 2007-3 Servlet技术
75
Session示例 addItem public void addItem(String itemID){
for(int i=0;i<itemOrdered.size();i++) { order = (ItemOrder) itemOrdered.get(i); if(order.getItemID().equals(itemID) { ItemOrder order.incrementNumItems(); return; } //新物品项 ItemOrder newOrder = Catalog.getItem(itemID); itemOrdered.add(newOrder); 2007-3 Servlet技术
76
Session示例 购物车前端实现 显示货物的列表页面,当点击”加入购物车时”,进入显示当前订单页面 当前订单页面OrderPage
//关键代码示例 HttpSession session = request.getSession(); ShoppingCart cart = (ShoppingCart) session.getAttribute(“soppingCart”); if(cart==null) { cart = new ShoppingCart(); session.setAttribute(“shoppingCart”,cart); } //获得ItemID, String itemID = request.getParameter(“itemID”); //调用addItem方法 Cart.addItem(itemID); //显示购物车中的所有订单 List itemsOrder = cart.getItemsOrdered(); for(…) {…} 2007-3 Servlet技术
77
filtering(本部分尚需完善和领悟)
Filtering是Servlet2.3以上版本的特性 主要内容: Filtering的基本思想 Filtering API Filtering的实现 2007-3 Servlet技术
78
基本思想 Filtering的基本思想: 将jsp,servlet,html看作资源,容器用来处理这些资源,并为资源提供服务
因此,可以在处理这些资源之前或之后,通过过滤器增加一些通用功能;比如: 拦截请求头:安全认证,日志 数据转换:加密,解密 抢占特殊资源的服务:缓存 而且这些过滤器可以形成一个链 2007-3 Servlet技术
79
基本思想 将jsp,servlet,html看作资源 2007-3 Servlet技术
80
基本思想 Filtering构成处理链 2007-3 Servlet技术
81
接口:javax.servlet.Filter 接口:javax.servlet.FilterChain
filtering API 接口:javax.servlet.Filter 接口:javax.servlet.FilterChain 接口:javax.servlet.FilterConfig 2007-3 Servlet技术
82
filtering API Filter接口
public void init(FilterConfig config)throws ServletException public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException public void destroy() 2007-3 Servlet技术
83
filtering API FilterChain接口
public void doFilter(ServletRequest request, ServletResponse response) throws java.io.IOException, ServletException 2007-3 Servlet技术
84
filtering API FilterConfig public java.lang.String getFilterName()
public ServletContext getServletContext() public java.lang.String getInitParameter(java.lang.String name) public java.util.Enumeration getInitParameterNames() 2007-3 Servlet技术
85
filtering 实现 创建filter 第一步:创建一个类,实现javax.servlet.Filter接口
第二步:配置web.xml文件 2007-3 Servlet技术
86
Filtering示例 CharEncodingFilter
public class CharEncodingFilter implements Filter { private FilterConfig filterConfig; public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,ServletException { System.out.println("in filter"); request.setCharacterEncoding("gb2312"); response.setCharacterEncoding("gb2312"); response.setLocale(Locale.SIMPLIFIED_CHINESE); filterChain.doFilter(request, response); public void destroy() { this.filterConfig = null; 2007-3 Servlet技术
87
Filtering示例 Web.xml中文件的配置 Filter定义:名字, Filter类 Filter映射:要处理哪类资源
<filter-name>charencode</filter-name> <filter-class>servlet.CharEncodingFilter</filter-class> </filter> <filter-mapping> <url-pattern>/*</url-pattern> </filter-mapping> 2007-3 Servlet技术
88
Filtering示例 URL模式 URL模式 含义 /* 根路径下的所有资源 /servlet/* /servlet路径下的所有资源
/jsp/*.jsp /jsp路径下的所有jsp页面 /dept/accounting/* /dept/accounting/路径下的所有资源 2007-3 Servlet技术
89
事件模型 事件:java.util.EventObject 事件侦听程序: 事件源: getSource()-Object
(标志)接口:java.util.EventListener 实现listener接口 事件源: 注册侦听程序 触发事件侦听程序 生成事件对象 调用已注册的侦听程序,处理事件 教师笔记 彻底讨论委派事件模型。给出 AWT 按钮作为示例。 转换说明:我们将继续讨论事件。 2007-3 Servlet技术
90
HttpSessionListener 事件(类):HttpSessionEvent 侦听器(接口):HttpSessionListener
getSession 侦听器(接口):HttpSessionListener sessionCreated(HttpSessionEvent se) sessionDestroyed(HttpSessionEvent se) 2007-3 Servlet技术
91
HttpSessionListener 示例 实现接口HttpSessionListener 注册侦听 在web.xml中注册侦听程序
<listener> <listener-class> servlet.OnlineCounterListener </listener-class> </listener> 2007-3 Servlet技术
92
HttpSessionListener 示例:利用HttpSessionListener实现网站在线人数统计功能
public class OnlineCounter { private static long online = 0; public static long getOnline() { return online; } public static void raise() { online++; } public static void reduce() { online--;} } public class OnlineCounterListener implements HttpSessionListener { public void sessionCreated(HttpSessionEvent hse) { System.out.println("in session create"); OnlineCounter.raise(); public void sessionDestroyed(HttpSessionEvent hse) { OnlineCounter.reduce(); 2007-3 Servlet技术
93
HttpSessionListener 测试: <%
out.println("onlineCount:"+OnlineCounter.getOnline()); %> 2007-3 Servlet技术
94
Servlet其它事件及侦听器 ServletContextEvent,ServletContextListener
contextDestroyed(ServletContextEvent sce) contextInitialized(ServletContextEvent sce) ServletContextAttributeEvent, ServletContextAttributeListener attributeAdded(ServletContextAttributeEvent scab) attributeRemoved(ServletContextAttributeEvent scab) attributeReplaced(ServletContextAttributeEvent scab) ServletRequestEvent,ServletReuestListener ServletRequestAttributeEvent,ServletReuestAttributeListener 2007-3 Servlet技术
95
小结 Web应用 web容器 Web.xml Servlet Servlet API 2007-3 Servlet技术
96
小结 web应用程序 B/S模型 是Servlet、JSP、Html、JPG、Class、Jar、Css、Js等的集合 Web应用目录结构
根(WebRoot) WEB-INF web.xml classes lib Web应用发布:.war文件拷贝到容器的相关目录 2007-3 Servlet技术
97
小结 Web容器 管理Servlet对象 创建相关对象: 发布目录 HttpServletRequest,
HttpServletResponse ServletConfig 发布目录 Tomcat的webapps目录下 可以是目录形式 2007-3 Servlet技术
98
小结 Web.xml <servlet><servlet-mapping>
<filter><filter-mapping> <listener> 其它 2007-3 Servlet技术
99
小结 Servlet 实现了Servlet接口的java类 在容器中运行,完成业务功能,一般作为控制器
一般要实现doGet或doPost方法 在容器中运行,完成业务功能,一般作为控制器 2007-3 Servlet技术
100
小结 Servlet API ServletConfig对象 Request对象 RequestDispatcher对象
Response对象 Session对象 其它 Filter Servlet事件 2007-3 Servlet技术
Similar presentations