ssm框架整合入门系列——编写ssm整合的关键配置文件(web.xml)

编写ssm整合的关键配置文件(web.xml)


前言

web.xml,一个Tomcat工程中最重要的配置文件。web.xml没有其实也可以----只要你确定你的项目里面不需要任何过滤器、监听器、Servlet等等

在启动一个WEB项目的时候,WEB容器(比如tomcat)会去读取它的配置文件web.xml,读取到不同的节点时,WEB容器就会创建相应的过滤器、监听器等为这个web项目服务。

如果你之前学过servlet肯定知道web.xml的加载顺序为:context-param->listener->filter->servlet。


该项目的web.xml内容解析

在ssm-crud项目下打开web.xml

1.contextConfigLocation配置解析

如下代码:


  
  <context-param>
  	<param-name>contextConfigLocationparam-name>
  	<param-value>classpath:applicationContext.xmlparam-value>
  context-param>
  <listener>
  	<listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
  listener>

作用:该元素用来声明应用范围(整个WEB项目)内的上下文初始化参数。
param-name 设定上下文的参数名称。必须是唯一名称
param-value 设定的参数名称的值
contextConfigLocation 参数定义了要装入的 Spring 配置文件。
与Spring相关的配置文件必须要以"applicationContext-"开头,要符合约定优于配置的思想

看到有一篇相关的详解:https://blog.csdn.net/tiantiandjava/article/details/8964912

和contextConfigLocation配合使用的是ContextLoaderListener
在myeclipse中使用快捷键 ctrl+shift+t可以直接打开它的源码文件,如图:
contextLoaderListener
可以看到,它是一个继承于ContextLoader和实现了ServletContextListener接口的一个类。如有需要可以它们的源码,这里不关注。
那么ContextLoaderListener的作用是什么?

ContextLoaderListener的作用就是启动Web容器时,读取在contextConfigLocation中定义的xml文件,自动装配ApplicationContext的配置信息,并产生WebApplicationContext对象,然后将这个对象放置在ServletContext的属性里,这样我们只要得到Servlet就可以得到WebApplicationContext对象,并利用这个对象访问spring容器管理的bean。
简单来说,就是上面这段配置为项目提供了spring支持,初始化了Ioc容器。

作者:walidake 链接:https://www.jianshu.com/p/523bfddf0810 來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

当然添加了以上配置后,还有在 src/main/resourse目录下新建一个applicationContext.xml文件(new spring bean Definition)。
applicationContext.xml配置信息会在下一篇文章。

2.dispatcherServlet


  <servlet>
  	<servlet-name>dispatcherServletservlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
  	
  	 <load-on-startup>1load-on-startup>
  servlet>
  
  <servlet-mapping>
  	<servlet-name>dispatcherServletservlet-name>
  	<url-pattern>/url-pattern>
  servlet-mapping>
  

配置DispatcherServlet表示,该工程将采用springmvc的方式。启动时也会默认在/WEB-INF目录下查找XXX-servlet.xml作为配置文件.

dispatcherServlet是名字名字,该文件中将配置两项重要的mvc特性:HandlerMapping,负责为DispatcherServlet这个前端控制器的请求查找Controller;

这里有一篇对于dispatcherServlet更详细的文章:https://juejin.im/post/58eb3c34b123db1ad06796c6

3.CharacterEncodingFilter 字符编码过滤器


  <filter>
  	<filter-name>CharacterEncodingFilterfilter-name>
  	<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
  	<init-param>
		<param-name>encodingparam-name>
		<param-value>utf-8param-value>
  	init-param>
  	<init-param>
		<param-name>forceRequestEncodingparam-name>
		<param-value>trueparam-value>
  	init-param>
  	<init-param>
  		<param-name>forceResponseEncodingparam-name>
  		<param-value>trueparam-value>
  	init-param>
  filter>
  <filter-mapping>
  	<filter-name>CharacterEncodingFilterfilter-name>
  	<url-pattern>/*url-pattern>
  filter-mapping>

过滤器基础知识

指定一个过滤器。
用于为过滤器指定一个名字,该元素的内容不能为空。
元素用于指定过滤器的完整的限定类名。
元素用于为过滤器指定初始化参数,它的子元素指定参数的名字,指定参数的值。
在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
子元素用于设置filter的注册名称。该值必须是在元素中声明过的过滤器的名字
设置 filter 所拦截的请求路径(过滤器关联的URL样式)

CharacterEncodingFilter类注释源码译文片段:

Servlet过滤器,允许用户为请求指定字符编码。
*这很有用,因为当前的浏览器通常不设置字符
*编码,即使在HTML页面或表单中指定。
*如果请求尚未应用,则此过滤器可以应用其编码
*指定编码,或在任何情况下强制执行此过滤器的编码
*(“forceEncoding”=“true”)。 在后一种情况下,编码也将是
*作为默认响应编码应用(虽然这通常会被覆盖
*通过视图中设置的完整内容类型)。

一句话总结:使用过滤器设置项目的编码默认使用utf-8,至于其中的两个参数forceRequestEncoding,forceResponseEncoding,是该类的逻辑要求,可以参考源码:CharacterEncodingFilter

一篇关于filter 过滤器的文章:Filter 过滤器

4.HiddenHttpMethodFilter

  • URI (Uniform Resource Identifier)标识、定位任何资源的字符串
  • URL是URI的子集

  <filter>
  	<filter-name>HiddenHttpMethodFilterfilter-name>
  	<filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class>
  filter>
  <filter-mapping>
  	<filter-name>HiddenHttpMethodFilterfilter-name>
  	<servlet-name>/*servlet-name>
  filter-mapping>

HiddenHttpMethodFilter类注释源码译文片段:

  • {@link javax.servlet.Filter}将发布的方法参数转换为HTTP方法,可通过{@link HttpServletRequest#getMethod()}检索。由于浏览器目前只有 *支持GET和POST,这是一种常见技术 -
  • 例如Prototype库使用 - 是使用带有附加隐藏表单字段的普通POST( _method 传递“真正的”HTTP方法。此过滤器读取该参数并进行更改 * {@link HttpServletRequestWrapper#getMethod()}相应地返回值。

它的文章:HiddenHttpMethodFilter


完整web.xml

在ssm-crud的web.xml下添加如下:


<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 	xmlns="http://java.sun.com/xml/ns/javaee"
  	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   	id="WebApp_ID" version="3.0">
  <display-name>ssm-cruddisplay-name>
  <welcome-file-list>
    <welcome-file>index.htmlwelcome-file>
    <welcome-file>index.htmwelcome-file>
    <welcome-file>index.jspwelcome-file>
    <welcome-file>default.htmlwelcome-file>
    <welcome-file>default.htmwelcome-file>
    <welcome-file>default.jspwelcome-file>
  welcome-file-list>
  
  
  
  <context-param>
  	<param-name>contextConfigLocationparam-name>
  	<param-value>classpath:applicationContext.xmlparam-value>
  context-param>
  <listener>
  	<listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
  listener>
  
  
  <servlet>
  	<servlet-name>springDispatcherServletservlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
  	
  	 <load-on-startup>1load-on-startup>
  servlet>
  
  <servlet-mapping>
  	<servlet-name>dispatcherServletservlet-name>
  	<url-pattern>/url-pattern>
  servlet-mapping>
  
  
  <filter>
  	<filter-name>CharacterEncodingFilterfilter-name>
  	<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
  	<init-param>
		<param-name>encodingparam-name>
		<param-value>utf-8param-value>
  	init-param>
  	<init-param>
		<param-name>forceRequestEncodingparam-name>
		<param-value>trueparam-value>
  	init-param>
  	<init-param>
  		<param-name>forceResponseEncodingparam-name>
  		<param-value>trueparam-value>
  	init-param>
  filter>
  <filter-mapping>
  	<filter-name>CharacterEncodingFilterfilter-name>
  	<url-pattern>/*url-pattern>
  filter-mapping>
  
  
  <filter>
  	<filter-name>HiddenHttpMethodFilterfilter-name>
  	<filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class>
  filter>
  <filter-mapping>
  	<filter-name>HiddenHttpMethodFilterfilter-name>
  	<servlet-name>/*servlet-name>
  filter-mapping>
  
web-app>

END

你可能感兴趣的:(ssm框架整合入门系列)