Servlet的生命周期与请求(HttpServletRequest).doc_第1页
Servlet的生命周期与请求(HttpServletRequest).doc_第2页
Servlet的生命周期与请求(HttpServletRequest).doc_第3页
Servlet的生命周期与请求(HttpServletRequest).doc_第4页
Servlet的生命周期与请求(HttpServletRequest).doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

普通java类Java类:Servlet类的类型也是java类也是java类继承关系默认继承java.lang.Object继承javax.servlet.http.HttpServlet编译者程序员通过javac.exe编译Servlet容器(Tomcat)也可以自行编译实例化程序员通过newServlet容器调用init方法实例化运行程序员通过java.exe解释器由Servlet容器进行实例化运行对象的生命周期new创建对象,GC回收当请求发生时,调用init方法创建对象,对象在被调用destroy方法时销毁。也就是说程序结束时才能销毁,所有请求共用同一个Servlet对象。1、 构建普通java类Public class MySimpleBean /extends java.lang.Object2、Servlet类的构建:必须要继承javax.servlet.http.HttpServletPublic class MyServlet extends javax.servlet.http.HttpServlet1)、要知道javax.servlet.http.HttpServlet这个类时谁定义的?回答:这个类是由SUN定义的一个基于HTTP请求的类,这个类在java中属于javaEE规范,既是java的企业级应用。如果我们编写的程序想基于HTTP请求,就要实现该抽象类中的doXXX方法。2)、这个类是抽象类吗?回答:是抽象类。3)、这个类能为子类提供哪些功能(已经实现了的功能)?回答:提供了如下功能:4)、该类要求子类做哪些事情?既是要求子类必须实现哪些功能(抽象方法)?回答:该抽象类中没有抽象方法,即不要求子类必须实现某抽象方法。但是有建议:意思是:HttpServlet的子类必须重写doXXX中的至少一个功能。练习:获取请求者的IP 地址。根据该情况分析,该应用必须是一个Web应用。且该应用是一个动态的Web应用。1、 在磁盘上建立一个应用的根目录(myweb)。这个目录下存放可以基于浏览器访问的html页面和Servlet。2、 根目录(应用名称):动态web应用的基本结构,如下图:3、编写用户请求的方式:比如超链接、form表单都可以请服务器发送请求。4、编写处理请求的Servlet:比如有ervlet:whz.servlet.test.MyServlet。将该Servlet编译到WEB-INF下的classes文件夹中。package whz.servlet.test;import javax.servlet.http.HttpServlet;import java.io.IOException;import javax.servlet.http.*;import javax.servlet.ServletException;public class MyServlet extends javax.servlet.http.HttpServletpublic void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException/谁访问该方法,就拿到谁的ip。System.out.println(doGet 方法被调用了。);String ip = req.getRemoteAddr();System.out.println(你的ip是:+ip);public static void main(String args)System.out.println(haha);5、对classes文件夹中的Servlet(MyServlet)进行注册:在WEB-INF下的web.xml文件中注册。注册方式如下: !为Servlet启别名myservletwhz.servlet.test.MyServlet !为启了别名称的Servlet进行url注册,该url地址可以随便写,必须以“/“开头myservlet/mys6、部署应用:将该应用拷贝到tomcat的根目录下的webapps目录下。7、启动tomcat,发布部署的应用。8、根据协议、主机地址、端口号、应用名称、资源名称(uri)访问。比如::8080/myweb/mys 访问我们定义的Servlet(whz.servlet.test.MyServlet)。3、Servlet的创建与销毁当一个Servlet第一次被访问时,由Servlet容器(Tomcat)自行创建,且该Servlet在Servlet容器中只有一个对象,这一个对象被所有的访问者(请求)共用。Servlet的初始化过程:1) 由容器根据请求的url-pattern值加载classes文件夹中的Servlet;2) 构建Servlet的对象:构造代码块构造方法;3) Servlet容器自行调用有参的init方法。4) 相应请求:通过public的service方法;5) Public的service方法将请求分发到protected的service方法;6) 在protected的service方法中获取用户的请求方式:通过request的getMethod方法获取;7) 根据请求方式调用相应的doXXX方法;8) 相应请求:通过response对象,或者将请求向下进一步分发;9) 如果系统停机等情况发生时,容器调用Servlet的destroy方法销毁对象。3、 web.xml文件的加载时间当Servlet容器启动进行项目部署时,会先将每个项目的web.xml文件加载到内存中。之后如果对web.xml文件进行了修改,一定要重新启动Servlet容器,让容器重新加载修改后的web.xml文件。图:一个服务器可以部署多个应用图:根据主机名和应用名访问具体资源的过程4、处理用户请求1)、如何获取用户的请求信息?请求方式:1. 如果用户直接在浏览器的地址栏输入要访问的资源的url,则是GET方式请求;2. 如果是通过超链接访问的资源的url,则也是GET方式请求。3. 如果是通过form表单提交请求,默认是get请求方式,要想改为post请求方式,可以将form表单的method属性值改为“post”以上三种请求方式都是GET的,那么我们编写Servlet处理请求时,一定要重写doGet方法。如果是以form表单的post方式请求,必须要重写doPost方法。2)GET请求和POST请求的区别1. GET请求是通过浏览器的地址栏传输参数信息的;2. POST请求的参数信息不会在浏览器的地址栏中显示。3. GET在提交参数内容时,它的内容会在浏览器中传输,而浏览器的容量又是有限的,不像POST。显然:POST请求比GET请求更安全。大数据提交时,只能选择POST,而不能选择GET,因为会造成数据的丢失。3)、如何根据用户请求的参数,获取参数对应的值?4、 javax.servlet.http.HttpServletRequest图:HttpServletRequest对象的实例化过程功能:javax.servlet.http.HttpServletRequestl 获取用户请求参数的值String value = req.getParameter(key:String );l 获取请求方式String requestMethod = req.getMethod(); 比如GET/POST请求方式;l 获取应用的url地址的字符串表示形式String contextPath = req.getContextPath();如果你的应用是这样部署的: contextPath 就是:“/TestRequestInfo”。l 获取用户的请求参数信息String queryString = req.getQueryString();比如你的请求是:http:/localhost:8080/TestRequestInfo/getinfo?key1=value1&key2=value2那么queryString就是“key1=value1&key2=value2”l 获取请求的URI和URL信息String reqURI = req.getRequestURI();StringBuffer reqURL = req.getRequestURL();比如您的请求是:http:/localhost:8080/TestRequestInfo/getinfo?key1=value1&key2=value2请求的URI=/TestRequestInfo/getinfo请求的URL=http:/localhost:8080/TestRequestInfo/getinfo注意:URL包含协议信息,而URI没有包含协议信息。l 获取请求的Servlet的pathString servletPath = req.getServletPath();比如请求的URL地址是:http:/localhost:8080/TestRequestInfo/getinfo?key1=value1&key2=value2那么Servlet的path就是“/getinfo”。l 获取复选参数的值String values = req.getParameterValues();爱好篮球足球排球网球复选了哪些爱好,String数组中就包含哪些value值。比如你选择了“篮球、网球”,则String values = “lq”,”wq”;l 获取提交的参数的Name值Enumeration names = req.getParameterNames();姓名:年龄:爱好篮球足球排球网球 提交时时,显示的names有:“username、age、inst”。6、乱码处理解决乱码的原则是:让所有和编码相关的地方,保证编码要统一。1)页面处的编码设置:比如是gbkInsert title here2)Servlet的请求对象HttpServletRequest的编码设置System.out.println(request 的默认字符编码格式:+req.getCharacterEncoding();req.setCharacterEncoding(gbk);注意:一定要在使用HttpServletRequest对象之前,先设置编码格式。比如在读取客户端提交信息前,要对request对象进行编码设置。3)Servlet的响应对象HttpServletResponse的编码设置resp.setCharacterEncoding(gbk);注意:一定要在使用HttpServletResponse对象之前,先对response对象进行编码统一设置。比如获取PrintWriter对象前,要先设置编码格式。Response还有一个设置内容编码的方法:resp.setContentType(text/html;charset=gbk);4)数据库的编码也要统一数据库的Database和表都要编码统一。Show create table user;CREATE TABLE user ( id int(11) NOT NULL auto_increment, name varchar(10) default NULL, age int(11) default NULL, sex varchar(6) default NULL, address varchar(80) default NULL, inst varchar(80) default NULL, info text, regtime datetime default NULL, PRIMARY KEY (id) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=gbk7、请求的转发对象:请求分发器javax.servlet.RequestDispatcher请求分发器:是一个接收客户端请求的对象,并且该对象可以将接收的请求分发到位于服务器上的任何一个资源(这些资源包括一个Servlet、jsp页面、html文件)。请求分发器对象是由Servlet 容器创建的,我们只要知道如何获取Servlet容器创建的分发器对象即可(可以通过reqest.getRequestDispatcher(“/path”)方法获取请求分发器)。可以通过RequestDispatcher的forward方法将请求向下分发(传递)。Example:客户端页面:client.htmlInsert title here求您了。请求的处理者:Servlet1.javaprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException /*当前Servlet1能够解决客户端的请求,就可以直接响应。response.setCharacterEncoding(gbk);response.getWriter().print(没问题。);*/* 如果当前Servlet1不能够解决客户端的全部请求,需要依赖另一个资源,比如Servlet2 我们要将客户端的请求向下分发,此时需要先创建请求的分发器:RequestDispatcher。*/RequestDispatcher dispatcher = request.getRequestDispatcher(Servlet2);/分发请求dispatcher.forward(request, response);请求的处理者:Servlet2.javaprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException /如果当前Servlet2能够响应。response.setCharacterEncoding(gbk);response.getWriter().print(问题解决了。);测试结果:发请求请求的响应:总结:使用请求分发时,url地址不会发生变化。8、请求的重定向利用HttpServletResponse的response.sendRedirect(“path”)方法实现请求的重定向。l 请求页面Insert title here 请帮忙。l 处理Servlet:ServletA.javaprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException /*当前ServletA能够解决客户端的请求,就可以直接响应。response.setCharacterEncoding(gbk);response.getWriter().print(没问题。);*/response.sendRedirect(ServletB);ServletA将请求重定向到资源(资源包括:servlet、jsp、html文件)ServletB。l 处理并响应的ServletB.javaprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException /如果当前ServletB能够响应。response.setContentType(text/html;charset=gbk);response.setCharacterEncoding(gbk);response.getWriter().print(问题解决了。);使用httplook进行请求监听:Httplook监听:处理步骤1)ServletA响应GET /TestRequestInfo/ServletA HTTP/1.1Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*Referer: http:/localhost:8080/TestRequestInfo/client.htmlAccept-Language: zh-cnUA-CPU: x86Accept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)Host: localhost:8080Connection: Keep-Alive2)临时状态(302)HTTP/1.1 302 Moved TemporarilyServer: Apache-Coyote/1.1Location: http:/localhost:8080/TestRequestInfo/ServletBContent-Length: 0Date: Fri, 22 Apr 2011 06:32:31 GMT3)重定向到的ServletBGET /TestRequestInfo/ServletB HTTP/1.1Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*Referer: http:/localhost:8080/TestRequestInfo/client.htmlAccept-Language: zh-cnUA-CPU: x86Accept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)Host: localhost:8080Connection: Keep-Alive4)成功响应(状态码200)HTTP/1.1 200 OKServer: Apache-Coyote/1.1Content-Type: text/html;charset=gbkContent-Length: 12Date: Fri, 22 Apr 2011 06:32:31 GMT问题解决了。8、对请求转发和请求重定向进行比较1)从请求的URL地址比较:请求的转发的url地址不会在浏览器的地址栏中显示,而请求的重定向会在浏览器的地址栏中显示。2)如果我们通过setAttribute(String key, Object value)向资源A中的HttpServletRequest对象中存储一个值,要想在另一个资源B(servlet、jsp)中通过getAttribute(String key)拿到资源A中存储的值,可以通过请求分发实现,如果是请求重定向,则无法获取资源A的request对象中存储的值。Example:如何实现资源之间的值传递?l Request对象可以进行值传递。资源和资源之间必须保证是请求的分发,而非请求的重定向。只有这样才可以通过request对象正常获取到其中存储的值。9、javax.servlet. http.HttpSession 如果用户要向多个页面发出请求,并且想存储和用户相关的信息,那么我们可以通过Session对象进行信息存储。注意存储的信息是和用户相关的,不像Request对象保存的数据,是和请求相关。Request对象保存的信息只对一次请求生效。要想对用户生效,数据要保存到Session对象中。Example:比较request和session对象值存储与访问的差异1)Servlet1.java 分别在request和session对象中存储内容,并且在Servlet1中重定向到Servlet2中。protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException request.setAttribute(request, request value);request.getSession().setAttribute(session, session value);response.sendRedirect(Servlet2);2)Servlet2.java 在Servlet2中通过getAttribute方法,分别从request和session对象中获取值protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException String reqvalue = (String)request.getAttribute(request);String sesvalue = (String)request.getSession().getAttribute(session);System.out.println(request info = + reqvalue);System.out.println(session info = + sesvalue);3)在浏览器中输入:http:/localhost:8080/requestWithsession/Servlet1后台输出:request info = nullsession info = session value注意:通过setAttribute方法,分别向request和session对象存储信息,如果是请求重定向,在另一个资源(servlet、jsp)中通过request对象调用getAttribute方法将无法获取存储信息。而session则可以。4)OtherServlet.java 在另一个OtherServlet中获取Servlet1中存储的信息protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException String reqvalue = (String)request.getAttribute(request);String sesvalue = (String)request.getSession().getAttribute(session);System.out.println(request info = + reqvalue);System.out.println(session info = + sesvalue);在浏览器中输入:http:/localhost:8080/requestWithsession/Servlet1回车,弹出如下窗口:后台显示信息:request info = nullsession info = session value5)在该窗口中,将url地址改为:http:/localhost:8080/requestWithsession/other弹出窗口:后台输出:request info = nullsession info = session value6)如果重新打开一个浏览器,输入:http:/localhost:8080/requestWithsession/other弹出如下窗口:但是后台输出:request info = nullsession info = null总结:session存储的信息和当前浏览器窗口绑定。只要不打开新的浏览器,都可以获取session中存储的信息。所谓打开新的浏览器和在当前浏览器窗口点击“文件”“新建”“窗口”不同。图:Session的创建与共享注意:想销毁session对象,可以通过session对象的invalidate()方法销毁。每一个session对象在创建的时候,容器都会给每个session对象分配一个唯一的标识。可以通过session对象的getId()方法获取标识值。10、客户端保存信息方式:javax.servlet.http.Cookie 我们可以通过Cookie的构造方法“new Cookie(String name, String value)”进行对指定名称的值绑定。并且通过浏览器进行保存。我使用的是windows操作系统,并且以admistrator身份进行登录。请访问的应用的名称是“cookieWithWeb”1)使用Cookie进行设置:CookieServlet.java 该servlet的url是:“cookies”protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException Cookie c = new Cookie(name, wanghezun);System.out.println(cookie Servlet response.);c.setMaxAge(100);response.addCookie(c);在浏览器的地址中输入:http:/localhost:8080/cookieWithWeb/cookies在当前用户的操作系统下:administratorcookieWithWeb1.txt 文件中的内容是:namewanghezunlocalhost/cookieWithWeb/1024296723379230147298197660379230147298*2)在服务器端通过request对象获取保存在客户端的Cookie中的信息:编写服务器端的Servlet:GetCookieServlet.javaprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException Cookie cs = request.getCookies();if(cs != null)for (int i = 0; i cs.length; i+) System.out.println(csi.getName()+:+csi.getValue();11、过滤器Filter:javax.servlet.Filter 是一个接口Example:用户注册1) 注册页面:reg.htmlInsert title here姓名:地址:2)后台接收请求的Servlet:AddUserServlet.javaprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException String name = request.getParameter(uname);String address = request.getParameter(address);System.out.println(姓名:+name);System.out.println(家庭住址: + address);PrintWriter out = response.getWriter();out.print(姓名:+name);out.print(家庭住址: + address);2) 在浏览器中输入:http:/localhost:8080/FilterWithWeb/reg.html输入中文信息,点击注册按钮。弹出如下窗口:服务器的后台输出:姓名:?家庭住址:?我们发现前台和后台对中文字符进行处理时,都发生了乱码现象。这种情况的发生,是因为我们没有对编码进行统一设置。前台页面采用的是GBK编码,那么后台的request和response对象也应该采用GBK编码。后台Servlet:AddUserServlet.java 应改为:protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException /在使用request对象之前先设置编码为GBKrequest.setCharacterEncoding(GBK);String name = request.getParameter(uname);String address = request.getParameter(address);System.out.println(姓名:+name);System.out.println(家庭住址: + address);/在使用response对象之前也要进行编码设置response.setCharacterEncoding(GBK);response.setContentType(text/html; charset=GBK);PrintWriter out = response.getWriter();out.print(姓名:+name);out.print(家庭住址: + address);注意:这种对后台request和response对象进行编码统一的方式很麻烦,每个Servlet都要重写很多代码“request.setCharacterEncoding(GBK);”;有没有一种简单的方式呢?回答是有,可以通过过滤器Filter来进行设置。注意:使用过滤器javax.servlt.Filter解决编码统一问题l 页面编码统一为GBKInsert title here姓名:地址:l 过滤器Filter:whz.servlet.EncodingFilter 对请求和相应对象进行编码统一package whz.servlet;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class EncodingFilter implements Filter public void destroy() System.out.println(EncodingFilter is destoried.);public void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException req.setCharacterEncoding(GBK);resp.setCharacterEncoding(GBK);resp.setContentType(text/html; charset=GBK);/请求继续chain.doFilter(req, resp);public void init(FilterConfig arg0) throws ServletException System

温馨提示

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

评论

0/150

提交评论