一尘不染

如何在Struts 2中使用JSP返回JSON结果

jsp

我知道在Struts2中可以使用json插件返回json类型结果。一个json也可以从返回的stream结果像这样的答案。

在Struts2文档页面上,使用JSP的Ajax结果,我发现可以dispatcher使用输出JSON的JSP 返回类型结果。

<%@ page import="java.util.Iterator,
         java.util.List,
         com.esolaria.dojoex.Book,
         com.esolaria.dojoex.BookManager" %>
<%
    String bookIdStr = request.getParameter("bookId");
    int bookId = (bookIdStr == null || "".equals(bookIdStr.trim()))
        ? 0 : Integer.parseInt(bookIdStr);
    Book book = BookManager.getBook(bookId);
    if (book != null) {
        out.println(book.toJSONString());
        System.out.println("itis: " + book.toJSONString());
    }
%>

但是它正在使用scriptlet向外部写入JSON。我知道强烈建议不要在JSP中使用scriplets。但是在这个问题中我找不到我的问题的答案。如何避免JSP文件中的Java代码?。如何使用JSP结果生成JSON对象?是否有更好的方法从JSP返回JSON对象?


阅读 243

收藏
2020-06-10

共1个答案

一尘不染

您可以通过dispatcher结果返回JSP ,然后使用<s:property />标记调用一个操作方法,该方法将返回JSP中的序列化数据。

您还应该contentType为您的JSP 表达权利:

public class DispatcherJsonAction extends ActionSupport {

    private Book book;

    @Action("dispatcherJson")
    @Result(name = ActionSupport.SUCCESS, location = "page.jsp")        
    public String execute(){
        book = loadBookSomeHow();
        return SUCCESS;
    }

    public String getJsonBook(){
        Gson gson = new Gson();
        try {
            return gson.toJson(book);
        } catch (Exception e){
            return gson.toJson(e.getMessage());
        }
    }

}

page.jsp:

<%@page language="java" contentType="application/json; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<s:property value="jsonBook" />
2020-06-10