从Struts 2 Action返回对象和JSON对象

时间:2015-03-10 14:12:50

标签: java json jsp struts2

我搜索此案例但找不到解决方案。

我想根据用户请求从同一个动作类返回List或JSON Object(对于此List)。我试图根据我的返回名称进行配置但不能这样做。

EG;如果用户将isJSON值设置为1,我将List转换为JSON对象。

我可以在JSP上访问我的List而不是JSON Object。

我尝试将结果类型设置为'json'以获取相关结果名称并实现必要的拦截器。在这种情况下,我无法从用户那里获得任何数据。

我不想添加代码,因为我尝试了很多不同的方法,并且它将大量显示所有内容。我可以根据要求出示。我很期待你的建议。

由于

1 个答案:

答案 0 :(得分:4)

两个动作,每个动作一个

你可以简单地使用映射到同一个动作类的两个动作,指向不同的方法,返回不同的结果(在这种情况下,一个JSP,一个JSON):

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

    <action name="jspList" class="foo.bar.MyAction">
        <result>myList.jsp</result>
    </action>

    <action name="jsonList" class="foo.bar.MyAction" method="jsonExecute">
        <result type="json">
            <param name="root">myList</param>
        </result>
    </action>

</package>

注意:由于智能默认值,操作中的method="execute"和结果中的name="success"会被省略。

myList.jsp中使用Struts标记读取myList操作属性并将其用于您想要的内容(填充Select标记,表格或其他内容......)。或者使用Stream结果而不是标准Dispatcher。

在Action类中:

public class MyAction extends ActionSupport {

    private List<Object> myList;          // Getter 

    public String execute(){
        doBusiness();
        return SUCCESS;
    }

    public String jsonExecute(){
        doBusiness();
        return SUCCESS;
    }

    private void doBusiness(){
        myList = // load the list here
    }    

}

一个动作,两个结果

当然,代替两个操作,每个操作都有一个结果,你可以使用一个带有两个结果的动作,选择正确的一个返回基于一个参数(就像你试图的那样)做,显然)......:

<package name="foobar" namespace="/" extends="json-default">
    <action name="list" class="foo.bar.MyAction">
        <!-- success -->
        <result>myList.jsp</result> 
        <!-- json -->
        <result name="json" type="json">
            <param name="root">myList</param>
        </result>
    </action>
</package>

在操作中,执行参数检查:

public class MyAction extends ActionSupport {

    private int isJSON;                  // Setter
    private List<Object> myList;         // Getter

    public String execute(){
        myList = // load the list here

        if (isJSON==1) {
            return "json"; // mapped to a JSON result
        }
        return SUCCESS; // mapped to a dispatcher result
    }

}

内容协商

另一种方法是基于HTTP标头执行真实的 Content-Negotiation,以浏览器声称接受的格式返回结果:

public class MyAction extends ActionSupport implements ServletRequestAware {

    private HttpServletRequest request;  // Setter
    private List<Object> myList;         // Getter

    public String execute(){
        myList = // load the list here

        String acceptHeader = request.getHeader("Accept");
        if (acceptHeader != null && acceptHeader.equals("application/json"){
            return "json"; // mapped to a JSON result
        } 
        return SUCCESS; // mapped to a dispatcher result
    }

}

同时使用root对象阅读how the JSON plugin works