第一天
一、SpringMVC介绍
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web
应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用
Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts 2(一般老项目使用)等。SpringMVC 已经成为目前最主流的 MVC 框架之一, 从 Spring3.0 的发布, 就已全面超越 Struts2,成为最优秀的MVC 框架。它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持RESTful 编程风格的请求。
1、MVC和三层架构
MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
控制器:主要处理客户端请求
视图:HTML、JSP、前端框架
模型:逻辑业务程序(主要是后台的功能程序),Service,Dao,JavaBean(java对象类,也称为实体类)
2、MVC模式
web.xml文件配置
<!--配置spring核心(前端控制器)-->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping> <!--只有*.form后缀的请求才会进入springmvc-->
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.form</url-pattern>
</servlet-mapping>
Spring配置文件
<!--开启springmvc注解支持(建议放在配置文件最后的位置)-->
<mvc:annotation-driven/>
springmvc注解支持说明
在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。在springmvc早期版本中需要我们自己加载springmvc的三大组件,现在新版本中,Spring配置文件中写入使用 <mvc:annotation-driven>
会自动加载这三大组件,另外:同时它还提供了:数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持和@Valid支持,读写XML的支持(JAXB,读写JSON的支持(Jackson)。我们处理响应ajax请求时,就使用到了对json的支持(配置之后,在加入了jackson的core和mapper包之后,不写配置文件也能自动转换成json)
SpringMVC的工作流程
可以在spring-webmvc-5.0.6.RELEASE.jar源码包下查看DispatcherServlet.properties文件看有哪些处理器是
springmvc默认加载的
二、Controller方法返回值
1、String
1.1、可以返回视图字符串,解析器会自动解析
@RequestMapping("/demo3_1")
public String demo3_1(){
return "/success.jsp"; //直接返回字符串
}
2、返回ModelAndView(模型和视图,SpringMVC内置提供)
@RequestMapping("/demo3_2")
public ModelAndView demo3_2(){ //返回ModelAndView
ModelAndView mav=new ModelAndView();
mav.setViewName("success.jsp");
mav.addObject("username","张三");
return mav;
}
3、返回void。一般用于使用原生的Servlet对象或者ajax请求(不跳转页面)
@RequestMapping("/demo3_3") //返回void(一般用于ajax)
public void demo3_2(HttpServletResponse response) throws IOException {
response.setContentType("text/html;charset=utf8");
response.getWriter().write("东方标准");
}
转发和重定向
SpringMVC内置提供一个String 类型的返回值之后会自动解析forward(转发)、redirect(重定向)等特殊字符串
视图解析器配置的前缀和后缀解析不支持forward、redirect
:forward:代表转发 request.getRequestDispatcher(url).forward(request,response)
:redirect:代表重定向 response.sendRedirect(url)
forward
@RequestMapping("/demo3_4")
public String demo3_4(Model model) { //转发
System.out.println("执行啦!");
model.addAttribute("username","张三");
return "forward:/success.jsp";
}
redirect
@RequestMapping("/demo3_5")
public String demo3_5(HttpSession session) { //重定向
session.setAttribute("password","admin");
System.out.println("执行啦!");
return "redirect:/success.jsp";
}
@RequestMapping注释解释
属性:
- value:用于指定请求的 URL。 它和 path 属性的作用是一样的。
- method:用于指定请求的方式。
- params:用于指定限制请求参数的条件。 它支持简单的表达式。 要求请求参数的 key 和 value 必须和配置的一模一样。(少用)
- produces = “application/json;charset=utf8” (解决Java对象转JSON乱码)
例如:
params = {“userId”},表示请求参数必须有 userId,区分大小写
params = {“userId!=20”},表示请求参数中 id不能是 20。可以不携带userId参数,区分大小写
@RequestMapping(value = "/hello.form",params = "userId!=1",method = RequestMethod.POST)
public ModelAndView hello(){
ModelAndView mav=new ModelAndView();
mav.addObject("msg","小标");
mav.setViewName("/hello.jsp");
return mav;
}
三、数据绑定
1、自动绑定数据类型
1.1、 基本数据类型:基本数据类型+String+包装类
1.2、包装数据类型(POJO):包装实体类
1.3、数组和集合类型:List、Map、Set、数组等数据类型
2、内置绑定数据自动绑定
ServletAPI:
2.1、HttpServletRequest
2.2、HttpServletResponse
2.3、HttpSession
3、SpringMVC内置对象
Model、ModelMap、ModelAndView。另外,Model也是基于Model。两者都是存储了Request请求作用域的数据的对象,这个两个对象的作用是一样,将数据返回到页面。
四、提交方式乱码解决
提交数据难免会产生中文的传值,比如用户名,地址值等等都是中文输入。
解决post提交乱码我们可以配置spring提供的过滤器
在Spring配置文件中输入下面代码即可:
<!--解决Post提交中文乱码-->
<filter>
<filter-name>characterEncoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<!--要使用的字符集,一般我们使用UTF-8(保险起见UTF-8最好)-->
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncoding</filter-name>
<!--代表所有请求都经过编码处理-->
<url-pattern>/*</url-pattern>
</filter-mapping>
五、SpringMVC常用注解
1、@PathVariable:绑定路径参数
//@RequestMapping("url")
@RequestMapping("/{id}/{username}/demo9") //@PathVariable绑定restful风格的请求
public String demo9(
@PathVariable("id") Integer id,@PathVariable("username") String username
){
System.out.println(id);
System.out.println(username);
return "/success.jsp";
}
2、@RequestParam:绑定表单数据
接收的参数的变量名与表单的name属性不一样
@RequestMapping("URL") //@RequestParam强制数据类型绑定
public String demo8(@RequestParam("name") String username) {
System.out.println(username);
return "/success.jsp";
}
3、@CookieValue:获得Cookie值的注解
/**
* 获得JSP 页面,JSESSIOINID这个Cookie值
* @param cookevalue
*/
@RequestMapping("/URL")
public void getcookie(@CookieValue(value="JSESSIONID") String cookevalue){
//输出Cookie
System.out.println(cookevalue);
}
4、@RequestHeader:获得指定请求头的值
@RequestMapping("/URL")
//获取请求头host的值封装到value中
public void demo10(@RequestHeader("User-Agent")String value){
System.out.println(value);
}
5、@SessionAttributes 把Model和ModelMap中的指定的key或者指定的属性的值也存入一份进session域
//把modelMap中的username,User类型,String类型,Integer类型的数据也存一份进session中
@SessionAttributes(names = {"username"},types ={User.class,String.class,Integer.class} )//names指的是键的名称集合,types指的是类型集合
public class Demo2Controller {
@RequestMapping("/demo12.form")
public String demo12(Model modelMap) {
modelMap.addAttribute("username","zhangsan");
modelMap.addAttribute("password","admin");
modelMap.addAttribute("age",20);
User user=new User();
user.setUsername("xiaodong");
modelMap.addAttribute("user",user);
return "/success.jsp";
}
}
6、@SessionAttribute注解:从session中获取一个值封装到参数中
/**
* @SessionAttribute:从session中获取一个值
* @param username
* @param user
* @return
*/
@RequestMapping(value = "/demo6")
public String demo5(@SessionAttribute("password") String username,@SessionAttribute("user") User user){
System.out.println(username);
return "/success.jsp";
}
六、格式化参数类型
SpringMVC之所以能够帮我们实现自动数据类型转换是因为SpringMVC提供了非常多的转换器(Converter),并且都实现Converter接口,所以如果我们需要定义转换器必须要实现Converter接口
案例:实现日期的转换
JavaBean
public class User {
private Integer id;
private String username;
private String password;
private String address;
private Date birthday;
}
表单(jsp页面数据提交):
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/testConverter.form">
<input type="text" name="username">
<input type="text" name="password">
<input type="text" name="address">
<input type="text" name="birthday">//需要转换的类型,把String转换为Date类型
<input type="submit">
</form>
</body>
</html>
controller:
@RequestMapping("/testConverter.form")//必须要和表单的action路径一致
public String testConverter(User user) {
System.out.println(user);
return "/success.jsp";
}
自定义转换器类:
package com.dfbz.converter;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Converter<传入进来的类型,转换之后的类型>
*/
public class MyConverter implements Converter<String,Date> {
@Override
public Date convert(String str) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sdf.parse(str);
return date;
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
关键一步:必须在Spring配置文件中引入自定义转换类(以下代码),并且要重新指定转换器。否则无效
<!--在SpringMVC配置的转换器中添加我们自定义的转换器-->
<bean id="myConverters"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 配置多个转换器 -->
<property name="converters">
<set>
<!-- 配置转换器(自定义转化器类) -->
<bean class="com.dfbz.converter.MyConverter"></bean>
</set>
</property>
</bean>
<!--开启springmvc注解支持并 重新 指定转换器-->
<mvc:annotation-driven conversion-service="myConverters"/>
七、json的支持
所谓的对JSON的支持,就是SpringMVC支持自动将JSON转换成JAVA对象,也支持将Java对象自动转成JSON.
SpringMVC本身没有对JSON数据处理的类库.要支持JSON的自动转换必须导入JSON的支持包
SpringMVC 中 Jackson依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
1、JSON转换成JAVA对象
需求:请求发送一个JSON的对象给执行方法,执行方法根据@RequestBody(只能放在参数上)这个注解强制将请求发送过来的JSON转换成Java对象.
配置步骤
1.1、客户端请求
$.ajax({
url: "/demo5_1.form",
contentType:"application/json", //告知ajax引擎传递的是json类型
type:"post", //传递json字符串必须使用post提交
data: "{\"username\": \"xiaodong\", \"address\": \"guangzhou\", \"birthday\": \"2000-
10-10\"}",
success: function (data) {
}
});
1.2、控制器(controller)代码
@RequestMapping("/URL")
public String demo5_1(@RequestBody User user) { //json字符串 转user
System.out.println(user);
return "/success.jsp";
}
2、Json字符串转Map
1.1、客户端请求
$("#test3").click(function () {
$.ajax({
url: "/demo5_2.form",
type:"post",
contentType:"application/json",
//Map类型只支持json字符串
data: "{\"username\": \"xiaodong\", \"address\": \"guangzhou\", \"birthday\":\"2000-10-10\"}",
success: function (data) {}
});
});
1.2、控制器(controller)代码
//json字符串 转map Map类型不支持json对象
@RequestMapping("/demo5_2")
public String demo5_1(@RequestBody Map map) {
System.out.println(map);
return "/success.jsp";
}
3、Java对象转成JSON
前端
$("#test4").click(function () {
$.ajax({
url: "/demo5_3.form",
success: function (data) {
alert(data);
alert(JSON.stringify(data));
}
});
});
后台
@RequestMapping("/demo5_3")
//表示对象以json对象写出到前端 并修改contentType:'application/json;charset=utf8'
@ResponseBody
public User demo5_3() { //user转json对象
User user = new User();
user.setId(20);
user.setUsername("xiaobiao");
user.setPassword("admin");
user.setAddress("guangzhou");
user.setBirthday(new Date());
return user;
}
4、将Map对象转JSON对象
前端
$("#test5").click(function () {
$.ajax({
url: "/demo5_4.form",
success: function (data) {
alert(data);
alert(JSON.stringify(data));
}
});
});
后台
@RequestMapping("/demo5_4",produces = "application/json;charset=utf8")
@ResponseBody
public Map demo5_4() { //map转json对象
Map map=new HashMap();
map.put("id",20);
map.put("username","xiaobiao");
map.put("password","admin");
map.put("address","guangzhou");
map.put("birthday",new Date());
return map;
}
八、Controller的生命周期
Spring框架默认创建的对象是单例.所以业务控制器是一个单例对象。
SpringMVC提供了,request,session ,globalsession三个生命周期
1、request:每次新的请求,创建一个新的实例.
2、session:每次会话创建一个新的实例. 就是同一个浏览器,就使用同一个实例
3、globalsession:基于集群的session