`

struts2页面取action中值

 
阅读更多

public class ParmValueAction extends ActionSupport
{
    private Usere user;

    @Override
    public String execute() throws Exception
    {
        ActionContext ctx = ActionContext.getContext();
        HttpServletRequest req = ServletActionContext.getRequest();
        Map<String, Object> requestMap = (Map<String, Object>) ctx
                .get("request");

        ctx.put("userKey", user);
        requestMap.put("userReqMap", user);
        req.setAttribute("userReq", user);

        return SUCCESS;
    }

    public Usere getUser()
    {
        return user;
    }

    public void setUser(Usere user)
    {
        this.user = user;
    }

}


jsp:

方法1:
    使用property标签
    <br>
    <s:property value="user.name"/>
    <s:property value="user.age"/>
    <br>
    方法2:
    使用property标签,使用#userKey对值栈进行查找
    <br>
    <s:property value="#userKey.name"/>
    <s:property value="#userKey.age"/>
    <br>
    方法3:
      使用property标签,使用#action对值栈进行查找,同时使用默认的查找方式,该方法等同于方法1,在2.0中该方法不可用,2.1可用
    <br>
    <s:property value="#action.user.name"/>
    <s:property value="#action.user.age"/>
    <br>
    方法4:
      使用property标签,使用#userReq对值栈进行查找,这里查不到该值,因为值栈中没有这个key
    <br>
    <s:property value="#userReq.user.name"/>
    <s:property value="#userReq.user.age"/>
    <br>
    方法5:
      使用property标签,使用#userReqMap对值栈进行查找,这里查不到该值,因为值栈中没有这个key
    <br>
    <s:property value="#userReqMap.name"/>
    <s:property value="#userReqMap.age"/>
    <br>
    
    <hr>
    request取值方法,取保存在userReqMap中的user:
    <br>
    <s:property value="#request.userReqMap.name"/>
    <s:property value="#request.userReqMap.age"/>
    <br>
    request取值方法,取保存在userKey中的user:
    <br>
    <s:property value="#request.userKey.name"/>
    <s:property value="#request.userKey.age"/>
    <br>
    request取值方法,取保存在userReq中的user:
    <br>
    <s:property value="#request.userReq.name"/>
    <s:property value="#request.userReq.age"/>
    <br>
    request取值方法1,取保存在action中的user:
    <br>
    <s:property value="#request.user.name"/>
    <s:property value="#request.user.age"/>
    <br>
    request取值方法2,取保存在action中的user:
    <br>
    <s:property value="#request.action.user.name"/>
    <s:property value="#request.action.user.age"/>
    <br>
    <hr>
    jstl取值方法,取保存在userReq中的user:
    <br>
    <c:out value="${request.userReq.name}"></c:out>
    <c:out value="${request.userReq.age}"></c:out>
    <br>
    jstl取值方法,取保存在userReqMap中的user:
    <br>
    <c:out value="${request.userReqMap.name}"></c:out>
    <c:out value="${request.userReqMap.age}"></c:out>
    <br>
    jstl取值方法,取保存在userKey中的user:
    <br>
    <c:out value="${request.userKey.name}"></c:out>
    <c:out value="${request.userKey.age}"></c:out>
    <br>
    jstl取值方法1,取保存在action中的user:
    <br>
    <c:out value="${request.user.name}"></c:out>
    <c:out value="${request.user.age}"></c:out>
    <br>
     jstl取值方法2,通过action取保存在action中的user:
    <br>
    <c:out value="${request.action.user.name}"></c:out>
    <c:out value="${request.action.user.age}"></c:out>
    <br>
    <hr>
    直接使用java编码来取:
    <%
   Usere user = (Usere)request.getAttribute("userReq");
  Usere userMap = (Usere) request.getAttribute("userReqMap");
  Usere userKey = (Usere) request.getAttribute("userKey");
  //2.0中无法取到action,本次测试的版本为2.1.8.1
  ParmValueAction action=(ParmValueAction)request.getAttribute("action");
  //Usere userAction=action.getUser();
  //String name=userAction.getName();
  //int age=userAction.getAge();
    %>
    直接取:
     <%=user.getName() %>
     <%=user.getAge() %>
     <br>
     取userMap:
     <%=userMap.getName()%>
     <%=userMap.getAge()%>
     <br>
     取userKey:
     <%=userKey.getName()%>
     <%=userKey.getAge()%>
     <br>
    取 action:
     <%=action.getUser().getName()%>
     <%=action.getUser().getAge()%>
  </body>


结果:

方法1: 使用property标签 
terje 25 
方法2: 使用property标签,使用#userKey对值栈进行查找 
terje 25 
方法3: 使用property标签,使用#action对值栈进行查找,同时使用默认的查找方式,该方法等同于方法1,在2.0中该方法不可用,2.1可用 
terje 25 
方法4: 使用property标签,使用#userReq对值栈进行查找,这里查不到该值,因为值栈中没有这个key 

方法5: 使用property标签,使用#userReqMap对值栈进行查找,这里查不到该值,因为值栈中没有这个key


request取值方法,取保存在userReqMap中的user: 
terje 25 
request取值方法,取保存在userKey中的user: 
terje 25 
request取值方法,取保存在userReq中的user: 
terje 25 
request取值方法1,取保存在action中的user: 
terje 25 
request取值方法2,取保存在action中的user: 
terje 25


jstl取值方法,取保存在userReq中的user: 
terje 25 
jstl取值方法,取保存在userReqMap中的user: 
terje 25 
jstl取值方法,取保存在userKey中的user: 
terje 25 
jstl取值方法1,取保存在action中的user: 
terje 25 
jstl取值方法2,通过action取保存在action中的user: 
terje 25


直接使用java编码来取: 直接取: terje 25 
取userMap: terje 25 
取userKey: terje 25 
取 action: terje 25


原因:通过查看

org.apache.struts2.dispatcher.StrutsRequestWrapper


源代码,以下这段代码是apache社区对Request做了包装,这样包装如果在页面中通过传统的取值方法找不到值,就到值栈中去找,这样一来不仅兼容了jstl和java代码直接取值,同时也保证struts2的标签能顺利取到值。

public Object getAttribute(String s) {
        if (s != null && s.startsWith("javax.servlet")) {
            // don't bother with the standard javax.servlet attributes, we can short-circuit this
            // see WW-953 and the forums post linked in that issue for more info
            return super.getAttribute(s);
        }

        ActionContext ctx = ActionContext.getContext();
        Object attribute = super.getAttribute(s);
        if (ctx != null) {
            if (attribute == null) {
                boolean alreadyIn = false;
                Boolean b = (Boolean) ctx.get("__requestWrapper.getAttribute");
                if (b != null) {
                    alreadyIn = b.booleanValue();
                }
    
                // note: we don't let # come through or else a request for
                // #attr.foo or #request.foo could cause an endless loop
                if (!alreadyIn && s.indexOf("#") == -1) {
                    try {
                        // If not found, then try the ValueStack
                        ctx.put("__requestWrapper.getAttribute", Boolean.TRUE);
                        ValueStack stack = ctx.getValueStack();
                        if (stack != null) {
                            attribute = stack.findValue(s);
                        }
                    } finally {
                        ctx.put("__requestWrapper.getAttribute", Boolean.FALSE);
                    }
                }
            }
        }
        return attribute;

2
0
分享到:
评论
2 楼 daocaoren1011 2014-05-03  
1 楼 lotnhiro 2013-04-18  
Good!  

相关推荐

    dsp中值滤波 dsp中值滤波

    4. 取排序后的中间值作为当前像素的新值,即中值滤波的结果。 5. 继续移动窗口,重复以上步骤,直至处理完整个图像。 在DSP系统中实现中值滤波,通常需要考虑以下几点: 1. 数据存储:由于需要对邻域像素值进行排序...

    MATLAB实现中值滤波(非medfilt2函数)

    10. 与MATLAB内置函数medfilt2的对比:在文档中,作者提供了一个与MATLAB内置中值滤波函数medfilt2的对比示例,这有助于观察自定义中值滤波算法与标准算法的差异,并评估性能。 通过上述知识点的整理,我们可以了解...

    单片机与DSP中的基于Stratix II EP2S60的改进中值滤波器设计

    在图像处理领域,中值滤波器是一种广泛应用的非线性滤波技术,尤其在抑制噪声和提升图像质量方面表现出色。本文主要讨论了在单片机与DSP系统中,如何利用Altera公司的Stratix II EP2S60 FPGA芯片实现一种改进的中值...

    lvbo.rar_medfilt2函数_二维中值滤波_图像中值滤波_图像滤波

    针对这种噪声,一种有效的滤波方法是使用二维中值滤波,其中MATLAB中的`medfilt2`函数是一个强大的工具。 `medfilt2`函数是MATLAB中的二维中值滤波器,用于对图像进行滤波操作,特别适合消除椒盐噪声。它的基本原理...

    中值滤波_matlab_中值滤波_

    与传统的线性滤波器不同,中值滤波器不考虑像素的加权平均值,而是取图像窗口内像素值的中值作为输出。这种操作可以有效保护边缘信息,因为边缘通常由连续像素的大值差构成,而噪声通常是孤立的、极端的值,所以中值...

    中值滤波Verilog代码

    窗口内的像素灰度值按照一定的顺序排列,然后取中间的值作为该位置的新灰度值。对于椒盐噪声,由于噪声点的灰度值极端,所以会被位于中间的正常像素值所取代,从而达到去噪效果。 在Verilog中实现中值滤波,主要...

    MATLAB的图像中值滤波?_matlab_中值滤波_

    在MATLAB中,我们可以使用内置的`medfilt2`函数来进行二维中值滤波。例如,如果有一张名为`image.jpg`的图像,我们可以通过以下代码对其进行中值滤波: ```matlab filteredImage = medfilt2(imread('image.jpg'), ...

    中值滤波matlab代码

    2. **滤波窗口**:中值滤波通常使用一个固定的大小(如3x3、5x5)的方形或圆形窗口,在图像上滑动,对每个窗口内的像素进行处理。 3. **中位数计算**:对于窗口内的像素值,按照灰度值从小到大排序,取中间值作为该...

    matlab代码 中值滤波

    中值滤波的基本原理是,对于图像中的每一个像素点,取其周围邻域内像素的中值作为该点的新值。相比于均值滤波,中值滤波对噪声的抑制效果更好,因为它不受到极端值(如噪声)的影响。中值滤波器通常使用一个固定大小...

    快速中值滤波+中值滤波

    2. **窗口移动策略**:根据窗口的对称性特征,设置合理的移动顺序,以便于在移动过程中利用相邻窗口的信息。 3. **利用已排序信息**:通过对窗口中的像素进行预排序,可以在后续移动时快速调整顺序,减少新的排序...

    图像缩小2倍后,中值滤波,matlab程序

    2. **灰度转换**:由于中值滤波通常应用于灰度图像上,因此需要将彩色图像转换为灰度图像。这里使用`rgb2gray`函数完成转换: ```matlab J = rgb2gray(I); ``` 3. **获取图像尺寸**:通过`size`函数获取图像的...

    matlab 中值滤波 均值滤波

    给定代码展示了如何使用MATLAB中的`medfilt2`和`conv2`函数来进行中值滤波和均值滤波操作。 1. **读取并转换图像** ```matlab N = imread('图像路径'); % 读取图像 M = rgb2gray(N); % 转换为灰度图像 imshow...

    自适应中值滤波MATLAB

    自适应中值滤波函数。

    均值滤波与中值滤波的应用_MATLAB中值滤波_均值滤波中值滤波的matlab代码_中值滤波_plandop_

    MATLAB提供了`medfilt2`函数来执行二维中值滤波。同样以`inputImage`为例,应用3x3的中值滤波器可以这样写: ```matlab outputImage = medfilt2(inputImage, filterSize); ``` 这里`filterSize`依然表示滤波窗口...

    EL表达式取servlet中值方法的总结

    很好的学习文档,并且实用初学者。帮助初学者更好的理解EL表达式的优势。

    一维中值滤波.

    7. `fix(w/2)+1`计算窗口中值的索引位置,因为中值滤波器取的是中间值,所以是排序后窗口大小的一半加1。 8. `me`变量存储了排序后中间位置的元素,即滑动窗口的中值。 9. 循环结束后,原始数据中的每个点都被其...

    struts2标签库实验报告.docx

    - 配置Struts2框架,包括`&lt;struts&gt;`、`&lt;package&gt;`、`&lt;action&gt;`、`&lt;interceptor-ref&gt;`和`&lt;result&gt;`等标签。 - 例如,配置`&lt;package&gt;`标签时,设置`name="csg_taglib"`,`namespace="/taglib"`,`extends="struts-...

    cuda实现的中值滤波介绍

    中值滤波的具体原理是选取一个含有奇数个像素点的掩模窗口,在图像数据中滑动,每次移动窗口时,取出窗口内所有像素点的灰度值,并将这些值进行排序,最终取排序后的中间值作为窗口中心像素的新值。在CUDA实现中,...

    matlab代码中值滤波

    MATLAB中实现中值滤波主要使用`medfilt2`函数。例如,假设我们有一个名为`image`的二维矩阵表示图像,我们可以使用以下代码进行中值滤波: ```matlab filteredImage = medfilt2(image, [windowSize windowSize]); `...

    中值滤波verilog代码

    2. **存储单元设计**:为了计算每个像素点的中值,需要存储其邻域内的所有像素值。这通常通过二维数组或者移位寄存器来实现。 3. **数据排序**:获取像素邻域数据后,需要进行排序以找出中值。由于Verilog不支持...

Global site tag (gtag.js) - Google Analytics