首页 > 代码库 > 浅谈Struts2(三)

浅谈Struts2(三)

一、Struts2收集client的参数

  核心思路:

<form method="post" action="XXXX">    <input type="text" name="username"/>    <input type="text" name="password"/>
  <input type="text" name="user.age"/>
  <input type="checkbox" name="hobby"/>
<input type="submit" value="ok"/></form>

   html/jsp通过form表单提交数据。

//代码仅为示例public class FirstServlet implements Action{    
  private User user;
private String username; private String password;
  private String[] hobby;
public void setUsername(String username){ this.username = username; } public String getUsername(){ return this.username; } ...}

   在Action中声明成员变量同时声明get、set方法,成员变量的名字跟html/jsp要传递的数据名保持一致。

 

  在这种情况下,struts2会自动将client传递的数据写入到所跳转Action中对应的成员变量中,既可以自动写简单数据,也可以写入复杂数据(对象、数组、集合)。

  好处:

    a、简单,方便。

    b、自动把提交的数据进行类型转换。

    c、自动对post中提交的中文进行转码处理(只针对UTF-8格式)。

二、Struts2的动态方法调用

  1、Action的第二种开发形式

    之前是通过implements Action接口来开发我们自己的Action的,其实更好的方法是extends ActionSupport类来开发我们的Action。

    ActionSupport类实现了Action接口,并且提供了execute()方法的空实现,并返回了"success"。

    用这种方法的好处是为了动态方法的调用。

  2、DMI(Dynamic Method Invoke)动态方法调用

    作用:可以在一个Action中提供多个方法,减少系统中Action的数量,便于管理与维护。

    java代码:

public class UserAction extends ActionSupport{        public String addUser(){        System.out.println("----this is addUser method----");        return "addUser";    }    public String delUser(){        System.out.println("----this is delUser method----");        return "delUser";    }        public String modifyUser(){        System.out.println("----this is modifyUser method----");        return "modifyUser";    }}

    struts.xml配置:

<action name="user_*" class="com.liquidxu.struts2.UserAction" method="{1}">    <result name="addUser">/result.jsp</result>    <result name="delUser">/result.jsp</result>    <result name="modifyUser">/result.jsp</result></action>

    访问http://localhost:8080/struts_app/user_addUser其中的addUser为所访问的Action中的方法名(必须保持一致),并且填充了配置文件中的{1}和*。

二、Struts2的数据处理机制

  1、OGNL表达式

    OGNL表达式是一种获取数据的技术。是一个独立的技术组件,不属于struts2框架,只是被struts2借用。

  2、ValueStack(值栈)

    作用:管理(储存)一次请求中,所涉及的数据(client提交的数据+作用域中的数据request、session、application)。

    好处:与视图层解耦和。

    a、ValueStack的获取方式

      ActionContext ctx = ActionContext.getContext();

      ps、ValueStack的生命周期为一个请求有效(等同于request作用域),换请求,值栈也会随之改变。

    b、ValueStack的内存结构

      技术分享

    ValueStack分为两个区域,root区和contextMap区。root区主要存当前访问的Action和标签处理的临时结果,contextMap区默认存有四部分内容,分别存有request、session、application作用域和parameters(client请求数据)。可以通过上图右侧的代码示例来从contextMap区中取值。

  3、值栈的灵活应用

    a、使用Action的成员变量替换request作用域(间接用值栈的root区)。

      因为值栈root区储存有当前访问的Action,所以如果需要用request作用域储存的数据,直接储存在当前Action的成员变量,然后在view层利用OGNL表达式从root区取出即可。

    b、值栈操作的封装

      值栈的操作时颇为麻烦的,每次都需要做许多重复的操作,所以应该做如下封装:

public class BaseAction extends ActionSupport{        private ValueStack vs;        public BaseAction(){        ActionContext ctx = ActionContext.getContext();        vs = ctx.getValueStack();    }    public void setSessionAttribute(String name,Object value){        vs.setValue("#session."+name,value);    }    public Object getSessionAttribute(String name){        return vs.findValue("#session."+name);    }    public void setApplicationAttribute(Stirng name,Object value){        vs.setValue("#application."+name,value);    }    public Object getApplicationAttribute(String name){        return vs.findValue("#application."+name);    }}

 

      再编写我们自己的Action的时候,就不再extends ActionSupport了,而是继承我们所封装的BaseAction。这样的话,在Action中进行值栈操作的时候就会方便很多。

  4、Struts2的标签

    <%@taglib uri="/struts-tags" prefix="s">

    作用:在jsp页面中,负责显示数据。使用标签替换java脚本。

    a、单个数据显示

      <s:property value="http://www.mamicode.com/OGNL表达式"/>

    b、有条件显示数据

      <s:if test="OGNL表达式">

        XXX

      </s:if>

      <s:elseif test="OGNL表达式">

        XXX

      </s:elseif>

    c、显示多个数据

      (1)遍历集合、数组

        <s:iterator value="http://www.mamicode.com/OGNL表达式">

          <s:property />

        </s:iterator>

      (2)遍历map

        <s:iterator value="http://www.mamicode.com/OGNL表达式">

          <s:property value="http://www.mamicode.com/key"/><s:property http://www.mamicode.com/value="value">

        </s:iterator>

      (3)遍历状态

        <s:iterator value="http://www.mamicode.com/OGNL表达式" status="sta">

          #sta.count  //当前遍历次数

          #sta.index  //获得当前遍历下标

          #sta.even  //当前是否为偶次遍历

          #sta.odd  //当前是否为奇次遍历

        </s:iterator>

        <s:iterator value="http://www.mamicode.com/OGNL表达式" begin="起始遍历下标" end="结束遍历下标" step="步长">

        <s/iterator>       

浅谈Struts2(三)