一、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="OGNL表达式"/>

    b、有条件显示数据

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

        XXX

      </s:if>

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

        XXX

      </s:elseif>

    c、显示多个数据

      (1)遍历集合、数组

        <s:iterator value="OGNL表达式">

          <s:property />

        </s:iterator>

      (2)遍历map

        <s:iterator value="OGNL表达式">

          <s:property value="key"/><s:property value="value">

        </s:iterator>

      (3)遍历状态

        <s:iterator value="OGNL表达式" status="sta">

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

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

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

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

        </s:iterator>

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

        <s/iterator>

    d、<s:date name="ONGL表达式" format="yyyy-MM-dd"/> 处理日期类型

    e、<s:url context="${pageContext.request.request.contextPah}(动态获取项目名称)"/>处理url链接

      (1)访问Action的处理

        <s:url  namespace="" action="" />

      (2)访问其他资源(css、jsp)

        <s:url value="资源的路径"/>

    f、<s:action />把多个Action的处理结果,进行汇总。

           

浅谈Struts2(三)的更多相关文章

  1. 浅谈struts2之chain

    转自:http://blog.csdn.net/randomnet/article/details/8656759 前一段时间,有关chain的机制着实困绕了许久.尽管网上有许多关于chain的解说, ...

  2. 浅谈C++三种传参方式

    浅谈C++三种传参方式 C++给函数传参中,主要有三种方式:分别是值传递.指针传递和引用传递. 下面通过讲解和实例来说明三种方式的区别. 值传递 我们都知道,在函数定义括号中的参数是形参,是给函数内专 ...

  3. 浅谈 Struts2 面试题收藏

    Struts2面试题 一.工作原理 一个请求在Struts2框架中的处理大概分为以下几个步骤 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 2 这个请求经过一系列的过滤器(Fi ...

  4. 浅谈Struts2拦截器的原理与实现

    拦截器与过滤器           拦截器是对调用的Action起作用,它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了 ...

  5. [SSH 2] 以网站主页面浅谈Struts2配置

    导读:前面总体的介绍了一下SSH框架,那么作为Struts这一支,具体是怎么配置的呢?本篇博客则主要是以自己做过的实例中的登录一条线,简单介绍一下struts2的配置,如有不妥之处,还请大家多提点提点 ...

  6. 浅谈Struts2(一)

    一.Struts2引言 1.Struts2框架的概念 解决的MVC开发过程中,控制器(Controller)的通用问题. a.什么是MVC开发 MVC开发是一种编程思想,由设计者人为的把一个项目,划分 ...

  7. 浅谈struts2的国际化----i18n

    可能大家在使用struts框架的时候,偶尔会看到这个词: i18n.也就是 Internationalization    i 开头,n 结尾. 总共18个字母,今天的主要内容就是环绕这 四个字母. ...

  8. 浅谈Struts2

    学过SSH框架很长一段时间了,一直没有很系统的总结一下,这里先简单谈谈Struts2. 为什么要用Struts2? 这里列举一些Servlet的缺点: 1.每写一个servlet在web.xml中都要 ...

  9. 小学生之浅谈Struts2与struts1的运行机制

    Struts1工作原理图: 1.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(s ...

随机推荐

  1. Trunk Club:颠覆男士时装零售的创业公司_第1页_福布斯中文网

    Trunk Club:颠覆男士时装零售的创业公司_第1页_福布斯中文网 Trunk Club:颠覆男士时装零售的创业公司

  2. 左右 android AES 所述机器的一部分 javax.crypto.BadPaddingException: pad block corrupted

    好多人 android 使用上述 AES 显现 javax.crypto.BadPaddingException: pad block corrupted 下面的代码发布没问题,比较自己.不解释! p ...

  3. 假设写一个android桌面滑动切换屏幕的控件(一)

    首先这个控件应该是继承ViewGroup: 初始化: public class MyGroup extends ViewGroup{ private Scroller mScroller; priva ...

  4. oracle传输表空间功能测试(含详细过程)

    最近做数据迁移,之前有一篇迁移思路思考的文章,这里继续做具体的测试,主题问表空间传输. 一.源服务器上导出表空间 源服务器:   10.1.122.55 目标服务器:10.1.122.54 0.设置字 ...

  5. System.Data.SQLite兼容32位和64位问题

    SQLite版本分的很详细,本机是64位在32位会出现问题,经过搜索找到解决方案. 这是我以前写的32位在我现在的机子上的运行报错. 类似这样的. 将当前说明文档的目录下的x64.x86目录和Syst ...

  6. vsvim _vsvimrc 设置(转)

    c_joewang的专栏 (转) vsvim安装到vs2010后可以使用绝大部分原生vim的编辑功能,包括宏录制,也可以通过配置设置键盘映射,关于支持的编辑功能等可以参考上面链接去查看相关文档. Vi ...

  7. Linux学习之开机启动

    当我们打开计算机电源,计算机会自动从主板的BIOS(Basic Input/Output System)读取其中所存储的程序.这一程序通常知道一些直接连接在主板上的硬件(硬盘,网络接口,键盘,串口,并 ...

  8. 安卓自定义view_GDI绘图 _2d绘图_canvas绘图

    2014年到2016年 发生了很多事情,如今已成定局,现在想忘掉这些烦恼的事情,找点以前想干没有干的事情来做,塞满大脑就不去想了. 之前,一直想做一款挂机类游戏,各种平台和开发语言都选择过了,从htm ...

  9. python+sublime text2中文乱码[Decode error - output not utf-8]

    转自: http://blog.sina.com.cn/s/blog_765abd7b0101dtbw.html 学习,记录一下.中文编码真的挺麻烦.抽空把自己的sb3的配置写一些. 该问题让我纠结了 ...

  10. [LeetCode]题解(python):137-Single Number II

    题目来源: https://leetcode.com/problems/single-number-ii/ 题意分析: 给定一个数组,数组里面每一个数字都出现了3次除了一个,找出那个数.要求时间复杂度 ...