如何使用 JAXBContext 和 Marshaller 在 Web 浏览器上显示 XML

问题描述

我不想创建文件(我知道如何执行此操作,但我想直接在浏览器中查看结果而不是创建文件

下面的代码试图读取电影列表,使用生成输出 XML 方法并将 xml 发送回我的 get 方法,该方法应该在浏览器中显示 xml。

我的 generateOutputXML 方法有效。当我使用 m.marshal(filmList,System.out) 写入控制台时;我可以在控制台中看到预期的 XML,但在浏览器中我看到“model.FilmList@10eb45c4”

@WebServlet("/Control")
public class Control extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    public Control() {
        super();
    }

   
    public static FilmList generateOutputXML (ArrayList<Film> films) throws JAXBException,FileNotFoundException {
        
        // create filmList,assigning film
        FilmList filmList = new FilmList();
        filmList.setFilmList(films);

        StringBuffer outputXML = new StringBuffer();
        // create JAXB context and instantiate marshaller
        JAXBContext context = JAXBContext.newInstance(FilmList.class);
        Marshaller m = context.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE);

        // Write to System.out
        m.marshal(filmList,System.out);
        
        return filmList;
    }
    
    protected void doGet(HttpServletRequest request,HttpServletResponse response) throws servletexception,IOException {
        
        response.setContentType("text/html");
        //response.setContentType("text/xml");
        PrintWriter out = response.getWriter();
        
        String jsonResult;
        Gson gson = new Gson();
        
        FilmDAO fd = new FilmDAO();
        ArrayList<Film> filmList = new ArrayList<Film>();
        
        filmList = fd.getAllFilms();
        jsonResult = gson.toJson(filmList);
        
        FilmList allFilms = new FilmList();

        try {
            allFilms = generateOutputXML(filmList);
        } catch (FileNotFoundException | JAXBException e) {
            e.printstacktrace();
        }

    //jsonResult = gson.toJson(filmList);
    //      out.println(jsonResult);
         out.println("Test");
         out.println(allFilms);

    }


    protected void doPost(HttpServletRequest request,IOException {
    
        doGet(request,response);
    }

解决方法

您正在将生成的 XML 写入 System.out。没有人可以在 web 应用程序中看到该输出。它可能被记录,但用户看不到日志。

您应该将生成的 XML 直接写入响应编写器。

您似乎还想将响应作为 JSON 发送。没关系,但您应该让客户端指定格式。这通常通过 HTTP 标头 Accept 完成,但也可以通过查询参数完成。

这是示例代码。

@Override
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
    // Determine content type
    String format = request.getParameter("format");
    if (format == null || format.equalsIgnoreCase("XML")) {
        response.setContentType("text/xml; charset=UTF-8");
    } else if (format.equalsIgnoreCase("JSON")) {
        response.setContentType("application/json; charset=UTF-8");
    } else {
        throw new ServletException("Unknown format: \"" + format + "\"");
    }

    // Get data
    FilmDAO fd = new FilmDAO();
    ArrayList<Film> films = fd.getAllFilms();

    // Render data directly to response stream
    try (Writer responseWriter = response.getWriter()) {
        if (format == null || format.equalsIgnoreCase("XML")) {

            FilmList filmList = new FilmList();
            filmList.setFilmList(films);

            JAXBContext context = JAXBContext.newInstance(FilmList.class);
            Marshaller m = context.createMarshaller();
            m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE);
            m.marshal(filmList,responseWriter);

        } else if (format.equalsIgnoreCase("JSON")) {

            Gson gson = new GsonBuilder().setPrettyPrinting().create();
            gson.toJson(films,responseWriter);

        }
    } catch (JAXBException e) {
        throw new ServletException("JAXB failed: " + e,e);
    }
}