【问题标题】:How do I convert a response from a servlet to a String?如何将响应从 servlet 转换为字符串?
【发布时间】:2013-02-01 17:32:31
【问题描述】:

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

在 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吗?难道你不能使用一个简单的类来接收 HttpServletRequest 和 HttpServletRequest 作为参数,完成工作然后返回到 Servlet A?
  • 您好 Diogo,感谢您的贡献。恐怕是这样。当 servlet_B 收到来自 servlet_A 的请求时,该请求被重定向到 jsp 以供用户输入,所以我一直坚持使用 servlet。
  • 我的意思是:据我了解,您的 servlet B 存在只是因为您必须对请求和响应对象进行一些处理,然后返回到 servlet A,对吗?如果是这样,您可以将 servlet B 更改为可以为您完成工作的类,并且仅在您需要时才实例化它。
  • 嗨,迪奥戈,再次感谢。如果只是处理数据的问题,我可以用一个普通的java类。但是,当请求到达 servlet_B 时,需要将请求重定向到 java 服务器页面以供用户输入,我想我需要一个 servlet……
  • 我了解到您在处理数据后从 Servlet B 重定向到 A... 抱歉! (:

标签: java servlets response printwriter requestdispatcher


【解决方案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();
// ...

【讨论】:

    【解决方案2】:

    在 servlet B 中,我认为您可以再次使用调度程序返回到 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_B 将作为单独的 WAR 文件的一部分导入到 web-app 中,并且不知道 servlet_A 的地址,这会使请求转发有点问题。有趣的想法,但这种方法可能会导致进一步的问题,我认为我仍然坚持必须以正常方式处理来自 servlet_B 的响应。但是,嘿,感谢您的关注……
    • 你是如何访问 servlet 的,我的意思是 servlet 调用的步骤是什么???
    【解决方案3】:

    我想你需要的只是将一个字符串从前一个 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");
    

    【讨论】:

    • 嗨,侯赛因。如果我理解正确,您是在建议我如何在 servlet_A 中的请求中添加数据,然后再将其发送到 servlet_B。感谢您的帮助,但恐怕这不是问题所在。问题是从servlet_B返回后如何处理servlet_A中的响应。
    猜你喜欢
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2017-01-17
    • 2021-12-05
    • 1970-01-01
    • 2021-06-01
    • 2012-10-14
    相关资源
    最近更新 更多