提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
SpringMVC
SpringMVC的基本概念
网络编程回顾
BS三层架构
浏览器 ----> 表现层 ----> 业务层 ----> 持久层
Browser <---- SpringMVC <---- Spring <---- MyBatis
MVC设计模型
M Model模型 JavaBean
V View视图 JSP
C Controller控制器 Servlet
SpringMVC优势
-
清晰的角色划分
前端控制器 (DispatcherServlet) 请求到处理器映射 (HandlerMapping) 处理器适配器 (HandlerAdapter) 视图解析器 (ViewResolver) 处理器或页面控制器 (Controller) 验证器 (Validator) 命令对象 (Command) 表单对象 (Form Object)
-
分工明确,容易扩展
SpringMVC 和 Strust2的优劣分析
共同点:
- 都是表现层框架,都是基于MVC模型编写的
- 底层都离不开原始ServletAPI
- 处理请求的机制都是一个核心控制器
区别:
- SpringMVC入口是一个Servlet;Strust2是Filter
- SpringMVC是基于方法设计的;Strust2基于类设计,每次执行都会创建一个动作类的对象。因此SpringMVC更快
- SpringMVC更加简洁,处理ajax请求更方便,支持JSR303
- Strust2的OGNL表达式使页面开发效率比SpringMVC更高
SpringMVC的入门
web配置 web.xml
SpringMVC以Servlet为核心,而前端控制器DispatcherServlet就是这个指挥中心
- 将请求引导至SpringMVC各控制器对象
- 将控制器响应转发给视图解析器对象
- 将结果返回给浏览器
<!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>
<!--配置前端控制器DispatcherServlet-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--加载xml配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:bean.xml</param-value>
</init-param>
<!--启动服务器时创建Servlet对象-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--配置前端控制器的路径-->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
Spring模块 bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--开启注解扫描-->
<context:component-scan base-package="com.zjuee"/>
<!--视图解析器对象-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--视图文件路径开头 (目录)-->
<property name="prefix" value="/WEB-INF/pages/"/>
<!--视图文件路径结尾 (格式) -->
<property name="suffix" value=".jsp"/>
</bean>
<!--开启SpringMVC框架注解的支持-->
<mvc:annotation-driven/>
</beans>
控制层Controller
RequestMapping:用于建立请求URL和处理请求方法之间的关系
属性:
- path = /user/hello 相对路径
- value 与path相同
- method={} 访问方法 get post…
- params={} 限制请求参数
- headers={} 限制请求头
/**
* 控制器类
* 该类被扫描后,创建为对象并加载进容器
*/
@Controller("helloController")
@RequestMapping("/user")
public class HelloController {
/**
* 入门案例
* RequestMapping:用于建立请求URL和处理请求方法之间的关系
* 属性
* path = /user/hello 相对路径
* value 与path相同
* method={} 访问方法 get post...
* params={} 限制请求参数
* headers={} 限制请求头
* @return
*/
@RequestMapping(path = "/testRM", params = {"username=hehe"}, headers = {"Accept"})
public String testRequestMapping() {
System.out.println("测试RequestMapping注解...");
return "success";
}
}
请求参数的绑定
-
Spring的参数绑定过程就是把表单提交的请求参数,作为控制器中方法的参数进行绑定。
要求提交表单的name和参数的名称是相同的。 -
支持的数据类型
- 基本数据类型和字符串类型
- 实体类型(JavaBean)
- 集合数据类型(List、map集合等)
-
解决中文乱码问题
web.xml中配置过滤器filter,拦截所有request并将其编码为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>
- 自定义类型
前端接受的数据都是字符串类型,SpringMVC自动将字符串封装到JavaBean等对象,但有些类型对应的字符串格式是有限的,可以自己设计Converter转换器将字符串转换为需要的数据格式。
自定义的转换器
/**
* 把字符串转换为日期
*/
public class StringToDateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
if(source == null || source.length() == 0) {
throw new RuntimeException("生日不能为空");
}
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
// 把字符串转换成日期
try {
return df.parse(source);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
在bean.xml中将自定义的转换器配置进SpringMVC框架中。
<!--配置自定义类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.zjuee.utils.StringToDateConverter"/>
</set>
</property>
</bean>
<!--开启SpringMVC框架注解的支持-->
<mvc:annotation-driven conversion-service="conversionService"/>
常用注解
@RequestParam
作用:把请求中指定名称的参数给控制器的形参赋值
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam(name="name") String username) {
System.out.println(username);
return "success";
}
@RequestBody
作用:用于获取请求体。直接使用得到的是key=value&key=value…结构的数据
get请求方式不适用
属性:required:是否必须有请求体
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body) {
System.out.println(body);
return "success";
}
@PathVariable
REST风格URL
由请求地址和请求方式确定请求的方法
@RequestMapping(path="/testPathVariable/{sid}, method={RequestMethod.GET")
public String testPathVariable(@PathVariable(name="sid") String id) {
System.out.println("执行了...");
System.out.println(id);
return "success";
}
@HiddenHttpMethodFilter过滤器
将POST、GET方式转为PUT、DELETE等浏览器不支持的方式
@RequestHeader
取出给定请求头的请求头
@RequestMapping(path = "/testRequestHeader")
public String testRequestHeader(@RequestHeader(value = "Accept") String header) {
System.out.println(header);
return "success";
}
@CookieValue
从Cookie中取出给定键名的值
@RequestMapping(path = "/testCookieValue")
public String testCookieValue(@CookieValue(value = "JSESSIONID") String cookieValue) {
System.out.println(cookieValue);
return "success";
}
@ModelAttribute
ModelAttribute注解的方法先于控制器执行,因此可以将一些数据存在model域中,控制器的方法可以直接从域中取数据,也可以由键名从域中取出数据。展示的是用键名来取。
@RequestMapping(path = "/testModelAttribute")
public String testModelAttribute(@ModelAttribute("abc") User user) {
System.out.println("MA执行了...");
System.out.println(user);
return "success";
}
@ModelAttribute
public void showUser(String username, Map<String,User> map) {
System.out.println("showUser执行了");
// 通过用户名查询数据库 (模拟)
User user = new User();
user.setUname(username);
user.setAge(20);
user.setBirthday(new Date());
// 将完整的user信息以键值对形式放到model域中
map.put("abc",user);
}
@SessionAttribute
@RequestMapping(value = "/testSessionAttribute")
public String testSessionAttribute(Model model) {
System.out.println("addSessionAttributes");
model.addAttribute("msg", "鬼鸿"); // 分别存到session和request域中
return "success";
}
@RequestMapping(value = "/getSessionAttribute")
public String getSessionAttribute(ModelMap modelMap) {
System.out.println("getSessionAttributes");
Object msg = modelMap.get("msg");
System.out.println(msg.toString());
return "success";
}
@RequestMapping(value = "/delSessionAttribute")
public String delSessionAttribute(SessionStatus status) {
System.out.println("delSessionAttribute");
status.setComplete();
return "success";
}