请求参数封装
1.属性驱动:没有实体类
表单数据的接受都定义在动作类中,所以称为动作类和模型数据写在一起
要想封装成功,必须按照要求书写
要求:表单元素的name属性取值,必须和动作类中成员get/set方法后面保持一致
Demo1Action
public class Demo1Action extends ActionSupport {
private String username;
private Integer age;
private Date birthday;
private String hobby;
/*
* 动作方法
* */
public String demo1() {
System.out.println(username+"==="+age+"==="+birthday+"==="+hobby);
return SUCCESS;
}
/**
* @return username
*/
public String getUsername() {
return username;
}
/**
* @return age
*/
public Integer getAge() {
return age;
}
/**
* @return birthday
*/
public Date getBirthday() {
return birthday;
}
/**
* @return hobby
*/
public String getHobby() {
return hobby;
}
/**
* @param username 要设置的 username
*/
public void setUsername(String username) {
this.username = username;
}
/**
* @param age 要设置的 age
*/
public void setAge(Integer age) {
this.age = age;
}
/**
* @param birthday 要设置的 birthday
*/
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
/**
* @param hobby 要设置的 hobby
*/
public void setHobby(String hobby) {
this.hobby = hobby;
}
}
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%--设置浏览器的页面编码 --%>
<%--设置JSP编译成Servlet时使用的编码,可以只写这一句 --%>
<!DOCTYPE html>
<html>
<head>
<%--规定 HTML 文档的字符编码 --%>
<meta charset="UTF-8">
<title>Struct2的入门案例</title>
</head>
<body>
<%--请求参数封装 1:属性驱动-没有实体类 --%>
<form action="${pageContext.request.contextPath }/demo1.action" method="post">
姓名:<input type="text" name="username"/>
年龄:<input type="text" name="age"/>
生日:<input type="text" name="birthday"/>
爱好:<input type="checkbox" name="hobby" value="吃饭"/>吃饭
爱好:<input type="checkbox" name="hobby" value="睡觉"/>睡觉
爱好:<input type="checkbox" name="hobby" value="写代码"/>写代码
<input type="submit" value="提交"/>
</form>
</body>
</html>
细节
struts2框架会给我们解决post请求的中文乱码问题,但是get请求没解决
struts2框架会自动为我们转换数据类型
基本类型自动转化
- 字符串数组会按照逗号+空格的方式拼接成字符串
- 日期类型:会按照本地格式转成日期对象
执行参数封装是一个名称为params的拦截器实现的
封装规则只有一个,它要去指定位置找属性,找到之后调用set方法赋值
- 属性驱动:有实体类
- 表单数据的接收都定义在实体类中,把实体类定义在动作类中。
- 要想封装成功,需要按照要求书写:
- 此时需要使用OGNL表达式来指定表单元素的name取值
- OGNL表达式全称:Object Graphic Navigation Language
- 对象 图 导航 语言
写法: user.username user.age
Demo2Action.java
public class Demo2Action extends ActionSupport {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
/**
* 动作方法
* @return
*/
public String demo2(){
System.out.println(user);
return SUCCESS;
}
}
index.jsp
<form action="${pageContext.request.contextPath}/demo2.action" method="post">
姓名:<input type="text" name="user.username"/><br/>
年龄:<input type="text" name="user.age"/><br/>
生日:<input type="text" name="user.birthday"/><br/>
爱好:<input type="checkbox" name="user.hobby" value="吃饭"/>吃饭
<input type="checkbox" name="user.hobby" value="睡觉"/>睡觉
<input type="checkbox" name="user.hobby" value="写代码"/>写代码
<br/>
<input type="submit" value="提交"/>
</form>
- 模型驱动
要想封装成功,需要按照要求书写:
动作类必须实现ModelDriven接口
动作类中需要定义模型,并且必须实例化出来
提供接口抽象方法的实现,返回值必须是模型对象
执行参数封装,是一个名称为params的拦截器实现的。
封装的规则只有一个,它要去指定位置找属性,找到之后调用set方法赋值。
模型驱动的实现,除了params拦截器之外,还需要一个叫modelDriven的拦截器配合
Demo3Action.java
public class Demo3Action extends ActionSupport implements ModelDriven<User>{
private User user = new User();
/**
* 动作方法
* @return
*/
public String demo3(){
System.out.println(user);
return SUCCESS;
}
@Override
public User getModel() {
// TODO 自动生成的方法存根
return user;
}
}
index.jsp
<form action="${pageContext.request.contextPath}/demo3.action" method="post">
姓名:<input type="text" name="username"/><br/>
年龄:<input type="text" name="age"/><br/>
生日:<input type="text" name="birthday"/><br/>
爱好:<input type="checkbox" name="hobby" value="吃饭"/>吃饭
<input type="checkbox" name="hobby" value="睡觉"/>睡觉
<input type="checkbox" name="hobby" value="写代码"/>写代码
<br/>
<input type="submit" value="提交"/>
</form>
集合类型的封装
复杂类型的封装:List集合封装
复杂类型的封装都需要基于第二种情况实现
public class Demo4Action extends ActionSupport {
private List<User> users;
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
/**
* 动作方法
* @return
*/
public String demo4(){
System.out.println(users);
return SUCCESS;
}
}
index.jsp
<form action="${pageContext.request.contextPath}/demo4.action" method="post">
姓名:<input type="text" name="users[0].username"/><br/>
年龄:<input type="text" name="users[0].age"/><br/>
生日:<input type="text" name="users[0].birthday"/><br/>
爱好:<input type="checkbox" name="users[0].hobby" value="吃饭"/>吃饭
<input type="checkbox" name="users[0].hobby" value="睡觉"/>睡觉
<input type="checkbox" name="users[0].hobby" value="写代码"/>写代码
<br/>
姓名:<input type="text" name="users[1].username"/><br/>
年龄:<input type="text" name="users[1].age"/><br/>
生日:<input type="text" name="users[1].birthday"/><br/>
爱好:<input type="checkbox" name="users[1].hobby" value="吃饭"/>吃饭
<input type="checkbox" name="users[1].hobby" value="睡觉"/>睡觉
<input type="checkbox" name="users[1].hobby" value="写代码"/>写代码
<br/>
姓名:<input type="text" name="users[2].username"/><br/>
年龄:<input type="text" name="users[2].age"/><br/>
生日:<input type="text" name="users[2].birthday"/><br/>
爱好:<input type="checkbox" name="users[2].hobby" value="吃饭"/>吃饭
<input type="checkbox" name="users[2].hobby" value="睡觉"/>睡觉
<input type="checkbox" name="users[2].hobby" value="写代码"/>写代码
<br/>
<input type="submit" value="提交"/>
</form>
Map 参数封装
Demo5Action.java
public class Demo5Action extends ActionSupport {
private Map<String,User> users;
public Map<String,User> getUsers() {
return users;
}
public void setUsers(Map<String,User> users) {
this.users = users;
}
/**
* 动作方法
* @return
*/
public String demo5(){
System.out.println(users);
return SUCCESS;
}
}
index.jsp
<form action="${pageContext.request.contextPath}/demo5.action" method="post">
姓名:<input type="text" name="users['key1'].username"/><br/>
年龄:<input type="text" name="users['key1'].age"/><br/>
生日:<input type="text" name="users['key1'].birthday"/><br/>
爱好:<input type="checkbox" name="users['key1'].hobby" value="吃饭"/>吃饭
<input type="checkbox" name="users['key1'].hobby" value="睡觉"/>睡觉
<input type="checkbox" name="users['key1'].hobby" value="写代码"/>写代码
<br/>
姓名:<input type="text" name="users['abc'].username"/><br/>
年龄:<input type="text" name="users['abc'].age"/><br/>
生日:<input type="text" name="users['abc'].birthday"/><br/>
爱好:<input type="checkbox" name="users['abc'].hobby" value="吃饭"/>吃饭
<input type="checkbox" name="users['abc'].hobby" value="睡觉"/>睡觉
<input type="checkbox" name="users['abc'].hobby" value="写代码"/>写代码
<br/>
姓名:<input type="text" name="users['key'].username"/><br/>
年龄:<input type="text" name="users['key'].age"/><br/>
生日:<input type="text" name="users['key'].birthday"/><br/>
爱好:<input type="checkbox" name="users['key'].hobby" value="吃饭"/>吃饭
<input type="checkbox" name="users['key'].hobby" value="睡觉"/>睡觉
<input type="checkbox" name="users['key'].hobby" value="写代码"/>写代码
<br/>
<input type="submit" value="提交"/>
</form>