Springmvc
绑定请求参数
用户发送的请求URL上带有参数时,spring MVC会自动将URL的参数值注入到控制器中映射方法的同名参数中,即要求方法形参名必须与请求参数名相同。
用户请求中的参数传递是以键值对的方式进行传递,spring MVC获取请求后,使用key取得请求的参数的value值并注入到方法的同名形参中(根据名称注入,与参数位置无关)。
虽然请求中传递的参数都是字符串,但spring MVC底层会自动对其进行转换,以符合形参的类型进行注入(前提是可以进行转换)。
例:方法形参是Integer类型的,此时请求参数中的“123”就可以注入成功,而“ab”则不行,原因是ab无法转换成数字,又或是“12.34”,也不能注入,因为转换后是Double类型,无法注入到Integer类型参数中。
需要注意的是:如果请求中传递的是整形数值字符串,方法形参采用Double类型,是可以进行注入的。也就是说,绑定请求参数时还得注意java数据类型转换的问题。
案例:
需求:获取用户请求中的参数,将其封装到控制器方法的形参中。
步骤1:修改index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<form method="post" th:action="@{/register}">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td>年龄</td>
<td><input type="text" name="age"></td>
</tr>
<tr>
<td>生日</td>
<td><input type="text" name="birthday"></td>
</tr>
<tr>
<td>爱好</td>
<td>
<input type="checkbox" name="hobbies" value="电视">电视
<input type="checkbox" name="hobbies" value="游戏">游戏
<input type="checkbox" name="hobbies" value="睡觉">睡觉
<input type="checkbox" name="hobbies" value="美食">美食
</td>
</tr>
<tr>
<td>账号</td>
<td><input type="text" name="cardNo"></td>
</tr>
<tr>
<td>余额</td>
<td><input type="text" name="balance"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="登录"></td>
</tr>
</table>
</form>
</body>
</html>
步骤2:修改控制器TestController.java
@Controller
public class TestController {
@RequestMapping("/")
public String index(){
return "index";
}
@RequestMapping("register")
public void register(String username,String password,Integer age,Date birthday){
System.out.println(username+":"+password+":"+age+":"+birthday);
}
}
集合类型
使用@RequestParam可使用集合接收多个同名参数的值。
案例:
需求:为多个同名参数传值。
修改TestController.java
@Controller
public class TestController {
@RequestMapping("/")
public String index(){
return "index";
}
@RequestMapping("register")
public void register(String username,String password,Integer age,Date birthday,@RequestParam List<String> hobbies,String cardNo,Double balance){
System.out.println(username+":"+password+":"+age+":"+birthday+":"+hobbies+":"+cardNo+":"+balance);
}
}
javaBean
javaBean属性:基本数据类型或String
当参数个数太多的时候,spring MVC也可以通过给javaBean来注入对应属性,此时要求javaBean的属性名与请求参数名相同**。
需求:将用户请求中的参数注入到javaBean中。
步骤1:创建javaBean
User.java
@Data
@ToString
public class User {
private String username;
private String password;
private Integer age;
private Date birthday;
}
步骤2:修改控制器TestController.java
@Controller
public class TestController {
@RequestMapping("/")
public String index(){
return "index";
}
@RequestMapping("register")
public void register(User user){
System.out.println(user);
}
}
javaBean属性:引用数据类型
需求:给javaBean中的引用数据类型注入值。
步骤1:自定义引用数据类型Account.java,修改User.java
@Data
@ToString
public class Account {
private String cardNo;
private Double balance;
}
@Data
@ToString
public class User {
private String username;
private String password;
private Integer age;
private Date birthday;
private Account account;//用于接收自定义类型数据
}
步骤2:修改index.html
<tr>
<td>账号</td>
<td><input type="text" name="account.cardNo"></td>
</tr>
<tr>
<td>余额</td>
<td><input type="text" name="account.balance"></td>
</tr>
javaBean属性:集合类型
需求:为javaBean的集合类型属性注入值。
步骤1:修改User.java
@Data
@ToString
public class User {
private String username;
private String password;
private Integer age;
private Date birthday;
private List<String> hobbies;//用于接收前端表单同名参数的值
private Account account;
}
自定义类型转换器
在springmvc中,如果给日期类型的参数注入值,需要按照特定的形式输入,比如“2000/10/10”,如果输入“2000-10-10”,则会注入失败,因为spring mvc默认不支持以上形式的日期进行类型转换。要解决这个类型的问题(即用户请求中出现了spring mvc默认类型转换解决不了的值),可以使用自定义类型转换器。
需求:自定义日期类型转换器,输入“2000/10/10”或“2000-10-10”都可以实现日期值的成功注入。
步骤1:创建工具类String2Date.java
@Component
public class String2Date implements Converter<String, Date> {
@Override
public Date convert(String s) {
if (StringUtils.isEmpty(s)) {
throw new RuntimeException("参数不正确");
}
try {
String pattern1="[0-9]{4}-[0-9]{2}-[0-9]{2}";
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
String pattern2="[0-9]{4}/[0-9]{2}/[0-9]{2}";
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy/MM/dd");
Date date=null;
if (s.matches(pattern1)) {
return sdf1.parse(s);
}
if (s.matches(pattern2)) {
return sdf2.parse(s);
}
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
步骤2:修改springmvc.xml
<!-- 配置自定义类型转换器 -->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<!-- 将自定义类型转换器注册到spring MVC类型转换器集合 -->
<bean class="com.wsjy.converter.String2Date"/>
</set>
</property>
</bean>
<!-- 注册自定义类型转换器,让自定义类型转换器生效 -->
<mvc:annotation-driven conversion-service="conversionService"/>
获取Servlet API
需求:在控制器中需要获取servlet API。
实现方式:在控制器方法参数中使用对应的形参接收即可。
步骤1:修改控制器TestController.java
@Controller
public class TestController {
......
@RequestMapping("servletapi")
public void testServletApi(HttpServletRequest request, HttpServletResponse response, HttpSession session){
System.out.println(request);
System.out.println(response);
System.out.println(session);
System.out.println(session.getServletContext());
}
}
最后来总结springmvc 的结构:
SpringMVC
WebMVC框架,解决的是将http请求映射到处理程序
1. 加依赖
2. 改头web.xml,加java文件夹
3. 配置web.xml
a. DispatcherServlet 启动子容器 配置文件 {servletname}-servlet.xml 将请求全部接收,转发给Controller
b. ContextLoaderListener 启动父容器 配置文件 applicationContext.xml
c. CharacterEncodingFilter 字符编码集过滤器
4. woniuxy-servlet.xml 子容器的配置文件
a. 扫包(扫的是controller层)
b. 视图解析器(渲染视图)
ⅰ. 内部资源视图: 前缀 (/WEB-INF/pages/) 后缀(.jsp)
ⅱ. 渲染json视图
c. 注解驱动,@Controller @RequestMapping
d. 静态资源映射 ,可以访问html页面
5.编写controller层发送请求
开发的两种模式
见图:
传统模式
前后端分离开发模式