這篇文章是給具備一些基本的j2ee開發(fā)的兄弟們看的
1 Webwork 2 作為MVC
要讓服務(wù)器支持webwork,首先需要對web服務(wù)器的web.xml進(jìn)行配置,這里用/*,表示所有請求都作為webwork的action,也可以使用*.action, 這樣只有后綴名為action的才執(zhí)行。
web.xml
<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>
配置好上面以后,webwork就可以運行了,我們添加兩個action試試
xwork.xml
<action name="employee" class="net.reumann.demo.webwork.employee.EmployeeAction">
<result name="list">/WEB-INF/jsp/employee/employeeList.jspx</result>
<result name="input">/WEB-INF/jsp/employee/employeeForm.jspx</result>
<result name="success" type="redirect">employee.action</result>
</action>
這里添加了一個action叫做employee,也就是說,所有請求http://site/employee 訪問,都被看成觸發(fā)一個action.其具體內(nèi)容如下:
這是一個最簡單的action,它起到了控制器的作用,實現(xiàn)了CRUD的基本功能,代碼非常簡介。幾乎和PHP,ROR差不多
EmployeeAction.java
public class EmployeeAction extends ActionSupport implements Preparable {
public String execute() throws Exception { //如果URL沒有指定Action,默認(rèn)調(diào)用它
return list(); //轉(zhuǎn)到list
}
public String list() {
return "list";
}
public String add() {
employee = new Employee();
return Action.INPUT;
}
public String edit() {
employee = employeeDao.getEmployee(id);
return Action.INPUT;
}
public String save() {
if (nullOrZero(employee.getEmployeeId())) {
employeeDao.insert(employee);
} else {
employeeDao.update(employee);
}
return Action.SUCCESS;
}
public String delete() {
employeeDao.delete(id);
return Action.SUCCESS;
}
public void prepare() {
departmentList = departmentDao.getAllDepartments(); //用于selectbox中下拉菜單
employeeList = employeeDao.getAllEmployees();
}
}
webwork是基于MVC2的,因此上面的控制器對應(yīng)下面兩個模板文件。當(dāng)然實際應(yīng)用中不一定所有的界面都要采用MVC.
employeeList.jspx
<a href="employee!add.action">Add New Employee</a>
employeeForm.jspx
<w:if test="employee==null || employee.employeeId == null">
<ww:set name="title" value="%{‘Add new employee‘}"/>
</w:if>
<w:else>
<ww:set name="title" value="%{‘Update employee‘}"/>
</w:else>
<w:form action="employee!save.action" method="post">
<w:textfield name="employee.firstName"
value="%{employee.firstName}" label="%{getText(‘label.firstName‘)}" size="40"/>
<w:textfield name="employee.lastName"
value="%{employee.lastName}" label="%{getText(‘label.lastName‘)}" size="40"/>
<w:textfield name="employee.age"
value="%{employee.age}" label="%{getText(‘label.age‘)}" size="20"/>
<w:select name="employee.department.departmentId"
value="%{employee.department.departmentId}"
list="departments" listKey="departmentId" listValue="name"/>
<w:hidden name="employee.employeeId"
value="%{employee.employeeId}"/>
<w:submit name="action" value="%{getText(‘button.label.submit‘)}" cssClass="butStnd"/>
<w:submit name="action" value="%{getText(‘button.label.cancel‘)}" cssClass="butStnd"/>
</w:form>
我們看到,這個表單非常簡單,由于其名字的規(guī)范定義。webwork的action響應(yīng)時,會自己裝載其中的變量,和struts的formbean差不多。
EmployeeAction-validation.xml
<validators>
<field name="employee.firstName">
<field-validator type="requiredstring">
<message key="errors.required.firstname"/>
</field-validator>
</field>
<field name="employee.lastName">
<field-validator type="requiredstring">
<message key="errors.required.lastname"/>
</field-validator>
</field>
<field name="employee.age">
<field-validator type="required" short-circuit="true">
<message key="errors.required.age"/>
</field-validator>
<field-validator type="int">
<param name="min">18</param>
<param name="max">65</param>
<message key="errors.required.age.limit"/>
</field-validator>
</field>
</validators>
可以通過獨立的文件來定義字段驗證
EmployeeAction.properties
errors.required.age.limit=Please provide an age between ${min} and ${max}.
2 簡化訪問數(shù)據(jù)庫
3 部分使用Spring連接系統(tǒng)原有資源,例如EJB
要使webwork支持spring,只要簡單的下面的配置即可
web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/net/reumann/demo/spring.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
修改webwork的配置文件objectFactory=spring
webwork.properties
webwork.devMode=false
webwork.objectFactory=spring
然后定義好需要IoC的組件
spring.xml
<beans>
<!-- DAO Configuration -->
<bean id="employeeDao" class="net.reumann.demo.persistence.EmployeeNoDBdao" />
<bean id="departmentDao" class="net.reumann.demo.persistence.DepartmentNoDBdao"/>
<bean id="employeeAction" class="net.reumann.demo.webwork.employee.EmployeeAction">
<constructor-arg ref="employeeDao" />
<constructor-arg ref="departmentDao" />
</bean>
</beans>
你就可以在action中自由的IoC了
action
public EmployeeAction(EmployeeDao employeeDao,
DepartmentDao departmentDao) {
this.employeeDao = employeeDao;
this.departmentDao = departmentDao;
}
頁面結(jié)構(gòu)設(shè)計
1 jsp include (部分使用taglib)
<webwork:component template=”calendar.vm” label=”Birthdate”
name=”birthday”>
<webwork:param name=”showWeekends” value=”true”/>
</webwork:component>
2 sitemesh
3 使用OA皮膚框架
4 ajax + dojo
業(yè)務(wù)層的設(shè)計
1 action中直接調(diào)用JDBC SQL/Proc, 即action + jdbc
2 action + service/session bean + dao + jdbc/ibatis/hibernate/entity bean (兩個接口,兩個實現(xiàn))
public class DepartmentDaoService implements DepartmentService {
DepartmentDao dao = new DepartmentDaoIbatisImpl();
}
3 沒有service層,只有action + dao + jdbc/ibatis/hibernate/entity bean ,(如上面的EmployeeAction)
其它一些Struts的比較
Struts不是一個框架,而是一組項目
兩個框架:
Action: Action model
Shale: Component model
Action 和 Shale 會盡可能多的共享代碼
各種子項目,例如Tiles
Struts 2將是Webwork 2.2和一些Struts的特性的結(jié)合
Class (re)Loading
1 Java 也可以像腳本語言那樣支持 edit-refresh 風(fēng)格的開發(fā)
2 Janino, Eclipse compiler 以及一些其他的編譯器都使用 Commons-JCI is used
3 所有的庫和框架都必須擺脫editcompile-package-deploy-wait-refresh的思想
Webwork 允許動態(tài)重新裝載xml配置文件 (例如, 自動重新裝載 actions.xml).
webwork.properties: webwork.configuration.xml.reload=true
EclipseWork 是Eclipse的WebWork插件
http://eclipsework.sourceforge.net/