笔记23 搭建Spring MVC 搭建一个最简单的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

       笔记23 搭建Spring MVC
搭建一个最简单的SpringMVC示例     笔记23 搭建Spring MVC
搭建一个最简单的SpringMVC示例    笔记23 搭建Spring MVC
搭建一个最简单的SpringMVC示例

测试二:服务器测试

<1>需要的jar包

笔记23 搭建Spring MVC
搭建一个最简单的SpringMVC示例      笔记23 搭建Spring MVC
搭建一个最简单的SpringMVC示例

<2>结果

 笔记23 搭建Spring MVC
搭建一个最简单的SpringMVC示例