随笔-55  评论-72  文章-2  trackbacks-0

        这篇文章,在草稿箱里沉积了好久,一直说要把它写完,可老是被其他事情给占用。我现在的休息时间就是漫天涂鸦,已经好久没去整理wmframework了,感觉自己都有点对它陌生了。今天发现刚好草稿箱里就剩下这个,那就把它写完吧。

    这里我主要介绍wmframework1.0版本关于jsp请求数据处理,这个版本被运用在我做一个校务管理系统的时候,大体的处理流程和(一)中介绍那样,有兴趣可以回头看看。wmframework v1.0整个版本的完善经历了2年半左右的时间。当然这更多得益于项目组最终确定采用这个技术框架,有了更多的人使用,自然暴露的问题就逐渐增多。为了满足通用与灵活多样的特性,解决了各种自己原先没考虑的需求,这中间我做了很多大大小小的修改完善。整个项目结束,最终1.0版本已就稳定下来了。

    我先说下wmframework 提倡什么,它主要倡导的就是开发的分层性,这个你可以在我的《用WM framework进行MVC团队组合模式的系统开发》找到答案。就单个模块或功能点的开发而言,wmframework提出,多个jsp页面请求公用一个action相应,一个service外部接口和一个dao完成处理,所以使用wmframework,常规下开发人员没必要也不允许进行actionservicedao的编写,因为wmframework自带的公用定义已经完成了你的操作。不说别的光这点上就可以节省多少不必要的资源开销,最终可以直接有效地降低开发人员的工作量,何乐而不为呢?

    wmframework 主要是依托于ajax数据提交模式下运作的,在1.0中主要是以同步请求提交为主,下面我具体来说说前后台jsp请求数据处理。

1.前台数据封装

    使用wmframework 要求开发人员在jsp中除了使用html标签,部分jstl及自定义标签外,一般不提倡使用类似strutsspring自带的mvc标签,因为这些标签本身就是一个javabean,如果用的过多,那必然增加jsp的页面负载和请求加载速度,如直接使用html标签,至少可以减少那些mvc标签的解析过程。下面我给出一个jsp中一个表单元素的写法:

<input type="text"  issave="true" fieldname="userAccount" require="true" datatype="chars"
showmessage
="用户账号为空或设置错误" maxlength="20" class="textfile" id='unit_account'/>

 

    这里wmframework 扩展了html标签,增加了几个自定义的属性。issave="true"表明当前表单元素是必须提交到后台进行操作的;fieldname是匹配当前表单提交匹配domain(或pojo)的中某个属性的名称;require表明当前字段是否必填;datatype标识当前元素需要填入的数据类型,这里chars代表需要字符型;showmessage表示如当前表单元素校验不通过;需要给出的提示信息。当然不光是input可以这样定义,只要html支持的页面标签如select,textarea,image,div,tr,td等等都可以进行这些属性的定义,这里就不一一罗列了。

2.前台数据校验

    页面元素定义完,接下来就是表单提交数据前,前台js校验问题了,这里wmframework 通过自定义的js对象WMvalidate完成,一般情况下不提倡直接调用WMvalidate中的方法,因为WMvalidate在被调用完成数据校验的同时,其他对象在完成这些表单数据的装载。

3.前台数据提交

    对于当前jsp表单数据的校验与装载过程,主要在前台js的入口对象WMaction中完成,所以一般页面中主要以调用WMaction为主。下面我给出jsp调用WMaction对象的一个实例,进行简单说明:

这是一个提交按钮触发的onclick事件处理函数

function dosave() {
  
var ac = new action();//创建js对象请求action对象

  ac.setForm(document.forms[0]);//设置本次提交表单数据所处的form对象,当一个页面存在太多元素或form是,可以有效地减少没必要的页面元素遍列
  ac.setUrl(cps+'/userAction.do?action=add');//设置本次提交的路径url, cps为公共文件中定义的全局变量,var cps = "<%=request.getContextPath()%>";即当前上下文的js引用。
  ac.setTextDiv('textdiv');//设置本次提交,需要隐藏按钮所在的div的ID值。数据提交后,当前操作按钮将被隐藏,避免用户进行二次点击操作
  ac.setHitDiv('hitDiv');//设置异步提交时,进度条所在的div的ID值。数据处理过程中,提交按钮将被隐藏,同时在相同位置将显示一个进度条标识当前请求处理的进度
  ac.setIsasy(true);//设置本次提交的操作方式:true 异步方式,即当前提交无需等待response的响应,可完成类似cpu多线程同时处理的方式, false 同步方式即当前请求提交后,必须等待response的响应,这好比数据库中的排它锁,一时仅能保证一个请求的处理。
  ac.setFunctionname("insertUser");//设置本次提交执行的sqlmap配置文件中的xml节点方法的id值,对大小写敏感,如果你了解ibatis,应该知道这里指的东西。
  ac.setDomainname("OaUser");//设置本次提交数据封装对象名称(和后台domain一致,不用加类全路径,加已无所谓)对大小写敏感,后台自带完成当前domain对象的全路径添加匹配,这就要求,整个系统的domain存放在固定的package ,当然你实在不愿意,那就直接加上当前domain的这个包路径,如  ac.setDomainname("com.test.OaUser");。
  ac.execute();//发送数据请求,因为这里仅考虑的是进行简单的保存或删除操作,所以没有添加回调函数的处理
}
 

  如果你感觉前面的定义过于繁琐难记,那可以使用第二种方式,直接获得数据表单居于xml格式封装的字符串,前面忘记说一点,wmframework 所有数据请求都是通过xml格式封装并通过ajax发出的,这点我在()中已经进行了相关介绍说明。
给出一个定义的参考

function dosave() {
  
var ac = new action();//创建js对象请求action对象

  ac.setForm(document.forms[0]);//设置本次提交表单数据所处的form对象,这里必须设置,不然WMvalidate没法子帮你进行数据校验
  ac.setUrl(cps+'/userAction.do?action=add');//同上
  ac.setTextDiv('textdiv');//同上
  ac.setHitDiv('hitDiv');//同上
  ac.setIsasy(true);//设置本次提交的操作方式:true 异步方式 false 同步方式
  var xmlStr = " <?xml version=\"1.0\" encoding=\"UTF-8\"?>"
                
+" <root>"
                
+" <vos id="OaUser""
                  
+" <vo> "
                
+" <userName>测试用户</userName> "
                
+" <userAccount>demo</userAccount> "
                  
+" <password>123</password> "
                
+" <userType>1</userType> "
                  
+" <departmentId>1</departmentId> "
                
+" <function>insertUser</function>"
                
+" </vo> "
                  
+" </vos> "
                  
+" </root> ";
  ac.setXmlstr(xmlStr);
//设置请求数据xml字符串

  ac.execute();//同上
}

 

      就这样简单的进行设置,就可以完成当前jsp页面表单数据的提交保存操作,当然这里的设置过于简单,其实在这里你还可以定义回调函数,操作失败处理函数,操作成功处理函数,调试跟踪器等,但在v1.o中这样的定义仅支持在本次操作为同步提交的模式。即ac.setIsasy(false)

    WMaction.execute()执行后,会先调用WMvalidate进行数据校验,当然你也可以不进行校验,那就别设置上面的form参数,不过方式仅支持数据采用第二种提交;WMvalidate校验通过,则判断当前用户使用哪种方式转载数据;如第一种,则调用WMdataemun对象完成提交数据表单的枚举类型封装(在v2.0中这个对象已经被废弃),即把表单数据转载在一个js定义的枚举对象中,以进行统一的xml字符串拼接读取,这个过程在WMdocobject完成;如用户采用第二种定义方式,那就不经过上述两个对象的流转,直接到WMservice对象中,在WMservice中最终构建XMLHttpRequest对象,并通过send方法把数据发送出去。这里给出个流程图

 

    至此jsp前台请求处理过程介绍基本结束,可能整个过程看起来很简单。确实很简单,因为WMframework本就是简单的东西,不过2.0版本相对处理就比这个繁琐一些,可兼容的东西也多一些,不过对于中小型web运用开发来说,这样的处理基本上足够了。先写到这里吧,下次再继续,太多了看的人眼花,变成消化不良了不太好。。。

(注:本人文章均为原创,转载请注明出处!20100616写于深圳。)



一篇好的文章应该如一坛佳酿,未偿已久醉于心;或如一壶好茶,品尝之间回味无穷;或如与心爱的人共进晚餐,仅餐秀色足以饱食。我不妄想自己的文章能惊世骇俗,但始终期待有“和旋之音,击缶之伴”。
posted on 2010-07-22 22:40 刀光剑影 阅读(1133) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: