Servlet技术.

Slides:



Advertisements
Similar presentations
第 4 章 配合 例子源代码一起使用 Power point 制作:耿祥义 张跃平 普通高等教育 “ 十一五 ” 国家级规划教材 JSP 内置对象.
Advertisements

第 4 章 JSP 内置对象 本章主要内容:  内置对象的概念  内置对象的作用域和生命期  内置对象的作用和关系  内置对象的使用方法.
Java Web 开发 授课人:张鸽. 第三讲 JSP 内置对象  JSP 有以下九种内置对象,包括:  ·request ,请求对象  ·response ,响应对象  ·pageContext ,页面上下文对象  ·session ,会话对象  ·application ,应用程序对象.
第 4 课 使用 JSP 处理客户端请求.  掌握 Form 表单的请求处理  掌握 JSP 常用内置对象的用法 out 对象 request 对象 response 对象 本章目标.
LOGO 第 9 章 Java Servlet 和 JSP 编程 孙焘. 重点: servlet 编程原理 1 servlet 的基础类与编程实现 2 JSP 编程原理 3 JSP 的常用语法 4.
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
JAVA 编 程 技 术 主编 贾振华 2010年1月.
第六章 网页设计与制作基础.
动态网站开发 【HTTP与网络基础】 李博杰
动态Web开发技术--JSP.
第五章. 服务器端开发技术- Servlet 对外经济贸易大学信息学院.
第一章 JSP概述.
第五章 JSP内置对象 第4章学习了页面组成元素和使用方法。本章学习JSP内置对象的使用。使用JSP内置对象,可以方便操作页面,访问页面环境,实现页面内、页面间、页面与环境之间的通讯。 学习目标 熟悉主要内置对象的概念 理解主要内置对象的作用域和生命期 理解主要内置对象的作用和关系 熟悉主要内置对象的使用方法.
7.5 其他对象 JSP 视频教学课程.
基于JSP搭建Web应用程序.
Java程序设计教程 第一讲 Java概述.
SAE Java 实际应用 在这里写上你的标题 作者名字/日期
第5章 HTML 標籤介紹.
第8讲 HTML与PHP基础 静态网页 vs. 动态网页.
张孝祥IT课堂 -深入体验Java Web开发内幕
Hello小程序的运行和编译 Java AppletJava小程序的构成 1、关键字
《Java程序设计之网络编程》 教学课件 重庆大学计算机学院
MVC Servlet与MVC设计模式.
J2EE Struts 和Spring 的区别.
全球資訊網(WWW)簡介.
Lab312.
Ch07 PHP程式基礎 網頁程式設計.
Hello World 體驗實作第一個JSP程式.
第9章 过滤器和监听器技术 过滤器(Filter)和监听器(Listener)是两种特殊的Servlet技术。过滤器可以对用户的请求信息和响应信息进行过滤,常被用于权限检查和参数编码统一设置等。监听器可以用来对Web应用进行监听和控制的,增强Web应用的事件处理能力。 本章主要介绍过滤器和监听器的编程接口、基本结构、信息配置、部署和运行,最后通过案例说明过滤器和监听器的典型应用。
第四章 網頁表單與資料傳遞.
JSP程式設計 基本概論 歐陽芳泉 Fang-Chuan Ou Yang
软件设计模式与体系结构课程设计 周 宇 College of Information Science and Technology
AJAX基础.
数据库操作示例 import java.sql.*; //导入java.sql包 public class JDBCDemo {
张孝祥IT课堂 -深入体验Java Web开发内幕
专题4:JSP脚本和指令.
专题一 Servlet技术 案例一简单计数器.
Arena System Technology Architecture 系统技术架构 1、Database V2(Lotus Notes)V3(Oracle8i) 2、Application Server SilverStream2.53 (Java as server side programming.
JSP自定义标签技术的分析与应用 ----Custom Tag 的分析与应用
2018/11/20 第一章 Java概述 武汉大学计算机学院计算机应用系 2018/11/20 14:33.
胡鹏 王慧锋 TEL: 数据库系统原理课程设计 实验环节1 胡鹏 王慧锋 TEL:
崑山科技大學資訊管理系 伺服網頁程式設計 系統開發細部流程 教師:游峰碩.
電子商務網站建制技術與實習(II) 助教:江宜政 吳昇洋.
第一章: Java Web 开发技术概述.
第六讲 JSP中的文件操作(2) 教学目的 本讲继续讲述JSP中使用Java输入、输出流实现文件的读写操作 。 1 文件上传 2 文件下载
Java语言程序设计 第五部分 Java异常处理.
第12章 JSP的檔案與電子郵件處理 12-1 伺服端的檔案處理 12-2 伺服端檔案的讀取與寫入 12-3 客戶端的檔案上傳
王豐緒 銘傳大學資訊工程學系 問題:JAVA 物件檔輸出入.
Java语言程序设计 第八部分 Applet小程序.
認識網際網路 網際網路(Internet)簡介 WWW簡介 臺灣地區網路資源 網路禮儀與規範 收發電子郵件 相關程式與服務
简单的介绍,简单的配置,简单的扩展 By jfm
DWR WEB开发交流 1、自我介绍 2、DWR概述 3、DWR DEMO介绍 4、DWR实现机制 5、DWR配置说明 6、JS开发注意事项.
第一讲 J2EE基础 博和利初级培训 —开发技能.
新世代計算機概論第三版 第11章 網際網路.
第11章 Android客户端与服务器交互.
PHP 變數、常數與運算子 變數 常數 運算子
Web前端开发 第23章:网站发布 阮晓龙 / 河南中医药大学管理科学与工程学科
Web Server 王宏瑾.
第4章 TCP/IP应用层常用协议 4.1 Telnet 协 议 4.2 文件传输协议FTP 4.3 电子邮件的工作原理及其协议
第3章 Java語法的JSP程式 3-1 Java語言的基礎 3-2 JSP程式的基本架構 3-3 Java的變數與資料型態
Ch09 在網頁之間傳遞資訊 網頁程式設計.
JSP程序设计 第9章 Servlet简介.
第十二章 过滤器.
HTTP 1.1 Method OPTIONS GET HEAD POST PUT DELETE TRACE CONNECT
第二章 Java语法基础.
第6章 PHP的数据采集.
第二章 Java基本语法 讲师:复凡.
第2章 Java语言基础.
HTML表单 JSP借由标签所构成的表单区块中,取得用户在其中特定字段输入的数据內容 。 JSP 动态网页新技术.
表单页面 表单是用户利用浏览器对Web站点网络数据库进行查询的一种界面,用户利用表单可以输入信息或选择选项等,然后将这些信息提交给服务器进行处理。通过表单,既可以将浏览器的信息发送到Internet服务器上,同时表单也可以使用户与站点的浏览者交互或从浏览者那里收集信息。它是网页的设计者和使用者相互交流的工具。表单对象包括文本域(单行、多行、密码)、列表、菜单、复选框、单选框、按钮等。
Presentation transcript:

Servlet技术

Servlet技术 要点 Http协议 Servlet基础 Servlet生命周期 Servlet API 会话管理 Filtering 2007-3 Servlet技术

B/S编程模型 B/S编程模型 Browser(客户端)(client) 客户端-服务器端通信协议:http 服务器(Server)端 代理客户发送http请求 接收服务器端响应 显示html文本 客户端-服务器端通信协议:http 服务器(Server)端 处理客户端的请求 发回http响应 http 客户机 Web 服务器 2007-3 Servlet技术

HTTP协议 简介 HTTP: HyperText Transfer Protocol,超文本传输协议,在RFC2616中定义 应用层协议,基于tcp/IP 版本:HTTP1.1 Http的缺省端口是80,ftp:20,21 2007-3 Servlet技术

HTTP协议 HTTP 通信的四个阶段 特点:无状态 1.客户机打开到服务器的连接 2. 客户机向服务器发出请求request 3. 服务器响应该请求response 4. 连接关闭 特点:无状态 2007-3 Servlet技术

HTTP协议 HTTP 通信的四个阶段 2007-3 Servlet技术 1. 连接到服务器 2. 发送请求 3. 发送响应 4. 关闭连接 客户机 Web 服务器 2007-3 Servlet技术

HTTP – 举例 URL(Uniform Resource Locator,统一资源定位符):协议名+DNS名+请求的文件名(MIME) http://www.itu.org/home/index.html 浏览器向DNS服务器询问www.itu.org 的IP地址 DNS的回复是156.106.192.163 浏览器与156.106.192.163上的80端口建立一个TCP连接 浏览器发送一个请求,要求获取文件/home/index.html www.itu.org服务器发送文件/home/index.html(服务器的响应) TCP连接被释放 浏览器显示/home/index.html中所有的文本 浏览器取回并显示该文件中的所有图片 2007-3 Servlet技术

Http请求 浏览器代理用户发出Http请求 地址栏:(get) 表单提交(post) http://www.google.cn/ http://www.google.cn/search?complete=1&hl=zh-CN&q=google&meta= 表单提交(post) 2007-3 Servlet技术

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(); 相当于: http://localhost:8080/myapp/loginValidator.jsp?UserName=tom &Password=1123456 2007-3 Servlet技术

Http请求 请求数据 请求头等:浏览器及客户端相关信息,如: 用户数据 http协议版本(1.1) 浏览器? 支持哪些类型文档类型? 支持哪些字符集? 客户机地址是多少? 用户数据 请求文件(资源) 请求参数 形式:名字=值 两种方法(method): Get Post 2007-3 Servlet技术

Http请求 Get方法与Post方法发送请求示例 Get方法示例: GET /myapp/loginValidator.jsp? UserName=tom&Password=123456 HTTP/1.1 Host: [其它请求头] BODY EMPTY Post方法示例: POST /ibm-demo/loginValidator.jsp HTTP/1.1 Host UserName=tom&Password=123456 2007-3 Servlet技术

Http请求 Get与Post方法的区别 因此: Get方法:用户数据作为 URL 中的查询字符串传递给服务器,而body中的数据为空 Post方法:用户数据在body中传输给服务器 因此: Get方法所传输的数据量有限制,Post方法则没有限制 Get方法所传输的数据在url中可见,post则不可见 2007-3 Servlet技术

Http请求 http请求小结: 通过地址栏发出的请求总是Get方法 Form表单发出的请求: Method=“Get” : Method=“Post”; 示例: <form name=“frmManage” method="get" action="loginValidator.jsp" > <form name=“frmManage” method=“post" 2007-3 Servlet技术

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技术

Http小结 http是B-S之间传输数据的协议 http请求 http响应 请求头相关 用户相关数据 响应头相关 响应数据:html文档 Get/Post方法 用户相关数据 请求资源可以是:html,jsp,servlet 输入数据 传输形式:name=value http响应 响应头相关 响应数据:html文档 2007-3 Servlet技术

动态技术 动态技术 服务器端动态处理常见技术 web服务器只能向客户提供静态的资源,但动态处理更为重要 Cgi(Common Gateway Interface):公共网关接口 PHP(HyperText Preprocessor):超文本处理器 ASP(Active Server Page):活动服务器页面 Servlet(JSP-Java Server Page):java 服务器页面 2007-3 Servlet技术

Servlet基础 Servlet技术规范 程序员所写Servlet 定义了容器功能 是一个 Java类 实现了Servlet接口 在容器上运行 请求的入口,实现业务系统功能 获取用户输入参数 完成业务功能 生成输出(响应) 2007-3 Servlet技术

Servlet基础 容器与Servlet 2007-3 Servlet技术 Web 容器 请求 Servlet 响应 客户机 数据库 http 服务器 Servlet Web 容器 2007-3 Servlet技术

Servlet基础 基于容器/Servlet的请求与响应 客户机将 HTTP 请求发送给 Web 服务器 Web 服务器将该请求转发给 Servlet容器 Servlet容器[做很多事],将请求转发给Servlet Servlet 处理该请求 Servlet产生输出发送给容器 Servlet容器将输出转为http响应发送给 Web 服务器 Web 服务器将http响应转发给客户机 浏览器根据响应显示页面 2007-3 Servlet技术

Servlet基础 Eclipse下Servlet开发示例 开发工具完成了: 在web.xml中的配置 完成了类WelcomeServlet 2007-3 Servlet技术

Servlet基础 Web.xml是web应用的部署描述文件 <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> </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技术

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>间的关系: http://localhost:8080/myapp/ servlet/WelcomeServlet <url-pattern>/*.action</url-pattern> http://localhost:8080/myapp/ a.action http://localhost:8080/myapp/b.action 2007-3 Servlet技术

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技术

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技术

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技术

Servlet基础 WelcomeServlet doGet代码分析 用户通过response(响应对象)响应客户端请求,容器根据response对象生成http响应发送给客户端 响应头 用户通过response上的一些方法设置相应头,如 response.setCharacterEncoding("gb2312"); 响应数据 用户通过下列方法 PrintWriter out = response.getWriter();获得一个out对象,通过out.print方法设置响应数据 2007-3 Servlet技术

Servlet基础 HttpServletRequest对象 示例 容器在获得http请求之后创建 是http请求的抽象与封装 获得请求头信息,用request上的一些特殊方法,如 request.getMethod() 获得用户提交数据 request.getParameter(“name”);//获得名为”name”的参数值 request.getParameterValues(“name”);//获得同名name的一组参数值 示例 2007-3 Servlet技术

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(); } http://localhost:8080/myapp/servlet/WelcomeServlet?userName=tom&userAge=18 2007-3 Servlet技术

Web 容器 web容器功能: 生成相关对象由 Servlet使用 管理 Servlet 生命周期,提供Servlet的运行环境 将响应从 Servlet 转发到 Web 服务器 2007-3 Servlet技术

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技术

Servlet基础小结 Servlet基础小结 Web.xml:部署描述文件 容器 Servlet 配置web应用,如描述了Servlet配置 容器通过它获得应用程序的配置信息 容器 管理servlet对象 调用servlet对象上的方法 Servlet 必须实现Servlet接口 在doGet/doPost方法中 通过HttpServletRequest获取用户请求信息 完成业务功能 通过HttpServletResponse作出响应 2007-3 Servlet技术

Servlet生命周期 容器管理Servlet 依据 Web.xml 接口Servlet(init() destroy() service()) 管理 创建Servlet对象 时机: 容器启动时,且配置了: <load-on-startup>1</load-on-startup> 第一次使用的时候 调用doGet doPost destroy()方法, 关闭容器时,长时间不使用 2007-3 Servlet技术

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技术

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技术

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技术

线程和Servlet 问题:多个用户并发对同一个Servlet发出请求,容器应该如何处理? 多线程,单实例(缺省方法) 多实例,单线程 Servlet需实现SingleThreadModel标志接口 具体实现 请求排队 实例池 2007-3 Servlet技术

Servlet 的类层次结构 Servlet <<接口>> GenericServlet HttpServlet 2007-3 Servlet技术

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技术

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技术

HttpServlet 类 特定于 HTTP 的 Servlet 接口实现 对于每种类型的 HTTP 请求方法,HttpServlet 类提供相应的 doXxx()方法 service方法中调用相应的doXxx()方法 程序员重写doXxx()方法 一般不重写service方法 2007-3 Servlet技术

HttpServletRequest 该类是客户端http请求信息的抽象与封装 请求头相关信息 用户相关数据信息 其它 请求资源 提交的数据 获得session对象:request.getSession()-HttpSession 获得请求分派对象 request作用域 request. setCharacterEncoding(“gb2312”); 2007-3 Servlet技术

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技术

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技术

HttpServletRequest 获得用户相关数据信息: 示例: http://localhost:8080/demo/login.jsp?name=tom&age=18 http request. getScheme() Localhost request.getServerName() request.getServerPort() /demo request.getContextPath() /login.jsp request.getServletPath(); /demo/login.jsp request.getRequesURI() http://localhost:8080/demo/login.jsp request.getRequestURL() name=tom&age=18 request.getQueryString() 2007-3 Servlet技术

HttpServletRequest 获得用户数据信息 获得用户提交数据 request.getParameter(“name”);//获得名为”name”的参数值 request.getParameterValues(“name”);//获得同名name的一组参数值,返回类型是String[] 2007-3 Servlet技术

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技术

HttpServletRequest 获得用户提交数据,其它相关方法 获得body中的数据 getParameterMap()-Map getParameterNames()-Enumeration 获得body中的数据 getReader()-BufferReader,作为字符数据 getInputStream-ServletInputStream,作为二进制数据 2007-3 Servlet技术

HttpServletRequest 获得请求分派对象 请求分派?一个请求由多个web组件完成 rquest.getRequestDispatcher(String)-RequestDispatcher 请求分派?一个请求由多个web组件完成 SeveletA,在ServletB,ServletC的帮助下,完成任务,由ServletA生成响应,include(包含) ServletA->ServletB->ServletC,由ServletC生成响应,forward(转发) 2007-3 Servlet技术

RequestDispatcher RequestDispatcher接口 include(ServletRequest,ServletResponse) forward(ServletRequest,ServletResponse) 2007-3 Servlet技术

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技术

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技术

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技术

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技术

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技术

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技术

HttpServletResponse Http状态码:用于服务器将请求的状态传送给客户机 设置状态码的方法: 100-199: 临时状态码 200-299: 请求成功 300-399:重定向 400-499:客户端错误 500-599:服务器端错误 设置状态码的方法: setStatus(int sc) HttpServletResponse中静态变量定义Http状态码: SC_OK 200 SC_MOVED_TEMPORARILY 302 SC_NOT_FOUND 404 SC_INTERNAL_SERVER_ERROR 500 2007-3 Servlet技术

HttpServletResponse 设置状态码 response.setStatus(int sc) 发送错误消息 例 response.sendError(int,String) 例 response.sendError(HttpServletResponse.SC_NOT_FOUND,”你所要查找的网页不存在!”) 2007-3 Servlet技术

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技术

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技术

HttpServletResponse 重定向 方法一: 方法二: 示例 设置状态码,如302 设置响应头:location sendRedirect 示例 response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); response.setHeader("Location","http://www.csdn.net"); response.sendRedirect("http://www.csdn.net"); 2007-3 Servlet技术

HttpServletResponse 告诉浏览器不要缓存页面 response.setHeader(“Cache-control”,”no-cache”); response.setHeader(“pragma”,”no-cache”); 2007-3 Servlet技术

HttpServletResponse 页面重新刷新 response.setIntHeader(“Refresh”,10); response.setHeader(“Refresh”,” 10 ,url=http://www.csdn.net”); 2007-3 Servlet技术

Cookie cookie 是 Web 服务器发送给客户机的一段文本信息,它存储在客户机的硬盘上,对于发送给同一服务器的后续请求,由客户机返回 服务器通过cookie的响应头将cookie发送给客户机,其形式为名称=值 客户机则以文件的形式将cookie存放在本地硬盘上,具体存储位置与浏览器相关 HTTP/1.1 200OK Set-Cookie:CustomerID=1234;domain=abc.com;path=/sales 2007-3 Servlet技术

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技术

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技术

会话管理 HTTP 协议特点:无状态协议 在线购物特点:服务器应能识别出每个客户的不同的购物车 每个客户端请求,对服务器而言都是新的 服务器不记住客户端的任何信息 这样的协议适用于在web上快速获取信息,同时,HTTP协议不支持维护客户机状态 在线购物特点:服务器应能识别出每个客户的不同的购物车 会话:<input type=“hiddent” name=“”> 会话是在指定阶段来自同一客户的一系列的HTTP请求 会话跟踪:将一个请求与会话关联的过程 会话管理:对容器要求 识别来自同一客户的请求 维护每个客户的状态 2007-3 Servlet技术

会话管理 会话应用 交互式应用程序 Web 应用程序的个性化 在线购物 个性化是指应用程序能区别对待不同的客户 2007-3 Servlet技术

会话管理技术 一般原理 常用技术 使用session进行会话管理 会话唯一标识:sessionID Cookie 隐藏表单域 url重写 <input type=“hidden” name=“sessionID” value=“…”/> url重写 http://localhost:8080/myapp/ServletA?sessionID=...... 使用session进行会话管理 2007-3 Servlet技术

Session对象 通过request对象获取Session对象 HttpSession session = request.getSession(); 容器: 1、Servlet通知容器,它需要Session对象; 2、容器创建sessionID,它是客户这次会话的唯一标识; 3、容器创建HttpSession对象,Servlet获得这个对象 2007-3 Servlet技术

容器进行的会话管理 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技术

会话超时阶段 定义:来自参与会话的客户机的两个连续请求之间的最长允许空闲时间称为会话超时阶段 <session-config> <session-timeout>10</session-timeout> </session-config> session.setMaxInactiveInterval(10); 2007-3 Servlet技术

HttpSession 接口 Session接口 setAttribute(String, Object) getAttribute(String) getID(); getMaxInactiveInterval() setMaxInactiveInterval(int) isNew() invalidate() getAttributeNames() -Enumeration removeAttribute(String name) 2007-3 Servlet技术

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技术

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技术

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技术

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技术

filtering(本部分尚需完善和领悟) Filtering是Servlet2.3以上版本的特性 主要内容: Filtering的基本思想 Filtering API Filtering的实现 2007-3 Servlet技术

基本思想 Filtering的基本思想: 将jsp,servlet,html看作资源,容器用来处理这些资源,并为资源提供服务 因此,可以在处理这些资源之前或之后,通过过滤器增加一些通用功能;比如: 拦截请求头:安全认证,日志 数据转换:加密,解密 抢占特殊资源的服务:缓存 而且这些过滤器可以形成一个链 2007-3 Servlet技术

基本思想 将jsp,servlet,html看作资源 2007-3 Servlet技术

基本思想 Filtering构成处理链 2007-3 Servlet技术

接口:javax.servlet.Filter 接口:javax.servlet.FilterChain filtering API 接口:javax.servlet.Filter 接口:javax.servlet.FilterChain 接口:javax.servlet.FilterConfig 2007-3 Servlet技术

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技术

filtering API FilterChain接口 public void doFilter(ServletRequest request, ServletResponse response) throws java.io.IOException, ServletException 2007-3 Servlet技术

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技术

filtering 实现 创建filter 第一步:创建一个类,实现javax.servlet.Filter接口 第二步:配置web.xml文件 2007-3 Servlet技术

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技术

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技术

Filtering示例 URL模式 URL模式 含义 /* 根路径下的所有资源 /servlet/* /servlet路径下的所有资源 /jsp/*.jsp /jsp路径下的所有jsp页面 /dept/accounting/* /dept/accounting/路径下的所有资源 2007-3 Servlet技术

事件模型 事件:java.util.EventObject 事件侦听程序: 事件源: getSource()-Object (标志)接口:java.util.EventListener 实现listener接口 事件源: 注册侦听程序 触发事件侦听程序 生成事件对象 调用已注册的侦听程序,处理事件 教师笔记 彻底讨论委派事件模型。给出 AWT 按钮作为示例。 转换说明:我们将继续讨论事件。 2007-3 Servlet技术

HttpSessionListener 事件(类):HttpSessionEvent 侦听器(接口):HttpSessionListener getSession 侦听器(接口):HttpSessionListener sessionCreated(HttpSessionEvent se) sessionDestroyed(HttpSessionEvent se) 2007-3 Servlet技术

HttpSessionListener 示例 实现接口HttpSessionListener 注册侦听 在web.xml中注册侦听程序 <listener> <listener-class> servlet.OnlineCounterListener </listener-class> </listener> 2007-3 Servlet技术

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技术

HttpSessionListener 测试: <% out.println("onlineCount:"+OnlineCounter.getOnline()); %> 2007-3 Servlet技术

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技术

小结 Web应用 web容器 Web.xml Servlet Servlet API 2007-3 Servlet技术

小结 web应用程序 B/S模型 是Servlet、JSP、Html、JPG、Class、Jar、Css、Js等的集合 Web应用目录结构 根(WebRoot) WEB-INF web.xml classes lib Web应用发布:.war文件拷贝到容器的相关目录 2007-3 Servlet技术

小结 Web容器 管理Servlet对象 创建相关对象: 发布目录 HttpServletRequest, HttpServletResponse ServletConfig 发布目录 Tomcat的webapps目录下 可以是目录形式 2007-3 Servlet技术

小结 Web.xml <servlet><servlet-mapping> <filter><filter-mapping> <listener> 其它 2007-3 Servlet技术

小结 Servlet 实现了Servlet接口的java类 在容器中运行,完成业务功能,一般作为控制器 一般要实现doGet或doPost方法 在容器中运行,完成业务功能,一般作为控制器 2007-3 Servlet技术

小结 Servlet API ServletConfig对象 Request对象 RequestDispatcher对象 Response对象 Session对象 其它 Filter Servlet事件 2007-3 Servlet技术