DAO类+通用持久类+通用动态formBean类+通用DispatchAction类,实现数据增、删、改、查
newxy(新坐标)
技术运用之四
DAO
类:
net.newxy.dbm.DBM
及其子类
通用持久类:
net.newxy.dbm.DynaDto
通用动态
formBean
类:
net.newxy.struts_faces.DynaFormBean
通用
DispatchAction
类:
net.newxy.struts_faces.DispatchAction
在《
DAO
类
+
通用持久类
+
通用动态
formBean
类,实现数据增、删、改、查》(又名《web开发:通用持久类代替hibernate的持久类、通用动态formBean类代替struts的formBean类》)文章中已介绍了
DAO
类、通用持久类、通用动态
formBean
类在数据增、删、改、
查中的运用。本篇增加了一个类net.newxy.struts_faces.DispatchAction,目的是为开发者提供几个通用的DispatchAction方法,节省代码,增加开发效率。
一、
net.newxy.struts_faces.DispatchAction类图
net.newxy.struts_faces.DispatchAction继承自struts的
org.apache.struts.actions.DispatchAction
二、net.newxy.struts_faces.DispatchAction的重要方法
1
、
getActionForward
public ActionForward getActionForward(ActionMapping actionMapping,HttpServletRequest httpServletRequest){
String frwd=httpServletRequest.getParameter("_frwd");
if(frwd!=null && frwd.trim().length()>0)
return actionMapping.findForward(frwd);
else{
if(actionMapping.getInputForward().getPath()!=null)
return actionMapping.getInputForward();
else{
httpServletRequest.setAttribute("message",net.newxy.cfg.Message.getMessage("errors.path")+";please give a forward for action");
return actionMapping.findForward("error");
}
}
}
以
_frwd
参数值作为
action
子属性
<forward />
的
name
值.如果此值不空,以其为
forward
的
name
值转发,如果没有此参数或其值为空,
actionMapping
会查看
action
的
input
参数,如果有
input forward
,则转到
input forward
,否则将"没有转发路径"类的信息保存到
request
中,并以名为
”error”
的全局
forward
进行转发.
2
、
find
jsp
页面表单传来的数据在这里组合成
sql
查询语句,进行查询,将查询结果保存到
actionForm
的
_coll
属性中。
public ActionForward find(ActionMapping actionMapping, ActionForm actionForm,
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws Exception{
......
return getActionForward(actionMapping,httpServletRequest);
}
actionForm
是
net.newxy.struts_faces.FormBean
类型,
是net.newxy.struts_faces.DynaFormBean的父类
。
如果发生异常,将异常信息以“
message”
为名保存到
request
中,并以“
error”
为全局
forward
的
name
值进行转发:
httpServletRequest.setAttribute("error",e.getMessage());
return actionMapping.findForward("error");
全局
forward
定义举例如下:
<global-forwards>
<forward name="error" path="/error.jsp" />
</global-forwards>
在“
/error.jsp
”页面上可用下列代码显示异常:
<logic:present name="message" scope="request">
<bean:write name=”message” scope=”request”/>
</logic:present>
如果数据查询过程没有异常,执行
return getActionForward(actionMapping,httpServletRequest)
语句转发。
3
、
update
页面上传的数据绑定到
formBean
中,
Object dto=form.getDto()方法得到包含上传数据的持久类对象,以该对象为参数调用DAO类的update(Object dto)方法,作更新或插入操作。
public ActionForward update(ActionMapping actionMapping, ActionForm actionForm,
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws Exception{
......
net.newxy.struts_faces.FormBean form=(net.newxy.struts_faces.FormBean)actionForm;
try{
Object dto=form.getDto();
IFacade ifacade=IFacadeFactory.getFacade(httpServletRequest.getParameter("_dao"), httpServletRequest.getLocale());
Object result=ifacade.update(dto);
......
}catch(Exception e){
......
}
......
return getActionForward(actionMapping,httpServletRequest);
}
actionForm
是
net.newxy.struts_faces.FormBean
类型,
是net.newxy.struts_faces.DynaFormBean的父类。
IFacadeFactory是DAO类的抽象工厂类。
IFacadeFactory.getFacade(String _dao,java.util.Locale locale)方法返回DAO类接口net.newxy.dbm.IFacade。
异常处理与转发和find方法相同。
4、remove
如果httpServletRequest.getParameter("_index")不空,删除参数值指定的那条记录,否则删除formBean数据对应的那条记录。
public ActionForward remove(ActionMapping actionMapping, ActionForm actionForm,
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws Exception{
......
String index=httpServletRequest.getParameter("_index");
try{
IFacade ifacade=IFacadeFactory.getFacade(httpServletRequest.getParameter("_dao"), httpServletRequest.getLocale());
if (index != null) {
net.newxy.util.FormBeanUtils.remove(ifacade, form, index);
} else
net.newxy.util.FormBeanUtils.remove(ifacade, form);
}catch(Exception e){
httpServletRequest.setAttribute("error",e.getMessage());
return actionMapping.findForward("error");
}
......
return getActionForward(actionMapping,httpServletRequest);
}
actionForm
是
net.newxy.struts_faces.FormBean
类型,
是net.newxy.struts_faces.DynaFormBean的父类。
IFacadeFactory是DAO类的抽象工厂类。
IFacadeFactory.getFacade(String _dao,java.util.Locale locale)方法返回DAO类接口net.newxy.dbm.IFacade。
异常处理与转发和find方法相同。
5、edit
edit方法从httpServletRequest.getParameter("_index")得到记录索引号,找到这条记录,将其数据填到actionForm中。
"edit"名意上是“编辑”,实际是将某条记录填入formBean中,供编辑或显示。
public ActionForward edit(ActionMapping actionMapping, ActionForm actionForm,
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws Exception{
......
net.newxy.struts_faces.FormBean form=(net.newxy.struts_faces.FormBean)actionForm;
String _index=httpServletRequest.getParameter("_index");
if(_index==null)
_index=form.get_index();
if(_index!=null)
form.setForm(_index);
......
return getActionForward(actionMapping,httpServletRequest);
}
actionForm
是
net.newxy.struts_faces.FormBean
类型,
是net.newxy.struts_faces.DynaFormBean的父类。
异常处理与转发和find方法相同。
6、empty
empty方法的目的是清空formBean,包括主关键字段属性也被清空,返回给用户的是空白表单,用户编辑数据,submit后,ActionServlet将数据绑定到formBean中。如果在后台调用DAO类的update(Object dto)方法,因为清除了主关键字属性,作插入操作。
empty方法的目的之一是让用户得到一空白表单,目的之二是为了数据插入。
public ActionForward empty(ActionMapping actionMapping, ActionForm actionForm,
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws Exception{
......
net.newxy.struts_faces.FormBean form=(net.newxy.struts_faces.FormBean)actionForm;
......
form.empty();
......
return getActionForward(actionMapping,httpServletRequest);
}
actionForm
是
net.newxy.struts_faces.FormBean
类型,
是net.newxy.struts_faces.DynaFormBean的父类。
异常处理与转发和find方法相同。
二、建议和约定
建议一、将net.newxy.struts_faces.DispatchAction作为通用DispatchAction类。
因为newxy(新坐标)的net.newxy.struts_faces.DispatchAction可以实现大部的数据增、删、改、查。它可以作为通用DispatchActionAction类。结合通用动态formBean类net.newxy.struts_faces.DynaFormBean,开发者在大多数情况下可以不写代码或少写代码实现数据增、删、改、查。
举例:
两个表:1.行业表industry,2.企业表enterprise。
两个formBean:1.formBeanIndustry与表industry对应,2.formBeanEnterprise与表enterprise对应。
两个DispatchAction: 1.actionIndustry与formBeanIndustry关联,有两个转发条件,2.actionEnterprise与formBeanEnterprise关联,也有两个转发条件。
Struts设置如下:
<form-beans>
<form-bean name="formBeanEnterprise" type="net.newxy.struts_faces.DynaFormBean" />
<form-bean name="formBeanIndustry" type="net.newxy.struts_faces.DynaFormBean" />
</form-beans>
<action-mappings>
<action name="formBeanEnterprise" parameter="method" path="/actionEnterprse" scope="session" type="net.newxy.struts_faces.DispatchAction">
<forward name="forward1" path="/jsp1.jsp" />
<forward name="forward2" path="/jsp2.jsp" />
</action>
<action name="formBeanIndustry" parameter="method" path="/actionIndustry" scope="session" type="net.newxy.struts_faces.DispatchAction">
<forward name="forward3" path="/jsp3.jsp" />
<forward name="forward4" path="/jsp4.jsp" />
</action>
</action-mappings>
现在在
jsp1.jsp
页面上对
enterprise
表进行编辑:
<html:form action="/actionEnterpise.do?method=update&_frwd=forward2">
企业名称
:<html:text property="name"></html:text><br />
企业地址
:<html:text property="address"></html:text><br />
<html:submit value="
提交
">
</html:submit>
</html:form>
action="/actionEnterpise.do?method=update&_frwd=forward2
"其中的
method
参数名由
actionEnterpirse
的
parameter
值决定,
update
是通用
Action
类
net.newxy.struts_faces.DispatchAction
的一个方法
,用于插入或更新数据。
_frwd
参数是通用动态
formBean
类
net.newxy.struts_faces.DynaFormBean
的保留属性
,其值是
struts
的
action
子属性
<forward />
的
name
值。
_frwd=forward2
,是要后台
update
数据后转到
jsp2.jsp
页面。
开发者应设置一名为
error
的全局转发:
<global-forwards>
<forward name="error" path="/error.jsp" />
</global-forwards>
在
error.jsp
页面上加入:
<logic:present name="message" scope="request">
<bean:write name=”message” scope=”request”/>
</logic:present>
如果
net.newxy.struts_faces.DispatchAction
在执行
update
操作时发生了错误,会转到
error.jsp
页面上来,并将错误信息显示出来.
建议二、开发者的action类继承net.newxy.struts_faces.DispatchAction
在开发过程中,有时要在数据插入或更新到数据库前从formBean中提取数据,或更改formBean中的数据.建议开发者的action类继承
net.newxy.struts_faces.DispatchAction
,如:
public class MyDispatchAction extends
net.newxy.struts_faces.DispatchAction
{
public ActionForward myUpdate(ActionMapping actionMapping, ActionForm actionForm,
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws Exception{
…… //开发者代码
try{
net.newxy.struts_faces.DynaFormBean form=(net.newxy.struts_faces.DynaFormBean)actionForm;//开发者代码
form.set(“field1”,”…”);//开发者代码
return super.update(actionMapping,actionForm,httpServletRequest,httpServletResponse);
catch(Exception e){
httpServletRequest.setAttribute(“message”,e.getMessage()); //
错误信息以
message
为名保存到
request
中.
return actionMapping.findForward(“error”); //
全局转发
}
}
}
数据上传到后台,开发在将数据送到数据库前,改变了field1字段属性值.
约定
约定与保留属性有关,下面是对页面上传的参数名的约定:
_frwd:其值
是
struts
的
action
子属性
<forward />
的
name
值,用于转发
;
_dao
:
DAO
类的别名;
_table
:要插入
、
更新或删除数据的表名;
_sql
:查询的基本条件.其它条件可由用户选择;
_index
:记录索引号,用于显示
、
编辑
、
或删除这条记录.
理解本篇的关键是理解
struts
的
DispatchAction
类,
newxy(
新坐标
)
的
net.newxy.struts_faces.DispatchAction
继承自struts的DispatchAction类,具有相同的工作原理.struts的action设置要有parameter的值,如果此值等于"method",jsp页面表单的action值就可以是如下形式:
action="/actionEnterpise.do?method=myUpdate&_frwd=forward2
"
myUpdate是 DispatchAction子类的一个方法.
newxy(新坐标)技术网站
:
http://www.newxy.net
posted on 2006-07-14 09:05
newxy新坐标 阅读(223)
评论(0) 编辑 收藏