概述
SpringMVC和Struts2的异同
共同点
- 都是基于MVC编写的表现层框架
- 底层都是原始ServletAPI
- 处理请求都是使用一个核心控制器
不同点
- SpringMVC入口是Servlet,Struts是基于Filter
- SpringMVC是单例的,Struts是多例的
- SpringMVC更加简洁
SpringMVC入门
导入jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<!--如果要使用原始的ServletAPI就需要导入以下两个jar包-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
编写web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--更改SpringMVC自带的过滤器将编码转为UTF-8-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--配置前端控制器-->
<servlet>
<servlet-name>mvc01</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--服务器启动初始化时就应该初始化该参数-->
<init-param>
<!--Spring XML文件的位置-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:mvc01.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mvc01</servlet-name>
<!--Servlet可以用/代表根目录下所有资源,但Filter不行-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
编写Spring XML文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--扫描Component注解-->
<context:component-scan base-package="com.zzxx"/>
<!--注册默认处理请求-->
<mvc:annotation-driven/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
编写控制类
@Controller
@RequestMapping("test")//请求的uri以/test开头
public class MyController {
@RequestMapping(value = "hi",method = RequestMethod.POST)//请求的uri为/test/hi,post请求方式
public String hello(
@RequestParam(value = "username") String name,
//将请求参数中名为age的参数赋值给形参a,如果找不到或者转化失败就赋值为默认值0(没有默认值时赋值为null)
@RequestParam(value = "age",required = false,defaultValue = "0")Integer a){
System.out.println("post");
System.out.println(name+","+a);
return "success";
}
@RequestMapping(value = "/hi",method = RequestMethod.GET)
public String hi(String username,String age){
System.out.println("get");
System.out.println(username+","+age);
//由于在Spring XML中配置过视图解析器,这里最后会变成/success.jsp
return "success";
}
}
组成
五大核心组件
DispatcherServlet
前端控制器,是SpringMVC的核心组件,负责接收请求,将请求任务分发给其他组件,再返回响应
HandlerMapping
处理器映射器,负责根据用户的请求路径找出对应的处理器,让前端控制器发送请求给处理器
Handler
处理器,由开发人员创建,自定义怎样处理数据和返回什么响应
HandlerAdapter
处理器适配器,处理器映射器找到的处理器可能是接口、实现类、方法等,这些处理器执行的方法各不相同,通过适配器来找出对应的执行方法,并执行处理器
View Resolver
视图解析器,根据处理器返回的数据,生成对应的视图,先生成页面地址,再生成View对象,最后渲染视图并让前端控制器返回给前端
执行流程
总结
- SpringMVC使用注解@RequestMapping找到对应的执行器
- 处理器的Request请求由处理器适配器传入