【问题标题】:JSTL: How do I account for HTML escape sequences on <C:OUT>?JSTL:我如何解释 <C:OUT> 上的 HTML 转义序列?
【发布时间】:2018-12-20 15:25:19
【问题描述】:

我有一个 Java 动态 Web 项目,其中一个 Servlet 执行以下操作:

    /**
     * Servlet implementation class DataAPIServlet
     */
    @WebServlet(name = "data", urlPatterns = { "/data" })
    public class DataAPIServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private String format;   

    /**
     * @see HttpServlet#HttpServlet()
     */
    public DataAPIServlet() {
        super();
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse 
    response)*/
    protected void doGet(HttpServletRequest request, HttpServletResponse 
    response) throws ServletException, IOException {
        format = request.getParameter("format").replaceAll("\"", "");

        // create data model and add to request object

        RequestDispatcher requestDispatcher = null;

        if (format.equals(null)) {
            requestDispatcher = jsonDispatcher(request);
            response.setContentType("text/json");
        } else {

            System.out.println("SERVING FORMATTED DATA : " + format);
            String returnString;
            switch (format.toLowerCase()) {


            case "xml":
                returnString = Films.getFilmsXML();
                request.setAttribute("data", returnString);
                requestDispatcher = xmlDispatcher(request);
                response.setContentType("text/xml;charset=UTF-8");
                response.setCharacterEncoding("UTF-8");
                break;
            case "csv":
                returnString =  Films.getFilmsCSV();
                request.setAttribute("data",returnString);
                requestDispatcher = csvDispatcher(request);
                response.setContentType("text");
                break;
            case "json":
                returnString =  Films.getFilmsJSON();
                request.setAttribute("data", returnString);
                requestDispatcher = jsonDispatcher(request);
                response.setContentType("text/json");
                response.setContentType("text/json;charset=UTF-8");
                response.setCharacterEncoding("UTF-8");
                break;
            }
        }

        // Forward the request to the view
        requestDispatcher.forward(request, response);
    }

    private RequestDispatcher xmlDispatcher(HttpServletRequest request){
        return request.getRequestDispatcher("xml.jsp");
    }

    private RequestDispatcher jsonDispatcher(HttpServletRequest request) {
        return request.getRequestDispatcher("json.jsp");
    }

    private RequestDispatcher csvDispatcher(HttpServletRequest request){
        return request.getRequestDispatcher("csv.jsp");
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse 
     response)*/
    protected void doPost(HttpServletRequest request, HttpServletResponse 
    response) throws ServletException, IOException {
        doGet(request, response);
    }

}

其中一个 servlet 根据 url 查询以 xml/json/csv 格式输出数据(例如 /data?format=json 将返回数据库中所有电影的 json 数据)。

通过调试,我发现我的 JAXB/GSON 方法正在正确地从我的模型创建数据集,但是当在对浏览器的响应中查看时出现了问题,这可能看起来像是特殊字符的 HTML 转义序列,例如“

这将其范围缩小到与 JSTL 中的 "" 方法有关。

我的XML由以下jsp显示:

<%@page contentType="application/xml" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page trimDirectiveWhitespaces="true"%>
<c:set var="data" value="${data}"></c:set>
<c:out value="${data}" />

我可以通过调试告诉 JSP 响应传递的数据是正确的:

除非我正在做的问题可以通过一些更好的机制来提供 xml/json/csv 数据而不是简单地将其提供给 jsp 文件?欢迎提出建议。

【问题讨论】:

    标签: java html jsp jstl


    【解决方案1】:

    在 JSTL 的标签中设置 escapeXML 为 false 以保持原始字符。否则 escapeXML true 会做相反的事情。

    <c:out value='${foo(someParameter)}' escapeXml="false"/> 
    

    【讨论】:

      猜你喜欢
      • 2012-09-09
      • 2023-03-05
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2023-02-19
      相关资源
      最近更新 更多