华山论剑

一心一意做技术!

BlogJava 首页 新随笔 联系 聚合 管理
  31 Posts :: 0 Stories :: 447 Comments :: 0 Trackbacks
  (本故事除了部分点明道姓并具有故事详细发生的具体时间点地等部分情节以外,其它内容纯属虚构,若有雷同,纯属巧合。)
 
  看本文的朋友请先看上一篇文章:玩玩Spring之struts+hibernate+spring添删改查示例,否则会看不懂滴(的)。
  该示例程序的运行效果先睹为快:
  http://www.easyjf.com/html/bbs/20060510/1512699849613700.htm?ejid=1141219960424115
 
  新同学:听说Struts有很多致命的技术缺陷啊,是吗?
  大牛:恩,专家都说了。
  新同学:听说J2EE程序员很讲究艺术及高雅,能举个例子吗?
  大牛:对啊,MVC中webwork就是高雅啊,用他写起程序来真是赏心悦目,华丽得真是没法容易。
 
  主演:webwork
  配角:struts、jsp、hibernate、spring等
  
  借着吹spring的风,今天笔者给大家介绍一种很多人都非常欣赏的轻量极、高雅的J2EE组合,那就是hibernate+ webwork+ spring。说介绍不准确,应该还只是一个简单的演示,毕竟webwork的赞歌已经有很多人唱过了,这里就不重复(主要还是因为唱不出来,惭愧!)。我只希望能通过简单的代码,让大家去体会webwork的高雅、过人之处。
 
  同样是上一篇中有关一个用户表“添删改查”的例子,这里只是把Web层改成使用webwork实现,下面我们直接介绍Web开发部分,其它部分的开发请照搬前面一篇的例子,新人可以结合上个例子中的Struts部分进行看。

1、写Action

  webwork跟Struts乃至其它的MVC框架一样,都有一个处理Web请求的Action,我们来看看本例子中这个Action的内容。下面是UserManageAction.java的全部代码:
 

package com.easyjf.webwork.action;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import com.easyjf.example.business.IUser;
import com.easyjf.example.business.IUserService;
import com.easyjf.util.CommUtil;
import com.easyjf.web.tools.IPageList;
import com.easyjf.web.tools.ListQuery;
import com.easyjf.web.tools.PageList;
import com.opensymphony.webwork.interceptor.ParameterAware;
import com.opensymphony.xwork.ActionSupport;
import com.opensymphony.xwork.Preparable;
public class UserManageAction extends ActionSupport implements ParameterAware,Preparable {
private List allUser;
private IUserService userService; 
private IUser user;
private Map parameters;
//用户查询
public String query() throws Exception { 
 String[] temp=(String[])parameters.get("page");
 int currentPage=CommUtil.null2Int(temp!=null?temp[0]:"0");
 temp=(String[])parameters.get("pageSize");
 int pageSize=CommUtil.null2Int(temp!=null?temp[0]:"0");
 if(currentPage<1)currentPage=1;
 if(pageSize<1)pageSize=10;
 String scope="1=1";
 Collection paras=new ArrayList();
 temp=(String[])parameters.get("orderType");
 String orderType=CommUtil.null2String(temp!=null?temp[0]:""); 
 temp=(String[])parameters.get("orderField");
 String orderField=CommUtil.null2String(temp!=null?temp[0]:"");
 temp=(String[])parameters.get("queryUserName");
 String userName=CommUtil.null2String(temp!=null?temp[0]:"");
 temp=(String[])parameters.get("queryTel");
 String tel=CommUtil.null2String(temp!=null?temp[0]:"");    
 if(!userName.equals(""))
 {
  scope+=" and userName like ?";
  paras.add("%"+userName+"%");
 }
 if(!tel.equals(""))
 {
  scope+=" and tel like ?";
  paras.add("%"+tel+"%");
 }  
 if(orderField.equals(""))//默认按用户名排序
 {
 orderField="userName";
 orderType="desc";    
 } 
 if(!orderField.equals(""))
 {
 scope +=" order by "+orderField;
 if(!orderType.equals(""))scope+=" "+orderType;
 }
 IPageList pList=new PageList(new ListQuery(userService.query(scope,paras)));
 pList.doList(pageSize,currentPage,"","");
 if(pList!=null){
  this.parameters.put("list",pList.getResult());
  this.parameters.put("pages",new Integer(pList.getPages()));
  this.parameters.put("rows",new Integer(pList.getRowCount()));
  this.parameters.put("page",new Integer(pList.getCurrentPage()));  
  this.parameters.put("gotoPageHTML",CommUtil.showPageHtml(pList.getCurrentPage(),pList.getPages()));
  }
 this.parameters.put("orderType",orderType);
 this.parameters.put("orderField",orderField);
    this.allUser = userService.query(scope,paras);
    return execute();
}
//添加或修改用户
public String  edit() throws Exception

 return execute();
}
//删除用户
public String  del() throws Exception

    if(user!=null && userService.del(this.user))
    {
     this.parameters.put("msg","数据删除成功!");      
    }
    else
    {
     this.parameters.put("msg","数据修改失败"); 
    }
 return query();
}
//保存用户信息
public String  save() throws Exception
{
 IUser  obj=this.getUser();
 boolean ret=false;
 if(obj!=null){
 if((obj.getCid()!=null)&&(!obj.getCid().equals("")))ret=userService.update(user);
 else ret=userService.save(user);
 }
    if(ret)
    {
     this.parameters.put("msg","数据操作成功!");      
    }
    else
    {
     this.parameters.put("msg","数据操作失败"); 
    }
 return query();
}
public IUserService getUserService() {
 return userService;
}
public List getAllUser() {
 return allUser;
}
public IUser getUser() {
 return user;
}
public void setUser(IUser user) {
 this.user = user;
}
public void setUserService(IUserService userService)
{
 this.userService=userService;
}
public void setParameters(Map parameters) {
 this.parameters=parameters;
}
public Map getParameters() {
 return parameters;
}
public void prepare() throws Exception {
 this.form2Obj();
}
//根据页面参数创建IUser对象
private void form2Obj() {
 String[] temp=(String[])parameters.get("cid");
 String cid=temp!=null?temp[0]:"";
 IUser user=null;
 if(cid!=null && (!cid.equals("")))user=userService.read(cid);
 if(user==null)user=userService.newUser();
 setUser(user);

}
 
 
2、写页面文件
  xwork支持多种页面模板,可以是JSP,也可以是Freemarker等,这里我们使用的是大家比较熟悉的JSP作模板。页面同样分为userEdit.jsp以及userList.jsp两个,模板中使用了一些wework的标签,(还好没有全部搞成标签,呵呵!),大家注意观察以<ww: 开头的标签写法就OK了,可以对照Struts的标签看一下。这两个页面从我们这个示例的完整源代码中可以得到,完整示例源码下载地址:
 
 
3、配置xwork.xml
 

  可以理解成struts中的struts-config.xml文件,当然等你真正熟悉他以后,发现他的配置文件中的玩艺及技术含量都要比Struts牛的多。下面是xwork.xml文件的全部内容:

  <!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.1.1//EN" "http://www.opensymphony.com/xwork/xwork-1.1.1.dtd">
<xwork>  
 <include file="webwork-default.xml"/>  
     <package name="userManage"  extends="webwork-default" namespace="/userManage">       
        <action name="query" class="com.easyjf.webwork.action.UserManageAction" method="query">
            <result>/userList.jsp</result>
            <interceptor-ref name="params" />
            <interceptor-ref name="basicStack"/>
        </action>
        <action name="edit" class="com.easyjf.webwork.action.UserManageAction" method="edit">
            <result>/userEdit.jsp</result> 
    <interceptor-ref name="params" />      
            <interceptor-ref name="basicStack"/>
        </action>
        <action name="save" class="com.easyjf.webwork.action.UserManageAction" method="save">
            <result name="input">/userEdit.jsp</result>
             <result>/userList.jsp</result>
        </action>
        <action name="del" class="com.easyjf.webwork.action.UserManageAction" method="del">           
             <result>/userList.jsp</result>
        </action>
    </package>
</xwork>
 
 
4、修改web.xml文件
  以Struts类似,同样需要修改web.xml文件,才能让webwork处理指定的请求。下面是本例中的web.xml文件的全部内容:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <filter>
        <filter-name>webwork</filter-name>
        <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>webwork</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>

  通过上面的配置,使得所有的请求都会交给webwork处理。
 
  好,现在一个完整的webwork示例程序就完了。不知webwork新朋友注意到没,webwork中没有了ActionForm Bean,配置文件也相对比较清晰明了,Action中的方法不再有类似public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)这样一大串让人看起来就不爽的参数,其干净得一个参数也没有。大家可以闭上眼睛摸着脑门再体会一下Webwork的Action的写法,是不是要简洁、华丽、优雅得多。
 
  当然,那么多技术牛人在支持webwork,并不是单看中这个Action的简洁,webwork本身还有很多东西,还包括AJAX支持,报表集成,强大的验证系统以及IOC等,其中有很多是Spring也有的东西,仅从技术的角度来看,笔者也认为他确实能称上是数一数二的。
 
  当然,本人不是webwork的粉丝,因此其它MVC框架的粉丝这里不要PK我,Struts的朋友就更不应该了,因为webwork开发团队与struts团队已经合并了,合并后的作品Apache Struts Action 2.0也即将出来了。Tapestry 、JSF的粉丝看到这里也别纳闷,有竞争才有技术进步嘛。
  
  好,今天就先玩到这里。由于笔者对webwork只是粗浅的看了一下,因此也许还不能完全通过这个示例表述出webwork的原意。还请webwork的超级粉丝或专家来帮忙补充一下,若发现不足的地方,请不吝批评指教。

  本示例的全部源码下载地址:
 

  本示例的运行效果图:
  
  (备注:由于笔者不想拐弯抹角浪费大家玩的时间,有些“表白”难免过于直接,还请不喜欢Spring或者过分喜欢Spring的同行多多见谅! 本文中的“我们”,仅指与笔者有着同样成长经历的80后人,对于文章提到的观点,多数皆属于笔者个人观点,不代表任何人。
  本文作者:EasyJF开源团队   大峡 版权归EasyJF开源团队所有,欢迎转载,转载请保留作者版权声明,谢谢!)
 

关于玩玩Spring系列,玩的过程及结果将会不定期在以下三个网站全球同步公布:
1.EasyJF开源团队官方网站,网址:http://www.easyjf.com
2.笔者的Blog,网址:http://www.blogjava.net/daxia/
3.Java研究组织(JR) ,网址:http://www.javaresearch.org
欢迎更多跟我一样爱玩的哥哥姐姐弟弟妹妹一起来玩。
 
posted on 2006-05-10 18:13 大峡 阅读(2264) 评论(12)  编辑  收藏

Feedback

# re: 玩玩Spring之hibernate+ webwork+ spring添删改查示例 2006-05-10 18:20 大峡
框架只是工具,用熟悉了就OK。不知道大家都用什么什么框架呢?  回复  更多评论
  

# re: 玩玩Spring之hibernate+ webwork+ spring添删改查示例 2006-05-10 19:06 Jonney
框架往往把简单的事情往复杂里整,真是受不了.
还是最原始的MVC最好,一个JSP页面处理逻辑,一个JSP页面负责表示,若干个JavaBean做Model。
就算所有的开发人员都跳槽了,新来的开发人员也能够维护。
SpringMVC就很简单,仅仅负责了MVC的关系,我很喜欢。  回复  更多评论
  

# re: 玩玩Spring之hibernate+ webwork+ spring添删改查示例 2006-05-10 20:25 原创专栏 开源学习
@Jonney
很不同意.SpringMVC简单吗?比struts,webwork上手快吗?

webwork核心是xwork的拦截器.
楼主代码有坏味道  回复  更多评论
  

# re: 玩玩Spring之hibernate+ webwork+ spring添删改查示例 2006-05-10 20:36 大峡
@原创专栏 开源学习
楼主代码有坏味道

  主要是前面的组合、模糊查询及分页部分,由于偶webwork用得不多,没有找到比较简单的方法,熟悉Webwork的朋友不妨改一下query中部分不爽的代码,丢上来大家一起学习学习!
  当然其它MVC框架的粉丝不妨也来给webwork找点骨头。嘿嘿,偶喜欢看热闹滴说!  回复  更多评论
  

# re: 玩玩Spring之hibernate+ webwork+ spring添删改查示例 2006-05-11 11:00 spacecoeboy
为什么源代码里找不到这几个类
import com.easyjf.util.CommUtil;
import com.easyjf.web.tools.IPageList;
import com.easyjf.web.tools.ListQuery;
import com.easyjf.web.tools.PageList;  回复  更多评论
  

# re: 玩玩Spring之hibernate+ webwork+ spring添删改查示例 2006-05-11 15:03 大峡
@spacecoeboy

这是开源EasyJWeb Tools中的业务引擎,EasyJWeb项目中有源代码!

关于该示例中分页的使用,请看这篇:http://www.blogjava.net/easyjf/archive/2006/04/10/40169.html   回复  更多评论
  

# re: 玩玩Spring之hibernate+ webwork+ spring添删改查示例 2006-05-11 15:47 mingo
楼主的代码优雅吗?

好凌乱~~~  回复  更多评论
  

# re: 玩玩Spring之hibernate+ webwork+ spring添删改查示例 2006-05-11 16:34 大峡
呵呵,水平有限,只能达到这样了。实现同样的功能,欢迎朋友们来点真正优雅的,丢上来大家一起学习学习!
  回复  更多评论
  

# re: 玩玩Spring之hibernate+ webwork+ spring添删改查示例 2006-05-11 20:03 mingo
(!userName.equals(""))

这种常量跟变量比较相等的写法 还是改改的好 好的习惯是常量一般放前面  回复  更多评论
  

# re: 玩玩Spring之hibernate+ webwork+ spring添删改查示例 2006-05-11 20:12 mingo
这么多翻页信息最起码可以抽取一个翻页类。

而且增删改和查询最好是分来的两个action比较好 一个action塞的执行方法太多会让人看晕的。  回复  更多评论
  

# re: 玩玩Spring之hibernate+ webwork+ spring添删改查示例 2006-05-11 20:37 大峡
@mingo
谢谢 mingo兄的建议,EasyJWeb实际是对这些逻辑进行了封装的。也有相应业务功能的Action基类等AbstractCrudAction,有时间请在帮忙看看EasyJWeb Tools中的写法,也请更多高手来一起研究,谢谢。

如,EasyJWeb Tools中的类似实现组合模糊查询及分页的query方法代码:

public class MessageAction extends AbstractCrudAction {

public IPageList doQuery(WebForm form, int currentPage, int pageSize) {
String belongUser=CommUtil.null2String(form.get("belongUser"));
String scope="1=1";
Collection paras=new ArrayList();
if(!"".equals(belongUser))
{
scope+=" and belongUser=?";
paras.add(belongUser);
}
String orderType=CommUtil.null2String(form.get("orderType"));
String orderField=CommUtil.null2String(form.get("orderField"));
if("".equals(orderField))
{
orderField="inputTime";
orderType="desc";
}
scope +=" order by "+orderField;
if(!orderType.equals(""))scope+=" "+orderType;
DbPageList pList=new DbPageList(Message.class,scope,paras);
pList.doList(currentPage,pageSize);
return pList;
}
}  回复  更多评论
  

# louis vuitton handbags 2011-06-10 16:41 louis vuitton handbags
amazing  回复  更多评论
  


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


网站导航: