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"文字输出。