-------------------siwuxie095
属性驱动封装
1、Struts2 将数据封装分为两大类:
(1)一类被称为是 属性驱动
(2)一类被称为是 模型驱动
2、属性驱动封装可以细分成两种:
(1)一种只需要提供属性的 set 方法即可(简称 属性封装)
(2)一种可以通过表达式直接封装到对象中(简称 表达式封装)
(一)属性封装:提供属性的 set 方法
1、在 Struts2 中可以直接在 Action 中定义各种 Java 基本数据
类型的字段,使这些字段和表单数据相对应,并利用这些字段进
行数据传递
「直接把表单数据封装到 Action 的属性中」
2、具体步骤
(1)在 Action 的成员变量位置定义属性
(2)提供属性的 set 方法
「属性名称要和表单输入项的 name 属性值一致」
3、具体实现
(1)编写页面
data.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>表单</title> </head> <body> <form action="${pageContext.request.contextPath }/data.action" method="post"> username:<input type="text" name="username"/> <br/> password:<input type="password" name="password"/> <br/> address:<input type="text" name="address"/> <br/> <input type="submit" value="提交"/> </form> </body> </html> |
(2)编写 Action
DataAction.java:
package com.siwuxie095.action;
import com.opensymphony.xwork2.ActionSupport;
/** * 使用属性封装获取表单数据 */ public class DataAction extends ActionSupport { /* * (1) 在 Action 的成员变量位置定义属性 * * 属性名称要和表单输入项的 name 属性值一致 */ private String username; private String password; private String address; /* * (2) 提供属性的 set 方法 * * 其实只需要提供 set 方法即可,因为 * 是自动生成,所以顺便生成 get 方法 */ public String getUsername() { return username; } public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
public String getAddress() { return address; }
public void setAddress(String address) { this.address = address; }
@Override public String execute() throws Exception { System.out.println(username+"-"+password+"-"+address); return NONE; } } |
(3)配置 Action
struts.xml:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts> <package name="demo" extends="struts-default" namespace="/"> <action name="data" class="com.siwuxie095.action.DataAction"></action> </package>
</struts> |
(4)访问路径
http://localhost:8080/工程名/data.jsp
4、问题与缺陷
如果要表单数据很多,那么 Action 的属性也会变得很多,再加上
属性有对应的 getter 和 setter 方法,从而导致 Action 的代码很
庞大,再在 Action 中编写业务逻辑的代码时,会使 Action 非常
臃肿,不够简洁
「表单数据只是封装到属性中,并没有封装到对象中」
5、解决方案
把属性和对应的 getter 和 setter 方法从 Action 中提取出来,封
装到实体类中,单独作为一个值对象
该对象就是用来封装表单数据的,且可以在多个 Action 中使用
「实体类封装的属性和表单的属性一一对应」
(二)表达式封装:页面提供 OGNL 表达式
1、表达式封装可以把表单数据直接封装到实体类对象中
2、具体步骤
(1)在 Action 中声明实体类对象
(2)提供实体类对象的 get 和 set 方法
(3)在表单输入项的 name 属性值处写 OGNL 表达式
3、具体实现
(1)编写实体类
User.java:
package com.siwuxie095.entity;
// User 实体类 public class User {
private String username; private String password; private String address; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User [username=" + username + ", password=" + password + ", address=" + address + "]"; } } |
(2)编写 Action
DataxAction.java:
package com.siwuxie095.action;
import com.opensymphony.xwork2.ActionSupport; import com.siwuxie095.entity.User;
/** * 使用表达式封装获取表单数据 */ public class DataxAction extends ActionSupport {
/* * (1) 在 Action 中声明实体类对象 * * 注意:是声明,不是创建,即不需要 new */ private User user; /* * (2) 提供实体类对象的 get 和 set 方法 */ public User getUser() { return user; }
public void setUser(User user) { this.user = user; }
@Override public String execute() throws Exception { System.out.println(user); return NONE; } } |
(3)配置 Action
struts.xml:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts> <package name="demo" extends="struts-default" namespace="/"> <action name="datax" class="com.siwuxie095.action.DataxAction"></action> </package>
</struts> |
(4)编写页面
datax.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>表单</title> </head> <body> <!-- (3) 在表单输入项的 name 属性值处写 OGNL 表达式 user.username 的 user,即在 Action 中声明的实体类对象 --> <form action="${pageContext.request.contextPath }/datax.action" method="post"> username:<input type="text" name="user.username"/> <br/> password:<input type="password" name="user.password"/> <br/> address:<input type="text" name="user.address"/> <br/> <input type="submit" value="提交"/> </form> </body> </html> |
(5)访问路径
http://localhost:8080/工程名/datax.jsp
【made by siwuxie095】