Struts2拦截器如何获得Action的返回信息

Struts2拦截器如何获得Action的返回信息,第1张

package action;

import javaxservlet>

生产者客户端:主线程和 Sender 线程

1、主线程: 由 KafkaProducer 创建消息,通过 拦截器、序列化器和分区器 后 缓存到消息累加器 (RecordAccumulator,也称消息收集器)中。

2、Sender 线程: 从 RecordAccumulator 中 获取消息,发送 到 Kafka

一、拦截器: 发送前准备: 过滤、修改 消息,发送回调前: 统计

二、序列化器:对象 转换成 字节数组 发送给 Kafka

三、分区器:根据 key 计算 partition

1、作用 发送前准备: 过滤、修改 消息,发送回调前: 统计

2、实现 orgapachekafkaclientsproducer ProducerInterceptor 接口,包含3个方法:

2、何时KafkaProducer调拦截器:

     1)序列化 和 计算分区前 调 拦截器 onSend() 修改(一般不修改topic、key 和 partition等)

     2) 消息被 应答前 (Acknowledgement)或 发送失败 时调 拦截器onAcknowledgement() ,优先于用户设定Callback前执行。

        ps:运行在 Producer I/O线程中,实现越简单越好,否则影响消息发送速度

     3)close() 关闭拦截器时清理

1、作用:对象 转换成 字节数组 发送给 Kafka。 消费者 用 反序列 化器转成对象(对应序列化器)

2、实现 orgapachekafkacommonserializationSerializer 接口,3个方法:配置、序列化、关闭

configure(): 创建 KafkaProducer 实例时调, 确定编码类型 。

serialize:编解码 ,如几种序列化器都无法满足,可用 Avro、JSON、Thrift、ProtoBuf 和 Protostuff 等通用序列化工具或自定义

1、作用:根据 key 计算 partition 。如果=指定partition 字段,不需分区器

2、实现: 默认分区器是 orgapachekafkaclientsproducerinternalsDefaultPartitioner,实现 orgapachekafkaclientsproducerPartitioner 接口,2个方法

3、partition() :哈希计算分区号 , 参数: 主题、键、序列化后键、值、序列化后值,集群元数据。默认分区器 DefaultPartitioner 中, key  null,轮询发往各个分区

4、close() : 关闭分区器回收资源, 空方法 (默认分区器中)。

5、自定义分区器 ,实现某系列key都发到 同一分区 有序消费, 实现Partitioner 接口。

>

1、引入包(本文中的包全部引自struts-2181\lib):

struts2-json-plugin-2181jar

json-lib-21jar

commons-collections-32jar

commons-beanutils-170jar

commons-lang-23jar

commons-logging-104jar

ezmorph-103jar

这7个包是返回json形式的数据必须的。因为json大量引用了Apache commons的包,所以要加入4个,commons包,除了commons的包外,还需要引入一个 ezmorph的包。最后加入struts2必须的6个包:

struts2-core-2181jar

xwork-core-216jar

ognl-273jar

freemarker-2315jar

commons-fileupload-121jar

commons-io-132jar

2、后台:

1) Userinfo实体类代码

public class UserInfo implements Serializable {

private int userId;

private String userName;

private String password;

get set方法略

}

2) Action类

public class TestAction extends ActionSupport {

private String message; //使用json返回单个值

private UserInfo userInfo; //使用json返回对象

private List userInfosList; //使用josn返回List对象

get set方法略

/返回单个值/

public String returnMsg(){

thismessage = "成功返回单个值";

return SUCCESS;

}

/返回UserInfo对象/

public String returnUser(){

userInfo = new UserInfo();

userInfosetUserId(10000);

userInfosetUserName("刘栋");

userInfosetPassword("123456");

return SUCCESS;

}

/返回List对象/

public String returnList(){

userInfosList = new ArrayList<UserInfo>();

UserInfo u1 = new UserInfo();

u1setUserId(10000);

u1setUserName("张三");

u1setPassword("111111");

UserInfo u2 = new UserInfo();

u2setUserId(10001);

u2setUserName("李四");

u2setPassword("222222");

userInfosListadd(u1);

userInfosListadd(u2);

return SUCCESS;

}

}

3) strutsxml(必须继承json-default、json-default继承自struts-default)

<package name="default" namespace="/json" extends="json-default">

<action name="returnMsg" class="comtestAction " method="returnMsg">

<result name="success" type="json">

<param name="root">validate</param>

</result>

</action>

<action name="returnUser "

class="comtestAction " method="returnUser ">

<result name="success" type="json">

<param name="includeProperties">

userInfo\userId,userInfo\userName,userInfo\password

</param>

</result>

</action>

<action name="returnList" class="comtestAction "

method="returnList">

<result name="success" type="json">

<param name="includeProperties">

userInfosList\[\d+\]\userName,userInfosList\[\d+\]\password

</param>

</result>

</action>

</package>

3、前台:

1) 页面引入jquery-142js

2) 代码如下:

<script language="javascript">

function getMsg(){

$ajax({

url:'json/returnMsgaction',

type:'post',

dataType:'json',

success:function(data){

$("#result")html(datamessage);

}

});

}

function getUser(){

$("# result ")html("");

$ajax({

url:'json/returnUseraction',

type:'post',

dataType:'json',

success:function(data){

$("#result")append("用户ID:"+datauserInfouserId+"")

append("用户名:"+datauserInfouserName+"")

append("密码:"+datauserInfopassword+"");

}

});

}

function getUserList(){

$("# result ")html("");

$ajax({

url:'json/returnListaction',

type:'post',

dataType:'json',

success:function(data){

$each(datauserInfosList,function(i,value){

$("#result")append("第"+(i+1)+"个用户")

append("用户名:"+valueuserName+"")

append("密码:"+valuepassword+"");

}

}

});

}

</script>

<div id="result"></div>

<input type="button" value="获得单个消息" onclick="getMsg()"/>

<input type="button" value="获得用户信息" onclick="getUser()"/>

<input type="button" value="获得用户列表" onclick="getUserList()"/>

4、只要继承extends="json-default",result type设置成json之后,容器会把action的属性自动封装到一个json对象中(json拦截器来做),然后调用ajax的callback方法 返回json数据

5、includeProperties 参数:输出结果中需要包含的属性值,这里正则表达式和属性名匹配,可以用“,”分割填充多个正则表达式。

如:输出UserInfo的所有属性及UserInfo的userName属性

<result type="json">

<param name="includeProperties"> userInfo,

userInfo \ userName </param>

</result>

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

7、输出一个JSON List列表

<result name="success" type="json">

<param name="includeProperties">

userInfosList\[\d+\]\userName,userInfosList\[\d+\]\password

</param>

</result>

其中userInfosList是action中的一个List类型的属性,userInfosList \[\d+\]\ userName表示,userInfosList中存储的对象0end的userName属性(list中存储的对象必须有userName属性)。

8、为什么要用includeProperties或excludeProperties 参数:主要是为了过滤掉接口,pojo的set、list、其它对象等不需要的数据防止循环取其它关联对象或找不到接口。如果不配置,默认是处理 action中的所有属性,如果action中有接口注入,json拦截器可能找不到接口而返回不了结果,还有如果action中有一个对象,这个对象与好多对象都有关联,json拦截器会将相关联的所有对象的属性全部转换成json格式,如果其它对象有list、set,其返回结果相当庞大,有可能是死循环而无法返回 。如果不用<param name="includeProperties">或其他方式进行json数据过滤,通过debug你会发现前台返回的json字符串,是把 action中的所有属性全部转化成json字符串返回给客户端(包括service接口、pojo所有属性及有关联的pojo。有时候根本返回不了结果,也不报错,后台执行了,但前台执行不到callback function,这主要是因为找不到接口或者关联的pojo太多,造成死循环),一般情况下用的最多的就是root、 includeProperties 和excludeNullProperties参数。当然还有其他的方法,如给pojo的属性加json注解。

9、总结: action中避免使用get开头的action方法,去掉action中的接口的get方法 为json类型的result配置includeProperties, excludeProperties等参数

以上就是关于Struts2拦截器如何获得Action的返回信息全部的内容,包括:Struts2拦截器如何获得Action的返回信息、在struts2中,接受ajax传的json对象集合,接受不到、(9)拦截器、序列化器、分区器处理顺序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9626155.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存