SpringMVC从配置初始化到HTTP请求全流程解析

1. 初始化配置

SpringMVC的请求处理依赖DispatcherServlet,而bean的管理依赖自身的Spring容器,配置管理现在依赖于SpringBoot.

  • 对于在servlet 3.0之前,Spring要应用于Web项目,启动的过程要依赖容器,在容器启动完成后触发Spring的初始化,而Web容器启动状态的监听是通过Listener来完成的,具体的接口就是ServletContextListener,其属于Servlet的规范,Spring的ContextLoaderListener类实现了ServletContextListener接口,从而我们可以想到,如果要在Web容器启动后自动初始化Spring则需要把ServletContextListener配置到web.xml中去。
  • SpringBoot的诞生改变了Spring的初始化方式,SpringBoot首先启动Spring容器,然后再根据配置启动嵌入的容器。(其实早在SpringBoot诞生之前就可以这样干了, 我们可以利用ClassPathXmlApplicationContext或者XmlBeanDefinitionReader 来读取Spring bean的配置文件,从而进行Spring的初始化)。
  • 那么SpringMVC的DispatcherServlet是怎么初始化的呢。首先它是一个Servlet,在Servlet 3.0之前,直接在web.xml中配置servlet,因为servlet规范中Listener是先于servlet初始化的,所以在初始化servlet的时候Spring容器已经启动,从而当请求到达DispatcherServlet后可以利用Spring容器中的bean。
  • 在servlet3.0即之后,由于可以编程式的动态实例化servlet,其通过ServletRegistration.Dynamic类注册新的servlet,所以在SpringBoot中DispacherServlet的注入就可以直接交给autoConfigure模块的DispatcherServletAutoConfiguration类来完成了。其实servlet新规范中还有一套注解用来取代以前的web.xml配置,在SpringBoot的场景下也可以使用这套注解,Spring完全可以给DispatcherServlet加上@WebServlet(配合@ServletComponentScan)注解,在Spring初始化web容器之后,容器会自动装配上servlet,但是看了下SpringBoot的代码并没有这样做。

SpringMVC的配置包含两部分,一部分是MVC相关配置,一部分是DispatcherServlet与容器相关的配置。

1.1 servlet容器相关配置DispatcherServletAutoConfiguration

在SpringBoot中,是通过DispatcherServletAutoConfiguration来对DispatcherServlet进行配置的。
首先我们看一下类的配置:

@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) //以最高优先级启动
@Configuration
@ConditionalOnWebApplication(type = Type.SERVLET) //应用是基于servlet的才启动
@ConditionalOnClass(DispatcherServlet.class)//DispatcherServlet必须要存在
@AutoConfigureAfter(ServletWebServerFactoryAutoConfiguration.class) //在ServletWebServerFactoryAutoConfiguration初始化之后
public class DispatcherServletAutoConfiguration {
   
}

这里首先我们要来关心一下ServletWebServerFactoryAutoConfiguration,因为DispatcherServlet的配置在它之后。

1.1.1 ServletWebServerFactoryAutoConfiguration

@Configuration
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) //最高优先级启动
@ConditionalOnClass(ServletRequest.class) //ServletRequest类存在
@ConditionalOnWebApplication(type = Type.SERVLET) //servlet服务
@EnableConfigurationProperties(ServerProperties.class) //引入ServerProperties配置
@Import({
    //导入以下类 (@Import将对于的类实例化后注入IOC容器)
      ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
      ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
      ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
      ServletWebServerFactoryConfiguration.EmbeddedUndertow.class 
 })
public class ServletWebServerFactoryAutoConfiguration {
   
}

很明显可以看出,该类是为servlet容器相关配置来服务的,它要求必须存在ServletRequest类,应用类型是SERVLET。这里我们注意到首先引入了BeanPostProcessorsRegistrar,应该是要左一些bean初始化的后置处理,然后引入了具体的servlet容器的实现配置。

具体看下这个自动配置类做了些什么:

//实例化ServletWebServerFactoryCustomizer 
@Bean
public ServletWebServerFactoryCustomizer servletWebServerFactoryCustomizer(ServerProperties serverProperties) {
   
   return new ServletWebServerFactoryCustomizer(serverProperties);
}
//在有Tomcat类存在(即引入了tomcat的jar)的情况下实例化TomcatServletWebServerFactoryCustomizer 
@Bean
@ConditionalOnClass(name = "org.apache.catalina.startup.Tomcat")
public TomcatServletWebServerFactoryCustomizer tomcatServletWebServerFactoryCustomizer(
      ServerProperties serverProperties) {
   
   return new TomcatServletWebServerFactoryCustomizer(serverProperties);
}


/**
 * 通过实现ImportBeanDefinitionRegistrar接口来实现早期的WebServerFactoryCustomizerBeanPostProcessor注入
 * 其实就是注入一个bean后置处理器
 * */

public static class BeanPostProcessorsRegistrar implements ImportBeanDefinitionRegistrar, BeanFactoryAware {
   

   private ConfigurableListableBeanFactory beanFactory;

   //设置beanFactory
   @Override
   public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
   
      if (beanFactory instanceof ConfigurableListableBeanFactory) {
   
         this.beanFactory = (ConfigurableListableBeanFactory) beanFactory;
      }
   }

   //注册web服务自定义配置后置处理器和错误页面后置处理器
   @Override
   public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
         BeanDefinitionRegistry registry) {
   
      if (this.beanFactory == null) {
   
         return;
      }
      registerSyntheticBeanIfMissing(registry, "webServerFactoryCustomizerBeanPostProcessor",
            WebServerFactoryCustomizerBeanPostProcessor.class);
      registerSyntheticBeanIfMissing(registry, "errorPageRegistrarBeanPostProcessor",
            ErrorPageRegistrarBeanPostProcessor.class);
   }

   //注入类具体实现
   private void registerSyntheticBeanIfMissing(BeanDefinitionRegistry registry, String name, Class<?> beanClass) {
   
   //在BeanFactory中找不到对应的bean时,则将对应Class的bean注入
      if (ObjectUtils.isEmpty(this.beanFactory.getBeanNamesForType(beanClass, true, false))) {
   
         RootBeanDefinition beanDefinition = new RootBeanDefinition(beanClass);
         beanDefinition.setSynthetic(true);
         registry.registerBeanDefinition(name, beanDefinition);
      }
   }

}

1.1.2 ServletWebServerFactoryConfiguration

再来看引入的ServletWebServerFactoryConfiguration具体做了哪些配置:

/**servlet web服务器的配置类
这些类应该被Import到一个常规的自动配置类中以此来保证他们的执行顺序。
这里就是被引入到了ServletWebServerFactoryAutoConfiguration 类里面。
**/
@Configuration
class ServletWebServerFactoryConfiguration {
   

   //嵌入tomcat
   @Configuration
   @ConditionalOnClass({
    Servlet.class, Tomcat.class, UpgradeProtocol.class })
   @ConditionalOnMissingBean(value = ServletWebServerFactory.class, search = SearchStrategy.CURRENT)
   public static class EmbeddedTomcat {
   
      @Bean
      public TomcatServletWebServerFactory tomcatServletWebServerFactory() {
   
         return new TomcatServletWebServerFactory();
      }
   }

   /**
    * jetty的配置.
    */
   @Configuration
   @ConditionalOnClass({
    Servlet.class, Server.class, Loader.class, WebAppContext.class })
   @ConditionalOnMissingBean(value = ServletWebServerFactory.class, search = SearchStrategy.CURRENT)
   public static class EmbeddedJetty {
   
      @Bean
      public JettyServletWebServerFactory JettyServletWebServerFactory() {
   
         return new JettyServletWebServerFactory();
      }
   }

   /**
    * Undertow配置.
    */
   @Configuration
   @ConditionalOnClass({
    Servlet.class, Undertow.class, SslClientAuthMode.class })
   @ConditionalOnMissingBean(value = ServletWebServerFactory.class, search = SearchStrategy.CURRENT)
   public static class EmbeddedUndertow {
   
      @Bean
      public UndertowServletWebServerFactory undertowServletWebServerFactory() {
   
         return new UndertowServletWebServerFactory();
      }
   }
}

从以上代码可以看出,ServletWebServerFactoryConfiguration其实就是根据classpath引入的jar包判断并实例化对应的servlet容器,分别是Tomcat, Jetty,Undertow。主要是分别初始化他们对应的xxServlectWebServerFactory。

1.1.3 ServletWebServerFactoryAutoConfiguration 总结

该类做了以下的事情:
1.初始化TomcatServletWebServerFactoryCustomizer
2.xxServletWebServerFactoryCustomizer通过ServerProperties 进行服务器客户化配置,配置文件前缀是server,例如server.port=8080
3.注入webServerFactoryCustomizerBeanPostProcessor和errorPageRegistrarBeanPostProcessor 后置处理器
4.初始化TomcatServletWebServerFactory(或者其它容器)

1.2 真正的DispatcherServletAutoConfiguration配置

看完了servlet容器相关的配置,然后我们再来看一下DispatcherServletAutoConfiguration做的事情:

1.2.1 实例化DispatcherServlet并传入配置

	@Configuration
	@Conditional(DefaultDispatcherServletCondition.class)
	@ConditionalOnClass(ServletRegistration.class)
	@EnableConfigurationProperties({
    HttpProperties.class, WebMvcProperties.class })
	protected static class DispatcherServletConfiguration {
   
	
		private final HttpProperties httpProperties;
		private final WebMvcProperties webMvcProperties;
        //注入配置
		public DispatcherServletConfiguration(HttpProperties httpProperties, WebMvcProperties webMvcProperties) {
   
			this.httpProperties = httpProperties;
			this.webMvcProperties = webMvcProperties;
		}
		//实例化DispatcherServlet
		@Bean(name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
		public DispatcherServlet dispatcherServlet() {
   
			DispatcherServlet dispatcherServlet = new DispatcherServlet();
			dispatcherServlet.setDispatchOptionsRequest(this.webMvcProperties.isDispatchOptionsRequest());
			dispatcherServlet.setDispatchTraceRequest(this.webMvcProperties.isDispatchTraceRequest());
			dispatcherServlet
					.setThrowExceptionIfNoHandlerFound(this.webMvcProperties.isThrowExceptionIfNoHandlerFound());
			dispatcherServlet.setEnableLoggingRequestDetails(this.httpProperties.isLogRequestDetails());
			return dispatcherServlet;
		}

		@Bean
		@ConditionalOnBean(MultipartResolver.class)
		@ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
		public MultipartResolver multipartResolver(MultipartResolver resolver) {
   
			// Detect if the user has created a MultipartResolver but named it incorrectly
			return resolver;
		}
	}

1.2.2 第二步 :将DispatcherServlet实例注入Servlet容器

@Configuration
@Conditional(DispatcherServletRegistrationCondition.class)
@ConditionalOnClass(ServletRegistration.class)
@EnableConfigurationProperties(WebMvcProperties.class)
@Import(DispatcherServletConfiguration.class)
protected static class DispatcherServletRegistrationConfiguration {
   
	private final WebMvcProperties webMvcProperties;
    //文件上传相关配置
	private final MultipartConfigElement multipartConfig;
    //传入MVC配置和文件上传配置
	public DispatcherServletRegistrationConfiguration(WebMvcProperties webMvcProperties,
			ObjectProvider<MultipartConfigElement> multipartConfigProvider) {
   
		this.webMvcProperties = webMvcProperties;
		this.multipartConfig = multipartConfigProvider.getIfAvailable();
	}
    //将servlet动态配置到ServletContext中, 这是servlet 3.0+的规范
	@Bean(name = DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME)
	@ConditionalOnBean(value = DispatcherServlet.class, name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
	public DispatcherServletRegistrationBean dispatcherServletRegistration(DispatcherServlet dispatcherServlet) {
   
		DispatcherServletRegistrationBean registration = new DispatcherServletRegistrationBean(dispatcherServlet,
				this.webMvcProperties.getServlet().getPath());
		registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME);
		registration.setLoadOnStartup(this.webMvcProperties.getServlet().getLoadOnStartup());
		if (this.multipartConfig != null) {
   
			registration.setMultipartConfig(this.multipartConfig);
		}
		return registration;
	}
}

这里我们可以详细看一下DispatcherServletRegistrationBean是如何实现Servlet的注入的,首先看一下它的依赖图:
依赖图
我们先看一下顶层接口的定义:

/**
 * 用于编程式配置Servlet 3.0+的ServletContext,它不像WebApplicationInitializer,
 * 实现了本接口(但是没有实现WebApplicationInitializer)将不会被SpringServletContainerInitializer(它实现了servlet 3.0规范的ServletContainerInitializer接口)主动发现,
 * 因此后续也不会被Servlet容器自动的启动
 * <p>
 * 这个接口的设计初衷就是要让Spring来管理它的实现而部署Servlet容器
 **/
@FunctionalInterface
public interface ServletContextInitializer {
   
    /**
	 给ServletContext配置任何的servlet、filter、listener、context-params 以及 attribute等必要的初始化条件。 
	 **/
	void onStartup(ServletContext servletContext) throws ServletException;
}

总结一下就是ServletContextInitializer是Spring提供的用来实现动态扩展ServletContext的接口,它的实现由Spring管理,并非Servlet容器。
它的实现RegistrationBean抽象类如下:

public abstract class RegistrationBean implements ServletContextInitializer, Ordered {
   
	private int order = Ordered.LOWEST_PRECEDENCE;
	private boolean enabled = true;

	@Override
	public final void onStartup(ServletContext servletContext) throws ServletException {
   
		String description = getDescription();
		if (!isEnabled()) {
   
			logger.info(StringUtils.capitalize(description) + " was not registered (disabled)");
			return;
		}
		register(description, servletContext);
	}
	//返回一个本次注册的描述
	protected abstract String getDescription();
    //注册
	protected abstract void register(String description, ServletContext servletContext);
    //--------setter and getter-----------------
}

这个类RegistrationBean其实也很简单,在这一层它增加了两个东西,一个是注册的优先级,默认最低,一个是注册是否开起的标志,实际上的注册动作通过模板模式让子类来提供具体的实现。
其子类 DynamicRegistrationBean的实现如下:

/**
基于Servlet 3.0+ javax.servlet.Registration.Dynamic 类实现动态注册的基础类。
这里 Registration就是servlet的规范了,而它的实现由具体的servlet容器来提供,例如tomcat
 */
public abstract class DynamicRegistrationBean<D extends Registration.Dynamic> extends RegistrationBean {
   

    //servlet name,如果不指定,后面会通过getOrDeduceName进行推导,其实就是disparcherServlet
	private String name;
    //servlet是否开启异步  3.0+ 规范
    //这个很重要,说明DispatcherServlet默认是开启异步请求功能的
	private boolean asyncSupported = true;
    //servlet初始化参数
	private Map<String, String> initParameters = new LinkedHashMap<>();

	/**以上参数的set get方法,此处省略………… **/

   //对父类register的实现
	@Override
	protected final void register(String description, ServletContext servletContext) {
   
	    //注册,委托servletContext完成注册
		D registration = addRegistration(description, servletContext);
		if (registration == null) {
   
			logger.info(
					StringUtils.capitalize(description) + " was not registered " + "(possibly already registered?)");
			return;
		}
		configure(registration);
	}

   //同样,具体的注册方法还是交由子类来实现,并且会返回用于注册的Registration.Dynamic
	protected abstract D addRegistration(String description, ServletContext servletContext);

   //配置异步和初始化参数
	protected void configure(D registration) {
   
		registration.setAsyncSupported(this.asyncSupported);
		if (!this.initParameters.isEmpty()) {
   
			registration.setInitParameters(this.initParameters);
		}
	}
    //…………省略不重要代码…………
}

在这里统一管理了servlet是否异步模式,以及提供了初始化参数的配置。
再看看addRegistration是如何实现的 。到目前为止,以上的抽象类是供所有的Filter/Listener/Servlet等注册使用的,再往下就是具体的某种类型注册的实现了,这里即ServletRegistrationBean。

/**
 * 一个ServletContextInitializer的实例,用于注册Servlet到Servlet 3.0+容器。
 * 类似于ServletContext提供的ServletContext.addServlet(String, Servlet)特性,但是对Spring Bean更友好。
 * <p>
 * setServlet(Servlet servlet)方法在onStartup方法被调用前必须先指定它。
 * URL mapping可以用setUrlMappings来配置,或者当配置/*时直接省略(除非alwaysMapUrl被设置为false), servlet 名称如果没有指定则会被推断得出。
 */
public class ServletRegistrationBean<T extends Servlet> extends DynamicRegistrationBean<ServletRegistration.Dynamic> {
   
    //当没有指定urlMappings的时候默认使用改urlMapping
	private static final String[] DEFAULT_MAPPINGS = {
    "/*" };
    //本次要注入的servlet
	private T servlet;
    //可以配置urlMapping
	private Set<String> urlMappings = new LinkedHashSet<>();
    //是否必须指定urlMapping(也不知道干嘛的,后面再看)
	private boolean alwaysMapUrl = true;
    //是否启动即加载
	private int loadOnStartup = -1;
    //文件上传配置
	private MultipartConfigElement multipartConfig;

	//构造方法
	public ServletRegistrationBean() {
   
	}
	//构造方法
	public ServletRegistrationBean(T servlet, String... urlMappings) {
   
		this(servlet, true, urlMappings);
	}
	//构造方法
	public ServletRegistrationBean(T servlet, boolean alwaysMapUrl, String... urlMappings) {
   
		Assert.notNull(servlet, "Servlet must not be null");
		Assert.notNull(urlMappings, "UrlMappings must not be null");
		this.servlet = servlet;
		this.alwaysMapUrl = alwaysMapUrl;
		this.urlMappings.addAll(Arrays.asList(urlMappings));
	}

	//设置要注册的servlet
	public void setServlet(T servlet) {
   
		Assert.notNull(servlet, "Servlet must not be null");
		this.servlet = servlet;
	}
	public T getServlet() {
   
		
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SpringMVC是一个基于MVC架构的Web框架,它可以帮助我们快速地开发Web应用程序。在使用SpringMVC时,我们需要在web.xml文件中进行配置。下面是SpringMVC web.xml配置的详解: 1. 配置DispatcherServlet 在web.xml文件中,我们需要配置一个Servlet来处理所有的请求。这个Servlet就是DispatcherServlet。我们需要在web.xml文件中添加以下配置: ``` <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/springmvc-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> ``` 在这个配置中,我们指定了Servlet的名称为dispatcherServlet,Servlet的类为org.springframework.web.servlet.DispatcherServlet。我们还指定了一个初始化参数contextConfigLocation,它指定了SpringMVC配置文件的位置。在这个例子中,配置文件的位置为/WEB-INF/springmvc-servlet.xml。最后,我们还指定了Servlet的启动顺序为1。 2. 配置Servlet映射 在web.xml文件中,我们还需要配置Servlet的映射。我们需要将所有的请求都映射到DispatcherServlet上。我们需要在web.xml文件中添加以下配置: ``` <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> ``` 在这个配置中,我们将Servlet的名称设置为dispatcherServlet,将URL的模式设置为/。这样,所有的请求都会被映射到DispatcherServlet上。 3. 配置字符编码过滤器 在web.xml文件中,我们还需要配置一个字符编码过滤器。这个过滤器可以确保请求和响应的字符编码都是正确的。我们需要在web.xml文件中添加以下配置: ``` <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 在这个配置中,我们指定了一个字符编码过滤器。我们将过滤器的名称设置为encodingFilter,将过滤器的类设置为org.springframework.web.filter.CharacterEncodingFilter。我们还指定了字符编码为UTF-8,并强制使用UTF-8编码。最后,我们将过滤器映射到所有的URL上。 4. 配置静态资源处理器 在web.xml文件中,我们还需要配置一个静态资源处理器。这个处理器可以帮助我们处理静态资源,如CSS、JavaScript和图片等。我们需要在web.xml文件中添加以下配置: ``` <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> <url-pattern>*.js</url-pattern> <url-pattern>*.png</url-pattern> <url-pattern>*.jpg</url-pattern> <url-pattern>*.gif</url-pattern> </servlet-mapping> ``` 在这个配置中,我们将所有的静态资源的URL模式都映射到默认的Servlet上。这样,当我们访问静态资源时,就可以直接访问它们了。 以上就是SpringMVC web.xml配置的详解。通过这些配置,我们可以快速地搭建一个SpringMVC应用程序。 ### 回答2: Spring MVC是一种常见的Java Web开发框架,供开发人员快速构建Web应用程序。在使用Spring MVC框架进行开发时,需要在Web.xml文件中进行一些配置来确保正确运行。下面是一个关于Spring MVC Web.xml配置的详细解释。 1. 配置DispatcherServlet 在Web.xml文件中,需要配置DispatcherServlet,这是Spring MVC中的核心Servlet,它接收所有来自客户端的请求,然后将请求分派到相应的控制器上。配置DispatcherServlet时,需要指定Servlet名称、Servlet类、URL模式。 <servlet> <servlet-name>springDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/spring-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springDispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> 2. 配置Spring ContextLoaderListener Spring MVC框架需要依赖Spring Framework,因此需要在Web.xml中配置一个Spring ContextLoaderListener来加载Spring上下文。Spring ContextLoaderListener会在Web应用程序启动时自动加载Spring配置文件,并将所有Spring bean加载到应用程序上下文中。 <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> 3. 配置字符集编码过滤器 为了确保应用程序能够处理国际化的文本消息,需要配置一个字符集编码过滤器,将接收到的请求和响应都设置为指定的字符集编码。 <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 4. 配置Spring MVC资源处理器 Spring MVC框架在处理Web请求时,需要使用资源处理器来加载和处理请求中使用的所有静态文件,如CSS、JavaScript、图片等。可以通过以下方式配置资源处理器: <mvc:resources mapping="/resources/**" location="/resources/" /> 5. 配置SpringMVC的视图解析器 Spring MVC框架使用视图解析器来获取请求处理器返回的视图名称,并将其解析为可执行的视图。通过以下方式配置视图解析器: <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean> 以上是关于Spring MVC Web.xml配置的详细解释。这些配置项将确保Spring MVC应用程序正常运行并且能够接收和响应客户端的请求。当然,Web.xml配置也有一些其他的配置项,如果您需要自定义一些配置,可以参考相关的文档或向社区寻求帮助。 ### 回答3: Spring MVC是一种基于Java的Web框架,可以用于快速开发Web应用程序。在Web应用程序中,Web.xml是配置文件,用于描述Web应用程序的URL映射和其他关键元素。在SpringMVC中,Web.xml也需要进行配置,以确保SpringMVC能够正确运行。下面我们来详细介绍SpringMVC中Web.xml的配置。 分为以下几个方面进行介绍: 一、基本介绍: SpringMVC中的Web.xml文件主要用于注册SpringMVC模块,并将请求路径与对应的Controller进行映射。Web.xml文件配置了Servlet,Filter,Listener等元素,这些元素都会被由Servlet容器Tomcat读取并执行。 二、配置DispatcherServlet: 处理所有类型请求,即所有请求都交由DispatcherServlet进行处理。 DispatcherServlet有两个参数: 1、contextConfigLocation:指定Spring的上下文配置文件,比如applicationContext.xml等。 2、springmvc:指定Spring MVC 配置文件的路径,比如springmvc-servlet.xml等。 <!-- SpringMVC 配置 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/applicationContext.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> 三、配置CharacterEncodingFilter: CharsetEncodingFilter是在Spring MVC中用于对请求进行编码和解码的过滤器,它可以使用init-param来设置特定的编码。 <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 四、配置Spring IoC容器: 我们可以使用ContextLoaderListener来配置Spring IoC容器。 <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> 五、配置spring-security: 创建spring-security.xml文件用于配置spring-security. <context:annotation-config/> <context:component-scan base-package="com.spring.bean"/> <http> <intercept-url pattern="/**" access="ROLE_USER" /> <access-denied-handler error-page="/403" /> <csrf disabled="true"/> </http> <authentication-manager> <authentication-provider user-service-ref="myUserDetailsService" /> </authentication-manager> 总结: Web.xml文件配置了Servlet,Filter,Listener等元素,这些元素都会被由Servlet容器Tomcat读取并执行。主要是通过配置DispatcherServlet、CharsetEncodingFilter、Spring IoC容器、spring-security等,来实现SpringMVC配置。除此之外,Web.xml的配置还有很多,以上仅是几个常用的配置

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值