论坛首页 Java企业应用论坛

《研磨struts2》第四章 Action 之 4.3 Action的数据

浏览 1312 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2012-04-22  

4.3  Action的数据

4.3.1  数据来源

在helloworld示例里面,在运行Action的execute方法的时候,你会神奇般的发现,Action的属性是有值的,而这正是Action进行请求处理所需要的数据。那么,这些数据从何而来呢?

       很明显,这些数据就是你在登录页面填写的数据,换句话说,这些数据来源于用户请求对象,也就是request对象。

       可是,Struts2怎么知道,页面上的值如何和Action的属性进行对应呢?

       这就涉及到如何把页面的数据和Action进行对应的问题了,接下来就来讨论页面的数据和Action的三种基本对应方式。

4.3.2  基本的数据对应方式

在Struts2中,页面的数据和Action有两种基本对应方式,分别是:属性驱动(FieldDriven)和模型驱动(ModelDriven)。

属性驱动又有两种情况:一种是基本数据类型的属性对应;另外一种是JavaBean风格的属性对应。为了区分它们,我们约定称呼如下:称呼“基本数据类型的属性对应”为属性驱动,而“JavaBean风格的属性对应”为直接使用域对象

下面就分别来看看它们都什么意思,都如何实现。

1:属性驱动FieldDriven(基本数据类型的属性对应)

基本数据类型的属性对应,就是web页面上要提交的html控件的name属性,和Action的属性或者与属性相应的getter/setter相对应,这种做法就是基本数据类型的属性对应的属性驱动。

事实上,我们已经使用过这种方式了,前面HelloWorld示例,就是采用的这种方式来把值对应到Action中的。

比如在登录页面上,我们是这么写的:

 

java代码:
  1. <form action="/helloworld/helloworldAction.action" method="post">  
  2.     <input type="hidden" name="submitFlag" value="login"/>  
  3.     账号:<input type="text" name="account"><br>  
  4.     密码:<input type="password" name="password"><br>  
  5.     <input type="submit" value="提交">  
  6. </form>  

在Action中是这么写的:

 

java代码:
  1. public class HelloWorldAction extends ActionSupport {  
  2.     private String account;  
  3.     private String password;  
  4.     private String submitFlag;  
  5.     public String getAccount() {  
  6.         return account;  
  7.     }  
  8.     public void setAccount(String account) {  
  9.         this.account = account;  
  10.     }  
  11.     public String getPassword() {  
  12.         return password;  
  13.     }  
  14.     public void setPassword(String password) {  
  15.         this.password = password;  
  16.     }  
  17.     public String getSubmitFlag() {  
  18.         return submitFlag;  
  19.     }  
  20.     public void setSubmitFlag(String submitFlag) {  
  21.         this.submitFlag = submitFlag;  
  22.     }  
  23.     //其他部分暂时省略掉,好让大家看清楚数据的对应关系  
  24. }  

你会发现,在页面上input的name属性,和Action的属性是同一个名称,这样一来,当页面提交的时候,Struts2会自动从request对象里面把数据取出来,然后按照名称进行对应,自动设置到Action的属性里面去。

有些朋友可能会说,Action的属性都是private的呀,按道理外部是无法访问的,正是因为如此,才为每个私有的属性提供了getter/setter方法,来让外部访问。

这也意味着,如果你不想为每个属性提供getter/setter方法,觉得很累赘,有一个简单的方式,那就是把属性的可访问权限设置成public的就可以了。但在Java开发中,不是很建议直接开放属性让外部访问,一般都是通过getter/setter方法来访问。当然如何选择,根据实际情况来判断吧,总之两种方式都是可以把值对应上的。

2:属性驱动FieldDriven(直接使用域对象)

       仔细察看上面属性驱动的方式,会发现,要是需要传入的数据很多的话,那么Action的属性也就很多了,再加上对应的getter/setter方法,Action类就直接上百行了,再在里面写请求处理的代码,会显得Action非常零乱,不够简洁,而且给人的感觉是Action的功能也不够单一。那么该怎么解决这个问题呢?

       很简单,把属性和对应的getter/setter方法从Action里面移出去,单独做成一个域对象,这个对象就是用来封装这些数据的,然后在Action里面直接使用这个对象就可以了。

(1)先看看域对象的写法,按照JavaBean的风格来写,示例代码如下:

 

java代码:
  1. public class HelloWorldModel {  
  2.     private String account;  
  3.     private String password;  
  4.     private String submitFlag;  
  5.       
  6.     public String getAccount() {  
  7.         return account;  
  8.     }  
  9.     public void setAccount(String account) {  
  10.         this.account = account;  
  11.     }  
  12.     public String getPassword() {  
  13.         return password;  
  14.     }  
  15.     public void setPassword(String password) {  
  16.         this.password = password;  
  17.     }  
  18.     public String getSubmitFlag() {  
  19.         return submitFlag;  
  20.     }  
  21.     public void setSubmitFlag(String submitFlag) {  
  22.         this.submitFlag = submitFlag;  
  23.     }  
  24. }  

(2)看看此时,Action写法的变化,主要就是直接使用这个对象,其实就是定义一个属性是这个对象类型,然后为这个属性提供相应的getter/setter方法即可,当然也可以直接把这个属性的可访问属性设置成public,这样就不需要写getter/setter方法了。

原来Action里面直接使用属性值的地方,就修改成使用这个属性对象来获取值了。示例代码如下:

 

java代码:
  1. public class HelloWorldAction extends ActionSupport {  
  2.     private HelloWorldModel hwm = new HelloWorldModel();  
  3.       
  4.     public HelloWorldModel getHwm() {  
  5.         return hwm;  
  6.     }  
  7.     public void setHwm(HelloWorldModel hwm) {  
  8.         this.hwm = hwm;  
  9.     }  
  10.       
  11.     public String execute() throws Exception {  
  12.         //1:收集参数,不用做了,数据会直接映射到上面的hwm里面  
  13.         //2:组织参数,也不用作了,数据会映射到上面的hwm的时候,就已经组织好了  
  14.         //3:调用模型的逻辑功能处理,这里不需要,只是简单的输出一下传入的参数  
  15.         this.businessExecute();  
  16.         //4:根据逻辑处理的结果来选择下一个页面,这里直接选择转向欢迎页面  
  17. padding-top: 0px !important; padding-right: 3px !important; padding-bottom: 0px !important; padding-left: 10px !important; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: solid; border-color: initial; border-left-width: 3px; border-left-color: #6ce26c; color: inherit; line-height: 14px; margin
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics