搭建一个最简单的SpringMVC示例
1.配置DispatcherServlet
DispatcherServlet是Spring MVC的核心。在这里请求会第一次 接触到框架,它要负责将请求路由到其他的组件之中。
使用Java将DispatcherServlet配置在Servlet容器中,而不 会再使用web.xml文件。
SpittrWebAppInitializer.java==================web.xml
1 package spittr.config; 2 import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; 3 4 public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 5 6 @Override 7 protected Class<?>[] getRootConfigClasses() { 8 // TODO Auto-generated method stub 9 return new Class<?>[] { RootConfig.class }; 10 } 11 12 @Override 13 protected Class<?>[] getServletConfigClasses() { 14 // TODO Auto-generated method stub 15 return new Class<?>[] { WebConfig.class }; 16 } 17 18 @Override 19 protected String[] getServletMappings() { // 将DispatcherServlet映射到“/” 20 // TODO Auto-generated method stub 21 return new String[] { "/" }; 22 } 23 24 }
扩 展AbstractAnnotationConfigDispatcherServletInitializer的任意类都会自动地 配置Dispatcher-Servlet和Spring应用上下文,Spring的应用上下 文会位于应用程序的Servlet上下文之中。
2.Spring MVC配置类
WebConfig.java=========================myspringmvc-servlet.xml
1 package spittr.config; 2 3 import org.springframework.context.annotation.Bean; 4 import org.springframework.context.annotation.ComponentScan; 5 import org.springframework.context.annotation.Configuration; 6 import org.springframework.web.servlet.ViewResolver; 7 import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; 8 import org.springframework.web.servlet.config.annotation.EnableWebMvc; 9 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 10 import org.springframework.web.servlet.view.InternalResourceViewResolver; 11 12 @Configuration 13 @EnableWebMvc // 启用Spring MVC 14 @ComponentScan("spittr.web") // 启用组件扫描 15 public class WebConfig extends WebMvcConfigurerAdapter { 16 @Bean // 配置JSP视图解析器 17 public ViewResolver viewResolver() { 18 InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 19 resolver.setPrefix("/WEB-INF/view/"); 20 resolver.setSuffix(".jsp"); 21 resolver.setExposeContextBeansAsAttributes(true); 22 return resolver; 23 } 24 25 @Override // 配置静态资源处理 26 public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 27 // TODO Auto-generated method stub 28 configurer.enable(); 29 } 30 31 }
上面的代码中第一件需要注意的事情是WebConfig现在添加了 @Component-Scan注解,因此将会扫描spitter.web包来查找组件。稍后编写的控制器将会带有@Controller注 解,这会使其成为组件扫描时的候选bean。因此,不需要在配置 类中显式声明任何的控制器。
然后添加了一个ViewResolver bean。更具体来讲, 是Internal-ResourceViewResolver。功能是查找JSP文件,在查找的 时候,它会在视图名称上加一个特定的前缀和后缀。
最后,新的WebConfig类还扩展了WebMvcConfigurerAdapter 并重写了其configureDefaultServletHandling()方法。通过 调用DefaultServlet-HandlerConfigurer的enable()方法,要求DispatcherServlet将对静态资源的请求转发到Servlet容 器中默认的Servlet上,而不是使用DispatcherServlet本身来处理 此类请求。
3.RootConfig.java
因为主要聚焦于Web开 发,而Web相关的配置通过DispatcherServlet创建的应用上下文 都已经配置好了,因此现在的RootConfig相对很简单
1 package spittr.config; 2 3 import org.springframework.context.annotation.ComponentScan; 4 import org.springframework.context.annotation.ComponentScan.Filter; 5 import org.springframework.context.annotation.Configuration; 6 import org.springframework.context.annotation.FilterType; 7 import org.springframework.web.servlet.config.annotation.EnableWebMvc; 8 9 @Configuration 10 @ComponentScan(basePackages = { "spittr" }, excludeFilters = { 11 @Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class) }) 12 public class RootConfig { 13 14 }
4.编写一个简单的控制器HomeController,用于显示首页
1 package spittr.web; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.RequestMapping; 5 import org.springframework.web.bind.annotation.RequestMethod; 6 7 @Controller // 声明为一个控制器 8 public class HomeController { 9 public HomeController() { 10 } 11 12 @RequestMapping(value = "/", method = RequestMethod.GET) 13 public String home() { 14 return "home"; 15 } 16 }
HomeController唯一的一个方法,也就是home()方法,带 有@RequestMapping注解。它的value属性指定了这个方法所要处 理的请求路径,method属性细化了它所处理的HTTP方法。
在本例 中,当收到对“/”的HTTP GET请求时(也可以是其他的,例如value的值为home),就会调用home()方法。
home()方法其实并没有做太多的事情:它返回了一 个String类型的“home”。这个String将会被Spring MVC解读为要 渲染的视图名称。
DispatcherServlet会要求视图解析器将这个 逻辑名称解析为实际的视图。 鉴于配置InternalResourceViewResolver的方式,视图 名“home”将会解析为“/WEB-INF/views/home.jsp”路径的JSP
5.home.jsp编写
1 <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> 2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 3 <% 4 String path = request.getContextPath(); 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 6 %> 7 8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 9 <html> 10 <head> 11 <base href="<%=basePath%>"> 12 13 <title>Spittr</title> 14 15 <meta http-equiv="pragma" content="no-cache"> 16 <meta http-equiv="cache-control" content="no-cache"> 17 <meta http-equiv="expires" content="0"> 18 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 19 <meta http-equiv="description" content="This is my page"> 20 <!-- 21 <link rel="stylesheet" type="text/css" href="styles.css"> 22 --> 23 24 </head> 25 26 <body> 27 <h1>Welcome to Spittr</h1> 28 <a href="<c:url value="/spittles"/>">Spittles</a> 29 <a href="<c:url value="/spitter/register"/>">Register</a> 30 </body> 31 </html>
6.测试
测试分为两种,一种是采用单元测试的方法,另一种是部署到tomcat服务器上进行测试。
测试一:单元测试
<1>编写HomeControllerTest.java
1 package spittr.web; 2 3 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; 4 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; 5 6 import org.junit.Test; 7 import org.springframework.test.web.servlet.MockMvc; 8 import org.springframework.test.web.servlet.setup.MockMvcBuilders; 9 10 public class HomeControllerTest { 11 @Test 12 public void testHomePage() throws Exception { 13 HomeController controller = new HomeController(); 14 // 搭建MockMvc 15 MockMvc mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); 16 // 对“/”执行GET请求 预期得到home视图 17 mockMvc.perform(get("/")).andExpect(view().name("home")); 18 } 19 }
发起了对“/”的GET请求,并断言结果视图的名称为 home。它首先传递一个HomeController实例 到MockMvcBuilders.standaloneSetup()并调用build()来构 建MockMvc实例。然后它使用MockMvc实例来执行针对“/”的GET请 求并设置期望得到的视图名称。
<2>需要的jar包
官网下载spring-framework-5.0.5.RELEASE,外加junit-4.12jar和hamcrest-all-1.3.jar
测试二:服务器测试
<1>需要的jar包
<2>结果