• 1. 1.Servlet/jsp概述1.1Servlet功能 Servlet是web服务器内的JAVA程序,它是一个中间层,负责处理来自浏览器/Http client程序的数据。
  • 2. (1)读取客户发送的显示数据,如HTML中表单数据 的读取; (2)读取由浏览器发送的隐式数据,如cookie; (3) 处理和产生结果; (4) 向客户发送显示数据; (5) 发送隐式Http响应数据;
  • 3. 1.2 Servlet代码特性 (1)它是普通的JAVA代码。 (2)继承与类HttpServlet。 (3)通常覆盖如doGet或doPost来处理请求。 如:一个向浏览器显示”Hello,world”的Servlet类HelloWorldservlet.java public class HelloWorld extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=gbk"); PrintWriter out=response.getWriter(); out.println("
    "); out.println("Hello,World!"); out.println("
    "); out.close(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
  • 4. (4)编辑/WebRoot/WEB-INF/web.xml文件,加入 HelloWorldServlet com.runwit.servlet.HelloWorldServlet HelloWorldServlet /helloWorldServlet (5)在浏览器中输入:http://localhost:8080/helloWorldServlet访问 (6)显示结果:
  • 5. Servlet配置详解 配置例子:
  • 6. Servlet配置详解 Servlet-name: 自定义的Servlet名字,唯一. Servlet-class: 具体的servlet处理java类, 通常继承于HttpServlet init-param: 初始参数,可以在servlet类中得到和使用.可以配置多个init-param. Load-on-startup: 一个>=0的数字,在web 启动的时候扫描所有servlet, 根据数字大小的先后次序依次初始化servlet. 如果不配置,则到用户第一次通过URL访问到该Servlet的时候再初始化. Uri-pattern: 用户访问的URL格式, 如果匹配,则交由该Servlet处理. (uri-pattern的详细格式规范和匹配规则见后页.
  • 7. uri-pattern的合法格式: 1、路径映射: 以”/’开头和以”/*”结尾的是用来做路径映射的。 2、扩展映射: 以前缀”*.”开头的是用来做扩展映射的。 3、默认映射:“/” 是用来定义default servlet映射的。 4、详细映射:剩下的都是用来定义详细映射的。比如: /loginServlet 、 /login/login.do注意: /abc/*.do : 该格式非法, 因为既属于路径映射, 又属于扩展映射,容器无法识别。
  • 8. Servlet容器对uri-pattern的匹配过程当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url , 然后进行以下顺序的匹配: 1、精确路径匹配 用户url: http://localhost:8080/runwit/login.do 假设servlet-mapping中有两个uri-pattern: *.do, /login.do, 则交由后者处理。 2、最长路径匹配 用户URL: /runwit/books/admin/login.do uri-pattern: /books/*, /books/admin/*, 则交由后者处理
  • 9. Servlet容器对uri-pattern的匹配过程3、扩展匹配 如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。 4、如果前面三条规则都没有找到一个servlet,容器会根据url选择对应的请求资源。如果应用定义了一个default servlet,则容器会将请求丢给default servlet
  • 10. 1.3 Servlet优点 (1)效率高 对每个请求用轻量级的JAVA线程来处理。 (2)API的功能强大。 (3)可移植性。 (3)廉价。
  • 11. 1.4 JSP技术 Servlet:含有html代码的java程序。 Jsp:含有Java代码的Html页面。 Jsp本质上是Servlet. 需要先翻译成Servlet,即产生.java文件,再编译成.class 文件执行。 当输出结果中含有大量Html代码时,建议使用Jsp,Jsp注 重Html代码的创建和维护。
  • 12. 2.Servlet基础2.1Servlet继承结构 Servletdestroy()service()init()GenericServletHttpServlet 重写service() service()中根据请求类型分别调用doGet(), doPost()等方法;(1) doGet()/doPost()方法参数; HttpServletRequest:获取客户端请求; HttpServletResponse:响应客户端请求;
  • 13. 2.2 Servlet生命周期 Servlet有良好的生存期的定义,包括如何加载、实例化、初始化、处理客户端请求以及如何被移除。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。 (1)加载和实例化 容器负责加载和实例化一个servlet。实例化和加载可以发生在引擎启动的时候,也可以推迟到容器需要该servlet为客户请求服务的时候。 首先容器必须先定位servlet类,在必要的情况下,容器使用通常的Java类加载工具加载该servlet,可能是从本机文件系统,也可以是从远程文件系统甚至其它的网络服务。容器加载servlet类以后,它会实例化该类的一个实例。需要注意的是可能会实例化多个实例,例如一个servlet类因为有不同的初始参数而有多个定义,或者servlet实现SingleThreadModel而导致容器为之生成一个实例池。
  • 14. (2) 初始化 servlet加载并实例化后,容器必须在它能够处理客户端请求前初始化它。初始化的过程主要是读取永久的配置信息,昂贵资源(例如JDBC连接)以及其它仅仅需要执行一次的任务。通过调用它的init方法并给它传递唯一的一个(每个servlet定义一个)ServletConfig对象完成这个过程。给它传递的这个配置对象允许servlet访问容器的配置信息中的名称-值对(name-value)初始化参数。这个配置对象同时给servlet提供了访问实现了ServletContext接口的具体对象的方法,该对象描述了servlet的运行环境。
  • 15. (3)处理请求 在servlet被适当地初始化后,容器就可以使用它去处理请求了。每一个请求由ServletRequest类型的对象代表,而servlet使用ServletResponse回应该请求。这些对象被作为service方法的参数传递给servlet。在HTTP请求的情况下,容器必须提供代表请求和回应的HttpServletRequest和HttpServletResponse的具体实现。需要注意的是容器可能会创建一个servlet实例并将之放入等待服务的状态,但是这个实例在它的生存期中可能根本没有处理过任何请求。
  • 16. (4)服务结束 容器没有被要求将一个加载的servlet保存多长时间,因此一个servlet实例可能只在容器中存活了几毫秒,当然也可能是其它更长的任意时间(但是肯定会短于容器的生存期) 当容器决定将之移除时(原因可能是保存内存资源或者自己被关闭),那么它必须允许servlet释放它正在使用的任何资源并保存任何永久状态(这个过程通过调用destroy方法达到)。容器在能够调用destroy方法前,它必须允许那些正在service方法中执行的线程执行完或者在服务器定义的一段时间内执(这个时间段在容器调用destroy之前)。一旦destroy方法被调用,容器就不会再向该实例发送任何请求。如果容器需要再使用该servlet,它必须创建新的实例。destroy方法完成后,容器必须释放servlet实例以便它能够被垃圾回收。
  • 17. 2.3 SingleThreadModel接口 通常情况,Servlet实例只有一个,实现SingleThreadModel接口,为每一个客户请求生成一个实例。
  • 18. HttpServletRequest方法表5-4 取得请求参数的方法 String getParameter(String name) 取得name的参数值 Enumeration getParameterNames( ) 取得所有的参数名称 String [ ] getParameterValues (String name)取得所有name的参数值 Map getParameterMap( )取得一个要求参数的Map
  • 19. 取得请求标头的方法 String getHeader(String name) 取得name的标头 Enumeration getHeaderNames( ) 取得所有的标头名称 Enumeration getHeaders (String name) 取得所有name的标头 int getIntHeader (String name) 取得整数类型name的标头 long getDateHeader (String name) 取得日期类型name的标头 Cookie [ ] getCookies( ) 取得与请求有关的cokies
  • 20. 其他请求的方法方法说明String getContextPath( )取得Context路径(即站台名称)String getMethod( )取得HTTP的方法 (GET、POST)String getProtocol( )取得使用的协议(HTTP/1.1、HTTP/1.0)String getQueryString ( )取得请求的参数字符串,不过,HTTP 的方法必须为GETString getRequestedSessionId( )取得用户端的Session IDString getRequestURI( )取得请求的URL,但是不包括请求的参数字符串String getRemoteAddr( )取得用户的IP地址String getRemoteHost( )取得用户的主机名称int getRemotePort( )取得用户的主机端口
  • 21. 3 Servlet响应HttpServletResponse响应常用状态码 404 : 找不到页面 302 : 重定向 200 : OK! 500 : 服务器内部错误 状态码设置 通常状态码无需设置, 服务器自动生成, 默认为200, 表示一切OK.
  • 22. 3 Servlet响应HttpServletResponse状态码设置 设置代码: response.setStatus(404); //则页面无法找到 重定向: 通过设置状态码和响应头来实现 response.setStatus(302); response.setHeader(“Location”, “http://www.163.com”); response提供的快捷方法 response.sendRedirect(“http://www.163.com”);
  • 23. 3 Servlet响应HttpServletResponse通过响应头设置让客户端浏览器不缓存网页. 设置代码: response.setHeader(“Cache-Control”, “no-cache”); response.setHeader(“Progma”, “no-cache”); //兼容老版本浏览器 定时刷新网页. response.setIntHeader(“Refresh”, 5); //每5秒 //5秒后跳转到另外网页xxx response.setHeader(“Refresh”, “5;xxx”);
  • 24. 3 Servlet响应HttpServletResponse状态码设置 设置代码: response.setStatus(404); //则页面无法找到 重定向: 通过设置状态码和响应头来实现 response.setStatus(302); response.setHeader(“Location”, “http://www.163.com”); response提供的快捷方法 response.sendRedirect(“http://www.163.com”);
  • 25. 4 Cookie管理4.1 Cookie是什么 Cookie是Web服务器发送给浏览器的一小段文本信息. 这小段文本信息保存在客户机浏览器缓存中或者客户机磁盘上. 之后当访问同一网站的时候, 可以将该文本信息传回原先的网站.
  • 26. 4 Cookie管理4.2 Cookie优点与作用 在电子商务会话中标识用户 记录用户名,密码等信息. 定制站点,记录用户偏好 定向广告
  • 27. 4 Cookie管理4.3 Cookie的缺点 Cookie不对客户机造成重大威胁, 但有可能暴露用户隐私. 浏览器可以禁用Cookie Cookie文本信息的大小, 数量受到一定限制.
  • 28. 4.4 删除Cookie IE当中的删除: 工具->Internate 选项 ->常规选项卡-> 删除Cookie...
  • 29. 4 Cookie管理4.5 向客户端发送Cookie 步骤: 创建Cookie对象(javax.servlet.http.Cookie) 设置Cookie最长存在时间 将Cookie放入到Http响应头中. 代码示范: Cookie c = new Cookie(“userID”, “1234”); c.setMaxAge(60*60*24*7); //保存一周 response.addCookie(c);
  • 30. 4 Cookie管理4.6 从客户端发读取Cookie 步骤: 调用request.getCookies, 得到Cookie[ ] 循环读取数组, 对每个对象应用getName, getValue分别读取键, 值对. 代码示范: 读取名称为userId的值 String userId = “”; Cookie[] cookies = request.getCookies(); for(int i=0; i
  • 31. 4 Cookie管理4.7 Cookie常用属性 Cookie注释信息: void setComment(String s) String getComment() 域信息 void setDomain(String s) String getDomain() 注意: Cookie不能跨域共享, 但可以跨主机共享. 如: 默认情况下: bbs.runwit.com所设置的Cookie可以被bbs.runwit.com所读取. 但不能被www.runwit.com所读取, 通过设置setDomain(“.runwit.com”), 可以被两个都读取,即跨主机共享. 但若setDomain(“.163.com”)就不可以被163读取, 即不能跨域共享. 设置指定域名的规则: 以点号开始, 必须包含有2个或3个点号. 最长存活时间 void setMaxAge(int lifetime) int getMaxAge()
  • 32. 4 Cookie管理4.7 Cookie常用属性 最长存活时间 void setMaxAge(int lifetime) int getMaxAge() 注意:如果创建完Cookie后不调用setMaxAge, 则Cookie仅存在浏览器缓存中,即关闭浏览器后消失,不保存到客户机磁盘. 读取Cookie名称 String getName() 注意: 没有setName方法,name由构造函数传入 Cookie值 String getValue() void setValue(String cookieValue)
  • 33. 4 Cookie管理4.7 Cookie常用属性 最长存活时间 void setMaxAge(int lifetime) int getMaxAge() 注意:如果创建完Cookie后不调用setMaxAge, 则Cookie仅存在浏览器缓存中,即关闭浏览器后消失,不保存到客户机磁盘. 读取Cookie名称 String getName() 注意: 没有setName方法,name由构造函数传入 Cookie值 String getValue() void setValue(String cookieValue)
  • 34. 4 Cookie管理4.7 Cookie常用属性 设置路径 void setPath(String s) String getPath() 注意:默认情况下某路径下设置的Cookie3只能被当前路径下的文件读取. 通过设置 setPath(“/”) 可以使Cookie在当前Web应用中共享.
  • 35. 5 Session管理Session对象在第一个jsp页面被装载时自动创建,完成会话期管理。当用户第一次登陆网站时,服务器端的JSP引擎将为该用户生成一个独一无二的Session对象。用以记录该用户的个人信息,一旦该用户退出网站,那么属于他的Session对象将会注销。Session对象可以绑定若干个人信息或者Java对象。如果不同Session对象内部定义了相同的变量名,那么这些同名变量是不会相互干扰的。需要说明的是,session对象中所保存和检索的信息不能是基本数据类型,必须是Java语言中相应的Object对象。下面我们给大家介绍session对象中所包含的方法。   l setAttribute(String key, Object obj):该方法实现将参数obj所指定的对象添加到session对象中,并为添加的对象指定一个索引关键字。索引关键字的指由参数key确定。 l getAttribute(String name):该方法实现从session对象中提取由参数name指定的对象。若该对象不存在,将返回null。 l getattributeNames(): 该方法返回session对象中存储的第一个对象,结果集是一个Enumeration类的对象。我们可以使用nextElements()来遍历session中的全部对象。 getCreationTime():该方法将返回创建session对象的时间,以毫秒为单位从1970年1月1日起计数。
  • 36. l         getId():每生成一个session对象,服务器都会给其分配一个独一无二的编号,该方法将返回当前session对象的编号。 l         getLastAccessedTime():该方法将实现返回当前session对象最后1次被操作的时间,即1970年1月1日起至今的毫秒数。 l         getMaxInactiveInterval():该方法将获得session对象的生存时间,单位为秒。 l         removeAttribute(String name):该方法将实现从session中删除由参数name所指定的对象。 l         isNew(): 该方法判断是否是一个新的用户。如果是返回true,否则为false。
  • 37. Servlet过滤器-- Filter过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息 Servlet 2.3规范加入过滤器
  • 38. Servlet过滤器-- Filter过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息
  • 39. 过滤器开发配置步骤 1)建立一个实现Filter接口的类。这个类需要三个方法,分别是:doFilter、init和destroy。        doFilter方法包含主要的过滤代码(见第2步),init方法建立设置操作,而destroy方法进行清楚。 2)在doFilter方法中放入过滤行为。doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息(包括表单数据、cookie和HTTP请求头)的完全访问。第二个参数为ServletResponse,通常在简单的过滤器中忽略此参数。最后一个参数为FilterChain,如下一步所述,此参数用来调用servlet或JSP页。 3)调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作为它的一个参数。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被激活。 4)对相应的servlet和JSP页面注册过滤器。在部署描述符文件(web.xml)中使用filter和filter-mapping元素。
  • 40. 过滤器实例字符编码过滤器 处理所有的request编码 登录过滤器 通过配置实现过滤功能
  • 41. Servlet 监听器Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。
  • 42. 常用Servlet 监听器ServletContextListener 用于监听WEB 应用启动和销毁的事件,监听器类需要实现javax.servlet.ServletContextListener 接口。 ServletContextAttributeListener 用于监听WEB应用属性改变的事件,包括:增加属性、删除属性、修改属性,监听器类需要实现javax.servlet.ServletContextAttributeListener接口 HttpSessionListener 用于监听Session对象的创建和销毁,监听器类需要实现javax.servlet.http.HttpSessionListener接口或者javax.servlet.http.HttpSessionActivationListener接口,或者两个都实现。
  • 43. 常用Servlet 监听器HttpSessionActivationListener 用于监听Session对象的钝化/活化事件,监听器类需要实现javax.servlet.http.HttpSessionListener接口或者javax.servlet.http.HttpSessionActivationListener接口,或者两个都实现。 HttpSessionAttributeListener 用于监听Session对象属性的改变事件,监听器类需要实现javax.servlet.http.HttpSessionAttributeListener接口。
  • 44. Servlet 监听器实例HttpSessionActivationListener 用于监听Session对象的钝化/活化事件,监听器类需要实现javax.servlet.http.HttpSessionListener接口或者javax.servlet.http.HttpSessionActivationListener接口,或者两个都实现。 HttpSessionAttributeListener 用于监听Session对象属性的改变事件,监听器类需要实现javax.servlet.http.HttpSessionAttributeListener接口。
  • 45. Servlet 监听器实例动手开发配置ServletContextListener