发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 CQRS 扩展性 并发编程 事件溯源 分布式 SOA
1 2 下一页 Go 2

如何在Action中构造DynaActionForm?

2003-06-12 14:04
赞助商链接

用Struts写了一个简单的用户登录和修改密码的程序,form用的是DynaActionForm,实现修改密码时流程是:在一个重定向Action中构造DynaActionForm -> 重定向到EditPwd.jsp -> 提交到EditPwdAction实现密码修改。遇到的问题是:在重定向Action中构造DynaActionForm时报NullPointerException。不知是什么原因?

2003-06-13 11:32

在重定向Action中构造DynaActionForm时,你需要创建它,报Null好像是你试图从哪里获取?

2003-06-16 23:33

在重定向Action中我创建了Form了,代码如下:
public ActionForm buildForm(){
DynaActionForm form = new DynaActionForm();
form.set("OAB_sn","B123456");
form.set("OAB_name","China");
return form ;
}
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
...
try{
...
form = this.buildForm();
...
}catch(Exception ex){
ex.printStackTrace();
}
...
}
可还是报空指针错误,不知是什么原因,请指教。

2003-08-04 16:50

http://www.javaresearch.org/forum/thread.jsp?column=20&thread=7006

问题描述:
也就是第二个Action中的excute方法参数中的ActionForm form有时候是jsp页面提交时传递过来的,有时候是第一个Action初始化一个actionForm后传递过来的。第一个Action初始化好的actionForm如何传递到二个Action中的excute方法参数中的ActionForm form参数?

解释:
出现这种扩展的需求很可能意味着你的设计出了问题。这种情况并不多。
(这不是我说的,Struts作者的原话)

但是你还是有两种办法来实现你的需求。
第一:
The best solution here is to add a switch to your bean to make its properties
immutable:
private boolean mutable = true;
public void setMutable(boolean mutable) {
this.mutable = mutable;
}
// ...
public setProperty(String property) {
if (isMutable()) this.property = property;
}
这样,当你离开第一个Action之前调用setMutable(ture),然后转发到第二个Action,那么
Formbean数据将不会重新被populate和validate。


另外一个办法,在第一个Action中,将这个Formbean存储在request上,但是使用另外的名称,这里需要一个技巧,设置Formbean的Attribute属性。

2003-08-04 20:21

DynaActionForm一般为简单的FORM提交数据而设计的,
为避免写过多的简单form类
比如用户登陆这个流程,如果写个LogonForm一则代码本身很简单
二则很大程度上并不需要

如:
<form-bean name="logonForm"
type="org.apache.struts.action.DynaActionForm">
<form-property name="useranme" type="java.lang.String"/>
<form-property name="password" type="java.lang.String"/>
</form-bean>
这样就可以在logonAction中直接使用这个form,比另单独写一个logonForm灵活多了,
当然在小应用中并看不出他的好处,但当系统一大,如果里面有N多的
form的话就很不合适了,特别是一些小而相似的form一多,呵呵:)


对于你的应用,修改密码比如需要提交form表单,而此时唯一与登陆不同
的一项其实用户ID,所以你希望用动态FORM来做,以避免再写一个form

但我认为更简单的办法是在struts的配置文件中如下配置:
<form-bean name="changePasswordForm"
type="org.apache.struts.action.DynaActionForm">
<form-property name="userid" type="java.lang.String"/>
<form-property name="password" type="java.lang.String"/>
</form-bean>

OK,现在你只要在你的EditPwdAction中取这个ID和password就可以了,而不需要在程序中自己创建任何form了:)

其实这里的ID都不需要,因为你的用户登陆信息肯定保存在session中的,
所以这个时候你需要的仅仅只是新密码的值(当然,一些必要的检验需要用javascript在之前完成),然后修改就成了:)

2Go 1 2 下一页

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系反馈 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com