1 SpringMVC入门
2.1 操作步骤
①导入SpringMVC相关坐标
② 创建Controller和业务方法(等同于Servlet)
③ 创建spring-mvc.xml
④ 在web.xml中配置SpringMVC核心控制器
⑤ 设定具体Controller的访问路径
⑥ 设置返回页面
2.2 详细流程
—案例工作流程分析
①在导入SpringMVC相关坐标
<dependencies>
<!-- servlet3.1规范的坐标 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--jsp坐标-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<!--spring的坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!--spring web的坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!--springmvc的坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
</dependencies>
<--这里因为需要用到tomcat服务所以要导入相关jar包-->
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
② 创建Controller和业务方法(等同于Servlet)
public class UserController {
public void show1(String name,int age){
System.out.println("name="+name+" age="+age);
}
}
③ 创建spring-mvc.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">
<!--扫描加载所有的控制类-->
<context:component-scan base-package="com.itheima.controller" />
</beans>
④ 在web.xml中配置SpringMVC核心控制器
标签设置“*.do” 用于条件访问路径问题,比如在目标方法上写@RequestMapping("/UserController")则访问路径应为//http://localhost/UserController.do 但是实际访问路径会由SpringMVC自动解析为//http://localhost/UserController
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<!--<url-pattern>/</url-pattern>-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
⑤ 设定具体Controller的访问路径
@RequestMappin 这个注解可以在类名+方法名上声明(其实就是为了以后建的包多了方便区分),也可以直接写在目标方法名上,
//写在类名+方法名上
//访问路径为:http://localhost/User/UserController.do
@Controller
@RequestMapping("/User")
public class UserController {
//设定当前方法的访问映射地址
@RequestMapping("/UserController")
//设置当前方法返回值类型为String,用于指定请求完成后跳转的页面
public String show1(String name,int age){
System.out.println("name="+name+" age="+age);
//设置具体跳转页面,这里的return相当于servlet中的“request.getRequestDispatcher("success.jsp")”
return "success.jsp";
}
}
//写在方法名上
//访问路径为:http://localhost/UserController.do
@Controller
public class UserController {
@RequestMapping("/UserController")
public String show1(String name,int age){
System.out.println("name="+name+" age="+age);
return "success.jsp";
}
}
2 常规配置
2.1 Controller扫描
SpringMVC的处理器对应的bean必须按照规范格式开发,未避免加入无效的bean可通过bean加载过滤器进
行包含设定或排除设定,表现层bean标注通常设定为@Controller
xml方式
<!--扫描加载所有的controller类-->
<!--方式一-->
<context:component-scan base-package="com.itheima.controller" />
<!--方式二-->
注意如果使用此方式一定要写上 use-default-filters="false" 不然“<context:include-filter/>”不会生效
<context:component-scan base-package="com.itheima.controller" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
2.2 静态资源加载
<!--方式一:放行指定类型静态资源配置方式-->
<mvc:resources mapping="/img/**" location="/img/"/>
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/css/**" location="/css/"/>
<!--方式二:SpringMVC提供的通用资源放行方式(使用最多,也更方便)-->
<mvc:default-servlet-handler/>
2.3 中文乱码处理
SpringMVC提供专用的中文字符过滤器,用于处理乱码问题
配置在 web.xml 里面
<!--乱码处理过滤器,与Servlet中使用的完全相同,差异之处在于处理器的类由Spring提供(用到时候直接CV大发就好 不要修改任何东西)-->
<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>
3 类型转换器
3.1 日期类型格式转换-全局配置
SpringMVC会对接收的数据自动进行类型转换,该工作通过Converter接口实现
SpringMVC默认支持大部分的数据类型转换, 包含String->Date的转换
但需要注意的是, SpringMVC默认支持的时间格式是"yyyy/MM/dd"
SpringMVC支持"自定义的转换格式并覆盖系统转换格式"
语法
<!--1.设定格式类型Converter,注册为Bean,受SpringMVC管理-->
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!--2.自定义Converter格式类型设定,该设定使用的是同类型覆盖的思想-->
<property name="formatters">
<!--3.使用set保障相同类型的转换器仅保留一个,避免冲突-->
<set>
<!--4.设置具体的格式类型-->
<bean class="org.springframework.format.datetime.DateFormatter">
<!--5.类型规则-->
<property name="pattern" value="yyyy-MM-dd"/>
</bean>
</set>
</property>
</bean>
<!--6.启用自定义Converter-->
<mvc:annotation-driven conversion-service="conversionService"/>
3.2 日期类型格式转换-简化版
语法:
@DateTimeFormat(pattern = “yyyy-MM-dd”)
位置:
"方法形参"或者"成员变量"上
实例:
public String show(@DateTimeFormat(pattern = "yyyy-MM-dd") Date date){
System.out.println("date="+date);
return "success.jsp";
}
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
注意:
<!--该操作, 依赖注解驱动支持,在spring-mvc.xml中写上-->
<mvc:annotation-driven />
3.3 自定义类型转换器(一般用不上)
除上述操作外, SpringMVC还允许用户自定义类型转换器
① 自定义类型转换器
//自定义类型转换器,实现Converter接口
//Converter<String, Date>:表示当String转换为Date时
public class MyDateConverter implements Converter<String, Date> {
//重写接口的抽象方法,参数由泛型决定
public Date convert(String source) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
//类型转换器无法预计使用过程中出现的异常,因此必须在类型转换器内部捕获,不允许抛出,框架无法预计此类异常如何处理
try {
date = df.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
② 配置自定义转换器
<!--1.设定自定义Converter服务bean-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<!--2.注入所有的自定义Converter,该设定使用的是同类型覆盖的思想-->
<property name="converters">
<!--3.set保障同类型转换器仅保留一个,去重规则以Converter<S,T>的泛型为准-->
<set>
<!--4.具体的类型转换器-->
<bean class="com.itheima.converter.DateConverter"></bean>
</set>
</property>
</bean>
③ 开启注解驱动
<!--开启注解驱动,加载自定义格式化转换器对应的类型转换服务-->
<mvc:annotation-driven conversion-service="conversionService"/>
4 请求Request
4.1 获取请求参数
@Controller
public class RequestController {
//http://localhost/show1.do?name=zhangsan&age=23
@RequestMapping("/show1")
public String show1(String name,int age){
System.out.println(name+" "+age);
return "success.jsp";
}
//http://localhost/show2.do?name=zhangsan&age=23
@RequestMapping("/show2")
public String show2(User user){
System.out.println(user);
return "success.jsp";
}
//http://localhost/show3.do?strs=aaa&strs=bbb&strs=ccc
@RequestMapping("/show3")
public String show3(String[] strs){
System.out.println(Arrays.toString(strs));
return "success.jsp";
}
//http://localhost/show4.do?strs=aaa&strs=bbb&strs=ccc
@RequestMapping("/show4")
public String show4(@RequestParam("strs") List<String> strs){
System.out.println(strs);
return "success.jsp";
}
}
4.2 其他请求数据(注意路径设置,非必须这样设置只是为了迎合上面所说的路径设置方式)
@Controller
@RequestMapping("/other")
public class OtherController {
//http://localhost/other/show1.do
@RequestMapping("/show1")
@ResponseBody
public String show1(@RequestHeader("User-Agent") String UserAgent){
System.out.println(UserAgent);
return "success.jsp";
}
//http://localhost/other/show2.do
@RequestMapping("show2")
@ResponseBody
public String show2(@CookieValue("JSESSIONID") String sid){ //获取键的名字为"JSESSIONID"的Cookie的值
System.out.println(sid);
return "success.jsp";
}
//如果,前台发送过来的参数是"json字符串",则需要在后台加上@RequestBody接收参数
//在服务器集群情况下,服务器之间只能收发字符串数据,所以在那种情况下,使用比较多
@RequestMapping("/show3")
@ResponseBody
public void show3(@RequestBody User user){ //获取User-Agent请求头
System.out.println(user);
}
@RequestMapping("/show4")
@ResponseBody
public void show4(@RequestParam String name){ //要求请求show2时,必须携带name参数吗,否则报错
System.out.println(name);
}
//http://localhost/show5?id=5 //原来带参数的写法
//http://localhost/show5/5 //Restful带参数的写法
@RequestMapping("/show5/{aaa}")
@ResponseBody
public String show5(@PathVariable("aaa") String id) { //用于:截取请求路径中的一部分
System.out.println(id);
return "success";
}
}
SpringMVC三层架构
-
表现层:负责数据展示
-
业务层:负责业务处理
-
数据层:负责数据操作
MVC(Model View Controller),一种用于设计创建Web应用程序表现层的模式 -
Model(模型):数据模型,用于封装数据
-
View(视图):页面视图,用于展示数据
-
jsp
-
html
Controller(控制器):处理用户交互的调度器,用于根据用户需求处理程序逻辑
-
Servlet
-
SpringMVC
-
阐述SpringMVC框架和Struts2框架的区别
SpringMVC的入口是servlet,而Struts2是filter(这里要指出,filter和servlet是不同的。以前认为filter是servlet的一种特殊),这就导致了二者的机制不同,这里就牵涉到servlet和filter的区别了。
下面这个连接说的还是挺详细的
SpringMVC框架和Struts2框架的区别