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

标签 java json jsp struts2

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

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

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

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

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

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

谢谢

最佳答案

两个 Action ,每个 Action 一个结果

您可以简单地使用两个操作,映射到相同的操作类,指向不同的方法,返回不同的结果(一个 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
    }    

}

一个 Action ,两个结果

当然,不是两个操作每个都有一个结果,您可以使用一个操作有两个结果,根据参数选择正确的返回(就像您尝试做,表面上)...:

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

在 Action 中,对参数进行检查:

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 header ,以浏览器声称接受的格式返回结果:

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 works使用 root 对象。

关于java - 从 Struts 2 Action 返回对象和 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28966018/

相关文章:

javascript - AngularJS:对象、数组、JSON、API 问题

java - Android Spinner dropDownHorizo​​ntalOffset 不起作用,但 dropDownVerticleOffest 是

java - 更改 Google Maps API 的 "My location"按钮的位置

java - Hibernate:批量和非批量插入生成相同数量的 SQL 查询

jquery getJSON函数计时问题

java - 如何在模板templates.jsp中使用if语句?

java - 在 java 正则表达式中匹配 '_' 和 '-'

json - 在 Xamarin 中导入 System.Web.Script.Serialization

java - ${status.value} 不起作用

java - 从 MySql 表生成 DAO 的 Pojo 和 JSP 的工具/Eclipse 插件?