Return 对象和 JSON 对象来自 Struts 2 个操作

Return object and JSON object from Struts 2 Action

我搜索了这个案例,但找不到解决方案。

我想根据用户请求从同一操作 class return 列表或 JSON 对象(对于此列表)。我正在尝试根据我的 return 名称进行配置,但无法执行。

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

我可以在 JSP 上访问我的列表,但不能访问 JSON 对象。

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

我不想添加代码,因为我尝试了很多不同的方法,而且要全部显示出来会很麻烦。我可以根据要求展示。我期待着您的建议。

谢谢

两个动作,一个结果一个

您可以简单地使用两个动作,映射到同一个动作 class,指向不同的方法,return 得到不同的结果(一个 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 标签,一个 table , 管他呢...)。或者使用 Stream 结果而不是标准 Dispatcher。

在行动中class:

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
    }    

}

一个动作,两个结果

当然,不是 两个动作每个一个结果,你可以使用一个动作有两个结果,选择正确的一个到 return 基础在一个参数上(就像你试图做的那样)...:[=​​22=]

<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
    }
            
}

Content-Negotiation

另一种方法是根据 HTTP headers、return 以浏览器的格式生成结果 real 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
    }
            
}

同时阅读 how the JSON plugin worksroot object。