网站建设支付安全,区域文化网站建设方案,大学网页制作学什么,百度网站收录提交入口在哪一、web.xml是什么#xff1f; 首先 web.xml 是java web 项目的一个重要的配置文件#xff0c;但是web.xml文件并不是Java web工程必须的。 web.xml文件是用来配置#xff1a;欢迎页、servlet、filter等的。当你的web工程没用到这些时#xff0c;你可以不用web.xml文件来配…一、web.xml是什么 首先 web.xml 是java web 项目的一个重要的配置文件但是web.xml文件并不是Java web工程必须的。 web.xml文件是用来配置欢迎页、servlet、filter等的。当你的web工程没用到这些时你可以不用web.xml文件来配置你的web工程。 所在位置 项目名/web/WEB-INFO/web.xml如下图所示 web.xml能做的事情 其实web.xml的模式(Schema)文件中定义了多少种标签元素web.xml中就可以出现它的模式文件所定义的标签元素它就能拥有定义出来的那些功能。 web.xml的模式文件是由Sun公司定义的每个web.xml文件的根元素web-app中都必须标明这个web.xml使用的是哪个模式文件。如 web.xml 配置文件 具体的内容 二、Web.xml详解 1.web.xml加载过程步骤 首先简单讲一下web.xml的加载过程。当启动一个WEB项目时容器包括JBoss、Tomcat等首先会读取项目web.xml配置文件里的配置当这一步骤没有出错并且完成之后项目才能正常地被启动起来。 1. 启动WEB项目的时候容器首先会去它的配置文件web.xml读取两个节点: listener/listener和context-param/context-param。 2. 紧接着容器创建一个ServletContextapplication这个WEB项目所有部分都将共享这个上下文。 3. 容器以context-param/context-param的name作为键value作为值将其转化为键值对存入ServletContext。 4. 容器创建listener/listener中的类实例根据配置的class类路径listener-class来创建监听在监听中会有contextInitialized(ServletContextEvent args)初始化方法启动Web应用时系统调用Listener的该方法在这个方法中获得 [html] view plain copy span stylefont-family:Times New Roman;ServletContextapplicationServletContextEvent.getServletContext();/span context-param的值就是application.getInitParameter(context-param的键);得到这个context-param的值之后你就可以做一些操作了。 5. 举例你可能想在项目启动之前就打开数据库那么这里就可以在context-param中设置数据库的连接方式驱动、url、user、password在监听类中初始化数据库的连接。这个监听是自己写的一个类除了初始化方法它还有销毁方法用于关闭应用前释放资源。比如:说数据库连接的关闭此时调用contextDestroyed(ServletContextEvent args)关闭Web应用时系统调用Listener的该方法。 6. 接着容器会读取filter/filter根据指定的类路径来实例化过滤器。 7. 以上都是在WEB项目还没有完全启动起来的时候就已经完成了的工作。如果系统中有Servlet则Servlet是在第一次发起请求的时候被实例化的而且一般不会被容器销毁它可以服务于多个用户的请求。所以Servlet的初始化都要比上面提到的那几个要迟。 8. 总的来说web.xml的加载顺序是:context-param-listener-filter-servlet。其中如果web.xml中出现了相同的元素则按照在配置文件中出现的先后顺序来加载。 9. 对于某类元素而言与它们出现的顺序是有关的。以filter为例web.xml中当然可以定义多个filter与filter相关的一个元素是filter-mapping注意对于拥有相同filter-name的filter和filter-mapping元素而言filter-mapping必须出现在filter之后否则当解析到filter-mapping时它所对应的filter-name还未定义。web容器启动初始化每个filter时按照filter出现的顺序来初始化的当请求资源匹配多个filter-mapping时filter拦截资源是按照filter-mapping元素出现的顺序来依次调用doFilter()方法的。servlet同filter类似此处不再赘述。 2.web.xml标签详解 1. XML文档有效性检查 [html] view plain copy span stylefont-family:Times New Roman;!DOCTYPE web-app PUBLIC-//Sun Microsystems, Inc.//DTD Web Application 2.3//ENhttp://java.sun.com/dtd/web-app_2_3.dtd /span 这段代码指定文件类型定义(DTD)可以通过它检查XML文档的有效性。下面显示的!DOCTYPE元素有几个特性这些特性告诉我们关于DTD的信息 web-app定义该文档(部署描述符不是DTD文件)的根元素 PUBLIC意味着DTD文件可以被公开使用 -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN”意味着DTD由Sun Microsystems, Inc.维护。该信息也表示它描述的文档类型是DTD Web Application 2.3而且DTD是用英文书写的。 URLhttp://java.sun.com/dtd/web-app_2_3.dtd表示D文件的位置。 2. web-app/web-app 部署描述符的根元素是web-app。DTD文件规定web-app元素的子元素的语法如下 [html] view plain copy span stylefont-family:Times New Roman;!ELEMENT web-app (icon?, display-name?, description?,distributable?, context-param*, filter*, filter-mapping*,listener*, servlet*, servlet-mapping*, session-config?,mime-mapping*, welcome-file-list?,error-page*, taglib*, resource-env-ref*, resource-ref*,security-constraint*, login-config?, security-role*,env-entry*,ejb-ref*, ejb-local-ref*) /span 正如您所看到的这个元素含有23个子元素而且子元素都是可选的。问号()表示子元素是可选的而且只能出现一次。星号(*)表示子元素可在部署描述符中出现零次或多次。有些子元素还可以有它们自己的子元素。web.xml文件中web-app元素声明的是下面每个子元素的声明。下面讲述部署描述符中可能包含的所有子元素。 注意在Servlet 2.3中子元素必须按照DTD文件语法描述中指定的顺序出现。比如如果部署描述符中的web-app元素有servlet和servlet-mapping两个子元素则servlet子元素必须出现在servlet-mapping子元素之前。在Servlet2.4中顺序并不重要。 3. display-name/display-name display-nametest-hwp-web-application/display-name定义了web应用的名称可以在http://localhost:8080/manager/html中显示。如下所示 4. distributable/ distributable/可以使用distributable元素来告诉servlet/JSP容器Web容器中部署的应用程序适合在分布式环境下运行。 5. context-param/context-param 使用上下文初始化参数 !--****************************上下文初始化参数***************************-- context-param param-namewebAppRootKey/param-name param-valuebusiness.root/param-value /context-param !-- spring config -- context-param param-namecontextConfigLocation/param-name param-value/WEB-INF/spring-configuration/*.xml/param-value /context-param 5.1context-param解释 context-param元素含有一对参数名和参数值用作应用的Servlet上下文初始化参数参数名在整个Web应用中必须是惟一的在web应用的整个生命周期中上下文初始化参数都存在任意的Servlet和jsp都可以随时随地访问它。param-name子元素包含有参数名而param-value子元素包含的是参数值。作为选择可用description子元素来描述参数。 5.2 什么情况下使用为什么使用context-param 比如定义一个管理员email地址用来从程序发送错误或者与你整个应用程序有关的其他设置。使用自己定义的设置文件需要额外的代码和管理直接在你的程序中使用硬编码Hard-coding参数值会给你之后修改程序带来麻烦更困难的是要根据不同的部署使用不同的设置通过这种办法可以让其他开发人员更容易找到相关的参数因为它是一个用于设置这种参数的标准位置。 5.3 Spring配置文件 配置Spring必须需要listener而context-param可有可无如果在web.xml中不写context-param配置信息默认的路径是/WEB-INF/applicationontext.xml在WEB-INF目录下创建的xml文件的名称必须是applicationContext.xml。如果是要自定义文件名可以在web.xml里加入contextConfigLocation这个context参数在param-value /param-value里指定相应的xml文件名如果有多个xml文件可以写在一起并以“,”号分隔比如在business-client工程中我们采用了自定义配置方式context-param配置如下 !-- spring config -- context-param param-namecontextConfigLocation/param-name param-value/WEB-INF/spring-configuration/*.xml/param-value /context-param listener listener-classorg.springframework.web.context.ContextLoaderListener/listener-class /listener 对应工程目录结构如下所示 部署在同一容器中的多个Web项目要配置不同的webAppRootKeyweb.xml文件中最好定义webAppRootKey参数如果不定义将会缺省为“webapp.root”如下 !-- 应用路径 -- context-param param-namewebAppRootKey/param-name param-valuewebapp.root/param-value /context-param 当然也不能重复否则报类似下面的错误 Web app root system property already set to different value: webapp.root [/home/user/tomcat/webapps/project1/] instead of [/home/user/tomcat/webapps/project2/] - Choose unique values for the webAppRootKey context-param in your web.xml files! 意思是“webapp.root”这个key已经指向了项目1不可以再指向项目2。多个项目要对webAppRootKey进行配置我们工程主要是让log4j能将日志写到对应项目根目录下比如我们的项目的webAppRootKey为 !—business-client应用路径 -- context-param param-namewebAppRootKey/param-name param-value business.root /param-value /context-param !—public-base应用路径 -- context-param param-namewebAppRootKey/param-name param-value pubbase.root/param-value /context-param 这样就不会出现冲突了。就可以在运行时动态地找到项目路径在log4j.properties配置文件中可以按下面的方式使用${webapp.root} log4j.appender.file.File${webapp.root}/WEB-INF/logs/sample.log 就可以在运行时动态地找出项目的路径。 5.4 多个配置文件交叉引用处理 如果web.xml中有contextConfigLocation参数指定的Spring配置文件则会去加载相应的配置文件而不会去加载/WEB-INF/下的applicationContext.xml。但是如果没有指定的话默认会去/WEB-INF/下加载applicationContext.xml。 在一个团队使用Spring的实际项目中应该需要多个Spring的配置文件如何使用和交叉引用的问题 多个配置文件可以在web.xml里用空格分隔写入如 context-param param-namecontextConfigLocation /param-name param-value applicationContext-database.xml,applicationContext.xml/param-value context-param 多个配置文件里的交叉引用可以用ref的external或bean解决例如applicationContext.xml bean iduserService classdomain.user.service.impl.UserServiceImpl property namedbbean ref beandbBean/ /property /bean dbBean在applicationContext-database.xml中。 5.5 在不同环境下如何获取范例: context-param param-nameparam_name/param-name param-valueparam_value/param-value /context-param 此所设定的参数在JSP网页中可以使用下列方法来取得 ${initParam.param_name} 若在Servlet可以使用下列方法来获得 String param_namegetServletContext().getInitParamter(param_name); Servlet的ServletConfig对象拥有该Servlet的ServletContext的一个引用所以可这样取得上下文初始化参数getServletConfig().getServletContext().getInitParameter()也可以在Servlet中直接调用getServletContext().getInitParameter()两者是等价的。 6. session-config/session-config !-- Set timeout to 120 minutes -- session-config session-timeout120/session-timeout /session-config session-config 用于设置容器的session参数比如session-timeout 用于指定http session的失效时间。默认时间设置在jakarta/conf/web.xml (30 minutes)。session-timeout用来指定默认的会话超时时间间隔以分钟为单位。该元素值必须为整数。如果 session-timeout元素的值为零或负数则表示会话将永远不会超时。 7. listener/listener !--****************************监听器配置*********************************-- !-- Spring的log4j监听器 -- listener listener-classorg.springframework.web.util.Log4jConfigListener/listener-class /listener listener listener-classorg.springframework.web.context.ContextLoaderListener/listener-class /listener !-- 与CAS Single Sign Out Filter配合注销登录信息 -- listener listener-classcom.yonyou.mcloud.cas.client.session.SingleSignOutHttpSessionListener/listener-class /listener 7.1 Listener介绍 listener为web应用程序定义监听器监听器用来监听各种事件比如application和session事件所有的监听器按照相同的方式定义功能取决去它们各自实现的接口常用的Web事件接口有如下几个(1). ServletContextListener用于监听Web应用的启动和关闭(2). ServletContextAttributeListener用于监听ServletContext范围application内属性的改变(3). ServletRequestListener用于监听用户的请求(4). ServletRequestAttributeListener用于监听ServletRequest范围request内属性的改变(5). HttpSessionListener用于监听用户session的开始和结束(6). HttpSessionAttributeListener用于监听HttpSession范围session内属性的改变。listener主要用于监听Web应用事件其中有两个比较重要的WEB应用事件应用的启动和停止starting up or shutting down和Session的创建和失效created or destroyed。应用启动事件发生在应用第一次被Servlet容器装载和启动的时候停止事件发生在Web应用停止的时候。Session创建事件发生在每次一个新的session创建的时候类似地Session失效事件发生在每次一个Session失效的时候。为了使用这些Web应用事件做些有用的事情我们必须创建和使用一些特殊的“监听类”。它们是实现了以下两个接口中任何一个接口的简单java类javax.servlet.ServletContextListener或javax.servlet.http.HttpSessionListener如果想让你的类监听应用的启动和停止事件你就得实现ServletContextListener接口想让你的类去监听Session的创建和失效事件那你就得实现HttpSessionListener接口。 7.2 Listener配置 配置Listener只要向Web应用注册Listener实现类即可无序配置参数之类的东西因为Listener获取的是Web应用ServletContextapplication的配置参数。为Web应用配置Listener的两种方式 (1). 使用WebListener修饰Listener实现类即可。 (2). 在web.xml文档中使用listener进行配置。 我们选择web.xml这种配置方式只有一个元素listener-class指定Listener的实现类如下所示 listener listener-classorg.springframework.web.context.ContextLoaderListener/listener-class /listener 这里的listener用于Spring的加载Spring加载可以利用ServletContextListener实现也可以采用load-on-startup Servlet 实现但是当filter需要用到bean时但加载顺序是先加载filter后加载servlet则filter中初始化操作中的bean为null所以如果过滤器中要使用到bean此时就可以根据加载顺序listener - filter - servlet将spring的加载改成Listener的方式。 (1). 利用ServletContextListener实现 servlet servlet-namecontext/servlet-narne servlet-classorg.springframework.web.context.ContextLoaderServlet/servlet-class load-on-startup1/load-on-startup /servlet (2).采用load-on-startup Servlet 实现 listener listener-classorg.springframework.web.context.ContextLoaderListener/listener-class /listener 我们选择了第二种方式在J2EE工程中web服务器启动的时候最先调用web.xml上面这段配置的意思是加载spring的监听器其中ContextLoaderListener的作用就是启动Web容器时自动装配applicationContext.xml的配置信息执行它所实现的方法。 8. filter/filter !--****************************过滤器配置*********************************-- !-- 字符集过滤器 -- filter filter-nameCharacterEncodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param init-param param-nameforceEncoding/param-name param-valuetrue/param-value /init-param /filter !-- 单点登出过滤器 -- filter filter-nameCAS Single Sign Out Filter/filter-name filter-classcom.yonyou.mcloud.cas.client.session.SingleSignOutFilter/filter-class /filter !-- 认证过滤器 -- filter filter-nameCAS Authentication Filter/filter-name filter-classcom.yonyou.mcloud.cas.client.authentication.ExpandAuthenticationFilter/filter-class init-param param-namecasServerLoginUrl/param-name param-valuehttps://dev.yonyou.com:443/sso-server/login/param-value /init-param init-param !--这里的server是服务端的IP -- param-nameserverName/param-name param-valuehttp://10.1.215.40:80/param-value /init-param /filter !-- 验证ST/PT过滤器 -- filter filter-nameCAS Validation Filter/filter-name filter-classorg.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter/filter-class init-param param-namecasServerUrlPrefix/param-name param-valuehttps://dev.yonyou.com:443/sso-server/param-value /init-param init-param param-nameserverName/param-name param-valuehttp://10.1.215.40:80/param-value /init-param init-param param-nameproxyCallbackUrl/param-name param-valuehttps://dev.yonyou.com:443/business/proxyCallback/param-value /init-param init-param param-nameproxyReceptorUrl/param-name param-value/proxyCallback/param-value /init-param init-param param-nameproxyGrantingTicketStorageClass/param-name param-valuecom.yonyou.mcloud.cas.client.proxy.MemcachedBackedProxyGrantingTicketStorageImpl/param-value /init-param !-- 解决中文问题 -- init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param /filter filter filter-nameCAS HttpServletRequest Wrapper Filter/filter-name filter-classorg.jasig.cas.client.util.HttpServletRequestWrapperFilter/filter-class /filter filter filter-nameCAS Assertion Thread Local Filter/filter-name filter-classorg.jasig.cas.client.util.AssertionThreadLocalFilter/filter-class /filter filter filter-nameNoCache Filter/filter-name filter-classcom.yonyou.mcloud.cas.client.authentication.NoCacheFilter/filter-class /filter !--****************************映射关系配置********************************-- filter-mapping filter-nameCharacterEncodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping filter-mapping filter-nameNoCache Filter/filter-name url-pattern/*/url-pattern /filter-mapping filter-mapping filter-nameCAS Single Sign Out Filter/filter-name url-pattern/*/url-pattern /filter-mapping filter-mapping filter-nameCAS Validation Filter/filter-name url-pattern/proxyCallback/url-pattern /filter-mapping filter-mapping filter-nameCAS Authentication Filter/filter-name url-pattern/*/url-pattern /filter-mapping filter-mapping filter-nameCAS Validation Filter/filter-name url-pattern/*/url-pattern /filter-mapping filter-mapping filter-nameCAS HttpServletRequest Wrapper Filter/filter-name url-pattern/*/url-pattern /filter-mapping filter-mapping filter-nameCAS Assertion Thread Local Filter/filter-name url-pattern/*/url-pattern /filter-mapping 8.1 Filter介绍 Filter可认为是Servle的一种“加强版”主要用于对用户请求request进行预处理也可以对Response进行后处理是个典型的处理链。使用Filter的完整流程是Filter对用户请求进行预处理接着将请求HttpServletRequest交给Servlet进行处理并生成响应最后Filter再对服务器响应HttpServletResponse进行后处理。Filter与Servlet具有完全相同的生命周期且Filter也可以通过init-param来配置初始化参数获取Filter的初始化参数则使用FilterConfig的getInitParameter()。 换种说法Servlet里有request和response两个对象Filter能够在一个request到达Servlet之前预处理request也可以在离开Servlet时处理responseFilter其实是一个Servlet链。以下是Filter的一些常见应用场合 (1)认证Filter (2)日志和审核Filter (3)图片转换Filter (4)数据压缩Filter (5)密码Filter (6)令牌Filter (7)触发资源访问事件的Filter (8)XSLT Filter (9)媒体类型链Filter Filter可负责拦截多个请求或响应一个请求或响应也可被多个Filter拦截。创建一个Filter只需两步:(1) 创建Filter处理类(2) Web.xml文件中配置FilterFilter必须实现javax.servlet.Filter接口在该接口中定义了三个方法(1) void init(FilterConfig config)用于完成Filter的初始化。FilteConfig用于访问Filter的配置信息。(2) void destroy()用于Filter销毁前完成某些资源的回收。(3) void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)实现过滤功能的核心方法该方法就是对每个请求及响应增加额外的处理。该方法实现对用户请求request进行预处理也可以实现对服务器响应response进行后处理---它们的分界线为是否调用了chain.doFilter(requestresponse)执行该方法之前即对用户请求request进行预处理执行该方法之后即对服务器响应response进行后处理。 8.2 Filter配置 Filter可认为是Servlet的“增强版”因此Filter配置与Servlet的配置非常相似需要配置两部分配置Filter名称和Filter拦截器URL模式。区别在于Servlet通常只配置一个URL而Filter可以同时配置多个请求的URL。配置Filter有两种方式(1). 在Filter类中通过Annotation进行配置。 (2). 在web.xml文件中通过配置文件进行配置。我们使用的是web.xml这种配置方式下面重点介绍filter内包含的一些元素。filter用于指定Web容器中的过滤器可包含filter-name、filter-class、init-param、icon、display-name、description。 (1).filter-name用来定义过滤器的名称该名称在整个程序中都必须唯一。 (2).filter-class元素指定过滤器类的完全限定的名称即Filter的实现类。 (3). init-param为Filter配置参数与context-param具有相同的元素描述符param-name和param-value。 (4). filter-mapping元素用来声明Web应用中的过滤器映射过滤器被映射到一个servlet或一个URL 模式。这个过滤器的filter和filter-mapping必须具有相同的filter-name指定该Filter所拦截的URL。过滤是按照部署描述符的filter-mapping出现的顺序执行的。 8.21 字符集过滤器 filter filter-nameCharacterEncodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param init-param param-nameforceEncoding/param-name param-valuetrue/param-value /init-param /filter filter-mapping filter-nameCharacterEncodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping CharacterEncodingFilter类可以通过简单配置来帮我们实现字符集转换的功能参数encoding用于指定编码类型参数forceEncoding设为true时强制执行request.setCharacterEncoding(this.encoding)和reponse.setCharacterEncoding(this.encoding)中的方法。8.22 缓存控制 filter filter-nameNoCache Filter/filter-name filter-classcom.yonyou.mcloud.cas.client.authentication.NoCacheFilter/filter-class /filter filter-mapping filter-nameNoCache Filter/filter-name !—表示对URL全部过滤-- url-pattern/*/url-pattern /filter-mapping 8.23 登录认证 !-- 认证过滤器 -- filter filter-nameCAS Authentication Filter/filter-name filter-classcom.yonyou.mcloud.cas.client.authentication.ExpandAuthenticationFilter/filter-class init-param param-namecasServerLoginUrl/param-name param-valuehttps://dev.yonyou.com:443/sso-server/login/param-value /init-param init-param !--这里的server是服务端的IP -- param-nameserverName/param-name param-valuehttp://10.1.215.40:80/param-value /init-param /filter filter-mapping filter-nameCAS Authentication Filter/filter-name url-pattern/*/url-pattern /filter-mapping 登录认证未登录用户导向CAS Server进行认证。8.24 单点登出 filter filter-nameCAS Single Sign Out Filter/filter-name filter-classorg.jasig.cas.client.session.SingleSignOutFilter/filter-class /filter filter-mapping filter-nameCAS Single Sign Out Filter/filter-name url-pattern/*/url-pattern /filter-mapping listener listener-classorg.jasig.cas.client.session.SingleSignOutHttpSessionListener/listener-class /listener CAS Server通知CAS Client删除session注销登录信息。8.25 封装request filter filter-nameCAS HttpServletRequest Wrapper Filter/filter-name filter-classorg.jasig.cas.client.util.HttpServletRequestWrapperFilter/filter-class /filter filter-mapping filter-nameCAS HttpServletRequest Wrapper Filter/filter-name url-pattern/*/url-pattern /filter-mapping 封装request, 支持getUserPrincipal等方法。8.26 存放Assertion到ThreadLocal中 filter filter-nameCAS Assertion Thread Local Filter/filter-name filter-classorg.jasig.cas.client.util.AssertionThreadLocalFilter/filter-class /filter filter-mapping filter-nameCAS Assertion Thread Local Filter/filter-name url-pattern/*/url-pattern /filter-mapping 8.27 禁用浏览器缓存 filter filter-nameNoCache Filter/filter-name filter-classcom.yonyou.mcloud.cas.client.authentication.NoCacheFilter/filter-class /filter filter-mapping filter-nameNoCache Filter/filter-name url-pattern/*/url-pattern /filter-mapping 8.28 CAS Client向CAS Server进行ticket验证 !-- 验证ST/PT过滤器 -- filter filter-nameCAS Validation Filter/filter-name filter-classorg.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter/filter-class init-param param-namecasServerUrlPrefix/param-name param-valuehttps://dev.yonyou.com:443/sso-server/param-value /init-param init-param param-nameserverName/param-name param-valuehttp://10.1.215.40:80/param-value /init-param init-param param-nameproxyCallbackUrl/param-name param-valuehttps://dev.yonyou.com:443/business/proxyCallback/param-value /init-param init-param param-nameproxyReceptorUrl/param-name param-value/proxyCallback/param-value /init-param init-param param-nameproxyGrantingTicketStorageClass/param-name param-valuecom.yonyou.mcloud.cas.client.proxy.MemcachedBackedProxyGrantingTicketStorageImpl/param-value /init-param !-- 解决中文问题 -- init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param /filter filter-mapping filter-nameCAS Validation Filter/filter-name url-pattern/proxyCallback/url-pattern /filter-mapping filter-mapping filter-nameCAS Validation Filter/filter-name url-pattern/*/url-pattern /filter-mapping 9. servlet/servlet !--****************************servlet/spanspan stylefont-family:SimSun;配置/spanspan stylefont-family:Times New Roman;******************************-- !-- Spring view/spanspan stylefont-family:SimSun;分发器 对所有的请求都由business对应的类来控制转发/spanspan stylefont-family:Times New Roman; -- servlet servlet-namebusiness/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class init-param param-namepublishContext/param-name param-valuefalse/param-value /init-param load-on-startup1/load-on-startup /servlet !-- /spanspan stylefont-family:SimSun;用户登出/spanspan stylefont-family:Times New Roman; -- servlet servlet-nameLogOutServlet/servlet-name servlet-classcom.yonyou.mcloud.cas.web.servlet.LogOutServlet/servlet-class init-param param-nameserverLogoutUrl/param-name param-valuehttps://dev.yonyou.com:443/sso-server/logout/param-value /init-param init-param param-nameserverName/param-name param-valuehttp://10.1.215.40:80/business//param-value /init-param /servlet !--****************************servlet/spanspan stylefont-family:SimSun;映射关系配置/spanspan stylefont-family:Times New Roman;*************************-- servlet-mapping servlet-nameLogOutServlet/servlet-name url-pattern/logout/url-pattern /servlet-mapping servlet-mapping servlet-namebusiness/servlet-name url-pattern//url-pattern /servlet-mapping 9.1 Servlet介绍 Servlet通常称为服务器端小程序是运行在服务器端的程序用于处理及响应客户的请求。Servlet是个特殊的java类继承于HttpServlet。客户端通常只有GET和POST两种请求方式Servlet为了响应则两种请求必须重写doGet()和doPost()方法。大部分时候Servlet对于所有的请求响应都是完全一样的此时只需要重写service()方法即可响应客户端的所有请求。 另外HttpServlet有两个方法 (1). init(ServletConfig config)创建Servlet实例时调用该方法的初始化Servlet资源。 (2). destroy()销毁Servlet实例时自动调用该方法的回收资源。 通常无需重写init()和destroy()两个方法除非需要在初始化Servlet时完成某些资源初始化的方法才考虑重写init()方法如果重写了init()方法应在重写该方法的第一行调用super.init(config)该方法将调用HttpServlet的init()方法。如果需要在销毁Servlet之前先完成某些资源的回收比如关闭数据库连接才需要重写destory方法()。 Servlet的生命周期 创建Servlet实例有两个时机 (1). 客户端第一次请求某个Servlet时系统创建该Servlet的实例大部分Servlet都是这种Servlet。 (2). Web应用启动时立即创建Servlet实例即load-on-start Servlet。 每个Servlet的运行都遵循如下生命周期 (1). 创建Servlet实例。 (2). Web容器调用Servlet的init()方法对Servlet进行初始化。 (3). Servlet初始化后将一直存在于容器中用于响应客户端请求如果客户端发送GET请求容器调用Servlet的doGet()方法处理并响应请求如果客户端发送POST请求容器调用Servlet的doPost()方法处理并响应请求。或者统一使用service()方法处理来响应用户请求。 (4). Web容器决定销毁Servlet时先调用Servlet的destory()方法通常在关闭Web应用时销毁Servlet实例。9.2 Servlet配置 为了让Servlet能响应用户请求还必须将Servlet配置在web应用中配置Servlet需要修改web.xml文件。从Servlet3.0开始配置Servlet有两种方式 (1). 在Servlet类中使用WebServlet Annotation进行配置。 (2). 在web.xml文件中进行配置。 我们用web.xml文件来配置Servlet需要配置servlet和servlet-mapping。servlet用来声明一个Servlet。icon、display-name和description元素的用法和filter的用法相同。init-param元素与context-param元素具有相同的元素描述符可以使用init-param子元素将初始化参数名和参数值传递给Servlet访问Servlet配置参数通过ServletConfig对象来完成ServletConfig提供如下方法 java.lang.String.getInitParameter(java.lang.String name)用于获取初始化参数 ServletConfig获取配置参数的方法和ServletContext获取配置参数的方法完全一样只是ServletConfig是取得当前Servlet的配置参数而ServletContext是获取整个Web应用的配置参数。 (1). description、display-name和icon 1). description为Servlet指定一个文本描述。 2). display-name为Servlet提供一个简短的名字被某些工具显示。 3). icon为Servlet指定一个图标在图形管理工具中表示该Servlet。 (2). servlet-name、servlet-class和jsp-file元素 servlet必须含有servlet-name和servlet-class或者servlet-name和jsp-file。 描述如下 1). servlet-name用来定义servlet的名称该名称在整个应用中必须是惟一的。 2). servlet-class用来指定servlet的完全限定的名称。 3). jsp-file用来指定应用中JSP文件的完整路径。这个完整路径必须由/开始。 (3). load-on-startup 如果load-on-startup元素存在而且也指定了jsp-file元素则JSP文件会被重新编译成Servlet同时产生的Servlet也被载入内存。load-on-startup的内容可以为空或者是一个整数。这个值表示由Web容器载入内存的顺序。 举个例子如果有两个Servlet元素都含有load-on-startup子元素则load-on-startup子元素值较小的Servlet将先被加载。如果load-on-startup子元素值为空或负值则由Web容器决定什么时候加载Servlet。如果两个Servlet的load-on-startup子元素值相同则由Web容器决定先加载哪一个Servlet。load-on-startup1/load-on-startup表示启动容器时初始化Servlet。 (4). servlet-mapping servlet-mapping含有servlet-name和url-pattern 1). servlet-nameServlet的名字唯一性和一致性与servlet元素中声明的名字一致。 2). url-pattern指定相对于Servlet的URL的路径。该路径相对于web应用程序上下文的根路径。servlet-mapping将URL模式映射到某个Servlet即该Servlet处理的URL。 (5). 加载Servlet的过程 容器的Context对象对请求路径(URL)做出处理去掉请求URL的上下文路径后按路径映射规则和Servlet映射路径url- pattern做匹配如果匹配成功则调用这个Servlet处理请求。 9.3DispatcherServlet在web.xml中的配置 !-- Spring view分发器 对所有的请求都由business对应的类来控制转发 -- servlet servlet-namebusiness/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class init-param param-namepublishContext/param-name param-valuefalse/param-value /init-param load-on-startup1/load-on-startup /servlet 配置Spring MVC指定处理请求的Servlet有两种方式 (1). 默认查找MVC配置文件的地址是/WEB-INF/${servletName}-servlet.xml (2). 可以通过配置修改MVC配置文件的位置需要在配置DispatcherServlet时指定MVC配置文件的位置。 我们在平台项目两个工程中分别使用了不同的配置方式介绍如下 (1). 在business-client工程中按照默认方式查找MVC的配置文件配置文件目录为 /WEB-INF/business-servlet.xml。工程目录结构如下所示 (2).在public-base-server工程中通过第2种方式进行配置把spring-servlet.xml放到src/main/resources/config/spring-servlet.xml则需要在配置DispatcherServlet时指定init-param标签。具体代码如下 servlet servlet-namespring/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class init-param param-namepublishContext/param-name param-valuefalse/param-value /init-param init-param param-namecontextConfigLocation/param-name param-valueclasspath:config/spring-servlet.xml/param-value /init-param load-on-startup1/load-on-startup /servlet 工程目录结构如下 其中classpath是web项目的类路径可以理解为classes下面。因为无论这些配置文件放在哪编译之后如果没有特殊情况的话都直接在classes下面。jar包的话虽然放在lib文件夹里但实际上那些类可以直接引用比如com.test.ABC仿佛也在classes下面一样。 在我们的工程里经过验证maven工程这两个路径经过编译后生成的文件都位于classes目录下即这两个路径相当于类路径在下面创建config文件夹folder然后创建自定义的xml配置文件即可。 classpath和classpath*区别同名资源存在时classpath只从第一个符合条件的classpath中加载资源而classpath*会从所有的classpath中加载符合条件的资源。classpath*需要遍历所有的classpath效率肯定比不上classpath因此在项目设计的初期就尽量规划好资源文件所在的路径避免使用classpath*来加载。 9.4 ContextLoaderListener和DispatcherServlet初始化上下文关系和区别 从上图可以看出ContextLoaderListener初始化的上下文加载的Bean是对于整个应用程序共享的一般如DAO层、Service层BeanDispatcherServlet初始化的上下文加载的Bean是只对Spring MVC有效的Bean如Controller、HandlerMapping、HandlerAdapter等该初始化上下文只加载Web相关组件。 注意用户可以配置多个DispatcherServlet来分别处理不同的url请求每个DispatcherServlet上下文都对应一个自己的子Spring容器他们都拥有相同的父Spring容器业务层持久daobean所在的容器。 10. welcome-file-list/welcome-file-list !-- welcome page -- welcome-file-list welcome-fileindex.html/welcome-file /welcome-file-list welcome-file-list包含一个子元素welcome-filewelcome-file用来指定首页文件名称。welcome-file-list元素可以包含一个或多个welcome-file子元素。如果在第一个welcome-file元素中没有找到指定的文件Web容器就会尝试显示第二个以此类推。 11. 参考文献 https://blog.csdn.net/ahou2468/article/details/79015251 转载于:https://www.cnblogs.com/linhuaming/p/9464356.html