?? 第二章 webwork標(biāo)簽庫(kù).txt
字號(hào):
WebWork.Jar包 com.opensymphony.webwork.default.properties文件。
webwork.jar webwork-default.xml。
xwork.jar xwork-default.xml。
xwork.jar com.opensymphony.xwork.validator.validators.default.xml的規(guī)則
上節(jié)課講了一個(gè)登陸的例子,從幾大方面進(jìn)行了提高
1. Action: 繼承類型、execute()返回值、值封裝的方式
2. ognl
3. valueStack
4. 視圖類型:并講了freemarker、velocity
5. 攔截器
今天再加上驗(yàn)證、標(biāo)簽庫(kù)的功能,怎么講呢,通過(guò)寫(xiě)一個(gè)增刪改查的例子來(lái)講,它有如下用例:
1. 登陸
2. 新增
3. 修改
4. 刪除
一、登陸
1. 導(dǎo)入jar包,將常用的jar拷貝到lib目錄下
2. 注冊(cè)webwork組件,修改web.xml,加上webwork的過(guò)濾器
<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>*.action</url-pattern>
</filter-mapping>
3. 寫(xiě)登陸頁(yè)面 login.jsp
<%@ page contentType="text/html;charset=GBK" %>
<%@ taglib uri="/webwork" prefix="ww" %>
<body align="center">
<ww:if test="message!=null">
<font color="red"><ww:property value="message"/></font><HR>
</ww:if>
<ww:form name="form1" action="login.action" method="post">
<table align="center">
<tr><td><ww:label value="用戶名:"/><ww:textfield name="uid" /></td></tr>
<tr><td><ww:label value="密 碼:"/><ww:password name="pwd" /></td></tr>
<tr><td><ww:label value="確認(rèn)密碼"/><ww:password name="pwd2"/></td></tr>
<tr><td align="center"><ww:submit value="提交" /><ww:reset value="重置" /></td></tr>
</table>
</ww:form>
</body>
4. 寫(xiě)LoginAction
package org.accp.webwork.action;
import com.opensymphony.xwork.Action;
public class LoginAction implements Action{
private String uid;
private String pwd;
private String pwd2;
private String message;
public String execute() throws Exception {
if(uid.equals(pwd))
return this.SUCCESS;
message = "用戶名或密碼錯(cuò)誤";
return this.INPUT;
}
public String getPwd() {return pwd;}
public void setPwd(String pwd) {this.pwd = pwd;}
public String getPwd2() {return pwd2;}
public void setPwd2(String pwd2) {this.pwd2 = pwd2;}
public String getUid() {return uid;}
public void setUid(String uid) {this.uid = uid;}
public String getMessage() {return message;}
public void setMessage(String message) {this.message = message;}
}
5. 在src下寫(xiě)配置文件webwork.properties
webwork.ui.theme=simple
webwork.i18n.encoding=gbk
webwork.locale=zh_CN
webwork.devMode = true
webwork.i18n.reload=true
webwork.configuration.xml.reload=true
6. 在src下寫(xiě)配置文件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"></include>
<package name="aaa" extends="webwork-default">
<default-interceptor-ref name="basicStack"></default-interceptor-ref>
<action name="login" class="org.accp.webwork.action.LoginAction">
<result name="success">/main.jsp</result>
<result name="input">/login.jsp</result>
</action>
</package>
</xwork>
7. 驗(yàn)證
1) 因?yàn)槭莝imple模板,所以缺省不支持客戶端驗(yàn)證,若要支持,必在jsp中強(qiáng)加上<ww:fielderror/>標(biāo)簽,在<ww:form>外面、<body>里面
<ww:fielderror/>
2) 在LoginAction所在的目錄下加上LoginAction-validation.xml文件,此文件引自xwork.jar中,com.opensymphony.xwork.validator.validators.default.xml的規(guī)則
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
<validators>
<field name="uid">
<field-validator type="requiredstring">
<message>用戶ID不能為空</message>
</field-validator>
</field>
<field name="pwd">
<field-validator type="stringlength">
<param name="maxLength">10</param> <!-- 大小寫(xiě)要分 -->
<param name="minLength">6</param>
<param name="trim">true</param>
<message>密碼長(zhǎng)度不能小于6位和大于10位</message>
</field-validator>
<field-validator type="fieldexpression">
<param name="expression">pwd==pwd2</param>
<message>二次密碼輸入不一致</message>
</field-validator>
</field>
</validators>
3) 修改LoginAction,改繼承com.opensymphony.xwork.ActionSupport
要實(shí)現(xiàn)字段驗(yàn)證,必須繼承這個(gè)ActionSupport,出錯(cuò)后,會(huì)自動(dòng)返回到提交頁(yè)面
4) 修改xwork.xml,在<action>內(nèi)加上攔截器
<interceptor-ref name="validationWorkflowStack" />
8. 登陸成功后返回到主截面main.jsp
<%@ page contentType="text/html;charset=GBK" %>
<%@ taglib uri="/webwork" prefix="ww" %>
<body>
<ww:form name="form1" action="main.action" method="post">
<table align="center">
<tr><td>
<input type="button" value="查看" onClick="sub('view.action')"/>
<input type="button" value="新增" onClick="sub('add.action')"/>
<input type="button" value="修改" onClick="sub('upd.action')"/>
<input type="button" value="刪除" onClick="sub('del.action')"/>
</td></tr>
</table>
<HR>
<table align="center" border="1" width="90%">
<tr><th>選擇</th><th>序號(hào)</th><th>用戶ID</th><th>用戶名</th><th>年齡</th></tr>
<ww:iterator value="data" status="index">
<tr>
<td><ww:checkbox name="chk" fieldValue="%{uid}"/></td>
<td><ww:property value="#index.count" /></td>
<td><ww:property value="uid" /></td>
<td><ww:property value="uname" /></td>
<td><ww:property value="age" /></td>
</tr>
</ww:iterator>
</table>
</ww:form>
</body>
<script>
function sub(opp) {
form1.action=opp;
form1.target="_self";
form1.submit();
}
</script>
9. 修改LoginAction,驗(yàn)證成功后,得到所有用戶的信息
private UserDelegate ud = new UserDelegate();
public List<User> getData() {
return ud.getAll();
}
再修改execute()方法的用戶驗(yàn)證,用這個(gè)代理。
10. 封裝用戶對(duì)象
package org.accp.webwork.vo;
public class User {
private String uid;
private String pwd;
private String uname;
private int age;
...
}
11. 寫(xiě)用戶代理類
package org.accp.well.delegate;
public class UserDelegate {
public boolean validate(String uid,String pwd) {
return uid.equals(pwd);
}
private static List<User> data = new ArrayList<User>();
static{
User u = new User();
u.setUid("zs");u.setUname("張三");u.setPwd("123");u.setAge(18);
data.add(u);
u = new User();
u.setUid("ls");u.setUname("李四");u.setPwd("123");u.setAge(18);
data.add(u);
u = new User();
u.setUid("ww");u.setUname("王五");u.setPwd("123");u.setAge(18);
data.add(u);
u = new User();
u.setUid("zl");u.setUname("趙六");u.setPwd("123");u.setAge(18);
data.add(u);
u = new User();
u.setUid("zz");u.setUname("哎呀");u.setPwd("123");u.setAge(18);
data.add(u);
}
public List<User> getAll() {
return data;
}
}
二、新增
1. 寫(xiě)MainAction
在主界面上點(diǎn)擊新增,調(diào)用MainAction的add()方法,ActionSupport繼承后,可不用execute()方法,但可新增其它很多方法。再調(diào)用它的execute()方法,缺省返回success,失敗返回到input。
public class MainAction extends ActionSupport{
//新增
public String add() throws Exception {
return execute();
}
}
2. 改xwork.xml
<action name="add" class="org.accp.webwork.action.MainAction" method="add">
<result>/user/add.jsp</result>
</action>
3. 在user目錄下新加add.jsp頁(yè)面
<%@ page contentType="text/html;charset=GBK" %>
<%@ taglib uri="/webwork" prefix="ww" %>
<body align="center">
<ww:form name="form1" action="saveOrUpdate.action" method="post" ><BR>
<ww:label value="用戶ID:" /><ww:textfield name="user.uid" /><BR>
<ww:label value="密 碼:" /><ww:password name="user.pwd" /><BR>
<ww:label value="用戶名:" /><ww:textfield name="user.uname" /><BR>
<ww:label value="年 齡:" /><ww:textfield name="user.age" /><BR>
<ww:submit value="提交" /><ww:reset value="重置"/><BR>
</ww:form>
</body>
4. 在MainAction中寫(xiě)保存方法
private UserDelegate ud = new UserDelegate();
public User user ;
public User getUser() {
return user;
}
//新增保存、修改保存調(diào)用同一個(gè)
public String saveOrUpdate() throws Exception {
ud.saveOrUpdate(user);
return this.SUCCESS;
}
//再加與LoginAction一樣的取所有數(shù)據(jù)的方法
public List<User> getData() {
return ud.getAll();
}
5. 修改UserDelegate
public void saveOrUpdate(User u) {
for(User user : data) {
if(user.getUid().equals(u.getUid())) {
data.remove(user);
break;
}
}
data.add(u);
}
6. 修改xwork.xml
<action name="saveOrUpdate" class="org.accp.webwork.action.MainAction" method="saveOrUpdate">
<result>/main.jsp</result>
</action>
三、查看
1. 修改MainAction
public void view() {
String chk1 = (chk!=null && chk.length>0) ? chk[0] : "";
user = ud.getUser(chk1);
}
2. 修改代理
private String[] chk;
public void setChk(String[] chk) {this.chk=chk;}
public String view() throws Exception {
String chk1 = (chk!=null && chk.length>0) ? chk[0] : "";
user = ud.getUser(chk1);
return execute();
}
3. 修改xwork.xml
<action name="view" class="org.accp.webwork.action.MainAction" method="view">
<result>/user/view.jsp</result>
</action>
4. 新增view.jsp
<%@ page contentType="text/html;charset=GBK" %>
<%@ taglib uri="/webwork" prefix="ww" %>
<body align="center">
<ww:form name="form1"><BR>
<ww:label value="用戶ID:" /><ww:textfield name="user.uid" /><BR>
<ww:label value="密 碼:" /><ww:password name="user.pwd" showPassword="true"/><BR>
<ww:label value="用戶名:" /><ww:textfield name="user.uname" /><BR>
<ww:label value="年 齡:" /><ww:textfield name="user.age" /><BR>
<a href=javascript:history.back()>返回</a><BR>
</ww:form>
</body>
四、修改
1. 修改MainAction
public String upd() throws Exception {
String chk1 = (chk!=null && chk.length>0) ? chk[0] : "";
user = ud.getUser(chk1);
return execute();
}
2. 修改xwork.xml
<action name="upd" class="org.accp.webwork.action.MainAction" method="upd">
<result>/user/add.jsp</result>
</action>
五、刪除
1. 修改MainAction
public String delete() throws Exception {
ud.delete(chk);
return execute();
}
2. 修改代理
public void del(String[] ss) {
if(ss==null || ss.length<=0) return;
for(String s : ss) {
for(Iterator<User> it = data.iterator(); it.hasNext();) {
if(it.next().getUid().equals(s)) {
it.remove();
break;
}
}
}
}
3. 修改xwork.xml
<action name="del" class="org.accp.webwork.action.MainAction" method="del">
<result>/main.jsp</result>
</action>
六、與spring集成
1. 導(dǎo)入spring的jar包
2. 在web.xml中注冊(cè)
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
2. 寫(xiě)applicationContext.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="main" class="org.accp.webwork.action.MainAction">
<property name="ud" ref="ud"/>
</bean>
<bean id="ud" class="org.accp.well.delegate.UserDelegate"/>
</beans>
3. 在webwork.properties中加上
webwork.objectFactory = spring
4. 修改UserDelegate
private UserDelegate ud ;
public void setUd(UserDelegate ud ) {
this.ud = ud;
}
七、注意事項(xiàng)
1. 無(wú)狀態(tài)綁丁,而jsf不是
2. login.action會(huì)關(guān)聯(lián)login.jsp與main.jsp,因?yàn)樵谂渲梦募械?lt;result>標(biāo)簽中可以看到。于是,這二個(gè)jsp中的數(shù)據(jù)都默認(rèn)從login.action對(duì)應(yīng)的類中去取和放。如果此時(shí)main.jsp在保存后又關(guān)聯(lián)到了main.action,則此時(shí)的數(shù)據(jù)又會(huì)從main.action中取,如果沒(méi)有相應(yīng)的get方法不會(huì)報(bào)錯(cuò),也不會(huì)從login.action中去取。譬如列表data.
3. action已退化到了actionForm與action二合一的地步,相當(dāng)于jsf的管理Bean
4. 關(guān)于值堆棧的context map,它是一個(gè)放置值堆棧上下文數(shù)據(jù)的對(duì)象。通過(guò)符號(hào)“#“再加上對(duì)象的名稱,可以訪問(wèn)這些數(shù)據(jù)(只可以訪問(wèn))
5. 在Jsp頁(yè)面中,默認(rèn)“altSyntax”是開(kāi)啟的。它是用來(lái)解決標(biāo)簽庫(kù)中的字符串和表達(dá)式語(yǔ)言混淆的問(wèn)題。所以,作為變量的表達(dá)式語(yǔ)言應(yīng)該放在%{}中,否則WebWork會(huì)把它當(dāng)作字符串處理。
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -