环境:Spring5.3.26
SpringMVC使用相信大家都会使用,别人项目工程搭建后,你只需负责写Controller即可,那你是否想过自己能否把环境搭建出来呢?而且还不借助网络;本篇教大家如何通过注解快速搭建SpringMVC运行环境。
传统SpringMVC配置本节:回顾传统SpringMVC的基本配置原理。
(资料图片)
DispatcherServlet需要一个WebApplicationContext(一个普通ApplicationContext的扩展)用于它自己的配置。WebApplicationContext有一个链接到ServletContext和它所关联的Servlet。它还绑定到ServletContext,这样应用程序就可以在需要访问WebApplicationContext时使用RequestContextUtils上的静态方法来查找它。
对于许多应用程序来说,只有一个WebApplicationContext就足够简单了。也可以有一个上下文层次结构,其中一个根WebApplicationContext在多个DispatcherServlet(或其他Servlet)实例之间共享,每个实例都有自己的子WebApplicationContext配置。有关上下文层次结构特性的更多信息,请参阅ApplicationContext的附加功能。
根WebApplicationContext通常包含基础设施bean,例如需要跨多个Servlet实例共享的数据存储库和业务服务。这些bean被有效地继承,并且可以在特定于Servlet的子WebApplicationContext中被重写(即重新声明),该子WebApplicationContext通常包含给定Servlet的本地bean。下图显示了这种关系:
web.xml中配置:
org.springframework.web.context.ContextLoaderListener contextConfigLocation /WEB-INF/root-context.xml app1 org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/app1-context.xml 1 app1 /app1/*
ContextLoaderListener:该监听器用来创建Root 容器,该容器就是用来配置基础的Bean,如DAO,Service等。
DispatcherServlet:对应一个web 容器,也就是子容器。该容器用来配置Controller。在Controller中会应用到Service,那么该子容器就会从父容器中查找相应的Bean。如下父子关系配置:
public abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAware { protected WebApplicationContext initWebApplicationContext() { // 获取父容器,该父容器是在ContextLoaderListener监听器中创建并保存到ServletContext中 WebApplicationContext rootContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext()); WebApplicationContext wac = null; if (this.webApplicationContext != null) { wac = this.webApplicationContext; if (wac instanceof ConfigurableWebApplicationContext) { ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) wac; if (!cwac.isActive()) { if (cwac.getParent() == null) { cwac.setParent(rootContext); } configureAndRefreshWebApplicationContext(cwac); } } } if (wac == null) { // 创建子容器并设置父容器 wac = createWebApplicationContext(rootContext); } return wac; }}
以上就是SpringMVC的基本配置。
Servlet注册既然是基于注解的方式配置SpringMVC,那么我们需要先了解Servlet的注册方式有哪些。
方式1:
web.xml中注册
DemoServlet com.pack.servlet.DemoServlet DemoServlet /demo
方式2:
基于注解方式
@WebServlet(name = "demoServlet", urlPatterns = "/demo")@WebServlet(value = {"/demo","/demo1"})@WebServlet(value = "/demo")@WebServlet("/demo")public class DemoServlet extends HttpServlet { // ...}
方式3:
通过SPI技术,这也是今天要使用的方式
Servlet3.0以上的版本开始,可以通过SPI方式注册Servlet,Filter,Listener三大组件。
第一步:在项目中建立如下文件
META-INF/service/javax.servlet.ServletContainerInitializer
文件名:javax.servlet.ServletContainerInitializer
第二步:自定义类实现ServletContainerInitializer
@HandlesTypes({CustomHandler.class})public class CustomContainerInitializer implements ServletContainerInitializer { // 这里的set集合就是当前环境中所有CustomHandler的子类 @Override public void onStartup(Set> set, ServletContext servletContext) throws ServletException { if (set!=null&&set.size()>0){ set.stream().forEach(cls->{ try { CustomHandler o = (CustomHandler)cls.newInstance(); o.onStartup(); } catch (Exception e) { e.printStackTrace(); } }); } //注入Servlet ServletRegistration.Dynamic userServlet = servletContext.addServlet("DemoServlet", DemoServlet.class); userServlet.addMapping("/demo"); }}
SpringMVC注解配置接下来就是要使用上面介绍的Servlet注册方式的第三种方式来实现SpringMVC的注册。
在Spring中已经提供了相应的实现:
在spring-web包中:
内容:
org.springframework.web.SpringServletContainerInitializer
@HandlesTypes(WebApplicationInitializer.class)public class SpringServletContainerInitializer implements ServletContainerInitializer {}
这里我们只需要实现WebApplicationInitializer接口即可,不过Spring已经为我们定义好了该接口的抽象模版,我们只需继承该抽象类即可:
public class SpringMVCConfig extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class>[] getRootConfigClasses() { return new Class>[] {RootConfig.class} ; } @Override protected Class>[] getServletConfigClasses() { return new Class>[] {WebConfig.class} ; } @Override protected String[] getServletMappings() { return new String[] {"/"} ; }}
RootConfig.java
@Configurationpublic class RootConfig {}
WebConfig.java
@Configuration@ComponentScan(basePackages = {"com.pack.controller"})public class WebConfig { }
测试controller
@RestController@RequestMapping("/demo")public class DemoController { @GetMapping("") public Object index() { Map result = new HashMap<>() ; result.put("code", 0) ; result.put("data", "你好") ; return result ; } }
测试:
只是通过如上配置,SpringMVC环境基本上是可以使用了,但是我们看上面Controller接口,是基于REST full,所以当你访问该接口时会出现如下错误:
这是因为默认情况下RequestMappingHandlerAdapter无法处理,服务器端无法提供与Accept-Charset以及Accept-Language消息头指定的值相匹配的响应。
这时候就需要为其配置相应的消息转换器:
@Beanpublic RequestMappingHandlerAdapter requestMappingHandlerAdapter() { RequestMappingHandlerAdapter adapter = new RequestMappingHandlerAdapter() ; adapter.getMessageConverters().add(new MappingJackson2HttpMessageConverter()) ; return adapter ;}
再次方法正常:
完毕!!!
关键词:
-
世界观焦点:Spring MVC通过注解完成运行配置原理你都会吗?
环境:Spring5 3 26SpringMVC使用相信大家都会使用,别人项目工程搭建后,你只需负责写Controller即可,那你
-
全球即时:首店关停,家乐福的会员之路受阻
首店关停,家乐福的会员之路受阻,苏宁,超市,会员店,大卖场,家乐福购物卡
-
世界看热讯:确认加盟!皇马赢了,老佛爷抢人,1800万年薪,瓜迪奥拉也没办法
夏窗还未到来,皇家马德里就已经陆续敲定一些交易,队内中场双老莫德里奇和克罗斯将签约,继续在马德里效力
-
焦点讯息:康恩贝:5月9日融资净买入640.81万元,连续3日累计净买入3802.77万元
5月9日,康恩贝(600572)融资买入2533 34万元,融资偿还1892 53万元,融资净买入640 81万元,融资余额4 14
-
新疆杨图片_新疆杨|天天速看
1、2013年新疆杨树苗市场价格行情:3公分新疆杨9-12元;4公分新疆杨17-20元;5公分新疆杨35-40元;1年生新
-
初级会计师《经济法基础》模考试卷(259) 当前讯息
初级会计师《经济法基础》模考试卷(259) 网上课程学习请电话咨询:400-622-5005!
-
建业东路社区
1、建业东路社区。2、新疆维吾尔自治区阿勒泰地区哈巴河县阿克齐镇下辖社区。
-
水性油墨是不是危险化学品_水性油墨
1、水性油墨气味没有毒2、水性油墨Water-basedink水性油墨简称为水墨,柔性版水性墨也称液体油墨,它主要
-
久治县气象台发布暴雪黄色预警信号【2023-05-10】
久治县气象台5月10日00时35发布暴雪黄色预警信号:预计5月10日00时35分至5月10日06时35分久治地区将出现暴
-
【全球时快讯】推荐一本好书作文批语_好书推荐作文批语大全
1、我喜欢看书,因此我的成长中少不了书。2、为了挖掘到书中无穷的智慧宝藏,我从小就和书籍做了好朋友。3
-
今日热闻!《星球大战绝地:幸存者》PC补丁将在本周上线
《星球大战绝地:幸存者》主机版新补丁将在今天上线,PC版将在本周晚些时候推出。重生推出的这个新补丁旨在
-
伟明环保: 伟明环保关于向不特定对象发行可转换公司债券募集说明书等申请文件财务数据更新的提示性公告_全球热头条
伟明环保:伟明环保关于向不特定对象发行可转换公司债券募集说明书等申请文件财务数据更新的提示性公告
-
【天天热闻】李家超:将举行“立法会行政长官互动交流答问会”
新华社香港5月9日电(记者刘明洋)香港特区行政长官李家超9日宣布,将举行“立法会行政长官互动交流答问会
-
非居民个人 所得税_非居民个人是什么意思
1、居民个人:负有无限纳税义务,从中国境内和境外取得的所得,都要在中国缴纳个人所得税负有有限纳税义务
-
辽宁队赢球!有一人却开心不起来,在场输14分 球迷:快裁掉
107-99!CBA总决赛第一场比赛,辽宁队以8分的优势击败了浙江队,拿到了CBA总决赛开门红,从而以大比分1-0领
-
科力尔: 关于向激励对象首次授予限制性股票的公告
科力尔:关于向激励对象首次授予限制性股票的公告
-
椰壳抹布是不是骗局(椰壳抹布是骗局吗) 天天观焦点
椰壳抹布是不是骗局,椰壳抹布是骗局吗这个很多人还不知道,现在让我们一起来看看吧!1、椰壳抹布不是骗局。
-
我借朋友的狗出去玩,狗把别人咬了该谁承担责任|世界速递
我借朋友的狗出去玩,狗把别人咬了该谁承担责任
-
事关武汉设计之都建设,正在征求意见→_热点聚焦
【来源:武汉市城乡建设局】为进一步强化设计在城市高质量发展、高效能治理、高品质生活中的赋能作用、引领
-
国网驻马店供电公司:“村网共建”惠民生
国网驻马店供电公司:“村网共建”惠民生