springMVC 笔记 请求与响应
SpringMVC开发底层是servlet
依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
简单应用
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!--固定配置:配置前端控制器DispatcherServlet
1.接收客户端请求
2.让tomcat创建核心容器
-->
<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:applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!-- /代表客户端所有请求都会被dispatcherServlet拦截,然后分发到controller
但是不包含访问jsp文件
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--
配置解决全局乱码的过滤器
-->
<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>
<!-- /和/*的区别 /不拦截jsp文件,/*拦截jsp文件-->
<url-pattern>/*</url-pattern>
</filter-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">
<context:component-scan base-package="com.angen" />
<!--加载SpringMVC注解驱动-->
<mvc:annotation-driven />
<!--配置视图解析器,解析地址-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver">
<!--配置视图解析规则-->
<!--配置前缀-->
<property name="prefix" value="/WEB-INF/pages/"></property>
<!--配置后缀-->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
控制器
@Controller
@RequestMapping("/hello")
public class HelloController {
@RequestMapping("sayHello")
public String hello(){
//请求转发
return "success";
}
}
WEB-INF/pages/success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>请求转发可以跳转的WEB_INF中,并且URL地址不改变</h1>
<h1>是服务器端转发</h1>
</body>
</html>
* RequestMapping注解 * 作用:请求路径映射,具体到哪个方法能处理哪个请求 * 属性: * 1,path或者value属性:映射路径,该映射路径开头可以不写斜杠 * 2,method属性:指定当前方法只能处理指定请求方式(get,post,delete,put等) * @RequestMapping(value = "sayHello",method = RequestMethod.GET) * 这个我们一般都是使用@GetMapping,@PostMapping等来代替了 * 3,params属性:指定限制请求参数的条件 * 4,headers属性:发送的请求中必须包含哪些请求头
* 获取请求参数 * 1,参数名=参数值&参数名=参数值 表单数据类型。参数类型form-data类型:get请求,表单提交 * 1.1以单个参数接收 * 直接以参数名与方法的参数名一一对应即可,springMVC对常用类型有内置转换器 * 1.2以对象方式接收 * 1.2.1 以pojo类对象接收 * 在要请求的方法中添加pojo类型的参数,然后pojo属性类型名称与传过来的参数名一一对应 * * 1.2.2 以map 对象接收 * 如果用map类型,只能接收到String类型或者int类型,并且必须在参数前加上@RequestParam注解 * 1.2.3 List接收参数 * 比如多选的时候,以数组类型传递参数 必须在方法参数前加上@RequestParam注解 * 2,{参数值:参数值,参数名:参数值} json数据类型。 * 2.1 POJO类的属性名和请求参数的名要一致 * 2.2 必须在方法请求参数POJO类型前添加@RequestBody注解
自定义类型转换器
用Date做案例,Date默认是转-。我们使用自定义转换器改成/格式转换。
局部转换:可以使用@DateTimeFormat(pattern = "yyyy-MM-dd")注解
public class User implements Serializable {
private Integer age;
private String name;
private String addr;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date date;
}
全局类型转换器
1,编写自定义转换器类型
/*
* 实现Converter接口。接口的泛型
* <String, Date>意思就是把String转换成Date
* */
public class DateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
//source要进行类型转换的数据,
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
return simpleDateFormat.parse(source);
} catch (ParseException e) {
e.printStackTrace();
throw new RuntimeException("Date转换器异常");
}
}
}
2,配置
<?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.angen" />
<!--加载SpringMVC注解驱动-->
<mvc:annotation-driven />
<!--加载SpringMVC注解驱动 conversion-service值和类型转换器的id一致 -->
<mvc:annotation-driven conversion-service="conversionService"/>
<!--配置视图解析器,解析地址-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver">
<!--配置视图解析规则-->
<!--配置前缀-->
<property name="prefix" value="/WEB-INF/pages/"></property>
<!--配置后缀-->
<property name="suffix" value=".jsp"></property>
</bean>
<!--配置类型转换器-->
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<!-- 这里可以添加多个类型转换器 -->
<bean class="com.angen.convert.DateConverter" />
</set>
</property>
</bean>
</beans>
如果我们想使用servlet中的api,那么我们想用谁就给方法传谁
@RequestMapping("test")
public void test(HttpSession httpSession, HttpServletResponse httpServletResponse){
/**
* 你想用Servlet里面的啥作用域就给参数传什么类
* */
//向session对象存值
httpSession.setAttribute("password","123456");
//用response
}
其他SpringMVC常用注解
@RequestParam
1,如果我们要封装参数到Map或者List时必须添加这个注解在参数前面。
2,可以把请求中指定名称的参数赋值给方法的形参。也就是请求参数和方法形参名不一致的时候可以指定。案例:传过来的参数名是name,通过注解把name赋值给username
@RequestMapping(value = "sayHello",method = RequestMethod.GET)
public String hello(@RequestParam("name")String username){
//请求转发
return "success";
}
@RequestBody
1,获取请求体信息
2,获取json类型的请求参数,封装到pojo类中
@PathVariable
该注解的作用是获取RestFul风格的url上的参数
同样的url不同的请求方式,对应分发的方法也不同。一个url代表一个资源,通过不同的请求方式对资源进行增删改查方法。
案例
@GetMapping("/{id}")
public void findUserById(@PathVariable("id") Integer id){
}
@DeleteMapping("/{id}")
public void deleteById(@PathVariable("id") Integer id){
}
@RequestHeader获取指定的请求头
@GetMapping("test5")
public void test5(@RequestHeader("user-Agent") String userAgent){
}
@CookieValue
获取指定cookie的值
@ModelAttribute
防止给不想修改但是没有提交的数据设置为null
@SessionAttributes
注解到类上,实现Session数据共享,作用往Session域对象存数据
在SpringMVC中Model类可以当作参数传给方法,作用往request域对象存数据,,所以我们如果要request域对象数据放到Session域对象里面可以使用这个注解
ModelAndView:既可以绑定域对象,又可以绑定视图
1、返回指定页面
ModelAndView构造方法可以指定返回的页面名称,
也可以通过setViewName()方法请求转发到指定的页面 ,
2、返回所需数值
使用addObject()设置需要返回的值,addObject()有几个不同参数的方法,可以默认和指定返回对象的名字。
请求转发和重定向
@GetMapping("test6")
public String test6(){
//return "redirct:http://www.baidu.com";
return "forward:/WEB-INF/pages/success.jsp";
}
给客户端响应json字符串数据,先添加jackson依赖
<!--Jackson包-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
然后使用@ResponseBody注解,案例:
@GetMapping("test7")
@ResponseBody
public User test7(){
User user = new User();
user.setAddr("北京朝阳区");
user.setAge(18);
user.setName("张三");
user.setDate(new Date());
//将User类型转换成json字符串,并且响应给客户端
return user;
}
@ResponseBody注解可以加到类上,可以作用到所有方法。
或者直接写@RestController,这样也可以不写@Controller注解了