【问题标题】:Struts2: How to insert the html result of an action inside the json result of another actionStruts2:如何将一个动作的html结果插入另一个动作的json结果中
【发布时间】:2015-07-26 18:11:25
【问题描述】:

我有两个动作。一种叫做produceHtml.action。结果是一个呈现的 JSP 页面。 另一个动作称为produceJSON.action,它产生一个对象的 jsonified 内容。

是否有可能在 produceJSON.action 中执行 produceHtml.action 并将生成的 HTML 放入对象的字符串字段中,使其成为 JSON 结果的一部分?

【问题讨论】:

  • 为什么需要这个?如果你需要页面返回它如果你需要 json 使用 json.
  • JSON 结果包含更新页面所需的几个值和插入该页面某处的 HTML 块。我可以自己在代码中构建这个 html 块。但是,如果我可以有一个常规的 JSP 文件并通过一个操作来创建它,那将会更容易和更好。这样我就可以使用所有的标签和 struts 功能。现在我正在使用两个单独的 ajax 调用来做这件事。一个获取 JSON,一个检索 HTML 块。但我想只打一次电话。
  • 可以返回带有一些隐藏值的jsp。因此,您的 html 块将从操作中返回,然后您可以检索隐藏字段以更新您现在使用 json 更新的值。
  • 是的,这实际上是我的 B 计划。我什至可以将完整的 JSON 块隐藏在 JSP 中。这将更容易在浏览器 JS 中解析和处理。但只是为了它,我仍然想知道是否有可能运行一个完整的动作和 JSP 调度来获得生成的 HTML 可能作为 OutputStream。而不是将其写入 HTTP 响应输出流。
  • 您可以使用stream 结果。但是如果你也想处理jsp,那就没那么简单了。

标签: ajax json jsp struts2


【解决方案1】:

感谢question,我发现您可以使用RequestDispatcher 来处理任意JSP。并且可以实现一个简单的HttpServletResponseWrapper 来获取字符串形式的输出。

动作:

public class JsonAction extends ActionSupport implements ServletResponseAware, ServletRequestAware {

    public HttpServletResponse response;
    public HttpServletRequest request;
    private JsonResponse jsonResponse;
    private String jsp;

    @Override
    public void setServletResponse(HttpServletResponse hsr) {
        response = hsr;
    }

    @Override
    public void setServletRequest(HttpServletRequest hsr) {
        request = hsr;
    }

    @Override
    public String execute() throws Exception {
        HttpServletResponseWrapper responseWrapper = new HttpServletResponseWrapper(response) {
            private final StringWriter sw = new StringWriter();

            @Override
            public PrintWriter getWriter() throws IOException {
                return new PrintWriter(sw);
            }

            @Override
            public String toString() {
                return sw.toString();
            }
        };

        request.getRequestDispatcher(jsp).include(request, responseWrapper);

        jsonResponse = new JsonResponse();
        jsonResponse.val1 = "Hello World";
        jsonResponse.val2 = 42;
        jsonResponse.html = responseWrapper.toString();

        return SUCCESS;
    }

    public String getJsp() {
        return jsp;
    }

    public void setJsp(String jsp) {
        this.jsp = jsp;
    }

    public JsonResponse getJsonResponse() {
        return jsonResponse;
    }

    public class JsonResponse {

        public String getVal1() {
            return val1;
        }

        public void setVal1(String val1) {
            this.val1 = val1;
        }

        public Integer getVal2() {
            return val2;
        }

        public void setVal2(Integer val2) {
            this.val2 = val2;
        }

        public String getHtml() {
            return html;
        }

        public void setHtml(String html) {
            this.html = html;
        }
        private String val1;
        private Integer val2;
        private String html;
    }
}

struts.html 片段:

<package name="myapp" extends="json-default">

    <action name="jsonExample" class="JsonAction">
        <param name="jsp">/test.jsp</param>
        <result type="json">
            <param name="root">
                jsonResponse
            </param>
        </result>
    </action>

</package>

这将处理test.jsp 并将响应放入JsonResponse 对象的字符串字段中。最终以 JSON 形式传输。

好消息是,此时ValueStack 已完全初始化,并在其顶部有JsonAction 对象。所以它的行为就像它会被默认的 struts 调度程序结果调度一样。

顺便说一句:该示例使用JSON Plugin。注意struts.html 中的extends="json-default"。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-01
    • 2020-01-13
    • 2023-03-21
    • 2020-12-21
    • 2014-03-05
    • 1970-01-01
    • 2015-12-14
    • 2015-11-20
    相关资源
    最近更新 更多