java 获取项目下的webapp_Spring Boot2 系列教程(一)纯 Java 搭建 SSM 项目
在 Spring Boot 项目中,正常来说是不存在 XML 配置,这是因为 Spring Boot 不推荐使用 XML ,注意,并非不支持,Spring Boot 推荐开发者使用 Java 配置来搭建框架,Spring Boot 中,大量的自动化配置都是通过 Java 配置来实现的,这一套实现方案,我们也可以自己做,即自己也可以使用纯 Java 来搭建一个 SSM 环境,即在项目中,不存在任何 XML 配置,包括 web.xml 。
环境要求:
使用纯 Java 来搭建 SSM 环境,要求 Tomcat 的版本必须在 7 以上。
快速体验
1 创建工程
创建一个普通的 Maven 工程(注意,这里可以不必创建 Web 工程),并添加 SpringMVC 的依赖,同时,这里环境的搭建需要用到 Servlet ,所以我们还需要引入 Servlet 的依赖(一定不能使用低版本的 Servlet),最终的 pom.xml 文件如下:
<dependency><groupId>org.springframeworkgroupId><artifactId>spring-webmvcartifactId><version>5.1.6.RELEASEversion>dependency><dependency><groupId>javax.servletgroupId><artifactId>javax.servlet-apiartifactId><version>4.0.1version><scope>providedscope>dependency>
2 添加 Spring 配置
工程创建成功之后,首先添加 Spring 的配置文件,如下:
@Configuration@ComponentScan(basePackages = "org.javaboy", useDefaultFilters = true, excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Controller.class)})public class SpringConfig {}
关于这个配置,我说如下几点:
@Configuration 注解表示这是一个配置类,在我们这里,这个配置的作用类似于 applicationContext.xml
@ComponentScan 注解表示配置包扫描,里边的属性和 xml 配置中的属性都是一一对应的,useDefaultFilters 表示使用默认的过滤器,然后又除去 Controller 注解,即在 Spring 容器中扫描除了 Controller 之外的其他所有 Bean 。
3 添加 SpringMVC 配置
接下来再来创建 springmvc 的配置文件:
@Configuration@ComponentScan(basePackages = "org.javaboy",useDefaultFilters = false,includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class)})public class SpringMVCConfig {}
注意,如果不需要在 SpringMVC 中添加其他的额外配置,这样就可以了。即 视图解析器、JSON 解析、文件上传......等等,如果都不需要配置的话,这样就可以了。
4 配置 web.xml
此时,我们并没有 web.xml 文件,这时,我们可以使用 Java 代码去代替 web.xml 文件,这里会用到 WebApplicationInitializer ,具体定义如下:
public class WebInit implements WebApplicationInitializer {public void onStartup(ServletContext servletContext) throws ServletException {//首先来加载 SpringMVC 的配置文件 AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(SpringMVCConfig.class);// 添加 DispatcherServlet ServletRegistration.Dynamic springmvc = servletContext.addServlet("springmvc", new DispatcherServlet(ctx));// 给 DispatcherServlet 添加路径映射 springmvc.addMapping("/");// 给 DispatcherServlet 添加启动时机 springmvc.setLoadOnStartup(1); }}
WebInit 的作用类似于 web.xml,这个类需要实现 WebApplicationInitializer 接口,并实现接口中的方法,当项目启动时,onStartup 方法会被自动执行,我们可以在这个方法中做一些项目初始化操作,例如加载 SpringMVC 容器,添加过滤器,添加 Listener、添加 Servlet 等。
注意:
由于我们在 WebInit 中只是添加了 SpringMVC 的配置,这样项目在启动时只会去加载 SpringMVC 容器,而不会去加载 Spring 容器,如果一定要加载 Spring 容器,需要我们修改 SpringMVC 的配置,在 SpringMVC 配置的包扫描中也去扫描 @Configuration 注解,进而加载 Spring 容器,还有一种方案可以解决这个问题,就是直接在项目中舍弃 Spring 配置,直接将所有配置放到 SpringMVC 的配置中来完成,这个在 SSM 整合时是没有问题的,在实际开发中,较多采用第二种方案,第二种方案,SpringMVC 的配置如下:
@Configuration@ComponentScan(basePackages = "org.javaboy")public class SpringMVCConfig {}
这种方案中,所有的注解都在 SpringMVC 中扫描,采用这种方案的话,则 Spring 的配置文件就可以删除了。
5 测试
最后,添加一个 HelloController ,然后启动项目进行测试:
@RestControllerpublic class HelloController {@GetMapping("/hello")public String hello() {return "hello"; }}
启动项目,访问接口,结果如下:
6 其他配置
6.1 静态资源过滤
静态资源过滤在 SpringMVC 的 XML 中的配置如下:
<mvc:resources mapping="/**" location="/"/>
在 Java 配置的 SSM 环境中,如果要配置静态资源过滤,需要让 SpringMVC 的配置继承 WebMvcConfigurationSupport ,进而重写 WebMvcConfigurationSupport 中的方法,如下:
@Configuration@ComponentScan(basePackages = "org.javaboy")public class SpringMVCConfig extends WebMvcConfigurationSupport {@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/js/**").addResourceLocations("classpath:/"); }}
重写 addResourceHandlers 方法,在这个方法中配置静态资源过滤,这里我将静态资源放在 resources 目录下,所以资源位置是 classpath:/
,当然,资源也可以放在 webapp 目录下,此时只需要修改配置中的资源位置即可。如果采用 Java 来配置 SSM 环境,一般来说,可以不必使用 webapp 目录,除非要使用 JSP 做页面模板,否则可以忽略 webapp 目录。
6.2 视图解析器
在 XML 文件中,通过如下方式配置视图解析器:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/>bean>
如果通过 Java 类,一样也可以实现类似功能。
首先为我们的项目添加 webapp 目录,webapp 目录中添加一个 jsp 目录,jsp 目录中添加 jsp 文件:
然后引入 JSP 的依赖:
<dependency><groupId>javax.servlet.jspgroupId><artifactId>javax.servlet.jsp-apiartifactId><version>2.3.1version>dependency>
然后,在配置类中,继续重写方法:
@Configuration@ComponentScan(basePackages = "org.javaboy")public class SpringMVCConfig extends WebMvcConfigurationSupport {@Overrideprotected void configureViewResolvers(ViewResolverRegistry registry) { registry.jsp("/jsp/", ".jsp"); }}
接下来,在 Controller 中添加控制器即可访问 JSP 页面:
@Controllerpublic class HelloController2 {@GetMapping("/hello2")public String hello() {return "hello"; }}
6.3 路径映射
有的时候,我们的控制器的作用仅仅只是一个跳转,就像上面小节中的控制器,里边没有任何业务逻辑,像这种情况,可以不用定义方法,可以直接通过路径映射来实现页面访问。如果在 XML
中配置路径映射,如下:
<mvc:view-controller path="/hello" view-name="hello" status-code="200"/>
这行配置,表示如果用户访问 /hello
这个路径,则直接将名为 hello
的视图返回给用户,并且响应码为 200
,这个配置就可以替代 Controller
中的方法。
相同的需求,如果在 Java
代码中,写法如下:
@Configuration@ComponentScan(basePackages = "org.javaboy")public class SpringMVCConfig extends WebMvcConfigurationSupport {@Overrideprotected void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/hello3").setViewName("hello"); }}
此时,用户访问 /hello3
接口,就能看到名为 hello
的视图文件。
6.4 JSON 配置
SpringMVC 可以接收JSON 参数,也可以返回 JSON 参数,这一切依赖于 HttpMessageConverter。
HttpMessageConverter 可以将一个 JSON 字符串转为 对象,也可以将一个对象转为 JSON 字符串,实际上它的底层还是依赖于具体的 JSON 库。
所有的 JSON 库要在 SpringMVC 中自动返回或者接收 JSON,都必须提供和自己相关的 HttpMessageConverter 。
SpringMVC 中,默认提供了 Jackson 和 gson 的 HttpMessageConverter ,分别是:MappingJackson2HttpMessageConverter 和 GsonHttpMessageConverter 。
正因为如此,我们在 SpringMVC 中,如果要使用 JSON ,对于 jackson 和 gson 我们只需要添加依赖,加完依赖就可以直接使用了。具体的配置是在 AllEncompassingFormHttpMessageConverter 类中完成的。
如果开发者使用了 fastjson,那么默认情况下,SpringMVC 并没有提供 fastjson 的 HttpMessageConverter ,这个需要我们自己提供,如果是在 XML 配置中,fastjson 除了加依赖,还要显式配置 HttpMessageConverter,如下:
<mvc:annotation-driven><mvc:message-converters><bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">bean>mvc:message-converters>mvc:annotation-driven>
在 Java 配置的 SSM 中,我们一样也可以添加这样的配置:
@Configuration@ComponentScan(basePackages = "org.javaboy")public class SpringMVCConfig extends WebMvcConfigurationSupport {@Overrideprotected void configureMessageConverters(List> converters) { FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); converter.setDefaultCharset(Charset.forName("UTF-8")); FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setCharset(Charset.forName("UTF-8")); converter.setFastJsonConfig(fastJsonConfig); converters.add(converter); }}
然后,就可以在接口中直接返回 JSON 了,此时的 JSON 数据将通过 fastjson 生成。
总结
好了,本文通过一个简单的例子向读者展示了使用 Java 来配置 Spring+SpringMVC 环境,事实上,只要这两个配置 OK ,再加入 MyBatis 就是非常容易的事了,本文相关的案例松哥已经上传到 GitHub 上了:https://github.com/lenve/javaboy-code-samples。
关于本文,有问题欢迎留言讨论。
1、一键部署 Spring Boot 到远程 Docker 容器,就是这么秀!2、完结撒花!129 集 21 个小时,松哥自制的 Spring Boot2 系列视频教程杀青啦!3、40 篇原创干货,带你进入 Spring Boot 殿堂!4、Spring Boot 中的同一个 Bug,竟然把我坑了两次!5、Spring Boot 支持 Https 有那么难吗?6、一个野生程序员的自我修养7、干货 | 鸟瞰 MySQL,唬住面试官!8、Spring Boot 修改静态资源一定要重启项目才会生效吗?未必!9、Spring Boot 跨域,JSONP 太 low,试试 CORS 怎么样?
喜欢就点个"在看"呗^_^
java 获取项目下的webapp_Spring Boot2 系列教程(一)纯 Java 搭建 SSM 项目相关推荐
- python3.6 django教程_【Python3.6+Django2.0+Xadmin2.0系列教程一】环境搭建及项目创建
由于工作需要,接触了大半年时间的Django+xadmin框架,一直没空对这块对进行相关的梳理.最近在同事的怂恿下,就在这分享下笔者的学习及工作经验吧. 好了,话不多说,下面开始进入正题: 环境需求: ...
- freemarker ftl模板_Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker
今天来聊聊 Spring Boot 整合 Freemarker. Freemarker 简介 这是一个相当老牌的开源的免费的模版引擎.通过 Freemarker 模版,我们可以将数据渲染成 HTML ...
- docker 打包镜像_Spring Boot2 系列教程(四十一)部署 Spring Boot 到远程 Docker 容器
不知道各位小伙伴在生产环境都是怎么部署 Spring Boot 的,打成 jar 直接一键运行?打成 war 扔到 Tomcat 容器中运行?不过据松哥了解,容器化部署应该是目前的主流方案. 不同于传 ...
- Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几
Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几 //获得入参的日期 Calendar cd = Calendar.getInstance(); cd.setTime(date ...
- druid 手动指定数据源_Spring Boot2 系列教程(二十)整合JdbcTemplate 多数据源
多数据源配置也算是一个常见的开发需求,Spring 和 SpringBoot 中,对此都有相应的解决方案,不过一般来说,如果有多数据源的需求,我还是建议首选分布式数据库中间件 MyCat 去解决相关问 ...
- 关于 Kotlin 一系列的学习教程、文章。学好 Kotlin 从这里开始,争取做到最全、最详细。让没有编程经验的朋友也能通过这个系列教程用 Koltin 语言来开发项目
KotlinLearn 项目地址:Jetictors/KotlinLearn 简介: 这是一个关于 Kotlin 一系列的学习教程.文章.学好 Kotlin 从这里开始,争取做到最全.最详细.让没有编 ...
- Maven项目下update maven后Eclipse报错:java.lang.ClassNotFoundException: ContextLoaderL
严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderLis ...
- maven web项目导入sts_Spring Boot2 系列教程(二)创建 Spring Boot 项目的三种方式
我最早是 2016 年底开始写 Spring Boot 相关的博客,当时使用的版本还是 1.4.x ,文章发表在 CSDN 上,阅读量最大的一篇有 43W+,如下图: 2017 年由于种种原因,就没有 ...
- java search 不能使用方法_ElasticSearch实战系列三: ElasticSearch的JAVA API使用教程
前言 在上一篇中介绍了ElasticSearch实战系列二: ElasticSearch的DSL语句使用教程---图文详解,本篇文章就来讲解下 ElasticSearch 6.x官方Java API的 ...
最新文章
- mysql like ilike_MySQLilike 子句
- DataGridView使用技巧十:单元格表示值的自定义
- 【逆强化学习-1】学徒学习(Apprenticeship Learning)
- 第三方插件渗透攻击之KingView
- 理解XML Schema: XML Schema 初步 (I)(转)
- luogu1850 [NOIp2016]换教室 (floyd+dp)
- 解决问题,别扩展问题
- png图像保存为yuv格式以及yuv格式转为png
- SQLite数据库使用(sqlite3 c++)
- 如何启用计算机的休眠,win7休眠-win7如何启用休眠,我已经google过了,没用,请大家帮忙我? 爱问知识人...
- Android开发十年,面试百度竟被刷!柳暗花明2020获字节跳动Offer(面试总结)
- java学习笔记第二周(一)
- 联诚发召开宝安区卓越绩效管理标准实施项目启动大会
- 安卓开机画面_领克的开机画面,你修改了?
- 数据库简介与 Mysql 服务基础
- 什么是REST以及 RESTful?
- Jmeter运行后,查看结果树中的响应数据出现中文乱码。
- 服务器异常流量导致性能下降怎么解决,云服务器查看异常流量
- 【福利分享】Python爬虫入门实战——彼岸图网
- Android L系统 剖析安卓5.0安卓L新特性
热门文章
- 哪些异常是RuntimeException?Sql异常属于RuntimeException吗?Spring下SQL异常事务回滚
- 快手短视频领域为例的领域数据建设探索
- 快看漫画个性化推荐探索与实践.pdf(附下载链接)
- 福利网站!程序员面试——算法工程师面试大全第四部分
- 通俗易懂!视觉slam第十一部分——线性系统和卡尔曼滤波
- PyTorch实战福利从入门到精通之五——搭建ResNet
- sklearn中的Linear_model的score函数讲解
- 【NLP保姆级教程】手把手带你RNN文本分类(附代码)
- cms是什么意思啊_美团面试官问我:ZGC 的 Z 是什么意思?
- HDU-4578 Transformation 线段树(两种方法)