2 qq 28812173 qq_28812173 于 2015.06.06 22:34 提问

问题:利用struts自带的json机制,期望从后台获取json数据失败,求帮助

问题:利用struts自带的json机制,期望从后台获取json数据失败,求帮助

##############################################################

struts 2.3.20

struts.xml

 <package name="json" extends="json-default" namespace="/test">
  <action name="AjaxJson" class="test.AjaxJsonAction">   
   <result type="json">
    <param name="root">dataMap</param>
   </result>  
  </action> 
 </package>

##############################################################

java code

public class AjaxJsonAction extends ActionSupport {

private static final long serialVersionUID = 1L;
//将会被Struts2序列化为JSON字符串的对象
private Map dataMap;

public Map getDataMap() {
return dataMap;
}

public String execute() throws Exception
{
dataMap = new HashMap();
dataMap.put("success", true);
System.out.println("Debug - AjaxJsonAction - execute");
return SUCCESS;
}

public void validate() {
System.out.println("Debug - AjaxJsonAction - validate");
}
}

##############################################################

url:http://localhost:8080/SSHBasic/AjaxJson //访问不成功;服务器后台能收到Firefox前台的访问请求,action的execute函数也执行了,可状态码是302,?Firefox前台看到网页是被重定向到index.jsp了

server控制台输出:

Debug - AjaxJsonAction - validate
Debug - AjaxJsonAction - execute

firefox控制台输出:

请求网址: http://localhost:8080/SSHBasic/AjaxJson

状态码:HTTP/1.1 302 Found

响应头 - Location: http://localhost:8080/SSHBasic/index.jsp

5个回答

angeldwind
angeldwind   2015.06.07 13:12

struts.xml 配置是什么
使用struts的默认json输出extends要配置为json-default并且result type为json 值为为返回的map对象的名称


map


angeldwind
angeldwind   2015.06.07 13:15

如:

<package name="josn" extends="json-default" namespace="/">
  <action name="actionname" class="classpath">
        <result type="json">map</result>
    </action>   
        </package>
angeldwind
angeldwind 回复qq_28812173: 不用谢 能帮到人就是对我最大的回报。
2 年多之前 回复
qq_28812173
qq_28812173 回复qq_28812173: 谢谢你啊,这个问题困扰了我好几天,有你讨论下真好。
2 年多之前 回复
qq_28812173
qq_28812173 回复K-Magic: 不用后缀也可以,服务器端能收到客户端的请求,并且AjaxJsonAction里面也正确处理了。
2 年多之前 回复
qq_28812173
qq_28812173 回复K-Magic: 问题解决了,解决方法不清楚,过程我贴出来了。没有struts-json.jar;只有struts2-json-plugin-2.3.20.jar
2 年多之前 回复
qq_28812173
qq_28812173 回复K-Magic: 问题解决了,解决方法不清楚,过程我贴出来了。没有struts-json.jar;只有struts2-json-plugin-2.3.20.jar
2 年多之前 回复
angeldwind
angeldwind 回复qq_28812173: 还有一个可能是没有struts-json.jar这个jar包 你下载个struts2的jar 里找下
2 年多之前 回复
angeldwind
angeldwind 回复qq_28812173: http://localhost8080/SSHBasic/AjaxJson 请求的action没有后缀吗 不是AjaxJson.do或AjaxJson.action?
2 年多之前 回复
qq_28812173
qq_28812173 struts.xml的配置贴上来了,在后面,本想编辑帖子本身的,就是编辑后没有发布的按钮
2 年多之前 回复
qq_28812173
qq_28812173 网站好像不让我发表这一段,等下我上传图片上来
2 年多之前 回复
qq_28812173
qq_28812173   2015.06.07 16:28

To K-Magic:
struts.xml的配置如下;发帖的时候复制黏贴不知道为何没了这段

struts 2.3.20

struts.xml





dataMap



qq_28812173
qq_28812173   2015.06.07 16:37
 struts 2.3.20

struts.xml

 <package name="json" extends="json-default" namespace="/test">
  <action name="AjaxJson" class="test.AjaxJsonAction">   
   <result type="json">
    <param name="root">dataMap</param>
   </result>  
  </action> 
 </package>
qq_28812173
qq_28812173   2015.06.07 20:59

这个问题解决了,却不知道原因是什么;特把解决过程记录下来,以便以后大家不再趟雷


分析
302 no found / redirect; 服务器端能收到客户端的请求,并且也在AjaxJsonAction里处理完毕,于是struts.xml是重点怀疑对象。 检查struts.xml。
发现有这么一行包含‘redirect’

怀疑点

 <result name="success" type="redirect">index.jsp</result>

struts.xml 全文

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC  "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <constant name="struts.i18n.encoding" value="UTF-8" />
    <constant name="struts.multipart.maxSize" value="15000000"></constant> 
    <package name="struts2" extends="struts-default">

        <action name="*_*" class="test.{1}Action" method="{2}">
            <result name="success" type="redirect">index.jsp</result>
            <result name="error">index.jsp</result>
            <result name="ADD">index.jsp</result>
            <result name="DELETE">index.jsp</result>
            <result name="REGISTER">login.jsp</result>
        </action>

        <action name="UploadFile" class="test.UploadFileAction">
            <result name="success">index.jsp</result>
            <result name="input">uploadFile.jsp</result>
            <param name="savePath">/images</param>
            <interceptor-ref name="fileUpload">
                <param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param>
                <param name="maximumSize">15000000</param>
            </interceptor-ref>
            <interceptor-ref name="defaultStack" />                 
        </action>

    </package>

    <package name="json" extends="json-default">
        <action name="AjaxJson_1"
            class="test.AjaxJsonAction" method="testByAction">
            <result type="json">
                <param name="root">dataMap</param>
            </result>
        </action>
    </package>
</struts>


解决办法

死马当活马医,谁叫你包含"redirect"

修改

 <result name="success" type="redirect">index.jsp</result>

为 (即删除 type="redirect")

 <result name="success">index.jsp</result>

验证解决办法

上面的方法竟然解决问题了,在客户端能拿到json格式的返回数据了。可是,就这方法就能解决?按理说,不同的package,不同的action,这样修改怎么能解决问题;可的的确确我就是只改了这里。更改后,发现原来的问题不见了,不得其解,留待将来对struts更熟悉了再查找原因吧

更改

 <result name="success">index.jsp</result>

成为(恢复type="redirect")

  <result name="success" type="redirect">index.jsp</result>
angeldwind
angeldwind <action name="*_*" class="test.{1}Action" method="{2}"> name="*_*" 这里的匹配规则 影响到下面的name="AjaxJson_1"
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片