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 works 和 root
object。
我搜索了这个案例,但找不到解决方案。
我想根据用户请求从同一操作 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 works 和 root
object。