摘要:更多相关博文参考前一篇博文讲了的方式创建应用,用过的童鞋都知道,早就没有什么事情了,其实的版本,就已经支持,不用再写本篇将介绍下,如何利用取代配置本篇博文,建议和上一篇对比看,贴出上一篇地址之基于配置的应用构建构建项目依赖对于依赖
更多spring相关博文参考: http://spring.hhui.top
前一篇博文讲了SpringMVC+web.xml的方式创建web应用,用过SpringBoot的童鞋都知道,早就没有xml什么事情了,其实Spring 3+, Servlet 3+的版本,就已经支持java config,不用再写xml;本篇将介绍下,如何利用java config取代xml配置
本篇博文,建议和上一篇对比看,贴出上一篇地址
190316-Spring MVC之基于xml配置的web应用构建
I. Web构建 1. 项目依赖对于依赖这一块,和前面一样,不同的在于java config 取代 xml
200-mvc-annotation war 5.1.5.RELEASE javax.servlet javax.servlet-api 3.1.0 org.springframework spring-core ${spring.version} org.aspectj aspectjweaver org.springframework spring-aop ${spring.version} org.springframework spring-web ${spring.version} org.springframework spring-webmvc ${spring.version} org.eclipse.jetty.aggregate jetty-all 9.2.19.v20160908 web-mvc org.eclipse.jetty jetty-maven-plugin 9.4.12.RC2 8080
细心的童鞋会看到,依赖中多了一个jetty-all,后面测试篇幅会说到用法
2. 项目结构第二节依然放上项目结构,在这里把xml的结构也截进来了,对于我们的示例demo而言,最大的区别就是没有了webapp,更没有webapp下面的几个xml配置文件
3. 配置设定现在没有了配置文件,我们的配置还是得有,不然web容器(如tomcat)怎么找到DispatchServlet呢
a. DispatchServlet 声明同样我们需要干的第一件事情及时声明DispatchServlet,并设置它的应用上下文;可以怎么用呢?从官方找到教程
{% blockquote @SpringWebMvc教程 https://docs.spring.io/spring... %}
The DispatcherServlet, as any Servlet, needs to be declared and mapped according to the Servlet specification by using Java configuration or in web.xml. In turn, the DispatcherServlet uses Spring configuration to discover the delegate components it needs for request mapping, view resolution, exception handling
{% endblockquote %}
上面的解释,就是说下面的代码和web.xml的效果是一样一样的
public class MyWebApplicationInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletCxt) { // Load Spring web application configuration AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext(); ac.register(AppConfig.class); ac.refresh(); // Create and register the DispatcherServlet DispatcherServlet servlet = new DispatcherServlet(ac); ServletRegistration.Dynamic registration = servletCxt.addServlet("mvc-dispatcher", servlet); registration.setLoadOnStartup(1); registration.addMapping("/*"); } }
当然直接实现接口的方式有点粗暴,但是好理解,上面的代码和我们前面的web.xml效果一样,创建了一个DispatchServlet, 并且绑定了url命中规则;设置了应用上下文AnnotationConfigWebApplicationContext
这个上下文,和我们前面的配置文件mvc-dispatcher-servlet有点像了;如果有兴趣看到项目源码的同学,会发现用的不是上面这个方式,而是及基础接口AbstractDispatcherServletInitializer
public class MyWebApplicationInitializer extends AbstractDispatcherServletInitializer { @Override protected WebApplicationContext createRootApplicationContext() { return null; } @Override protected WebApplicationContext createServletApplicationContext() { AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext(); // applicationContext.setConfigLocation("com.git.hui.spring"); applicationContext.register(RootConfig.class); applicationContext.register(WebConfig.class); return applicationContext; } @Override protected String[] getServletMappings() { return new String[]{"/*"}; } @Override protected Filter[] getServletFilters() { return new Filter[]{new HiddenHttpMethodFilter(), new CharacterEncodingFilter()}; } }
看到上面这段代码,这个感觉就和xml的方式更像了,比如Servlet应用上下文和根应用上下文
说明
上面代码中增加的Filter先无视,后续会有专文讲什么是Filter以及Filter可以怎么用
b. java config前面定义了DispatchServlet,接下来对比web.xml就是需要配置扫描并注册bean了,本文基于JavaConfig的方式,则主要是借助 @Configuration 注解来声明配置类(这个可以等同于一个xml文件)
前面的代码也可以看到,上下文中注册了两个Config类
RootConfig定义如下,注意下注解@ComponentScan,这个等同于
@Configuration @ComponentScan(value = "com.git.hui.spring") public class RootConfig { }
另外一个WebConfig的作用则主要在于开启WebMVC
@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { }4. 实例代码
实例和上一篇一样,一个普通的Server Bean和一个Controller
@Component public class PrintServer { public void print() { System.out.println(System.currentTimeMillis()); } }
一个提供rest服务的HelloRest
@RestController public class HelloRest { @Autowired private PrintServer printServer; @GetMapping(path = "hello", produces="text/html;charset=UTF-8") public String sayHello(HttpServletRequest request) { printServer.print(); return "hello, " + request.getParameter("name"); } @GetMapping({"/", ""}) public String index() { return UUID.randomUUID().toString(); } }5. 测试
测试依然可以和前面一样,使用jetty来启动,此外,介绍另外一种测试方式,也是jetty,但是不同的是我们直接写main方法来启动服务
public class SpringApplication { public static void main(String[] args) throws Exception { Server server = new Server(8080); ServletContextHandler handler = new ServletContextHandler(); // 服务器根目录,类似于tomcat部署的项目。 完整的访问路径为ip:port/contextPath/realRequestMapping //ip:port/项目路径/api请求路径 handler.setContextPath("/"); AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext(); applicationContext.register(WebConfig.class); applicationContext.register(RootConfig.class); //相当于web.xml中配置的ContextLoaderListener handler.addEventListener(new ContextLoaderListener(applicationContext)); //springmvc拦截规则 相当于web.xml中配置的DispatcherServlet handler.addServlet(new ServletHolder(new DispatcherServlet(applicationContext)), "/*"); server.setHandler(handler); server.start(); server.join(); } }
测试示意图如下
6. 小结简单对比下xml的方式,会发现java config方式会清爽很多,不需要多个xml配置文件,维持几个配置类,加几个注解即可;当然再后面的SpringBoot就更简单了,几个注解了事,连上面的两个Config文件, ServletConfig都可以省略掉
另外一个需要注意的点就是java config的运行方式,在servlet3之后才支持的,也就是说如果用比较老的jetty是起不来的(或者无法正常访问web服务)
II. 其他 - 系列博文web系列:
Spring Web系列博文汇总
mvc应用搭建篇:
190316-Spring MVC之基于xml配置的web应用构建
190317-Spring MVC之基于java config无xml配置的web应用构建
0. 项目工程:spring-boot-demo
项目: https://github.com/liuyueyi/spring-boot-demo/blob/master/spring/200-mvc-annotation
1. 一灰灰Blog一灰灰Blog个人博客 https://blog.hhui.top
一灰灰Blog-Spring专题博客 http://spring.hhui.top
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
微博地址: 小灰灰Blog
QQ: 一灰灰/3302797840
3. 扫描关注一灰灰blog
知识星球
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/73731.html
摘要:的框架用于解决上述提到的问题,基于模型,可以帮助开发人员构建灵活易扩展的应用。在这一章中,将专注于构建该应用的层,创建控制器和显示,以及处理用户注册的表单。类有两个静态接口,代表两种模拟服务的方式独立测试和集成测试。 主要内容 将web请求映射到Spring控制器 绑定form参数 验证表单提交的参数 写在前面:关于Java Web,首先推荐一篇文章——写给java web一年左右...
摘要:时间年月日星期日说明本文部分内容均来自慕课网。整体目录结构如下项目文件用于数据持久化配置项目配置配置视图解析器配置静态资源映射配置配置配置自定义指令配置解析器配置,类似于项目启动类新建,注册配置类,并将其和当前关联。 时间:2017年3月19日星期日说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:无个人学习源码:https://githu...
摘要:一旦最基本的应用创建好了,你可以给他加上安全防护。一旦成功登出了,我们的应用程序重定向到到并显示相应的登陆成功的消息。这标记该应用程序是一个应用程序,并激活一些关键行为,比如创建一个。一旦应用程序启动,用浏览器访问。 原网页 https://spring.io/guides/gs/securing-web/ 本指南将引导您完成创建一个资源由Spring Security的保护的一个简单...
摘要:的面向的异常遵从通用的异常层次结构。比如以前常用的框架,现在常用的框架包含许多项目,下面挑一些最常用的出来总结一下。状态是流程中事件发生的地点,在流程中通过转移的方式从一个状态到另一个状态,流程的当前状况称为流程数据。 如今做Java尤其是web几乎是避免不了和Spring打交道了,但是Spring是这样的大而全,新鲜名词不断产生,学起来给人一种凌乱的感觉,我就在这里总结一下,理顺头绪...
摘要:在中,就是前端控制器的任务是将请求发送给控制器。处理器映射会根据请求所携带的信息来进行决策一旦选择了合适的控制器,会将请求发送给选中的控制器。这些信息被称为模型。因此无需在配置类中显式声明任何的控制器具体来讲是试图解析器。 Spring MVC基于模型-视图-控制器(Model-View-Controller,MVC)模式实现,能够构建像Spring框架那样灵活和松耦合的Web应用程序...
阅读 2165·2023-04-26 02:14
阅读 2887·2021-09-30 09:46
阅读 2071·2021-09-24 09:48
阅读 872·2021-09-24 09:47
阅读 3212·2019-08-30 15:44
阅读 1846·2019-08-30 15:44
阅读 3252·2019-08-30 14:18
阅读 1909·2019-08-30 12:58