一.struts中的配置
配置ajax的方式有两种
第1种:package标签extends “json-default” 方式.
第2种:但如果当前package确实无法继承”json-default”的话,还可以
在当前package中定义result-type,将json给加进去
,如下:
<result-types>
<result-type name="json" class="org.apache.struts2.json.JSONResult"/>
</result-types>
详细举例:
<struts>
<package name="json-default" extends="struts-default">
<result-types>
<result-type name="json" class="org.apache.struts2.json.JSONResult"/>
</result-types>
<interceptors>
<interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>
</interceptors>
</package>
</struts>
因为name为"json"的result type是在json-default中定义的,所以,从json-default继承就可以使用json这个result。另外json-default还定义了一个name为"json"的interceptor。另外,依json-default的定义来看,方法2中还应该再加一个json的interceptor定义才比较合适。
二.调试时确保编译后的文件在XXX/WebContent/WEB-INF/classes目录下,否则可能会报
There is no Action mapped for action name loginAction. - [unknown location]
并且,要确保有 struts2-json-plugin-2.3.1.2.jar 这个文件,不然会报上面同样的错误
三.报错:
org.apache.struts2.json.JSONWriter can not access a member of class
org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
with modifiers "public"。
主要原因:struts会将action中定义的一些变量序列化转换成json格式,需要调用对象的一系列get方法(例子中调用
authorityService
和
authorities的get方法
),并调用以上两个变量的成员变量的get方法将其内容组成json格式。但是在序列化authorityService时,由于其成员变量中含有含有接口所以会报错。
解决方案:
1.修改配置文件:指定序列化的根节点,这样data就是从authorities的根节点以下的数据,不需要用data.authorities
1 <package name="super_admin" extends="json-default" namespace="/superadmin"> 2 <action name="allAuthorities" class="edu.bjfu.action.AuthoritiesAction"> 3 <result type="json"><param name="root">authorities</param></result> 4 </action> 5 </package>
2. 修改java代码:让编译器不对authorityService序列化
1 @JSON(serialize=false) 2 public AuthorityService getAuthorityService() { 3 return authorityService; 4 }
3.此外貌似可以通过配置文件的excude和include来指定需要序列化的对象