⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 第二章 webwork标签库.txt

📁 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 + -