【 tulaoshi.com - Web开发 】
zhipingch 原创
去年初,正好负责一个医药信息系统的设计开发,架构设计时,采用Struts+JDBC(自定义采用适配器模式封装了HashMap动态VO实现的持久层)。后来ajax热潮兴起,正好系统中有很多地方需要和服务器端交互数据,如采购销售系统中的订单头/订单明细等主从表结构的维护。
[color=blue]数据交互过程[/color],我们考虑采用xml来组织数据结构,前台封装需要的xml,通过ajax提交---〉action解析xml ---〉改造原有的持久层实现xml持久化;
持久层根据实际需要返回xml,document对象,---〉action 处理 --〉前台自己封装js库来解析xml,并刷新部分页面。
ajax:已经有很多方法实现跨浏览器的方式,这里只介绍最简单的方式,同步模式下提交xmlStr给action(*.do)。
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)/** * 将数据同步传递给后台请求url * @return 返回xmlhttp 响应的信息 * @param-url = '/web/module/xxx.do?p1=YY&p2=RR'; * @param-xmlStr:xml格式的字符串 dataxpath![CDATA[数据信息]]/xpath/data * @author zhipingch * @date 2005-03-17 */ function sendData(urlStr, xmlStr) { var xmlhttp = ActiveXObject("Microsoft.XMLHTTP"); xmlhttp.open("POST", urlStr, ); xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); (xmlStr) { xmlhttp.send(xmlStr); } { xmlhttp.send(); } xmlhttp.responseXml; }
struts中我们扩展了Action,实现了xmlStr转化成document对象(dom4j),并且完善了转发方式。如
[quote]
以一个Controller响应一组动作绝对是Controller界的真理,Struts的DispatchAction同样可以做到这点。
[list]
action path="/admin/user" name="userForm" scope="request" parameter="method" validate="false"
forward name="list" path="/admin/userList.jsp"/
/action
[/list]
其中parameter="method" 设置了用来指定响应方法名的url参数名为method,即/admin/user.do?method=list 将调用UserAction的public ActionForward list(....) 函数。
public ActionForward unspecified(....) 函数可以指定不带method方法时的默认方法。[/quote]
但是这样需要在url后多传递参数[size=18][color=red]method=list [/color][/size];并且action节点配置中的[color=red]parameter="method" [/color]
也没有被充分利用,反而觉得是累赘!
因此我们直接在BaseDispatchAction中增加xml字符串解析,并充分利用action节点配置中的[color=red]parameter="targetMethod" [/color],使得转发的时候,action能够直接转发到子类的相应方法中,减少了url参数传递,增强了配置信
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)ramework.dao.DataAccessException; org.springframework.web.context.support.WebApplicationContextUtils; com.ufida.haisheng.constants.Globals; com.ufida.haisheng.converter.DateConverter; com.ufida.haisheng.converter.TimestampConverter; com.ufida.haisheng.exp.ExceptionDTO; com.ufida.haisheng.exp.ExceptionDisplayDTO; com.ufida.haisheng.exp.exceptionhandler.ExceptionHandlerFactory; com.ufida.haisheng.exp.exceptionhandler.ExceptionUtil; com.ufida.haisheng.exp.exceptionhandler.IExceptionHandler; com.ufida.haisheng.exp.exceptions.BaseAppException; com.ufida.haisheng.exp.exceptions.MappingConfigException; com.ufida.haisheng.exp.exceptions.NoSuchBeanConfigException;
/** * 系统的Ajax转发基类。增加模版处理异常信息。 * * @author 陈志平 chenzp * @desc BaseDispatchDocumentAction.java * * @说明: web 应用基础平台 * @date 2005-03-02 11:18:01 AM * @版权所有: All Right Reserved 2006-2008 */ BaseDispatchDocumentAction Action {
Class clazz = .getClass(); Logger log = Logger.getLogger(BaseDispatchDocumentAction.);
/** * 异常信息 */ ThreadLocalExceptionDisplayDTO
expDisplayDetails =
ThreadLocalExceptionDisplayDTO();
Long defaultLong = ; ApplicationContext ctx = ;
/** * 注册转换的工具类 使得From中的string -- * Model中的对应的类型(Date,BigDecimal,Timestamp,Double...) */ { &, Document.,
HttpServletRequest.,
HttpServletResponse. };
/** * Process the specified HTTP request, and create the corresponding HTTP * response (or forward to another web component that will create it). * Return an codeActionForward/code instance describing where and how * control should be forwarded, or codenull/code if the response has * already been completed. * * @param mapping * The ActionMapping used to select this instance * @param form * The optional ActionForm bean for this request (if any) * @param request * The HTTP request we are processing * @param response * The HTTP response we are creating * * @exception Exception * if an exception occurs */ ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
Exception { response.setContentType("text/html; charset=UTF-8"); &n
/** * 直接输出纯字符串 */ renderText(
HttpServletResponse response,
String text) {
PrintWriter out = ; { out = response.getWriter(); response.setContentType("text/plain;charset=UTF-8"); out.write(text); } (
IOException e) { log.error(e); } { (out != ) { out.flush(); out.close(); out = ; } } }
/** * 直接输出纯HTML */ renderHtml(
HttpServletResponse response,
String text) {
PrintWriter out = ; { out = response.getWriter(); response.setContentType("text/html;charset=UTF-8"); out.write(text); } (
IOException e) { log.error(e); } ExceptionDisplayDTO handlerException(
HttpServletRequest request,
HttpServletResponse response,
Exception ex) { ExceptionDisplayDTO expDTO = (ExceptionDisplayDTO) expDisplayDetails.get(); ( == expDTO) { expDTO = ExceptionDisplayDTO(,.getClass().getName()); } IExceptionHandler expHandler = ExceptionHandlerFactory.getInstance().create(); ExceptionDTO exDto = expHandler.handleException(expDTO.getContext(), ex); request.setAttribute("ExceptionDTO", exDto); renderText(response,"[Error:" + (exDto == ? "ExceptionDTO is null,请检查expinfo.xml配置文件." : exDto.getMessageCode()) + "]"); expDTO; } isValidMethod(
String actionMethod) MappingConfigException { (actionMethod == || "execute".equals(actionMethod) || "perform".equals(actionMethod)) { log.error("[BaseDispatchAction-error] parameter = " + actionMethod); expDisplayDetails.set( ExceptionDisplayDTO(, "MappingConfigException")); MappingConfigException("对不起,配置的方法名不能为 " + actionMethod); } }
/** * 解析xml流 * @param request * @return Document对象 */ &n