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