《J2EE设计开发编程指南》(及spring)作者Rod Jhnson也说过类似的话,《J2EE设计开发编程指南》第394页倒数第三行写“这就意味着它们不能被传递给业务对象”,认为这是Struts的ActionForm方法很差(第396页)。我相信,Struts的设计者们也一定面对过这个问题,最后还是保留了现在的做法。所以,关键看开发者如何考虑和处理,而不在于Struts。也就是说开发者可采用现在Struts的折衷办法,因为它带来了许多优点;也可以自己修改一下Struts,使Bean与Struts无关,但同时也失去了Struts数据验证等优点。实际上,ActionForm并不复杂,开发者想修改它或扩展它还是不难的,不用我多说,看看ActionForm源代码就知道了:
package org.apache.struts.action;
import java.io.Serializable;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.upload.MultipartRequestHandler;public abstract class ActionForm implements Serializable {
protected transient ActionServlet servlet = null;
protected transient MultipartRequestHandler multipartRequestHandler;
protected ActionServlet getServlet() {
return (this.servlet);
}
public ActionServletWrapper getServletWrapper() {
return new ActionServletWrapper(getServlet());
}
public MultipartRequestHandler getMultipartRequestHandler() {
return multipartRequestHandler;
}
public void setServlet(ActionServlet servlet) {
this.servlet = servlet;
}
public void setMultipartRequestHandler(MultipartRequestHandler multipartRequestHandler) {
this.multipartRequestHandler = multipartRequestHandler;
}
public void reset(ActionMapping mapping, ServletRequest request) {
try {
reset(mapping, (HttpServletRequest) request);
} catch (ClassCastException e) {
;
}
}
public void reset(ActionMapping mapping, HttpServletRequest request) {
; // Default implementation does nothing
}
public ActionErrors validate(ActionMapping mapping,
ServletRequest request) {
try {
return (validate(mapping, (HttpServletRequest) request));
} catch (ClassCastException e) {
return (null);
}
}
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
return (null);
}
}
package org.apache.struts.action;
import java.io.Serializable;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.upload.MultipartRequestHandler;public abstract class ActionForm implements Serializable {
protected transient ActionServlet servlet = null;
protected transient MultipartRequestHandler multipartRequestHandler;
protected ActionServlet getServlet() {
return (this.servlet);
}
public ActionServletWrapper getServletWrapper() {
return new ActionServletWrapper(getServlet());
}
public MultipartRequestHandler getMultipartRequestHandler() {
return multipartRequestHandler;
}
public void setServlet(ActionServlet servlet) {
this.servlet = servlet;
}
public void setMultipartRequestHandler(MultipartRequestHandler multipartRequestHandler) {
this.multipartRequestHandler = multipartRequestHandler;
}
public void reset(ActionMapping mapping, ServletRequest request) {
try {
reset(mapping, (HttpServletRequest) request);
} catch (ClassCastException e) {
;
}
}
public void reset(ActionMapping mapping, HttpServletRequest request) {
; // Default implementation does nothing
}
public ActionErrors validate(ActionMapping mapping,
ServletRequest request) {
try {
return (validate(mapping, (HttpServletRequest) request));
} catch (ClassCastException e) {
return (null);
}
}
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
return (null);
}
}
解决方案 »
- 在java中怎么动态的创建一个数据源
- 关于DispatchAction,菜鸟求救
- 关于struts实现上传的问题???
- 两个用户注册问题
- 高分求网站换肤的解决方案?分不够再加!
- 有一个问题我至今还不知道,就是用j2me,j2se和j2ee中的API用于商业时到底是不是全免费的?
- 帮忙看看是什么错误?
- 请问,isleaf(),叶子节点是什么意思?
- 求助在JBuilder中的CMP实体Been中的关联的意思
- spring roo 报 Version is required for xxx错误,如何解决?
- 在hibernate中,用Middlegen-Hibernate来实现对数据库中表的映射的问题???
- 关于JBuilder X打EJB包的时候出现的问题 ...
public class Contact{
private String name;
private String address;
......
}
对于
ContactForm
类,可以这么来写:
public class ContactForm extern ActionForm{
Contact contact = new Contact();
}那么在页面上:可以这么写:
<input type="text" name="contactForm.name" value="">contactForm 为你在struct-config.xml文件中,
action 指写的formBean的name.
我现在的做法和你提的是一样的,但问题是ContactForm还要写一堆的getter,setter.
to kui:
我觉得改写struts的实现代码不是个好的方案,这样你的代码就难兼容了.
一般来说ActionForm起了1到防火墙的作用...
使web层的数据经过过滤传到Action
一般ActionForm也可以当作一个VO来使用
我的做法是
jsp-->ActionForm-->vo2po工具(自己写)--->domain object-->pesistent layer
反向
pesistent layer -->domain object -->BeanUtils工具-->ActionForm-->jsp(配合标签库)
就是把你的contact实现为接口,然后ActionForm继承这个接口
这样虽然getter、setter免不了还要重复写(就是接口中的无需实现罢了),但程序结构上好一些
Contact未必就是PO,Contact可以认为是M层提供给C层和V层的业务接口(虽然它的表示是个bean).所以我认为让Contact来直接作为ActionForm未必就是不好的设计,这样相当于我在V层使用了M层的Contact接口.当然,Polarislee(北极星)说的也有道理
另,谢谢大家的热情参与
用户界面上显示的数据项和数据库中保存的数据结构有时会差得很多,放在一起只会增加代码的复杂性,增加维护的难度。即便是今天你看到的是一样数据结构的,但你的用户对界面会提出很多修改意见,form中的数据项可能要经常调整,如果按你的想法设计,有些调整会对你的model带来很大的影响。
这样虽然可以解决问题,但是却破坏了软件层次,最后搞的层次不清
2.liaowufeng(liaowufeng)的用法,也是非数据库字段的在action请求多一次,对应get,set方法.
加上Contact对象 这两种方式我都用过,觉得思路还算清析,也不会态多重复代码啊!!