我搜索了这个案例,但找不到解决方案。
我想根据用户请求从同一操作类返回列表或 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/