0

很抱歉用这个来打断你的一天,但我已经花了很长时间在网上搜寻答案,但我完全被困住了!

在 Web 应用程序中,我使用 RequestDispatcher 将请求从 servlet_A 发送到 servlet_B。在 servlet_B 中,我运行一些代码来生成一个简单的字符串值,该值作为对 servlet_A 的响应返回。

servlet A 中的代码:

ServletContext context = getServletContext();
RequestDispatcher dispatcher = context.getRequestDispatcher("/servlet_B");
dispatcher.forward(request, response);

/*
How do I catch the response from servlet_B and convert it to a String?
*/

servlet B 中的代码:

/*
Some other code which creates a String
*/

String result = "someValue";

// Send the response to servlet_A.
response.setContentType("text/plain");
response.setContentLength(result.length());
PrintWriter out = response.getWriter();
out.println(result);

在 servlet_A 中,我需要将来自 servlet_B 的响应转换为一个简单的字符串值,这就是我坚持的一点。如何将来自 servlet_B 的响应作为 servlet_A 中的简单字符串处理?

我想我需要使用 PrintWriter 来解析响应,我已经在网上搜索了一个示例,但我能找到的只是展示如何使用 PrintWriter 发送响应或将数据输出到屏幕的示例。

如果有人可以帮助我,我将不胜感激。

4

3 回答 3

1

从技术上讲,您在挽救问题方面走错了方向。您要转发到的另一个 servlet 显然是紧耦合的,它的代码需要重构为一个独立类,该类立即将所需数据作为字符串返回,以便另一个 servlet 可以将其写入响应并且当前 servlet 可以直接使用独立类,而不是首先为此调用整个其他 servlet。

忽略臭气熏天的糟糕设计,您可以通过将当前响应替换为HttpServletResponseWrapper写入内部字符串缓冲区而不是实际响应主体的实现来解决它。这是一个适合您特定功能要求的具体启动示例(应注意实际实现可能比这复杂得多,您还需要考虑getOutputStream()getCharacterEncoding()考虑):

final StringWriter buffer = new StringWriter();
request.getRequestDispatcher("/servlet_B").include(request, new HttpServletResponseWrapper(response) {
    private PrintWriter writer = new PrintWriter(buffer);
    @Override
    public PrintWriter getWriter() throws IOException {
        return writer;
    }
});

String writtenByServletB = buffer.toString();
// ...
于 2013-02-01T18:19:25.650 回答
0

我想您所需要的只是将一个字符串从前一个 servlet 传递到下一个,然后您所要做的就是在您的请求对象中添加一个属性。因此,当您将请求传递给下一个 servlet 时,请求对象将值设置为属性

所以在第一个 Servlet 中你可以写

String sendThisValue = "some Important value to be sent";
request.setAttribute("sendThisValue",sendThisValue);
RequestDispatcher dispatcher = context.getRequestDispatcher(“/servlet_B”);
dispatcher.forward(request, response);

然后当控制传递到下一个 servlet 时,您可以通过请求对象访问您在上一个 servlet 中设置的值

String gotTheValue = request.getAttribute("sendThisValue");
于 2013-02-01T18:09:16.690 回答
0

在 servlet BI 中认为您可以再次使用调度程序返回到 servlet A

ServletContext context = getServletContext();
RequestDispatcher dispatcher = context.getRequestDispatcher(“/servlet_A”);
request.setAttribute("result",result);//the String you want to pass
dispatcher.forward(request, response);
于 2013-02-01T17:52:42.227 回答