Struts:把页面数据提交到Form的原理及使用方法

 我们使用Struts框架的其中一个好处就是,它会帮你把页面上的数据一个个的转移到ActionForm上。使你可以使用对象来获得这些数据,而不用多次使用request.getParameter(String)的方法来获得用户在页面上输入的值。

本文主要是简单说明一下这个功能的原理及几种使用方法。

 

首先,浏览器的请求发送到服务器端之后,web服务器(如tomcat)会把这个请求转送给ActionServlet的实例处理。而ActionServlet的doGet()和doPost()方法都会调用自身的process()方法。而process()方法会调用RequestProcessor#process(HttpServletRequest, HttpServletResponse)来完成实际的预处理请求操作。其中有两行代码是完成ActionForm实例的获得和赋值操作的。如下。

 

 

其中第一行代码是获取ActionForm的实例,第二行代码是从request中取到页面上各个项的值,赋到ActionForm的实例上,假如form为null的话,赋值操作就不会做,用户在页面上输入的信息也不会转移到form上。那么你在Action中就只能通过request.getParameter(String)的方式来获得用户输入的信息。

所以,这里最重要的就是第一行代码,只有processActionForm()返回的值不为null,populate操作(就是赋值操作)才会成功执行。

 

那么这个processActionForm()做了什么事情呢?它首先获取到你在struts-config.xml中为当前action配置的form名,然后使用这个名字在相应的scope(request或者session)中寻找ActionForm的实例,如果没有的话,就创建一个新的实例。

由此可以看出,只有为action配置了合适的ActionForm,用户提交的数据才会被正确的设置到form中。

 

不了解这个原理的话,可能会犯这样一个错误。假如有这样一个实例,页面A上有一个button是跳转到页面B的,并且这个button确实是进行了表单的submit操作,但是页面上的数据依然没有提交到form上。这是什么原因呢?因为很有可能,这个button提交的action就是B页面的显示Action,而B页面的显示Action配置的是B页面的form,所以导致数据populate失败。

 

对付这类问题的话,有几种方法。

1 . 首先是确认页面B的显示Action是否需要配置B页面的Form,如果不需要的话,就把它配置成页面A的form,这样就可以解决了。

 

#大多数情况下,1都是不可行的,因为页面B的显示Action很可能需要为页面B的form设置一些属性的值。

 

2. 如果页面A的Action是继承了DispatchAction的话,可以在这个Action中添加一个分支,没有任何实际代码,只是跳转到页面B。然后把页面A的button的提交操作的action改成这个新的分支。

 

3 . 还有一种有效的方法是使用ForwardAction。ForwardAction其实是struts框架为用户提供的一个共同的跳转Action,你可以通过仅在struts-config.xml中配置,而不需要写任何java代码就可以使用它。

 


上面的代码就是ForwardAction的一个示例。与一般的action不同的就是type必须指定为相应的ForwardAction,parameter表示接下来要跳转的url,比如说页面B的action的url,当前是相对路径了。

 

使用这个ForwardAction的话,需要注意两点。

1. scope 如果有这种需求,需要把页面上的数据提交到form上,并且不需要立即处理,form的scope一般设置为session。

 

2. 我们在设计自己的系统的时候,一般都会设计一个继承了Action的类(比如说ActionBase),然后让所有的Action都继承这个ActionBase。那么,就不要直接使用struts自带的ForwardAction了,自己照抄一个也是很简单的。

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值