一提到springMVC大家一定都很熟悉,目前好多公司都还在使用。 但是一提到springMVC的运行流程,估计有好多人就要百度了。再提springMVC的配置,估计更多的人都比较陌生。 目前的Spring 版本是支持 xml,注解和javaConfig配置的。当然这三个也能混合使用。 我们百度一下 spring mvc 搭建。结果基本上都是xml 和 注解的混合使用。 下面我来分享一下我对springMVC的个人理解。
建立web app项目我这里就不演示了,相信大家都会。接下来我开始介绍:
我们先在pom.xml文件夹中添加三个依赖: 一个为spring-webmvc 依赖,一个 servlet 依赖,一个测试依赖。
这里有必要提一下:spring-webmvc 这个依赖。 这个依赖直接继承spring了不需要再额外导入spring其他的包了,这时候我的项目jar包就下载过过来了。如下图: 版本方面: 我们查看spring官网可以得知 最新版本的Spring Framework版本为:Version 5.2.7.RELEASE 感兴趣的小伙伴们可以自行查阅新功能。我这里用5.2.6测试。 网上好多用的还是 2.X版本的spring,有些即使用了5.X也用的是2.X的配置。5.0还是有很多新功能的,这里就不一一介绍了。
1、既然我们用SpringMVC 那就少不了web.xml 文件。 众所周知 springMVC 核心部分之一就是DispatcherServlet 。既然我们需要用到springMVC 那就必须和 servlet 结合起来,application.xml 也需要和servlet结合起来。 我们先在resources文件夹下新建一个application.xml 文件,**先什么都不写。**一会用到再配置。 如图: 2、我们现在就开始配置web.xml . 我们需要关联dispatcherServlet 和 application.xml 代码如下:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:application.xml</param-value> </init-param> <!--启动优先级--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>同样在web.xml 也可以配置字符转换等等你项目所需要的功能,这里只配个springMVC 我们现在还差Controller和一个tomcat了。
添加一个纯xml配置的controller 代码如下:
/** * <p> * spring mvc xml 配置controller 方式 * </p> */ public class XmlController implements Controller { private Date date; //我这里运用spring构造方法注入bean public XmlController(Date date){ this.date = date; } @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest , HttpServletResponse httpServletResponse) throws Exception { System.out.println("xml Coltroller is run......" + date); return null; } }类建好以后,我们需要把类托管给spring 。这时候就需要我们application.xml在中配置。配置代码如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="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 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <bean id="date" class="java.util.Date"/> <bean name="/my" class="com.my.mvc.controller.XmlController"> <constructor-arg ref="date"/> </bean> </beans>解释一下:
<bean id="date" class="java.util.Date"/> 相当于 @Autowired private Date date; <bean name="/my" class="com.my.mvc.controller.XmlController"> <constructor-arg ref="date"/> </bean> 就是配置一个XmlController类,他的访问地址为/my至此我们的书写完了Controller了。
我们还差一个tomcat ,这个很简单,我们自己去tomcat官网下载一个,或者用idea的都行。我这里用的是maven中的出插件。maven 插件中的tomcat比较老,最高只支持tomcat7。大家觉得低也可以换成jetty jettry maven plugs支持更高版本。 我这里就不换了。具体怎么配置tomcat maven plugin 大家也可以自行百度,比较简单。 我这里简单介绍一下: 现在maven中添加tomcat plugin 如下:
<plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <!-- 项目访问路径 和端口号 --> <path>/</path> <port>8090</port> <uriEncoding>UTF-8</uriEncoding><!-- 非必需项 --> </configuration> </plugin>第二步:配置启动项。至于为什么这么配,我这里不再过多介绍,官网上有详细介绍。 至此,SpringMVC xml纯xml配置方式完成,我们运行tomcat。启动成功后,我们访问:http://localhost:8090/my 这时候控制台打印如下图:
注解方式我们应该特别熟悉。网上基本都是这种,好多公司依然在用这种方式。配置环境不变。
我们新建一个类:叫AnnotationController 代码如下:
@RestController @RequestMapping("/test") public class AnnotationController { @Autowired private Date date; @RequestMapping("/getUrl") public String getUrl(String name) { System.out.println("annotation controller run ...." + name + " time is " + date); return "success"; } }说明一下: @RestController 这个注解试spring 4.0版本添加的。相当于@ResponseBody 和 @Controller 如果使用4.0一下版本的 ,还是老老实实的写组合的吧。好多教程都还停留4.0一下。这里推荐高版本学习。
我们需要开启扫描。这时候就需要改变我们的application.xml了。修改后代码如下:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="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 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--这两个bean是xml配置方式用的--> <bean id="date" class="java.util.Date"/> <bean name="/my" class="com.my.mvc.controller.XmlController"> <constructor-arg ref="date"/> </bean> <!--注解式配置--> <!--开启扫描--> <context:component-scan base-package="com.my.mvc*"/> <!--开启SpringMvc注解模式--> <mvc:annotation-driven/> </beans>自此springMVC注解方式已经配置完成,这时候启动tomcat 访问:http://localhost:8090/test/getUrl?name=‘lilei’ 我们可以看到控制台打印如图:
javaConfig配置方式启动springMVC 博客中基本没有。 我们可以在maven仓库中看看Servlet3.0是什么时候发布。 如图: 好了不多说,下面这些介绍和Servlet3.0以上版本有关。涉及一些3.0的规范。 javaConfig 和 Servlet3.0规范一起可以不需要web.xml 和application.xml 全部使代码配置启动。当然这里比较难,需要有一些基础,比如了解javaConfig 了解内嵌式Tomcat和Servlet3.0 新规范中的一些方法。 下面正式开始吧:
先从pom.xml删除 tomcat plugin 。删除webapp 文件夹。删除recourse 文件夹 我们先在我刚才项目中configer 文件夹下创建 MyConfig.java文件。内容如下:
@Configuration @ComponentScan("com.my.mvc") public class MyConfig { }说明: 这个类就是java config注解试配置。javaConfig 使用方式还需参考spring文档。 在springwebMvc官方文档给我们模拟了一份web3.0和java config配置springmvc的方式 如图: 我们新建一个类,把对应的代码copy 下来。 我把注释写到MyWebApplicationInitializer,java文件吧。 如下:
public class MyWebApplicationInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletCxt) { System.out.println("---------------servletCxt 开始启动-------------"); // 注解式启动spring容器。 AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext(); //MyConfig.class 使我们项目的配置类。 ac.register(MyConfig.class); //spring 初始化最关键的代码。需要了解源码。这里我还没有学明白 ac.refresh(); //下方的配置相等同于 之前的web.xml中配置的DispatcherServlet // 创建然后注册一个DispatcherServlet DispatcherServlet servlet = new DispatcherServlet(ac); ServletRegistration.Dynamic registration = servletCxt.addServlet("app", servlet); //设置启动优先级 registration.setLoadOnStartup(1); //过滤器 registration.addMapping("/*"); } }我们先打印一下System.out.println("---------------servletCxt 开始启动-------------"); 让我在后续Tomcat 启动的时候知道Spring环境已经加载。
这时候我们模仿Spring-boot 和Tomat启动类。 我们先建一个模仿Spring-boot 启动类,Application.java 代码如下
public class Application { public static void run(){ } }然后再建一个借鉴Tomcat启动类:BootStrap.java 代码如下:
public class BootStrap { public static void main(String[] args) { Application.run(); } }添加一个内置的tomcat 内部的tomcat jar包我们已经在maven的pom.xml中添加过了。 这时候我们在 application 类中 创建tomcat 代码如下:
public class Application { public static void run(){ //创建一个tomcat Tomcat tomcat = new Tomcat(); tomcat.setPort(8088); //项目所在目录 tomcat.addWebapp("/","D:\\my\\"); try { tomcat.start(); tomcat.getServer().await(); } catch (LifecycleException e) { e.printStackTrace(); } } }此时我们去启动我们的tomcat 这时候会发现如图: tomcat 已经启动了。这个报错是因为没有jsp解析的jar 。下面我们在maven仓库中找到对应tomcat 的jar 如图: 这时候我们再来启动我们的man 方法 结果如下图: 这时候我们的tomcat 就成功启动了。 这时候我们再写一个Controller新建一个ConfigController.java 然后再代码如下:
@RestController @RequestMapping("/config") public class ConfigController { @RequestMapping("/getUrl") public String getUrl() { System.out.println("config controller run ...."); return "success"; } }然后启动访问 我们的controller 浏览器结果: 我们再看日志如下图: 至此我们的SpringMVC javaConfig和Servlet3.0就结合起来成为了零xml配置项目。
可能有些同学比较疑问MyWebApplicationInitializer.java 文件命名什么都没做,怎么启动的时候就加载了呢。 这就是Servlet3.0的知识了。 MyWebApplicationInitializer implements WebApplicationInitializer接口。我们实现了这个接口怎么就调用了呢? Servlet3.0 规范的作用。 我们在加载的jar 包中找到如图的jar包 规范规定只要项目中有META-INF问价夹下有javax.servlet.ServletContainerInitializer配置文件。在文件中配置的类,会被加载。 我们点进去进入类中。发现如图 @HandlesTypes(WebApplicationInitializer.class) 这个是servlet3.0的注解,规定只要加了这个注解,这个注解就会在初始化的时候调用WebApplicationInitializer 中的所有实现了WebApplicationInitializer 接口的onStartup方法。 所以我们的类 MyWebApplicationInitializer implements WebApplicationInitializer 这时候我们的onStartup 方法也就可以被调用。也就是我们DispatcherServlet 可以成功的初始化。这个是规范。
好了,SpringMVC 的三种启动方式在这里我就介绍完了。其中有很多的不足之处,希望与大家共同进步吧。 文中还有一处小小的BUG 我现在也没有明白,如有知道可以在下方留言告知。我学明白后会及时的给修复。