第一部分概述Web应用程序工作原理客户端把请求发送到服务器端的Web应用程序,Web应用程序接收请求后进行相关处理(静态网页和动态网页),并把结果以文本或网页的形式,返回到客户端;因此当访问Web站点的时候,我们所看到的所有内容都是在浏览器中呈现的;Web应用程序是在HTTP协议支持下的,基于B/S结构(Browser浏览器/Server服务器)的应用程序。Web应用程序优势相对于传统的C/S结构(Client客户端/Server服务器)的应用程序而言,B/S结构的Web应用程序具备以下优势:–集中部署,无需安装客户端程序;–集中管理,业务逻辑在服务端进行维护;–数据共享,所有客户端访问同一服务器的数据;–覆盖面广,只要有Internet覆盖的区域都可通过浏览器享受服务;–更强的平台无关性,不必关心客户端的软硬件平台,只要遵循HTTP协议,都可获得支持。搭建运行环境组件必须运行在容器(container)中容器一般使用软件形式实现Tomcat是一种常用Web容器什么是ServletServlet是服务器端的组件,是运行在Web服务器上的Java小程序Servlet必须运行在容器中,它一般会把处理的结果以为HTML的形式返回,在客户端形成动态网页Servlet是一个Java类,该类遵守一定规范客户端Web服务器Servlet请求响应注意事项HttpServlet中还包含一个service方法,其原型如下:publicvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException此方法用来调度客户端的请求,API文档中明确规定,请勿重写该方法。doGet与doPost在web基本的学习部分,我们知道了form提交的方式get方式和post方式我们提交把请求提交到Servlet中,容器会调用Servlet中的相应方法–getdoGet–postdoPostdoGet和doPost的区别doGet事件可接受:–浏览器直接访问–超级连接默认为doGet•ahref==‘123’//a–Form表单的get方法访问•不安全•会在浏览器显示•字符有限制doPost事件只可接受form的post方法访问第一个Servlet继承HttpServlet类覆盖HttpServlet类的doXXX方法往往覆盖doGet或doPost方法packagecom.etc;publicclassFirstServletextendsHttpServlet{publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{System.out.println(doPost:Hello,ETC!);}}第一个Servlet继承HttpServlet类覆盖HttpServlet类的doXXX方法往往覆盖doGet或doPost方法packagecom.etc;publicclassFirstServletextendsHttpServlet{publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{System.out.println(doPost:Hello,ETC!);}}访问Servlet的三种方式有三种方式可以访问Servlet在地址栏通过url直接访问通过超级链接访问bodyahref=firstServletRunthefirstservlet/a/body通过表单提交访问formaction=firstServletname=form1method=postinputtype=submitname=submit/formweb.xml文件web.xml是部署描述符文件每个web应用中都必须有web.xml文件web.xml存在于WEB-INF目录下web.xml中所有标签都在schema中定义Demo中的MVC体现Java类实现业务逻辑---Model(模型)JSP页面实现视图---View(视图)Servlet实现控制逻辑---Controller(控制器)第二部分servletServlet是多线程单实例的Servlet只有在第一次被调用时初始化一次,该实例被存储在容器中多个客户端并发访问时,Tomcat会启动多线程,并发访问Servlet实例如果某个Servlet需要在应用加载时被实例化,可以通过在web.xml中配置load-on-startup来完成Servlet的生命周期初始化构造方法init(ServletConfig)方法init()方法提供服务service方法doXXX方法销毁destroy方法RequestDispatcher请求转发器如果希望请求中的信息能够继续传递到下一个资源,可以通过使用请求转发器的请求转发方法实现请求转发器的接口是RequestDispatcher请求转发方法Request.getRequestDispatcher(path).forward(request,response)请求属性HttpServletRequest接口中提供了一系列与请求属性有关的方法setAttribute()getAttribute()HttpSession接口客户端对服务器端一次连续的访问过程,称为会话HttpSession接口用来表示会话对象通过请求对象的方法获得会话对象getSessionHttpSessionsession=request.getSession();request.getSession(true)当前如果没有session对象时自动创建一个session.如果设成false则不会创建新的session对象HttpSession中和属性有关的方法setAttributegetAttributeremoveAttributeJSP中的会话对象JSP中的内置对象session,是HttpSession对象默认情况下,JSP中总是创建session对象,可以直接使用URL重写通过修改客户端浏览器设置,可以禁止发送cookie如果cookie被禁止,那么基于cookie实现的session将失效为了解决cookie禁止session失效的问题,可以使用URL重写技术response.encodeRedirectUrl(“url”);会话超时为了有效使用内存,以及保证安全性,会话在一定时间内不被使用(称为会话超时),将被销毁有三种策略可以使会话超时web.xml中配置会话超时时间session-configsession-timeout60/session-timeout/session-config使用setMaxInactiveInterval方法设置超时时间使用invalidate方法直接将某会话设置为失效过滤器概念过滤器运行在服务器端,遵守一定的编码规范过滤器必须实现ServletAPI中的Filter接口过滤器用来执行应用中通用处理的程序,如记录日志、设置编码格式等过滤器有关APIFilter接口所有过滤器都必须实现Filter接口其中doFilter方法是过滤器提供服务的方法FilterChain接口用来将请求传递到下一个资源,可能是下一个过滤器,也可能是最终要访问的资源,如JSP、Servlet等FilterConfig接口封装过滤器的配置信息,如过滤器的名字、初始化参数等Filter的大致结构publicclassEncodingFilterimplementsFilter{publicvoidinit(FilterConfigarg0)throwsServletException{}publicvoiddoFilter(ServletRequestarg0,ServletResponsearg1,FilterChainarg2)throwsIOException,ServletException{}publicvoiddestroy(){}}过滤器的构建步骤1-2建立一个过滤器涉及下列四个步骤:–1)建立一个实现Filter接口的类。这个类需要三个方法,分别是:doFilter、init和destroy。doFilter方法包含主要的过滤代码,init方法进行初始化设置操作,destroy用于资源释放。–2)在doFilter方法中放入过滤行为。过滤器的构建步骤2-23)调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作为它的一个参数。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被激活。publicvoiddoFilter(ServletRequestarg0,ServletResponsearg1,FilterChainarg2)throwsIOException,ServletException{HttpServletRequestrequest=(HttpServletRequest)arg0;request.setCharacterEncoding(utf-8);arg2.doFilter(arg0,arg1);}FilterChain接口:代表当前Filter链的对象。由容器实现,容器将其实例作为参数传入过滤器对象的doFilter()方法中。过滤器对象使用FilterChain对象调用过滤器链中的下一个过滤器,如果该过滤器是链中最后一个过滤器,那么将调用目标资源。4)对相应的servlet和JSP页面注册过滤器。在部署描述符文件(web.xml)中使用filter和filter-mapping元素。过滤器的构建步骤之四--具体配置方式配置一个Filter1、声明Filter给出Filter的映射关系/使用filter-mapping元素具体如下:filterfilter-nameFilterDemo/filter-namefilter-classcom.servlet.FilterDemo/filter-class/filterfilter-mappingfilter-nameFilterDemo/filter-nameurl-pattern/*/url-pattern/filter-mapping注:如果有多个Filter指向一个资源时,过滤器按照filter-mapping的顺序进行过滤处理。过滤器的执行过程过滤器的执行顺序取决于在web.xml中的配置顺序通过简单示例,演示过滤器的执行顺序过滤器的配置使用过滤器前,必须在web.xml中配置过滤器配置初始化参数init-paraminit-paramparam-nameLogFileName/param-nameparam-valueuserLog.txt/param-value/init-param配置dispatcher属性:REQUEST、FORWARD、INCLUDE、ERRORfilterfilter-nameFilterDemo/filter-namefilter-classcom.servlet.FilterDemo/filter-class/filterfilter-mappingfilter-nameFil