SpringMVC
SpringMVC
Model:模型 业务逻辑层+数据访问层
View:视图 jsp html
Controller:控制器 servlet
介绍
SpringMVC是一种基于Java实现MVC模型的轻量级Web框架,SpringMVC 已经成为目前最主流的 MVC 框架之一, 从 Spring3.0 的发布, 就已全面超越 Struts2,成为最优秀的 MVC 框架。它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持RESTful 编程风格的请求。
springmvc 它让一个普通的Java类 上面加点注解 就可以实现和servlet一样的效果
springmvc优化了servlet
普通的Java类 加上注解 就变成了和servlet一样的功能 起了新名字就叫controller
优点
- 使用简单,开发便捷(相比于Servlet)
- 灵活性强
执行流程
SpringMVC流程:
01、用户发送出请求到前端控制器DispatcherServlet。
02、DispatcherServlet收到请求调用HandlerMapping(处理器映射器)。
03、HandlerMapping找到具体的控制器(可查找xml配置或注解配置),生成处理器对象的执行链(如果有),再一起返回给DispatcherServlet。
04、DispatcherServlet调用HandlerAdapter(处理器适配器)。
05、HandlerAdapter经过适配调用具体的处理器(controller)。
06、Controller执行完成返回ModelAndView对象。
07、HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet。
08、DispatcherServlet将ModelAndView传给ViewReslover(视图解析器)。
09、ViewReslover解析后返回具体View(视图)。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户。
示例
1.导入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
2.controller
package com.yxh.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class SpringTestController {
@RequestMapping("aa")
public String getSuccess(){
return "success";
}
}
3.四大组件配置
springmvc.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.yxh.controller"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
4.在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>
<servlet>
<servlet-name>springTest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springTest</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
5.成功页面配置
webapp/pages/success.jsp
spring和springMVC容器关系
controller对象可以访问 业务逻辑层对象
业务逻辑层对象不可以访问controller层对象
原因是:业务罗基层和数据访问层对象都在spring父容器,controller对象在子容器中控,子容器中的对象可以访问父容器中的对象
请求与响应
请求映射路径
名称:@RequestMapping
作用:设置当前控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀
参数:method,params
method规定浏览器发送的请求的类型 ,请求不匹配报405
params规定浏览器发送请求必须携带参数params,不携带报400提示
post请求乱码问题
web.xml中配置(需要配置在servlet之前 )
<filter>
<filter-name>tt</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>
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value><!--强制编码-->
</init-param>
</filter>
<filter-mapping>
<filter-name>tt</filter-name>
<url-pattern>/*</url-pattern><!--拦截路径-->
</filter-mapping>
请求参数与方法入参不同
@RequestMapping("aa")
//value:设置入参名称;
//required:参数是否为必须的,true为必须,false为不必须
//defaultValue:请求未带此参数时的默认值
public String getSuccess(@RequestParam(value = "name1",required = false,defaultValue = "pwd111") String name, String pwd){
System.out.println(name + " "+pwd);
return "success";
}
对象中嵌套数据传值
对象.属性
//如何给User对象中的嵌套的对象传值
@Data
public class User implements Serializable{
private String uname;
private String upwd;
private String sex;
private String address;
private Dog dog;
}
数组的传值
@RequestMapping("/cc1")
public String cc(String[] nums){
Arrays.stream(nums).forEach(System.out::println);
return "success";
}
集合的传值
@RequestMapping("/cc2")
public String cc(@ReuqestParam List<String> kk){
kk.stream().forEach(System.out::println);
return "success";
}
对象中传值数组或集合,请求参数和实体类中参数一样即可
JSON的传值
如果浏览器发送过来的是json格式的字符串
1.参数添加@RequestBody
2.需要导入依赖(把json格式的字符串转换成java中的对象或者数组)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
3.springmvc.xml配置文件中删除原来的处理器映射器和处理器适配器
<mvc:annotation-driven/>
<!--自动创建处理器映射器,处理器适配器,类型转换(浏览器发送过来的字符串可以转换成各种数据类型)-->
特殊传参
json对象传参无法和实体类属性对应:使用Map接收
json对象数组传参无法和实体类属性对应:使用List<Map>接收
传参为Date类型(springMVC只能将yyyy/MM/dd字符串转为日期类型)
如果浏览器发送过来的日期格式是yyyy-MM-dd需要使用注解@DataTimeFormat
(@DateTimeFormat(pattern="yyyy-MM-dd"))
实体类中属性为Date类型需要在实体类属性上指定格式@DateTimeFormat(pattern="yyyy-MM-dd")
响应
@ResponseBody
方式:响应为对象和对象集合时,在方法上添加
作用:将controller返回的java对象格式转换为 JSON对象
restFul风格
介绍
作用:简化url的书写格式,同一个url处理不同的请求
优点:
- 隐藏资源的访问行为,无法通过地址得知对资源是何种操作
- 书写简化
- GET用来获取资源
- POST用来新建资源
- PUT用来更新资源
- DELETE用来删除资源
RESTful的实现
- 访问地址是一样的
- 参数是通过/分隔的,如果有多个参数,使用多个/
请求地址(URI) | 请求含义 | 请求方式 |
---|---|---|
/user json | 新增用户 | POST |
/user/1 | 删除编号1的用户 | DELETE |
/user/1/Jack/18 json | 修改编号1的用户 | PUT |
/user/1 | 获取编号1的用户 | GET |
入门案例
做法:在Controller中定义方法时设定"http请求动作(请求方式)"和"设定请求参数(路径变量)"
package com.tyhxzy.controller;
import com.tyhxzy.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping(produces = "application/json;charset=utf-8")
public class UserController {
/*
添加请求方式: post
method = RequestMethod.POST 限制请求方式为post
*/
@RequestMapping(value = "/user",method = RequestMethod.POST)
@ResponseBody
public String add(@RequestBody User user){
System.out.println("添加操作.."+user);
return "添加";
}
/*
修改请求方式: Put
method = RequestMethod.PUT 限制请求方式为post
*/
@RequestMapping(value = "/user",method = RequestMethod.PUT)
@ResponseBody
public String update(@RequestBody User user){
System.out.println("更新操作.."+user);
return "更新";
}
/*
删除请求方式: Delete
method = RequestMethod.Delete 限制请求方式为Delete
{id} : {name} 参数占位符
http://localhost:8080/user/10
@PathVariable: 该注解的作用就是获取访问路径上的数据给到变量 ,占位符的名字与变量名字一样,可以省略名字不写
*/
@RequestMapping(value = "/user/{id}",method = RequestMethod.DELETE)
@ResponseBody
public String delete(@PathVariable("id") Integer id){
System.out.println("删除操作.."+id);
return "删除";
}
/*
修改请求方式: Get
method = RequestMethod.Get 限制请求方式为get
*/
@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
@ResponseBody
public String findById(@PathVariable("id") Integer id){
System.out.println("查询操作.."+id);
return "根据一个id查询";
}
/*
修改请求方式: Get
method = RequestMethod.Get 限制请求方式为get
*/
@RequestMapping(value = "/user",method = RequestMethod.GET)
@ResponseBody
public String findAll(){
System.out.println("查询全部操作..");
return "查询全部操作";
}
}
@PathVariable
- 名称:@PathVariable
- 类型:形参注解
- 位置:SpringMVC控制器方法形参定义前面
- 作用:绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应
@RequestBody、@RequestParam、@PathVariable区别和应用
- 区别
@RequestParam用于接收url地址传参或表单传参
@RequestBody用于接收json数据
@PathVariable用于接收路径参数,使用{参数名称}描述路径参数 - 应用
后期开发中,发送请求参数超过1个,以json格式为主,@RequestBody应用较广
如果发送非json格式数据,选用@RequestParam接收请求参数
采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值
注解合并
@Controller+@ResponseBody = @RestController
//@RequestMapping(value = "/hh/{id}",method = RequestMethod.GET)
@GetMapping("/hh/{id}")
//@RequestMapping(value = "/hh",method = RequestMethod.POST)
@PostMapping("/hh")
//@RequestMapping(value = "/hh",method = RequestMethod.PUT)
@PutMapping("/hh")
//@RequestMapping(value = "/hh/{id}",method = RequestMethod.DELETE)
@DeleteMapping("/hh/{id}")