📄 第二章 webwork标签库.txt
字号:
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的规则
上节课讲了一个登陆的例子,从几大方面进行了提高
1. Action: 继承类型、execute()返回值、值封装的方式
2. ognl
3. valueStack
4. 视图类型:并讲了freemarker、velocity
5. 拦截器
今天再加上验证、标签库的功能,怎么讲呢,通过写一个增删改查的例子来讲,它有如下用例:
1. 登陆
2. 新增
3. 修改
4. 删除
一、登陆
1. 导入jar包,将常用的jar拷贝到lib目录下
2. 注册webwork组件,修改web.xml,加上webwork的过滤器
<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. 写登陆页面 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="确认密码"/><ww:password name="pwd2"/></td></tr>
<tr><td align="center"><ww:submit value="提交" /><ww:reset value="重置" /></td></tr>
</table>
</ww:form>
</body>
4. 写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 = "用户名或密码错误";
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下写配置文件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下写配置文件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. 验证
1) 因为是simple模板,所以缺省不支持客户端验证,若要支持,必在jsp中强加上<ww:fielderror/>标签,在<ww:form>外面、<body>里面
<ww:fielderror/>
2) 在LoginAction所在的目录下加上LoginAction-validation.xml文件,此文件引自xwork.jar中,com.opensymphony.xwork.validator.validators.default.xml的规则
<!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> <!-- 大小写要分 -->
<param name="minLength">6</param>
<param name="trim">true</param>
<message>密码长度不能小于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
要实现字段验证,必须继承这个ActionSupport,出错后,会自动返回到提交页面
4) 修改xwork.xml,在<action>内加上拦截器
<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>序号</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,验证成功后,得到所有用户的信息
private UserDelegate ud = new UserDelegate();
public List<User> getData() {
return ud.getAll();
}
再修改execute()方法的用户验证,用这个代理。
10. 封装用户对象
package org.accp.webwork.vo;
public class User {
private String uid;
private String pwd;
private String uname;
private int age;
...
}
11. 写用户代理类
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. 写MainAction
在主界面上点击新增,调用MainAction的add()方法,ActionSupport继承后,可不用execute()方法,但可新增其它很多方法。再调用它的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页面
<%@ 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中写保存方法
private UserDelegate ud = new UserDelegate();
public User user ;
public User getUser() {
return user;
}
//新增保存、修改保存调用同一个
public String saveOrUpdate() throws Exception {
ud.saveOrUpdate(user);
return this.SUCCESS;
}
//再加与LoginAction一样的取所有数据的方法
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. 导入spring的jar包
2. 在web.xml中注册
<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. 写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;
}
七、注意事项
1. 无状态绑丁,而jsf不是
2. login.action会关联login.jsp与main.jsp,因为在配置文件中的<result>标签中可以看到。于是,这二个jsp中的数据都默认从login.action对应的类中去取和放。如果此时main.jsp在保存后又关联到了main.action,则此时的数据又会从main.action中取,如果没有相应的get方法不会报错,也不会从login.action中去取。譬如列表data.
3. action已退化到了actionForm与action二合一的地步,相当于jsf的管理Bean
4. 关于值堆栈的context map,它是一个放置值堆栈上下文数据的对象。通过符号“#“再加上对象的名称,可以访问这些数据(只可以访问)
5. 在Jsp页面中,默认“altSyntax”是开启的。它是用来解决标签库中的字符串和表达式语言混淆的问题。所以,作为变量的表达式语言应该放在%{}中,否则WebWork会把它当作字符串处理。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -