You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从REST Web Service(Jersey)向JSP发送XML(类Servlet属性方式)

从Jersey REST服务向JSP传递XML(类似Servlet的set/get属性方式)

嘿,这个场景我处理过好几次,其实核心是利用Jersey对Servlet API的支持,把REST服务和JSP的请求上下文打通就行,给你几个实用的方案:

方案1:服务器端内部转发(最接近Servlet的forward方式)

如果你的REST服务处理完XML后,需要直接跳转到JSP展示数据,这时候可以像普通Servlet那样用RequestDispatcher转发,同时通过请求属性传递XML。

步骤:

  1. 在Jersey资源类中注入Servlet的HttpServletRequest和HttpServletResponse对象(用@Context注解)
  2. 把XML数据(可以是字符串、DOM对象或者JAXB实例)设置到请求属性中
  3. 转发到目标JSP

代码示例:

import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Path("/xmlHandler")
public class XmlResource {

    @POST
    public void handleXmlAndForward(@Context HttpServletRequest req, 
                                    @Context HttpServletResponse resp) throws IOException {
        // 假设这里已经处理完原始XML,生成了要传给JSP的新XML内容
        String targetXml = "<user><id>123</id><name>Harsh</name></user>";
        
        // 设置请求属性,和Servlet的setAttribute完全一样
        req.setAttribute("transmittedXml", targetXml);
        
        // 转发到JSP,注意路径要正确
        req.getRequestDispatcher("/showXml.jsp").forward(req, resp);
    }
}

JSP中获取数据:

在showXml.jsp里,你可以用EL表达式直接获取,或者用脚本:

<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<body>
    <h3>Received XML from REST:</h3>
    <!-- 用EL表达式获取,自动转义特殊字符 -->
    <pre>${transmittedXml}</pre>
    
    <!-- 或者用脚本方式(不推荐,但兼容旧代码) -->
    <% 
        String xml = (String) request.getAttribute("transmittedXml");
        out.println("<pre>" + xml + "</pre>");
    %>
</body>
</html>

方案2:重定向+Session存储(适合需要客户端跳转的场景)

如果REST服务需要先返回响应,再让客户端跳转到JSP(比如POST/REDIRECT/GET模式),可以把XML存在Session中,然后重定向到JSP。

代码示例:

@POST
@Path("/xmlRedirect")
public void handleXmlAndRedirect(@Context HttpServletRequest req, 
                                 @Context HttpServletResponse resp) throws IOException {
    String targetXml = "<product><id>456</id><name>Laptop</name></product>";
    
    // 存入Session
    req.getSession().setAttribute("sessionXml", targetXml);
    
    // 重定向到JSP
    resp.sendRedirect("/showSessionXml.jsp");
}

JSP中获取Session数据:

<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<body>
    <h3>XML from Session:</h3>
    <pre>${sessionScope.sessionXml}</pre>
    
    <!-- 用完后建议移除Session属性,避免内存泄漏 -->
    <% session.removeAttribute("sessionXml"); %>
</body>
</html>

方案3:前端AJAX获取+动态渲染(无服务器跳转)

如果不想做服务器端跳转,而是让前端从REST拿到XML后动态展示在JSP页面上,这种方式更灵活:

前端JS代码(放在JSP里):

<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<body>
    <h3>AJAX获取的XML:</h3>
    <div id="xmlDisplay"></div>

    <script>
        // 发送AJAX请求到REST服务
        fetch('/your-app/xmlHandler', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/xml'
            },
            // 这里可以传原始XML数据
            body: '<originalXml>...</originalXml>'
        })
        .then(response => response.text())
        .then(xmlText => {
            // 把XML展示到页面
            document.getElementById('xmlDisplay').innerHTML = '<pre>' + xmlText + '</pre>';
        })
        .catch(error => console.error('Error:', error));
    </script>
</body>
</html>

注意事项:

  • 如果传递的是XML DOM对象,JSP里可以用JSTL或者自定义标签来解析渲染,避免直接输出字符串导致的格式问题
  • 注意XML中的特殊字符(比如<、>),用EL表达式或者fn:escapeXml标签来转义,防止XSS攻击
  • 确保你的Jersey项目已经正确引入Servlet API依赖,否则@Context注入会失败

内容的提问来源于stack exchange,提问作者Harsh Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:06:16