Java 如何将servlet的响应转换为字符串?

Java 如何将servlet的响应转换为字符串?,java,servlets,response,printwriter,requestdispatcher,Java,Servlets,Response,Printwriter,Requestdispatcher,很抱歉打断了你的一天,但我花了很长时间在网上寻找答案,我完全被卡住了 在web应用程序中,我使用RequestDispatcher将请求从servlet_a发送到servlet_B。 在servlet_B中,我运行一些代码,生成一个简单的字符串值,作为对servlet_a的响应返回 servlet A中的代码: ServletContext context = getServletContext(); RequestDispatcher dispatcher = context.getReque

很抱歉打断了你的一天,但我花了很长时间在网上寻找答案,我完全被卡住了

在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发送响应,或将数据输出到屏幕


如果有人能帮助我,我将非常感激。

在servlet B中,我想您可以再次使用dispatcher返回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);

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

因此,在第一个Servlet中,您可以编写

String sendThisValue = "some Important value to be sent";
request.setAttribute("sendThisValue",sendThisValue);
RequestDispatcher dispatcher = context.getRequestDispatcher(“/servlet_B”);
dispatcher.forward(request, response);
然后,当控件传递到下一个servlet时 您可以通过以下方式使用th请求对象访问在以前的servlet中设置的值:

String gotTheValue = request.getAttribute("sendThisValue");

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

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


是否真的需要一个Servlet B?您不能使用一个简单的类来接收HttpServletRequest和HttpServletRequest作为参数,完成这些工作,然后返回Servlet吗?嗨,Diogo,感谢您的贡献。恐怕是这样。当servlet_B收到来自servlet_a的请求时,请求会被重新定向到jsp以供用户输入,因此我只能使用servlet。我的意思是:据我所知,servlet B的存在只是因为您必须对请求和响应对象进行一些处理,然后返回servlet a,对吗?如果是这样,您可以将servlet B更改为一个类,该类将为您完成这项工作,并且只在您需要时对其进行实例化。如果这只是一个处理数据的问题,我可以使用一个普通的java类。但是,当请求到达servlet_B时,需要将请求重新定向到java服务器页面以供用户输入,我想我需要一个servlet来实现这一点……我知道,在处理数据之后,您可以从servlet B重定向到a。。。很抱歉(:有趣!我没有想到……这种方法可能会有一些问题——在最终实现中,servlet_B将作为单独WAR文件的一部分导入web应用程序,并且不知道servlet_a的地址,这会使请求转发成为一个问题。有趣的想法,但这种方法可能会导致进一步的问题,我想我仍然必须以正常的方式处理servlet_B的响应。但是,嘿,谢谢你的关注…你是如何访问servlet的,我的意思是servlet调用的步骤是什么???嗨Hussain。如果我理解正确,你是在建议我如何添加数据在将请求发送到servlet_B之前,将其发送到servlet_A中。感谢您的帮助,但恐怕这不是问题所在。问题在于从servlet_B返回响应后如何处理servlet_A中的响应。
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();
// ...