本文共 8345 字,大约阅读时间需要 27 分钟。
转载请注明出处:
本文源自【】
Spring MVC提供了一个DispatcherServlet来开发Web应用。
在Servlet 2.5 及以下的时候只要在web.xml下配置<servlet>
元素即可。
下面实例在IDEA中基于Maven搭建零配置的Spring MVC原型项目。
pom.xml内容:
4.0.0 cn.chenhaoxiang highlight_springmvc4 1.0-SNAPSHOT war 1.7 UTF-8 UTF-8 2.2 1.2 3.1.0 4.2.3.RELEASE 1.0.13 1.7.7 1.2.17 javax javaee-web-api 7.0 provided org.springframework spring-webmvc ${spring-framework.version} javax.servlet jstl ${jstl.version} javax.servlet javax.servlet-api ${servlet.version} javax.servlet.jsp jsp-api ${jsp.version} provided org.springframework spring-tx ${spring-framework.version} org.slf4j slf4j-api ${slf4j.version} log4j log4j ${log4j.version} org.slf4j jcl-over-slf4j ${slf4j.version} ch.qos.logback logback-classic ${logback.version} ch.qos.logback logback-core ${logback.version} ch.qos.logback logback-access ${logback.version} org.apache.maven.plugins maven-compiler-plugin 2.3.2 org.apache.maven.plugins maven-war-plugin 2.3 false
在src/main/resources目录下,新建logback.xml用来配置日志,内容如下:
true logbak: %d{HH:mm:ss.SSS} %logger{36} - %msg%n
将org.springframwork.web包下的类的日志级别设置为DEBUG,我们开发Spring MVC经常出现和参数类型相关的4XX错误,设置此项我们会看到更详细的错误信息。
在这里有一个注意的地方,页面的创建位置。
在src/main/resources下建立views目录,并在此目录下新建index.jsp。 内容如下:<%-- Created by IntelliJ IDEA. User: 陈浩翔 Date: 2016/12/18 Time: 下午 12:45 To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %>MVC Title Welcome to Spring MVC欢迎!
这里的页面不放在Maven标准的src/main/webapp/WEB-INF下,在这里这么放的原因是,Spring Boot的页面是放置在src/main/resources下。
这个就是一个简单的Spring配置类。
在这里配置了一个JSP的ViewResolver,用来映射路径和实际页面的位置,其中,@EnableWebMvc注解会开启一些默认配置,如一些ViewResolver或者MessageConverter等package cn.hncu.springmvc;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.EnableWebMvc;import org.springframework.web.servlet.view.InternalResourceViewResolver;import org.springframework.web.servlet.view.JstlView;/** * Created with IntelliJ IDEA. * User: 陈浩翔. * Date: 2016/12/19. * Time: 下午 3:39. * Explain:配置类 */@Configuration@EnableWebMvc@ComponentScan("cn.hncu.springmvc")public class MyMvcConfig { @Bean public InternalResourceViewResolver viewResolver(){ InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix("/WEB-INF/classes/views/");//映射路径-运行时代码会将我们的页面自动编译到/WEB-INF/classes/views/下 viewResolver.setSuffix(".jsp");//实际页面后缀 viewResolver.setViewClass(JstlView.class); return viewResolver; }}
Spring MVC的ViewResolver,这个是Spring MVC视图(JSP下就是html)渲染的核心机制;Spring MVC里有一个接口叫做ViewResolver(我们的ViewResolver都实现该接口),实现这个接口要重写resolverViewName(),这个方法的返回值是接口View,而View的职责就是使用model、request、response对象,并将渲染的视图(不一定是html,可能是json、xml、pdf)返回给浏览器。
可能会对映射路径前缀配置为/WEB-INF/classes/views/有点奇怪,这不是我们放页面的路径啊。
这是因为看到的页面效果是运行时而不是开发时的代码,运行时代码会将我们的页面自动编译到/WEB-INF/classes/views/下、 如图: 这个是编译后的路径!这个类就是为了代替web.xml的位置的。
package cn.hncu.springmvc;import org.springframework.web.WebApplicationInitializer;import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;import org.springframework.web.servlet.DispatcherServlet;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.ServletRegistration;/** * Created with IntelliJ IDEA. * User: 陈浩翔. * Date: 2016/12/19. * Time: 下午 3:44. * Explain:Web配置 */public class WebInitializer implements WebApplicationInitializer { //WebApplicationInitializer是spring提供用来配置Servlet3.0+配置的接口,从而实现了替代web.xml的位置。 //实现此接口将会自动被SpringServletContainerInitializer(用来启动Servlet3.0容器)获取到 @Override public void onStartup(ServletContext servletContext) throws ServletException { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.register(MyMvcConfig.class); context.setServletContext(servletContext);//新建WebApplicationContext,注册配置类,并将其和当前servletContext关联 ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher",new DispatcherServlet(context)); //注册Spring MVC的DispatcherServlet servlet.addMapping("/"); servlet.setLoadOnStartup(1); }}
package cn.hncu.springmvc;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;/** * Created with IntelliJ IDEA. * User: 陈浩翔. * Date: 2016/12/19. * Time: 下午 3:55. * Explain:简单控制器 */@Controller //利用@Controller注解声明是一个控制器public class HelloController { @RequestMapping("/index")//利用@RequestMapping配置URL和方法之间的映射 public String hello(){ return "index";//通过上面ViewResolver的Bean配置,返回值为index,说明我们的页面放置的路径是:/WEB-INF/classes/views/index.jsp }}
在这里,我们通过@RequestMapping配置URL和方法之间的映射,来访问实际的页面!
最后,将程序部署到Tomcat中,启动Tomcat,访问:
本篇博客涉及到的源码链接:
【】
本文章由编写, 所有权利保留。
欢迎转载,分享是进步的源泉。转载请注明出处:
本文源自【】