(本故事除了部分點明道姓并具有故事詳細發生的具體時間點地等部分情節以外,其它內容純屬虛構,若有雷同,純屬巧合。)
?
該示例程序的運行效果先睹為快:
?
新同學:聽說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開源團隊所有,歡迎轉載,轉載請保留作者版權聲明,謝謝!)
?
posted on 2006-08-07 14:34
SIMONE 閱讀(328)
評論(0) 編輯 收藏 所屬分類:
JSP