java高级培训 (8).ppt_第1页
java高级培训 (8).ppt_第2页
java高级培训 (8).ppt_第3页
java高级培训 (8).ppt_第4页
java高级培训 (8).ppt_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第八课,Servlet,Author: huangjy Email:,本课内容,Servlet概述 Servlet的基本概念 Servlet和JSP的区别 Servlet的生命周期 Servlet基本方法 经典设计模式 会话跟踪,Author: huangjy Email:,Servlet的基本概念,Servlet是服务器端的Java小程序,用于响应客户机的请求。在默认情况下,Servlet采用一种无状态的请求-响应处理方式。 Servlet一般会把处理的结果以HTML的形式返回,在客户端形成动态网页。 在Servlet API中提供了大量的方法,供编写Servlet时调用。 关于Servle

2、t API的内容,请参照SUN J2EE帮助文档,Author: huangjy Email:,Servlet 的工作内容,读取客户端显式传递来的数据(form data) 读取客户端隐式传递来的数据(request header) 生成结果 向客户端发送显式数据(html) 向客户端发送隐式数据(response header,状态号等),Author: huangjy Email:,Servlet和JSP的区别,一个网络项目至少分为三层:数据层、业务逻辑层和表现层。 数据层通过数据库保存数据; 业务逻辑层用来完成数据计算、数据分析、数据库连接等处理工作; 表现层用来完成HTML页面的输出。

3、 Servlet和JSP的区别是: JSP更加注重页面的表现,而Servlet更注重业务逻辑的实现,且编写Servlet较难; 同时,JSP只能处理浏览器的请求,而Servlet还可以处理客户端的应用程序请求, 可以认为Servlet加强了Web服务器的功能。,Author: huangjy Email:,Servlet的生命周期,Servlet的生命周期分为初始化、处理客户端的请求和销毁三个阶段。 当服务器装载一个Servlet的时候,服务器创建一个Servlet实例并且调用Servlet的init()方法。在初始化阶段,Servlet初始化参数被传递给Servlet配置对象。 在服务器装载

4、和初始化Servlet后,服务器会创建特定的“请求”对象和一个“响应”对象。服务器调用Servlet的service()方法,用于传递“请求”和“响应”对象。service()方法从“请求”对象获得请求信息,处理该请求并用“响应”对象的方法将响应返回客户端。service()方法可以调用其它方法来处理请求,例如doGet()、doPost()等方法。 如果服务器不再需要或重新装入Servlet实例时,服务器会调用Servlet的destroy()方法以终止请求。,Author: huangjy Email:,Servlet基本方法,主要介绍javax.servlet.http提供的HTTP S

5、ervlet应用编程接口,包含init()、destroy()、service()等方法 。 init() 在Servlet的生命周期中,init()方法仅执行一次。它是在服务器装入Servlet时执行的。 缺省的init()方法通常是符合要求的,但也可以对其重写,典型的做法是在该方法中编写代码管理服务器端资源。缺省的init()方法设置了Servlet的初始化参数,并用它的ServletConfig对象参数来启动配置,因此所有重写init()方法的Servlet应调用super.init()以确保执行这些任务。在调用service()方法之前,应确保已完成了init() 方法。 servic

6、e() service()方法是Servlet的核心。每当客户端请求一个Servlet实例时,该实例的service()方法就会被调用。缺省的是调用与HTTP请求方法相应的do功能。如果HTTP请求方法是GET,则缺省情况下调用doGet()方法;如果HTTP请求方法是POST,则缺省情况下调用doPost()方法。 destroy() destroy()方法只执行一次,即在服务器停止并卸载Servlet时被调用。缺省的destroy()方法通常是符合要求的,但也可以重写,典型的例子是管理服务器端的资源。,Author: huangjy Email:,我的第一个Servlet,文件名称:Sim

7、pleServlet.java import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class SimpleServlet extends HttpServlet public SimpleServlet()super(); /重写doPost方法 public void doPost(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException res.setContentType(

8、text/html); / 首先设置头信息 PrintWriter out = res.getWriter();/ 用 writer方法返回响应数据 out.println(); out.println(+ The first Servet,So simple!);,Author: huangjy Email:,我的第一个Servlet,out.println(You can see that this output is from the SimpleServlet.); out.println(); out.close(); /重写doGet方法 public void doGet(Htt

9、pServletRequest req, HttpServletResponse res)throws ServletException,IOException doPost(req,res); 将编译后的字节码文件复制到Tomcat目录下的“webappsmyjspWEB-INFclasses”目录。,Author: huangjy Email:,Servlet基本方法,Servlet需继承javax.servlet.http.HttpServlet类。 Servlet需重写父类javax.servlet.http.HttpServlet的相应方法,常用处理HTTP请求的方法有: (1)do

10、Get()方法:响应客户端的Get请求 (2)doPost():响应客户端的Post请求 提示: 在客户端的浏览器中,如果form中提交的信息量较小,可以采用GET方式提交,当数据量较大时,需采用POST方式提交,否则,可能造成数据的丢失。 编译后的Servlet只被装载一次,因此,当源程序修改并编译后,需重新启动Tomcat。 Servlet类的修饰符必须为public。,Author: huangjy Email:,为什么不应该覆盖service方法,之后可以通过加入doPut,doTrace等支持其他服务。 通过添加getLastModified方法,就可以支持修改日期。 service

11、方法自动提供下述支持: HEAD请求 OPTIONS请求 TRACE请求 其他方案:让doPost调作doGet,Author: huangjy Email:,使用小结,主要的servlet代码都在doGet或doPost中: HttpServletRequest包含输入信息 HttpServletResponse允许我们设置发送出去的信息 调用setContentType指定MIME类型 调用getWriter获取针对客户的Writer 一次性的设置代码放在init中 servlet仅仅初始化并载入一次 servlet被多次调用 初始化参数在web.xml中设定,Author: huangj

12、y Email:,运行和修改Servlet时的注意事项,运行和修改Servlet时的注意事项: 在Tomcat和WTP环境下, 是自动重新加载的 其他服务器, 或者Tomcat正式环境下, 有可能不是自动加载的, 主要是出于性能和安全的考虑.,Author: huangjy Email:,Servlet和Web页面的简单交互,范例名称:使用Servlet和Web页面进行交互 文件名称:TestServlet.htm Test HTML 请输入姓名: 您的兴趣: ,Author: huangjy Email:,Servlet和Web页面的简单交互,Sleep Dance Travel 将该文件复

13、制到Tomcat的“webappsmyjsp”目录下,然后,通过浏览器访问如下地址: http:/localhost:8080/myjsp/TestServlet.htm,Author: huangjy Email:,Servlet和Web页面的简单交互,文件名称:TestServlet.java import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class TestServlet extends HttpServlet /重写doPost方法 public void doPost(Htt

14、pServletRequest req, HttpServletResponse res) throws ServletException, IOException res.setContentType(text/html); PrintWriter out = res.getWriter(); out.println(); out.println(name: + req.getParameter(myname);,Author: huangjy Email:,Servlet和Web页面的简单交互,out.println(); out.println(love: + req.getParame

15、ter(love); out.println(); out.close(); /重写doGet方法 public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException,IOException doPost(req,res); 编译Servle并将编译后的Servlet字节码文件TestServlet.class复制到Tomcat的“myjspWEB-INFclasses”目录下。,Author: huangjy Email:,从JSP到Servlet的信息传递,范例名称:JSP页面

16、和Servlet之间的信息传递 文件名称:FromJspToServlet.jsp 通过jsp:forward动作将页面转向了上节编写的Servlet,Author: huangjy Email:,从Servlet到JSP的信息传递,在Servlet中,通过以下语句将信息由Servlet传递到了JSP: request.setAttribute (servletName, servletToJsp); 注意:应将Servlet字节码文件和JSP文件分别放置在不同的目录下 在该范例中 ,将编译后的Servlet复制到Tomcat目录的“webappsmyjspWEB-INFclasses”目录下

17、,将hello.jsp复制到Tomcat目录下的“webappsmyjsp”目录。 重新启动Tomcat,访问如下地址: http:/localhost:8888/myjsp/servlet/servletToJsp,Author: huangjy Email:,从Servlet到JSP的信息传递,文件名称:servletToJSP.java import javax.servlet.*; import javax.servlet.http.*; public class servletToJsp extends HttpServlet public void doGet (HttpServl

18、etRequest request, HttpServletResponse response) try / Set the attribute and Forward to hello.jsp request.setAttribute (servletName, servletToJsp); getServletConfig().getServletContext().getRequestDispatcher(/MyServlet/01/hello.jsp).forward(request, response); catch (Exception ex) ex.printStackTrace

19、 (); ,Author: huangjy Email:,从Servlet到JSP的信息传递,文件名称:hello.jsp Servlet使用JSP Servlet使用JSP的例子: 这个页面是被 这个Servlet调用的. ,Author: huangjy Email:,经典设计模式,模式一:JSP + JavaBean模式 模式二:MVC模式,Author: huangjy Email:,模式一:JSP + JavaBean模式,在前面章节中一直采用了这种模式,在该模式中,JSP页面响应请求并将处理结果返回客户,所有的数据库操作和复杂业务逻辑操作通过JavaBean来实现。 使用此模式,常

20、会导致在JSP页面中嵌入较多的Java代码,当需要处理的商业逻辑非常复杂时,情况就会变得很糟糕。大量的Java代码使得JSP页面变得非常臃肿,前端的页面设计人员稍有不慎,就有可能破坏有关商业逻辑的代码。 这种模式只适用于中小规模的项目。,Author: huangjy Email:,模式二:MVC模式,“MVC”模式即是:“Model-View-Controller”模式。 Servlet充当了控制器(Controller即“C”)的角色,负责响应客户对业务逻辑的请求并根据用户的请求行为,决定将调用的JSP页面。 JSP页面处于表现层,也就是视图(View即“V”)的角色。 JavaBean负

21、责数据的处理,也就是模型(Model即“M”)的角色。 在开发中,采用模式二,可以具有更清晰的逻辑划分,能够有效的区分不同的角色,避免彼此间的互相影响,充分发挥每位开发人员的特长。 该模式在开发大型项目时表现出的优势尤其突出。,Author: huangjy Email:,会话跟踪,为什么要进行会话跟踪 当客户在在线商店中向他们的购物车中添加商品时,服务器如何才能知道购物车中已经有什么商品了呢? 当客户决定结账时,服务器如何能够确定客户对应之前创建的哪个购物车呢?,Author: huangjy Email:,会话跟踪的三种实现,进行会话跟踪:cookie 进行会话跟踪:URL重写 进行会话跟

22、踪:隐藏的表单域,Author: huangjy Email:,进行会话跟踪:cookie, 思想:把cookie与服务器上的数据关联起来 String sessionID = makeUniqueString(); HashMap sessionInfo = new HashMap(); HashMap globalTable = findTableStoringSessions(); globalTable.put(sessionID, sessionInfo); Cookie sessionCookie = new Cookie(JSESSIONID, sessionID); respo

23、nse.addCookie(sessionCookie); 接下来要做的是: 提取出存储会话标识符的cookie 为cookie设置合适的过期时间 将散列表与每个请求关联起来 生成唯一的会话标识符,Author: huangjy Email:,进行会话跟踪:URL重写, 思想 客户程序在每个URL的尾部添加一些额外的数据来标识会话 服务器将这个标识符与它所存储的有关会话的数据关联起来 例如,http:/host/path/file.jsp;jsessionid=1234 优点 cookie被禁用或者根本不支持的情况下依旧能够工作 缺点 必须对所有指向您的网站的URL进行编码 所有页面必须动态生

24、成 不能使用预先记录下来的URL进行访问,或者从其他网站链接进行访问,Author: huangjy Email:,进行会话跟踪:隐藏的表单域, 思想: 优点 cookie被禁用或者根本不支持的情况下依旧能够工作 缺点 涉及许多冗长的处理工作 所有的页面必须是表单提交之后的结果,Author: huangjy Email:,Java的会话跟踪, 会话对象生存于服务器上 会话自动通过cookie或URL重写与客户关联起来 使用request.getSession来得到会话 后台:系统检查cookie或附加在URL上的额外信息,看看是否与之前存储的会话对象的键相匹配。如果匹配,它返回该对象,如果不

25、匹配,则创建新的对象,指定一个cookie或URL信息作为它的键,并返回新创建的会话对象。 类散列表机制允许我们将任何对象存储到会话中 setAttribute存储值 getAttribute读取值,Author: huangjy Email:,会话跟踪基础, 访问会话对象 调用request.getSession获取HttpSession对象 这是一个与用户相关联的散列表 查找与会话相关联的信息 调用HttpSession对象的getAttribute,将返回的值转换成合适的类型,要注意检查结果是否为null。 将信息存入会话 使用setAttribute给出相应的键和值。 废弃会话数据 调

26、用removeAttribute废弃指定的值。 调用invalidate废弃整个会话。 调用logout 将客户从Web/应用服务器注销。,Author: huangjy Email:,会话跟踪基础:示例代码,HttpSession session = request.getSession(); SomeClass value = (SomeClass)session.getAttribute(someID); if (value = null) value = new SomeClass(.); session.setAttribute(someID, value); doSomething

27、With(value); 如果被修改的值为同一对象,(在对值做出修改后)不需要再次调用setAttribute。但是,如果值是不可变的,那么修改后的值将会是新对象的引用,我们必须再次调用setAttribute。,Author: huangjy Email:,如果服务器使用URL重写有哪些变化?, 会话跟踪代码: 没有变动 生成链接到同一网站的超链接的代码: 将URL传给response.encodeURL处理。 如果服务器使用cookie,它原封不动地返回URL。 如果服务器使用URL重写,它将会话信息附加到URL上。 例如: String url = order-page.html; ur

28、l = response.encodeURL(url); sendRedirect到自己网站的代码: 将URL传递给response.encodeRedirectURL,Author: huangjy Email:,HttpSession的方法, getAttribute 从会话对象中提取出一个之前存储的值。如果没有找到与给定名称相关联的值,则返回null。 setAttribute 把值与名称关联起来。更改的监控:让值实现HttpSessionBindingListener。 removeAttribute 移除与名称关联的值。 getAttributeNames 返回会话中所有属性的名称。

29、 getId 返回惟一的标识符。,Author: huangjy Email:,HttpSession的方法, isNew 确定会话对于客户(不是针对页面)来说是否为新创建的 getCreationTime 返回会话初次创建的时间 getLastAccessedTime 返回客户端最近一次发送会话的时间 getMaxInactiveInterval, setMaxInactiveInterval 取得或设置在未被访问的情况下多长时间应该将会话置为无效 invalidate 废弃当前的会话 logout 废弃与用户相关联的所有会话,Author: huangjy Email:,显示客户访问计数的

30、servlet,public class ShowSession extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException response.setContentType(text/html); HttpSession session = request.getSession(); String heading; Integer accessCount =(Integer)session.

31、getAttribute(accessCount); if (accessCount = null) accessCount = new Integer(0); heading = Welcome, ; else heading = Welcome Back; accessCount = new Integer(accessCValue() + 1); session.setAttribute(accessCount, accessCount); out.println (docType + n + ,Author: huangjy Email:,显示客户访问计数的servle

32、t,PrintWriter out = response.getWriter(); out.println (docType + n + + title + n + n + n + + heading + n + Information on Your Session:n + n + n + Info TypeValuen + Number of Previous Accessesn + + accessCount + n + n + );,Author: huangjy Email:,进行会话跟踪小结, 会话并不跨网络传递 传递的只是唯一标识符 获取会话 request.getSession

33、 从会话中提取数据 session.getAttribute 进行类型转换,并注意检查结果是否为null 将数据存入会话 session.setAttribute,Author: huangjy Email:,Filter 工作原理,Author: huangjy Email:,编写filter,实现类必须实现javax.servlet.Filter 接口,其中包含三个方法: void init(FilterConfig config) throws ServletException:这是容器所调用的初始化方法。它保证了在第一次 doFilter() 调用前由容器调用。它能获取在 web.xm

34、l 文件中指定的filter初始化参数。 void destroy():完成过滤行为后系统自动调用的方法 void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException: 完成具体的过滤工作。,Author: huangjy Email:,Filter应用举例,public class EncodingFilter implements Filter private FilterConfig config = null; private

35、String targetEncoding = ASCII; / default to ASCII public void init(FilterConfig config) throws ServletException this.targetEncoding = config.getInitParameter(encoding); /在过滤器中实现字符集编码转化 public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain chain) throws IOException, Ser

36、vletException HttpServletRequest request = (HttpServletRequest)srequest; request.setCharacterEncoding(targetEncoding); / move on to the next chain.doFilter(srequest,sresponse); public void destroy() . ,Author: huangjy Email:,Filter 对应配置,filterfilter-nameEncodingFilter/filter-namedisplay-nameEncoding

37、 Filter/display-namedescriptionno description/descriptionfilter-classcom.sun.j2ee.blueprints.encodingfilter.web.EncodingFilter/filter-classinit-paramparam-nameencoding/param-nameparam-valueUTF-8/param-valueinit-param/filter filter-mappingfilter-nameEncodingFilter/filter-nameurl-pattern/admin/*/url-p

38、attern /filter-mapping,Author: huangjy Email:,使用Filter的步骤,创建一个类实现 Filter 接口 实现方法: doFilter, init, destroy 将过滤行为放到doFilter方法中 参数:ServletRequest, ServletResponse, FilterChain 调用 FilterChain的 doFilter方法 调用下一个过滤器或者实际资源 将过滤器注册到对应jsp或Servlet上 利用web.xml 中的filter 和 filter-mapping 使调用Servlet失效,Author: huangjy Email:,案例:简单的filter,public class ReportFilter

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论