java 方式配置ssm,关于SSM以及Spring boot中对于Spring MVC配置的问题

SSM中 Spring MVC配置

传统的web.xml配置

web.xml

contextConfigLocation

classpath*:applicationContext.xml

org.springframework.web.context.ContextLoaderListener

encodingFilter

org.springframework.web.filter.CharacterEncodingFilter

encoding

UTF-8

encodingFilter

/*

SpringMVC

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

classpath:spring-mvc.xml

SpringMVC

/

spring-mvc.xml

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:beans="http://www.springframework.org/schema/beans"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc.xsd

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd">

id="internalResourceViewResolver">

基于java配置的方式

现在JavaConfig配置方式在逐步取代xml配置方式。而WebApplicationInitializer可以看做是Web.xml的替代,它是一个接口。通过实现WebApplicationInitializer,在其中可以添加servlet,listener等,在加载Web项目的时候会加载这个接口实现类,从而起到web.xml相同的作用。

SpittrWebAppInitializer 主配置类

//扩展自Abstrac~Initializer的任意类,都会自动地配置Dispatcher-Servlet和Spring应用上下文

//spring的应用上下文会位于程序的Servlet上下文之中

public class SpittrWebAppInitializer extends

AbstractAnnotationConfigDispatcherServletInitializer {

@Override

protected Class>[] getServletConfigClasses() {

return new Class>[] { WebConfig.class };

}

//映射“/”,表示会使用默认的Servlet

@Override

protected String[] getServletMappings() {

return new String[] { "/" };

}

@Override

protected Class>[] getRootConfigClasses() {

// TODO Auto-generated method stub

return null;

}

@Override

protected Filter[] getServletFilters() {

final CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();

encodingFilter.setEncoding("UTF-8");

encodingFilter.setForceEncoding(true);

return new Filter[] { encodingFilter };

}

}

我们创建的SpittrWebAppInitializer这个类是继承了

AbstractAnnotationConfigDispatcherServletInitializer,其继承关系为:

AbstractAnnotationConfigDispatcherServletInitializer extends AbstractDispatcherServletInitializer extends AbstractContextLoaderInitializer implements WebApplicationInitializer

AbstractDispatcherServletInitializer对DispatcherServlet进行了自动配置和初始化;AbstractContextLoaderInitializer初始化和配置了Spring应用的上下文。因此,任意继承自这个类的类都会通过创建DispatcherServlet和ContextLoaderListener,自动配置DispatcherServlet和Spring应用上下文,但是真正完成配置上下文的是WebApplicationInitializer接口。

WebApplicationInitializer接口

WebApplicationInitializer接口是如何完成配置的呢?其只有一个方法onStartup,看不出什么头绪。但是,在这个包下有另外一个类,SpringServletContainerInitializer。

public interface WebApplicationInitializer {

void onStartup(ServletContext servletContext) throws ServletException;

}

@HandlesTypes(WebApplicationInitializer.class)

public class SpringServletContainerInitializer implements ServletContainerInitializer {

@Override

public void onStartup(Set> webAppInitializerClasses, ServletContext servletContext)

throws ServletException {

List initializers = new LinkedList();

if (webAppInitializerClasses != null) {

for (Class> waiClass : webAppInitializerClasses) {

// Be defensive: Some servlet containers provide us with invalid classes,

// no matter what @HandlesTypes says...

if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) &&

WebApplicationInitializer.class.isAssignableFrom(waiClass)) {

try {

initializers.add((WebApplicationInitializer) waiClass.newInstance());

}

catch (Throwable ex) {

throw new ServletException("Failed to instantiate WebApplicationInitializer class", ex);

}

}

}

}

if (initializers.isEmpty()) {

servletContext.log("No Spring WebApplicationInitializer types detected on classpath");

return;

}

servletContext.log(initializers.size() + " Spring WebApplicationInitializers detected on classpath");

AnnotationAwareOrderComparator.sort(initializers);

for (WebApplicationInitializer initializer : initializers) {

initializer.onStartup(servletContext);

}

}

}

SpringServletContainerInitializer实现了ServletContainerInitializer接口,其在web容器启动时为提供给第三方组件机会做一些初始化的工作,例如注册servlet或者filtes等,servlet规范中通过ServletContainerInitializer实现此功能。每个框架要使用ServletContainerInitializer就必须在对应的jar包的META-INF/services 目录创建一个名为javax.servlet.ServletContainerInitializer的文件,文件内容指定具体的ServletContainerInitializer实现类,那么,当web容器启动时就会运行这个初始化器做一些组件内的初始化工作。

一般伴随着ServletContainerInitializer一起使用的还有HandlesTypes注解,通过HandlesTypes可以将HandlesTypes指定的类或者实现该接口的类注入到SpringServletContainerInitializer的onStartup方法作为参数传入。

Tomcat容器的ServletContainerInitializer机制的实现,主要交由Context容器和ContextConfig监听器共同实现,ContextConfig监听器负责在容器启动时读取每个web应用的WEB-INF/lib目录下包含的jar包的META-INF/services/javax.servlet.ServletContainerInitializer,以及web根目录下的META-INF/services/javax.servlet.ServletContainerInitializer,通过反射完成这些ServletContainerInitializer的实例化,然后再设置到Context容器中,最后Context容器启动时就会分别调用每个ServletContainerInitializer的onStartup方法,并将感兴趣的类作为参数传入。

Spring Web中通常会有两种应用上下文,一种是Spring MVC上下文,这种上下文通过DispatcherServlet加载,对应上边的getServletConfigClasses()方法,另一种上下文是spring容器本身的上下文,就要通过ContextLoaderListerner创建,对应的是方法getRootConfigClasses()

WebConfig.java 类

@Configuration //标明了该类是一个配置类并且会将该类作为一个SpringBean添加到IOC容器内

@EnableWebMvc

//通过查看@EnableWebMvc的源码,可以发现该注解就是为了引入一个DelegatingWebMvcConfiguration Java 配置类。并翻看DelegatingWebMvcConfiguration的源码会发现该类似继承于WebMvcConfigurationSupport的类。

@ComponentScan("spitter.web")

public class WebConfig extends WebMvcConfigurerAdapter {

/**

* 配置JSP视图解析器,他会查找jsp文件,在查找的时候

* 他会在视图名称上加一个特定的前缀和后缀

* home的视图——解析成为/WEB-INF/views/home.jsp

* @return

*/

@Bean

public ViewResolver viewResolver(){

InternalResourceViewResolver resolver=

new InternalResourceViewResolver();

resolver.setPrefix("/WEB-INF/views/");

resolver.setSuffix(".jsp");

resolver.setExposeContextBeansAsAttributes(true);

return resolver;

}

/**

* 通过调用enable方法,我们要求DispatcherServelet将

* 对静态资源的请求转发到Servlet容器中的默认的Servlet上,

* 不是DispatcherServelet本身处理

* @param configurer

*/

public void configureDefaultServleHandling(DefaultServletHandlerConfigurer configurer){

configurer.enable();

}

}

WebConfig中的配置其实就是对应web.xml中spring-mvc.xml的配置。@EnableWebMvc注解内部使用了@Import(DelegatingWebMvcConfiguration.class),其作用是会把WebMvcConfigurationSupport当成配置文件来用,将其中所有标识有@Bean注解的方法配置成bean,这就成了Spring mvc的默认配置。

@Configuration

public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {

private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();

@Autowired(required = false)

public void setConfigurers(List configurers) {

if (!CollectionUtils.isEmpty(configurers)) {

this.configurers.addWebMvcConfigurers(configurers);

}

}

....//省略其他方法

}

DelegatingWebMvcConfiguration继承了WebMvcConfigurationSupport类,其setConfigurers()方法在覆盖父类的方法之前,它会寻找容器中所有的WebMvcConfigurer实现类,将所有WebMvcConfigurer实现类中的配置组合起来,组成一个超级配置(WebMvcConfigurerAdapter是WebMvcConfigurer的实现类)。这样,WebMvcConfigurationSupport中的bean发布时,就会把这所有配置都带上了。

WebMvcConfigurer接口提供的功能如下表所示:

配置接口

接口说明

configurePathMatch

配置HandlerMapping路径匹配参数

configureContentNegotiation

配置路径到请求内容类型转换的相关参数,如.pdf结尾的请求解析成PDF类型或者其它等

configureAsyncSupport

配置异步请求处理相关参数

configureDefaultServletHandling

配置是否需要以下功能:如果一个请求没有被任何Handler处理,那是否使用DefaultServletHttpRequestHandler来进行处理?

addFormatters

增加额外的Converter和Formatter

addInterceptors

增加拦截器

addResourceHandlers

增加处理静态资源的Handler

addCorsMappings

配置跨域请求相关参数

addViewControllers

使用特殊的Controller来处理指定的URL请求;

configureViewResolvers

配置将Controller返回的视图名称转换成视图的视图解析器; 以便进行视图渲染

addArgumentResolvers

添加支持个性化配置Controller的方法参数类型的Resolver。

addReturnValueHandlers

添加支持个性化处理Controller返回数据类型的处理器;

configureMessageConverters

配置消息转换器;

extendMessageConverters

扩展消息转换器

configureHandlerExceptionResolvers

配置异常处理器

extendHandlerExceptionResolvers

扩展异常处理器

注意:

spring-webmvc 从5.0开始已经废除了WebMvcConfigurerAdapter类,对于spring mvc的配置可以通过直接实现WebMvcConfigurer接口来实现。

public class WebConfig implements WebMvcConfigurer

Spring boot

在spring boot中通过WebMvcAutoConfiguration自动配置类已经将配置的大部分工作完成了,可以简单的认为,WebMvcAutoConfiguration完成了之前SpittrWebAppInitializer和WebConfig的工作,提供适用于多数应用的自动配置功能。自动配置添加了以下特性:

引入ContentNegotiatingViewResolver和BeanNameViewResolver beans。

对静态资源的支持,包括对WebJars的支持。

自动注册Converter,GenericConverter,Formatter beans。

对HttpMessageConverters的支持。

自动注册MessageCodeResolver。

一般情况下是不需要改动mvc的配置的,但是如果需要添加其他mvc配置,有两种方法:

全面弃用spring boot的自动配置

直接继承WebMvcConfigurationSupport在扩展的类中重写父类的方法

使用注解@Configuration + @EnableWebMvc,并继承WebMvcConfigurationAdapter,重写父类的方法

在spring boot自动配置的基础上添加部分配置

继承WebMvcConfigurationAdapter,在扩展的类中重写父类的方法

注意:

spring boot 从2.0使用spring-webmvc 5.0因此继承WebMvcConfigurationAdapter需要替换为实现WebMvcConfigurer接口

public class WebConfig implements WebMvcConfigurer

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 并发的原子性_Java并发教程–原子性和竞争条件

java 并发的原子性原子性是多线程程序中的关键概念之一。 我们说一组动作是原子的,如果它们都以不可分割的方式作为单个操作执行。 认为多线程程序中的一组操作将被串行执行是理所当然的,可能会导致错误的结果。 原因是由于线程干扰,这意味着…

linux 误删除mysql表能恢复吗,Linux误删数据恢复

引子指在键上飘,难免会湿手套。当你按下shiftdel键后,会不会突然心里凉透,当你执行rm -rf后,会不会马上去搜索哪个国家入境不需要签证。或者你还会遇到如下的情况:root4xem7:~# aliasalias cdrm -rfalias ddocker数据恢…

Apache Camel 3.1 –更多骆驼核心优化(第3部分)

我以前曾在博客中介绍过我们在下一个Camel 3.1版本中所做的优化 博客第1部分 博客第2部分 今天,我想简短介绍一下我们已经完成的最新开发,因为我们准备在本周末或下半年准备好构建和发布Camel 3.1。 从第2部分开始,我们设法在路由过程中将…

mysql error 1114,mysql error 1114 table is full 处理分享

问题描述:一、早上上班收到报警,用户中心某slave不同步。二、查看情况,发现mysql error 1114,The table ‘xxxx’ is full 。。。。。三、检查其他slave,都出现同样问题。四、解决问题方案1、网上解决方案a、修改tmp_…

jvm jinfo 参数_jinfo:JVM运行时配置的命令行浏览

jvm jinfo 参数在最近的一些博客中(特别是在对Java EE 7性能调优和优化以及WildFly性能调优的书中的评论中),我引用了自己过去在某些Oracle JDK命令行工具上的博客文章。 令我震惊的是,我从来没有专门解决过漂亮的jinfo工具&#…

matlab int 积不出,matlab – 点积:*命令与循环给出不同的结果

我在Matlab,z和beta中有两个向量.矢量z是117:1 0.430742139435890 0.257372971229541 0.0965909090909091 0.694329541928697 0 0.394960106863064 0 0.100000000000000 1 0.264704325268675 0.387774594078319 0.269207605609567 0.472226643323253 0.750000000000…

49自动化测试中最常见的硒异常

开发人员将始终在编写代码时牢记不同的场景,但是在某些情况下,实现可能无法按预期工作。 相同的原则也适用于测试代码,该代码主要用于测试现有产品的功能,发现错误以及使产品100%不受错误影响。 正确地说,…

鹰式价差matlab,鹰式期权:什么叫铁鹰式期权组合,蝶式价差期权?

蝶式期权套利 是利用 交割月份的价差进行 套期获利, 个方向相 反、 共享居中交割月份合约的跨期套利组成。是一种期权策略,风险有限,盈利也有限,是由一手牛市套利和一手熊市套利组合而成的。铁鹰式期权组合是牛市看跌价差期权组合…

angular8 rest_带有Angular JS的Java EE 7 – CRUD,REST,验证–第2部分

angular8 rest这是Angular JS承诺的Java EE 7的后续版本–第1部分 。 花了比我预期更长的时间(找到时间来准备代码和博客文章),但是终于到了! 应用程序 第1部分中的原始应用程序只是带有分页的简单列表,以及提供列表数…

php如果字符串有1 3 5,Day3-php 字符串1

字符串是由一系列字符组成,在PHP中,字符和字节一样,也就是说,一共有256种不同字符的可能性。1、字符串 定义方法字符串型可以用三种方法定义:单引号形式、双引号形式和Heredoc结构形式。单引号:不会解析变量…

带有Java Pojo作为输入输出示例的AWS Lambda函数

在上一教程中,我们看到了如何使用Java创建AWS Lambda函数,并传递了String作为输入,还返回了String作为Output。如果您是第一次创建lambda函数,我建议先阅读该教程。 在本教程中,我们将看到如何传递Java普通的旧Java对…

bing搜索php,PHP 使用bing搜索网站的api封装类用法

/*** 使用bing api搜索网站的PHP封装类** param* author 编程之家 jb51.cc jb51.cc**/class BingAPI{var $accountKey ;var $ServiceRootURL https://api.datamarket.azure.com/Bing/Search/;var $WebSearchURL;var $searchText;var $searchType;var $request_data;var $Auto…

php右侧弹窗QQ客服,JavaScript_网页右侧悬浮滚动在线qq客服代码示例,网页右侧悬浮滚动QQ在线客服 - phpStudy...

网页右侧悬浮滚动在线qq客服代码示例网页右侧悬浮滚动QQ在线客服代码function myEvent(obj,ev,fn){if (obj.attachEvent){obj.attachEvent(onev,fn);}else{obj.addEventListener(ev,fn,false);};};function getbyClass(id,sClass){var oParent document.getElementById(id);va…

测试Maven版本插件自动递增版本号

抽象 Maven版本插件是一个非常强大的工具,我在很大程度上依赖于它来协调软件版本。 通常,软件发行版本号遵循简单的1.0.0.0-SNAPSHOT格式。 但是最近我需要在版本号中添加限定符-类似于1.0-beta-SNAPSHOT或1.0.0-fix-bug-description-SNAPSHOT 。 在我第…

idea spark java,IntelliJ Idea 搭建spark 开发环境

笔者介绍的是在MAC环境下使用Idea搭建spark环境。环境:spark 2.0.0scala 2.11.8maven 3.9.9idea 151.Idea的安装.Idea可以在官网上下载。熟悉java的肯定都知道这个开发利器,可以在官网上进行下载,在此就不在赘述。有免费的和付费版本,对于我们…

optaplanner_OptaPlanner –具有真实道路距离的车辆路线

optaplanner在现实世界中,车辆路径问题(VRP)中的车辆必须走这条路:它们不能在客户之间直线行驶。 大多数VRP研究论文和演示都乐于忽略此实现细节。 和我一样,过去。 尽管使用道路距离(而不是空中距离&#…

php 转换数组为小写,PHP如何将数组键转换为小写?

在PHP中将数组键转换为小写,我们可以在不使用循环的情况下来简单实现。我们只需要使用array_change_key_case()。array_change_key_case函数有两个参数,一个为数组,另一个可以为常量“CASE_LOWER”,那么我们在做大项目的时候可能会…

带有PostgreSQL的Docker Compose for Spring Boot应用程序

在此博客文章中,您将学习如何使用PostgreSQL配置Spring Boot应用程序以与Docker Compose一起运行。 这篇博客文章涵盖: Spring Boot应用程序Dockerfile配置,在依赖关系和资源之间进行了清晰的分离 用于通过PostgreSQL运行应用程序的Docker…

java中的jpa_JPA教程–在Java SE环境中设置JPA

java中的jpaJPA代表Java Persistence API,它基本上是一个规范,描述了一种将数据持久存储到持久存储(通常是数据库)中的方法。 我们可以将其视为类似于Hibernate之类的ORM工具的东西,除了它是Java EE规范的正式组成部分…

java中给组合框加监听器,如何区分ActionEvent中的多个组合框

我有两个类,一个包含两个组合框的监听器类和一个监听两个组合框的监听器类。该软件是关于披萨的,而组合框的选择是披萨类型和数量,我会发布相关的代码。(gui class)private Listener listen new Listener();private JComboBox chooseItem n…