spring MVC是一个基于MVC模式的表现层框架,在spring2.5以后增加了注解功能。使得开发变得更加高效、快捷。由于spring MVC是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合,可以达到无缝整合。

     springMVC的特点有:

    1、基于的是servlet/jsp模式

              2、控制器不再需要继承其它类,只需要用@Controller注解

      3、应用控制器方法参数,由前端控制器负责封装,方法签名定义灵活。

      4、返回页面直接在方法中指定,可以是String,也可以是其它的,比如:ModelAndView或void等

      5、性能优秀

      下面来看一下,内置tomcat中,如何整合springMVC。

      首先,创建maven项目,导入springMVC相关的依赖。

               由于springMVC是spring的一个模块,所以spring的依赖也需要导入:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.7.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.7.RELEASE</version>
</dependency>

       当然,内置tomcat也需要导入    

<dependency>
     <groupId>org.apache.tomcat.embed</groupId>
     <artifactId>tomcat-embed-core</artifactId>
     <version>9.0.36</version>
</dependency>

       另外,为了方便处理json,还需要导入jackson

<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-databind</artifactId>
   <version>2.11.0</version>
</dependency>
<dependency>
   <groupId>com.fasterxml.jackson.module</groupId>
   <artifactId>jackson-module-parameter-names</artifactId>
   <version>2.11.0</version>
</dependency>
<dependency>
   <groupId>com.fasterxml.jackson.datatype</groupId>
   <artifactId>jackson-datatype-jdk8</artifactId>
   <version>2.11.0</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.11.0</version>
</dependency>

           第二步,需要编写配置类,完成spring和springMVC相关的配置

@Configuration //申明该类为配置类
@ComponentScan(basePackageClasses = WebApplicationConfig.class)//扫描指定类所在包及子包中的spring组件
@EnableWebMvc //提供mvc支持
public class WebApplicationConfig implements WebMvcConfigurer {

    //设置响应信息编码集
    @Override
    public void extendMessageConverters(
            List<HttpMessageConverter<?>> converters) {
        StringHttpMessageConverter stringHttpMessageConverter =
                (StringHttpMessageConverter) converters.get(1);
        stringHttpMessageConverter.setDefaultCharset(
                Charset.forName("utf-8"));
    }

    //提供静态资源的支持
    @Override
    public void addResourceHandlers(
            ResourceHandlerRegistry registry) {
        //客户端以/html/开始的请求,访问类路径下static/html
        registry.addResourceHandler("/html/**").
                addResourceLocations("classpath:/static/html/");
    }
}

        从这里可以看出,响应信息编码集为utf-8,解决了响应信息乱码问题。客户端所访问的静态文件,比如:html、css、js、图片等放在类路径下。由于创建的是maven项目,所以,可以在resources目录下创建static/html,用于放置静态资源。

     

         第三步,编写启动类,在启动类中注册springMVC的前端控制器。

package com.project;

public class MainServer {
    public MainServer(){
        Tomcat tomcat = new Tomcat();//创建tomcat对象
        tomcat.setPort(8088); //设置端口
        tomcat.getConnector();
        
        //创建web容器上下文
        Context context = tomcat.addContext("", null);
        try {
            //注册前端控制器
            DispatcherServlet dispatcherServlet = new DispatcherServlet(
                    this.createApplicationContext(context.getServletContext()));
            Wrapper servlet = tomcat.addServlet(context, "dispatcherServlet", dispatcherServlet);
            servlet.setLoadOnStartup(1);
            servlet.addMapping("/*"); 

            tomcat.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 创建spring容器的应用上下文对象
     * @param servletContext WEB容器上下文对象
     * @return spring容器应用上下文对象
     */
    public  WebApplicationContext createApplicationContext(
            ServletContext servletContext) {
        AnnotationConfigWebApplicationContext ctx
                = new AnnotationConfigWebApplicationContext();
        ctx.register(WebApplicationConfig.class); //加载配置类

        ctx.setServletContext(servletContext);
        ctx.refresh();
        ctx.registerShutdownHook();
        return ctx;
    }

    public static void main(String[] args) {
        new MainServer();
    }
}

  好了,springMVC已经注册进内置tomcat。

 

       第四步:书写应用控制器处理客户端请求,产生响应:

package com.project.conrtroller;

@Controller
public class TestController {
    @RequestMapping("/test")
    public String testRequest(String name){
        System.out.println("执行应用控制器方法,参数name为"+name);
       //重定向到指定页面
        return "redirect:/html/info.html";
    }
}

  注意,应用控制器所在的包,必须是配置类扫描包,或子包。比如,在上面配置类中的扫描定义为

@ComponentScan(basePackageClasses = WebApplicationConfig.class)//扫描指定类所在包及子包中的spring组件
public class WebApplicationConfig implements WebMvcConfigurer {
……
}

  那么,应用控制器必须是配置类WebApplicationConfig所在包,及子包中的类。

        在resources目录下,创建static/html。然后,在该目录下,新建info.html,书写文本:“info.html”

 

  第五步,测试

  运行启动类,打开浏览器,输入:http://localhost:8088/test?name=tom。就可以看到info.html中的内容。并且,在服务器控制台上,有"执行应用控制器方法,参数name为tom"文字输出。