JSTL: Как мне учитывать экранирующие последовательности HTML на? - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть Java Dynamic Web Project, в котором один из сервлетов выполняет следующие действия:

    /**
     * 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);
    }

}

Один из сервлетов выводит данные в формате xml / json / csv на основе URL-запроса (дляexmaple / data? format = json вернет данные json для всех фильмов в базе данных).

Посредством отладки я обнаружил, что мои методы JAXB / GSON правильно создают набор данных из моей модели, однако при просмотре в ответе браузеру что-то идет не так, что, вероятно, выглядит как escape-последовательности HTML для специальных символовтакие как <в тегах xml. </p>

json

xml

Это сужает дочто-то делать с методом "" в 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, верныотладкой:

debug screen shot 1

debug screen shot 2

Если проблема с тем, что я делаю, не будетрешен каким-то лучшим механизмом для обслуживания данных xml / json / csv, чем просто передача их в файл jsp?предложения приветствуются.

1 Ответ

0 голосов
/ 24 декабря 2018

В теге JSTL установите escapeXML на false , чтобы сохранить исходные символы.В противном случае escapeXML true сделает противоположное.

<c:out value='${foo(someParameter)}' escapeXml="false"/> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...