SpringMVC(2)学习
第三章:请求参数的绑定
请求参数绑定说明
1 绑定机制
表单提交的数据都是k=v格式的 username=hh&password=123
SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
要求:提交的表单的name和参数的名称是相同的
2 支持的数据类型
基本数据类型和字符串类型
实体类型(JavaBean)
集合数据类型(List,map集合等)
基本数据类型和字符串类型
提交表单的name和参数名称是相同的
区分的大小写
实体类型(javaBean)
提交表单的name和javaBean的属性名称需要一致
如果一个javaBean表中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性:
比如:address.name
给集合属性数据封装
JSP页面编写方式:list[0].属性
练习代码
suc.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>成功</title>
</head>
<body><h3>请求参数绑定入门</h3>
<form action="/user/save1.do" method="post">姓名:<input type="text" name="username" /><br/>年龄:<input type="text" name="age" /><br/><input type="submit" value="提交" />
</form><h3>请求参数绑定(封装到实体类)</h3>
<form action="/user/save2.do" method="post">姓名:<input type="text" name="username" /><br/>年龄:<input type="text" name="age" /><br/>
<%-- 生日:<input type="date" name="birthday">--%><input type="submit" value="提交" />
</form><h3>请求参数绑定(封装到实体类)</h3>
<form action="/user/save3.do" method="post">姓名:<input type="text" name="username" /><br/>年龄:<input type="text" name="age" /><br/>金额:<input type="text" name="address.money" /><br/><input type="submit" value="提交" />
</form><h3>请求参数绑定(封装到实体类,存在list集合)</h3><form action="/user/save4.do" method="post">姓名:<input type="text" name="username" /><br/>年龄:<input type="text" name="age" /><br/>金额:<input type="text" name="address.money" /><br/>集合:<input type="text" name="list[0].money" /><br/>集合:<input type="text" name="list[1].money" /><br/><input type="submit" value="提交" />
</form></body>
</html>
javaBean代码
User类
package com.xsy.demo.entity;import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;import java.util.Date;
import java.util.List;@Data
public class User {private String username;private Integer age;
// 生日
// 2000-1-1格式的日期不能进行转换了 开发使用比较多 比较简单@DateTimeFormat(pattern = "yyyy-MM-dd")private Date birthday;
// 引用对象private Address address;// list集合private List<Address> list;}
Address类
package com.xsy.demo.entity;import lombok.Data;@Data
public class Address {private Double money;
}
Controller代码
package com.xsy.demo.controller;import com.xsy.demo.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
@RequestMapping("/user")
public class UserController {/*** @param username 用户名* @param age 年纪* @return*/@RequestMapping("/save1.do")public String save(String username,Integer age){System.out.println("姓名"+username);System.out.println("年龄"+age);return "suc";}@RequestMapping("/save2.do")public String save2(User user){System.out.println("user:"+user);return "suc";}@RequestMapping("/save3.do")public String save3(User user){System.out.println("user对象:"+user);return "suc";}@RequestMapping("/save4.do")public String save4(User user){System.out.println("user对象:"+user);return "suc";}}
自定义类型转换器
第一种方法使用@DateTimeForemat注解的方法
package com.xsy.demo.entity;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.util.List;
@Data
public class User {private String username;private Integer age;
// 生日
// 2000-1-1格式的日期不能进行转换了 开发使用比较多 比较简单@DateTimeFormat(pattern = "yyyy-MM-dd")private Date birthday;
// 引用对象private Address address;// list集合private List<Address> list;}
然后修改配置文件Spring.xml添加下面代码
<mvc:annotation-driven/>是 Spring MVC 中的一个重要配置,它的作用是启用 Spring MVC 的默认配置并注册所需的组件。如果不添加这个配置
注册下面三个组件
注册核心组件
- 处理器映射器:
RequestMappingHandlerMapping - 处理器适配器:
RequestMappingHandlerAdapter - 异常解析器:
ExceptionHandlerExceptionResolver
| 功能 | 是否受影响 | 影响程度 |
|---|---|---|
@DateTimeFormat注解 | 完全失效 | 严重 |
@NumberFormat注解 | 完全失效 | 严重 |
@RequestMapping等注解 | 基本正常 | 轻微 |
@RequestParam、@PathVariable | 部分失效 | 中等 |
| 数据绑定和验证 | 功能受限 | 中等 |
<!-- 不配置自定义 conversionService,使用默认的 -->
<mvc:annotation-driven/>
第二种方式,自定义类型转化器,如果想自定义数据类型转换,可以实现Converter接口
1 自定义类型转换器
package com.xsy.demo.utils;import org.springframework.core.convert.converter.Converter;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class StringToDate implements Converter<String, Date> {@Overridepublic Date convert(String source) {if (source == null) {throw new RuntimeException("请输入内容");}SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");try {return simpleDateFormat.parse(source);} catch (ParseException e) {throw new RuntimeException(e);}}
}
2 注册自定义类型转换器 在Springmvc.xml编写配置
<!-- 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><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.xsy.demo.utils.StringToDate" /></set></property>
</bean>
<!-- 配置spring开启注解mvc的支持,并指定转换服务 -->
<mvc:annotation-driven conversion-service="conversionService"/>
在控制器中使用原生的ServletAPI对象
1 只需要在控制器的方法参数中定义HttpServletRequest和HttpServletResponse对象在这里插入图片描述
//使用原生API
@RequestMapping("/save6.do")public String savr6(HttpServletRequest request, HttpServletResponse response){System.out.println(request);
// 获取到HttpSession对象HttpSession session = request.getSession();System.out.println(session);System.out.println(response);return "suc";}
结果:
第四章:常用的注解
RequestParam注解
作用:把请求中指定名称的参数传递给控制器中的形参赋值
属性
value:请求参数的名称
required:请求参数中是否必须提供此参数,默认是true,必须提供
@Controller
@RequestMapping("/dept")
public class DeptController {@RequestMapping("/save1.do")public String save(@RequestParam(value = "username",required = false,defaultValue = "xsy")String name){System.out.println(name);return "suc";}
}
RequestBody注解
作用:用于获取请求体中的内容(注意:get方法不可以)
属性
required:是否必须有请求体,默认是true
@RequestMapping("/save2.do")
public String save2(@RequestBody String body){System.out.println(body);return "suc";
}
PathVaribale注解
作用:拥有绑定url中的占位符的 例如:url中有/delete/{id} ,{id}就是占位符
属性
value:指定url中的占位符名称
Resuful风格的URL
请求路径一样,可以根据不同的请求方法去执行后台的不同方法
Resulful风格的URL优点
- 结构清晰
- 符合标准
- 易于理解
- 扩展方便
代码
可以使用apipost和postman进行测试
@RequestMapping(path = "emp",method = RequestMethod.POST)
public void save(){System.out.println("xsy保存了员工");
}@RequestMapping(path = "/emp",method = RequestMethod.GET)
public void findAll(){System.out.println("xsy查询所有员工");
}
@RequestMapping(path = "/emp/{id}" ,method = RequestMethod.GET)
public void findById(@PathVariable(value = "id") int id){System.out.println("xsy通过id查询员工..."+id);
}
修改前端控制器的配置文件
<!--配置前端控制器-->
<servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--加载springmvc.xml配置文件,配置的是Spring配置--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!--配置启动加载--><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>
RequestHeader注解
作用:获取指定请求头的值
属性:
value:请求头的名称
@RequestMapping(value = "/getreahead")
public void getreqhead(@RequestHeader(value = "Accept") String header){System.out.println("Accept请求头的值"+header);
}
CookieValue注解
@RequestMapping(value = "/getcookie")
public void getcookie(@CookieValue(value = "JSESSIONID") String cookie){System.out.println("cookie的值"+cookie);
}
