我搜索此案例但找不到解决方案。
我想根据用户请求从同一个动作类返回List或JSON Object(对于此List)。我试图根据我的返回名称进行配置但不能这样做。
EG;如果用户将isJSON值设置为1,我将List转换为JSON对象。
我可以在JSP上访问我的List而不是JSON Object。
我尝试将结果类型设置为'json'以获取相关结果名称并实现必要的拦截器。在这种情况下,我无法从用户那里获得任何数据。
我不想添加代码,因为我尝试了很多不同的方法,并且它将大量显示所有内容。我可以根据要求出示。我很期待你的建议。
由于
答案 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。