Fork me on GitHub

属性驱动封装

-------------------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】

posted on 2017-08-10 13:09  siwuxie095  阅读(644)  评论(0编辑  收藏  举报

导航