已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Servlet串讲 Servlet原理Servlet是什么?Servlet,服务器端的小程序,它是相对于Applet而言的,Applet是客户端小程序。 Servlet,是接受来自网络的请求(form表单,以及其他的请求),并对不同请求作出不同的响应 Servlet,是基于Http协议的,是运行在web服务器中的程序。这里要提出一个容器的概念。 servlet是运行在web容器中,在后面会详细地讲解,这个web容器可以控制Servlet对象的生命周期,控制请求由Servlet对象处理。第一个servlet程序访问过程Servlet的调用过程 1,用户通过浏览器向web服务器发送请求 http:/serverip:port/apppath 2,服务器为用户定位资源 静态资源:/a.html /a/b.html (这里的路径是针对web应用文件夹目录)读文件并把内容发送到客户端 动态资源:解析web.xml定位Servlet类的名字 装载类(WEB-INF/classes|WEB-INF/lib/*.jar) 创建该对象的实例 Servlet ser=(Servlet)(Class.forName(servle的类名).newInstance(); ser.service(request,response); /我们写的Servlet一定要实现Servlet接口或者继承实现了Servlet接口的类 Servlet接口:init():初始化servlet类,生命周期中只出现一次,可以用它来完成某些准备工作,比如获得数据库连接,打开某些文件等。 service():每一次请求都调用该方法来相应。destroy():销毁servlet类时调用的方法,完成资源的释放等,它必须等待所有线程调用service方法结束后才运行。getServletConfig():让用户自定义的servlet类可以获得ServletConfig对象,从而获得相关初始化参数。getServletInfo():获得一个String类型的对象,主要是描述该servlet的信息,比如作者,版权等ServletConfig接口: ConfigTest org.jerryrat.web.ConfigTestServlet firstname zhang lastname san getInitParameter(String key):获得初始化参数的值,比如:getInitParamter(firstname),结果为zhang。getInitParameterNames():获得该servlet的所有初始化参数,结果为Enumeration类型对象。getServletContext():获得Servlet上下文的引用。getServletName():获得servlet在部署描述符(web.xml)中指明的名字,即:ConfigTest。GenericServlet抽象类:该类实现了Servlet和ServletConfig接口,提供除service方法外的其他4种方法的简单实现。注意:2种重载的init方法。public void init(ServletConfig config) throws ServletExceptionpublic void init() throws ServletException第一个有参方法是对Servlet接口中init方法的实现,运行过程中,servlet容器调用某个servlet的构造方法后,会调用有参的init方法完成初始化工作。有参的init方法中会调用无参的init方法,所以我们写servlet类时一般覆盖init方法时只要覆盖无参的就可以了,如果我们覆盖有参的,必须要显示的调用super.init(config),否则会导致servletConfig对象不能使用。HttpServlet类:该类继承自GenericServlet类,提供了2种重载的service方法,还有针对http协议中的get,post,head,put,delete等请求方法,提供了相应的处理方法,doGet、doPost、doHead等。public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOExceptionpublic void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException说明:第一个service方法是对GenericServlet中service方法的实现,该方法中所做的事情是将ServletRequest和ServletResponse对象封装成HttpServletRequest和HttpServletResponse对象,然后传参调用第二个service方法。在第二个service方法中,会调用request的getMethod方法获得请求是什么类型的,如果是get请求,则调用doGet方法来处理。HttpServletRequest接口:web.xml文件中: TestRequestServlet org.jerryrat.guide.TestRequestServlet TestRequestServlet /test/testRequest/*浏览器访问url:http:/localhost:8080/sd0903_servlet/test/testRequest/abc?name=12request.getContextPath()=/sd0903_servletrequest.getServletPath()=/test/testRequestrequest.getPathInfo()=/abcrequest.getRequestURI()=/sd0903_servlet/test/testRequest/abcrequest.getRequestURL()=http:/localhost:8080/sd0903_servlet/test/testRequest/abcrequest.getQueryString()=name=123其他方法:getCookies():该方法返回客户端发送过来的所有Cookie对象,返回类型为Cookie。注:Cookie是客户端浏览器中的一种技术,它是在浏览器中分配一段空间,用来保存某些数据,数据的保存格式为key=value,当浏览器将这些key-value值发送给服务器时,服务器会将其封装成一个个Cookie对象(此为Cookie类),通过getCookie方法可以获得这些对象。Cookie对象中有相应的getName()和getValue()方法,就可以获得这些key-value值。getSession():返回HttpSession对象。如果没有则新建一个。getSession(boolean):获得HttpSession对象,参数为true时,没有则新建,有则返回;参数为false,有则返回,没有则返回null。getParameter(String paramName):返回某一个参数对应的值,如果有多个值只返回第一个。getParameterValues(String paramName):返回该参数的所有value。getParameterNames():返回所有参数的name,返回类型为为String类型。getParameterMap():返回所有参数的key-value对,返回类型为Map。request.getReader();request.getInputStream();request.setCharacterEncoding();设置请求参数的字符集,在上面6个方法之前设置才有效。HttpServletResponse接口:1. 设置响应消息头的相关方法。response.setContentType(text/html;charset=utf8);其他MIME类型:Image/jpeg,text/plain.response.setCharacterEncoding(utf8);其优先级比在contentType中设置高,而且字符集的设置要在获得输出流之前设置,否则字符集的设置不起作用。如果没有设置字符集,默认是ISO8895-1.2. 创建响应正文相关方法。ServletOutputStream getOutputStream();PrintWriter getWriter();Service方法执行后有容器负责关闭该输出流,service方法中多次调用上面的同一个方法返回的对象是同一个对象。3. 请求转发&请求重定RequestDispatcher请求转发requestBrowserDB转发ssViewBizDAOSevletJsp/ServletServletContext类的getRequestDispatcher(String path)方法获得一个RequestDispatcher对象,path就是指定跳转的Servlet的url-pattern。ServletRequest.getRequestDispatcher( String path );其中的path可以用相对的地址 如:path=”./index.html”可以,也可以传绝对的ServletContext.getRequestDispatcher( String path );必须是绝对的地址,以”/”开始RequestDispatcher类的forward(ServletRequest request, ServletResponse response) 方法,可以把请求对象转发给其他的Servlet或JSP。()Response.sendRedirect重定向HttpServletResponse是用来回应用户的操作的,它可以实现页面的重定向。sendRedirect(String location),是用这个方法指定要访问的servlet,其参数是Servlet的url-pattern的值。如果使用了重定向,就不会保留原有的request对象。 Response.sendRedirect (“/serv-app/student/ctrl”);SingleThreadModel接口:这是一个标记接口,没有任何方法,只是告诉servlet容器这是一个单线程处理的servlet。如果一个servlet实现了该接口,那么当请求到来时,servlet容器会产生单独的该servlet对象来处理,也就是一个请求对于一个对象,多个请求则会产生多个servlet对象,从而达到线程安全的目的。此方法只对成员变量有用,对静态变量(也就是类变量)是没有用的,因为多个servlet对象还是共享类对象,还是会出现线程安全问题,所以它被标记成已过时的。ServletContext接口:每一个Web应用程序分别用一个ServletContext对象来表示,我们所写的servlet类可以通过ServletContext对象与容器进行通信。1. 获得Web应用程序的初始化参数ServletConfig是获得单个Servlet类的初始化参数,每一个Servlet类对应一个ServletConfig对象。一个web应用程序只对应一个ServletContext对象,所以一个web应用中的所有servlet类共享这个ServletContext对象。namejerryrat ConfigTest org.jerryrat.web.ConfigTestServlet firstname zhang lastname san getInitParameter(String paramName);getInitParameterNames();2. application范围的属性。ServletContext对象是整个web应用共享的,又被称为application对象(应用程序对象),其内部有一个hashtable对象,用来保存很多key-value键值对,这些key-value就可以被应用中的所有servlet类共享。getAttributeNames();获得application对象中所有的属性,返回类型是Enumeration。getAttribute(String attrName);获得某一个属性的value值。setAttribute(String key , Object value);添加一个属性,如果该key已经存在,则覆盖。removeAttribue(String name);删除该属性。3. 访问资源文件。问题引入:Java类中使用的相对路径,都是指相对于当前工作目录,这个当前工作目录通常是执行java命令的目录,而不是这个java类所在的目录。举例说明: FileAccessServlet类的service方法中:FileInputStream fis = new FileInputStream(perties);Properties props = new Properties();props.load(fis);System.out.println(props.getProperty(name);System.out.println(props.getProperty(age);perties文件存在于WEB-INF/classes中结果:报错,说perties文件找不到,为什么?分析:FileAccessServlet类中所写的路径是相对路径,相对于当前工作目录,当前工作目录为执行java命令的地方,tomcat中java命令是由tomcat主动调用的,所以此处工作目录为启动tomcat的命令所在的目录,即bin目录。当我们把perties放到bin目录下,我们惊奇的发现该servlet可以正常运行。显然我们不应该使用相对路径。解决方案:ServletContext类的getResource()和getResourceAsStream()方法。InputStream is =getServletContext().getResourceAsStream(/WEB-INF/classes/perties);CookieCookie,是记录用户的Session信息,也可以记录用户的请求信息,也就是SessionID,来分辨哪一个用户是否登陆过。在每次登陆时,还会将Cookie发送回服务器端,Cookie是用来跟踪Session的。Cookie: name - value Cookie allCookies = req.getCookies();public void service(ServletRequest request,ServletResponse response)String user = request.getParameter(user);String pass = request.getParameter(pass);Cookie userCookie = new Cookie(user, user); userCookie.setMaxAge(60 * 60 * 24 * 365);/设置Cookie的最大有效期,秒为单位 Cookie passCookie = new Cookie(pass, pass); passCookie.setMaxAge(60 * 60 * 24 * 365); response.addCookie(userCookie); response.addCookie(passCookie);Session1、介绍Session是对Cookie的封装,是基于Cookie来跟踪的,即:没有Cookies的支持,Session是不能运行起来的。容器中会有个Session列表,可以根据SessionID找到对应的Session。Session产生后,会同时产生个SessionID的Cookie。Session是存在于服务器内存中的,用于存用户多个请求的信息的;同时也要求客户端发送个Session的标志:SessionID (地址栏或封装在请求的Header中)。客户端SIDsession123session1容器自动做了以下步骤:a、创建SessionId=”123”b、创建Session对象c、创建cookie(ISESSIONID=123)d、response.addCookie(cooke)requestrequest.getSession()cookie(ISESSIONID, “123”)创建出SessionISESSIONID123Tomcat容器CookieSession对象用来解决客户端发送多个请求时来用户请求信息的存储问题,但是他和ServletRequest对象是不同的,他会在有需要时创建,但是他的生命周期会比请求对象要长。Session对象的生命周期也是有限制的,如果长时间的没有访问,就会销毁掉Session对象,可以通过Session对象的 2、方法介绍getSession(true)就表示如果Session不存在就创建一个新的Session,并把Session的标识SessionID写到Cookie中,如果存在就是用这个Session。getSession(false)就是在Session不存在时不会创建新Session而是返回null。如果使用getSession()方法,就等同于getSession(true)。setAttribute(String name, Object o) 和getAttribute(String name)来存取数据信息。Session是用户级的对象。public void service(ServletRequest request,ServletResponse response)String user = request.getParameter(user); String pass = request.getParameter(pass);HttpSession session = request.getSession(true);/使用请求对象来创建Session session.setAttribute(username, user); session.setAttribute(passwd, pass);注意:ServletRequest对象适用于传输大量的数据,因为其生命周期比较短,可以有效的节省内存资源。大数据量的传输或保存不适合使用Session空间。通常我们称放在Session中的对象称为:状态实体;只要不是用来标识状态的对象,可以全放在request中。3、Session结束的可能情况:(1)关掉浏览器,Session失效(2)长时间不用,Session超时,Session会释放;或在程序中主动释放。(3)当关机时,Session会持久化到硬盘上。用户身份认证登录时,创建session访问资源页面时,先判断session是否存在退出时清除session:session. invalidate(),接着可以将用户引导到登录页面Session第二种跟踪机制:URLRewritingResponse.sendRediret(Response.encodeRedirectURL(/serv-app/student/ctrl“)把在地址栏后加上SessionID地址地址参数out.println(”a href=”+response.encodeURL(url)”Forward也是encodeURL特殊一个:Response.sendRedirect(response.encodeRedirectURL(url);每一个URL都要加上sessionID,但它不能跨越静态页面。所以一般默认针对Cookies可用编写程序。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- MDL-25637-生命科学试剂-MCE
- 小餐厅合同范本
- 货款类合同范本
- Leucocin-A-LeuA-生命科学试剂-MCE
- 专题12统计与数学广角专项(核心知识点速记+典型例题解构+分层训练)-六年级上册数学讲义人教版
- 安信息化建设指南(2025版)
- 贵州省西能煤炭勘查开发有限公司2025年招聘备考题库及参考答案详解一套
- 乐山师范学院2026届高层次人才招聘备考题库及答案详解1套
- 重庆市开州区事业单位2025年面向应届高校毕业生考核招聘工作人员备考题库带答案详解
- 腹部手术围手术期疼痛管理指南(2025版)
- 库房婚庆道具管理办法
- 设计公司生产管理办法
- 智能制造职业技能培训教学计划
- 机电安装工程师中级职称论文范文
- 小学“十五五”发展规划
- 篮球培训员工规章管理制度
- 2025北京八年级(上)期末语文汇编:名著阅读
- 小学美术教育活动设计
- 2025年主管护师考试真题试题及答案
- 贷款项目代理协议书范本
- 心理咨询与治疗 习题及答案 雷秀雅 第1-15章
评论
0/150
提交评论