action向页面传递数据,拦截那些没必要传到客户端的方法。includeProperties

如果action的属性很多,我们想要从Action返回到调用页面的数据。这个时候配置includeProperties或者 excludeProperties拦截器即可。而这2个拦截器的定义都在struts2的json-default包内,所以要使用该拦截器的包都要继承自json-default。

xml文件:

<struts>
    <constant value="spring" name="struts.objectFactory" />
    <include file="struts-admin.xml"></include>
    <package name="default" extends="json-default">
        <action class="com.person.PersonAction" name="person" method="view">
            <result type="json">
                <param name="includeProperties">person\.name,persoon\.age,person\.gender </param>
            </result>
        </action>
    </package>
</struts>

经过测试,下面的设置也是可以的,就是在includeProperties里面直接写你所在Action的属性

<struts>
    <constant value="spring" name="struts.objectFactory" />
    <include file="struts-admin.xml"></include>
    <package name="default" extends="json-default">
        <action class="com.person.PersonAction" name="person" method="view">
            <result type="json">
                <param name="includeProperties">name,age,gender </param>
            </result>
        </action>
    </package>
</struts>

利用Struts 2的支持的可配置结果,可以达到过滤器的效果。Action的处理结果配置支持正则表达式。但是如果返回的对象是一个数组格式的Json数据。比如 peson Bean中有对象persion1…person9,而我只要JSON插件,则可以用如下的正则表达式。

<struts>
    <constant value="spring" name="struts.objectFactory" />
    <include file="struts-admin.xml"></include>
    <package name="default" extends="json-default">
        <action class="com.person.PersonAction" name="person" method="view">
            <result type="json">
                <param name="includeProperties">person\.name,persoon\.age,person\.gender </param>
            </result>
        </action>
    </package>
</struts>
<!--利用Struts 2的支持的可配置结果,可以达到过滤器的效果。Action的处理结果配置支持正则表达式。 但是如果返回的对象是一个数组格式的Json数据。比如peson Bean中有对象persion1...person9,而我只要person1的json数据, 则可以用如下的正则表达式。 -->
<struts>
    <constant value="spring" name="struts.objectFactory" />
    <include file="struts-admin.xml"></include>
    <package name="default" extends="json-default">
        <action class="com.person.PersonAction" name="person" method="view">
            <result type="json">
                <param name="includeProperties">person\[\d+\]\.person1 </param>
            </result>
        </action>
    </package>
</struts>
<!--excludeProperties拦截器的用法与此类同,如果拦截的仅仅是一个对象,如果拦截掉person Bean的整个对象。 -->
<struts>
    <constant value="spring" name="struts.objectFactory" />
    <include file="struts-admin.xml"></include>
    <package name="default" extends="json-default">
        <action class="com.person.PersonAction" name="person" method="view">
            <result type="json">
                <param name="excludeProperties">person </param>
            </result>
        </action>
    </package>
</struts>

传递List或者对象是,后面要加上  .*   代表全部的意思。

<param name="includeProperties">topicList.*</param>

需要注意的是,如果用JSON插件把返回结果定为JSON。而JSON的原理是在ACTION中的get方法都会序列化,所以前面是get的方法只要没指定不序列化,都会执行,那么可以在该方法的前面加注解声明该方法不做序列化。

@JSON(serialize = false)
public User getUser() {
    return this.User;
}
 
@JSON(format = "yyyy-MM-dd")
public Date getStartDate() {
    return this.startDate;
}

项目中遇到的问题:

strut2提供了支持json的插件

必须继承json-default、json-default继承自struts-default.

<package name="json" namespace="/" extends="json-default">
    <action name="moduleAction" class="moduleAction" >
        <result type="json" name="findData">
            <param name="root">datas</param>
            <param name="includeProperties">success,totalcount</param>
        </result>
        
        <result type="json" name="findTree">
            <param name="root">result</param>
        </result>
    </action>
</package>

1,result中type设置成json之后,容器会把action的属性自动封装到一个json对象中(json拦截器来做),然后调用ajax的callback方法. 返回json数据

2,includeProperties 参数:输出结果中需要包含的属性值,这里正则表达式和属性名匹配,可以用“,”分割填充多个正则表达式。 如<param name="includeProperties">module.*,user\.userName</param>? 表示是module的所有属性及用户的用户名

3,excludeProperties 参数:输出结果需要排除的属性值,也支持正则表达式匹配属性名,可以用“,”分割填充多个正则表达式,类同includeProperties

4,为什么要用includeProperties或excludeProperties 参数:

a.主要是为了过滤掉接口,pojo的set、list、其它对象等不需要的数据防止循环取其它关联对象或找不到接口。

b.如果不配置,默认是处理 action中的所有属性,如果action中有接口注入,json拦截器可能找不到接口而返回不了结果,

c.还有如果action中有一个对象,这个对象与好多对象都有关联,json拦截器会将相关联的所有对象的属性全部转换成json格式,

d. 如果其它对象有list、set,其返回结果相当庞大,有可能是死循环而无法返回 。

e.如果不用<param name="includeProperties">或其他方式进行json数据过滤,通过debug你会发现前台返回的json字符串,是把 action中的所有属性全部转化成json字符串返回给客户端(包括service接口、pojo所有属性及有关联的pojo。有时候根本返回不了结果,也不报错,后台虽然执行了, 但前台执行不到callback function,这主要是因为找不到接口或者关联的pojo太多,造成死循环),

f. 一般情况下用的最多的就是root、 includeProperties 和excludeNullProperties参数。

g. 当然还有其他的方法,如给pojo的属性加json注解。

5,result标签中的name属性,即表示是struts2中的action类中返回的名称

如:

public String findAllById() throws Exception{
        int id=Integer.parseInt( this.request.getParameter("pid"));
        List<ModuleBean> list=service.findById(id);
        return "findTree";
}

上面代码return "findTree"就会找到findTree的结果集,并将其封装起来,返回json给客户端

因此 action 可以配置多个result

时间: 2024-10-22 15:44:47

action向页面传递数据,拦截那些没必要传到客户端的方法。includeProperties的相关文章

iframe实践小结:如何实现父页面向子页面传递数据

思路分析: 子页面获取数据: 补充说明: 需要注意的是:主页面与子页面的sessionStorage不是共享的,而是相互独立,另外postMessage只支持原生js写法,不支持jq获取id 原文地址:https://www.cnblogs.com/hxw1024/p/12046521.html

ASP.NET多页面传递数据,附框架源码

很多时候我们需要把数据传递到多个页面,比如表单提交可以指定提交数据到某个页面,那么关闭某个页面怎么把数据传递到上一个页面或者它的父页面. 在这里我附一段源码用于当前页面关闭指定某个页面刷新. 子页面方法 //保存表单; function AcceptClick(callback) { if (!$('#form1').Validform()) { return false; } var postData = $("#form1").GetWebControls(keyValue); $

Vue子页面给父页面传递数据

子页面: <template> <div> <p>子组件</p> <button @click="sendMsg">传递到父页面</button> </div></template> <script> export default { name: 'child', data() { return { msg:'子组件数据' } }, computed:{ addNum(){ re

vue父页面给子页面传递数据

父页面: <template> <div>{{msg}} <Son title='向子文件传递数据' :data='data' :lifemsg ='lifemsg' :num='num'/> <button @click="chageMsg">修改数据</button> <input type="text" v-model="lifemsg" /> </div>

vue引入iframe的父页面向子页面传递数据

父页面 <template> <div> <el-button @click='btn(index)' :class="{'active':activeName2==index}" v-for="(item,index) in list" :key="index"> {{item.label}} </el-button> <iframe-tab :assid="assid"

详细介绍ASP.NET页面间数据传递的使用方法

在ASP.NET中,页面间数据传递的方法有很多.下面为大家总结一下,页面间数据传递的方法. Web页面是无状态的,服务器对每一次请求都认为来自不同用户,因此,变量的状态在连续对同一页面的多次请求之间或在页面跳转时不会被保留.在 用ASP.NET 设计开发一个Web系统时, 遇到一个重要的问题是如何保证数据在页面间进行正确.安全和高效地传送,Asp.net 提供了状态管理等多种技术来解决保存和传递数据问题,以下来探讨.NET 下的解决此问题的各种方法和各自的适用场合. 一.ASP.NET页面间数据

ASP.NET页面间数据传递的方法

本文我们将讨论的是asp.net页面间数据传递的几种方法,对此希望能帮助大家正确的理解ASP.NET页面间数据传递的用处以及便利性. 引言 Web页面是无状态的, 服务器对每一次请求都认为来自不同用户,因此,变量的状态在连续对同一页面的多次请求之间或在页面跳转时不会被保留.在用ASP.NET 设计开发一个Web系统时, 遇到一个重要的问题是如何保证数据在页面间进行正确.安全和高效地传送,Asp.net 提供了状态管理等多种技术来解决保存和传递数据问题,以下来探讨.NET 下的解决此问题的各种方法

页面之间传递数据

最近在写公司HR微信公众号,其中某个模块需要A.html传递一个参数Data给B.html,然后B.html通过参数Data发送Ajax.整理一下搜寻到方法: 方法一:通过location给页面传递数据:附上代码. <!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title>页面A</title> </head> <body> &

【ASP.NET MVC】View与Controller之间传递数据

1   概述 本篇文章主要从操作上简要分析Controller<=>View之间相互传值,关于页面之间传值,如果感兴趣,可参考我另外一篇文章ASP.NET 页面之间传值的几种方式 . Controller=>View:Model,ViewBag,ViewData,TempData,ViewBag=>ViewData,ViewData=>ViewBag,ViewModel,JqGrid,AJAX+第三方插件等: View=>Controller:QueryString,F