【问题标题】:How to invoke localhost servlet with URL Connection without specifying full url?如何在不指定完整 url 的情况下使用 URL 连接调用 localhost servlet?
【发布时间】:2012-08-07 15:19:25
【问题描述】:

我正在从 jsp 调用本地 servlet,servlet 只是返回一个 json 字符串:

URL url = new URL("http://myapp.appspot.com/myservlet");
URLConnection conn = url.openConnection();
conn.setConnectTimeout(5000);
InputStream is = conn.getInputStream();

StringWriter writer = new StringWriter();
IOUtils.copy(is, writer, "UTF-8");

String jsonStr = writer.toString();

我可以使用相对路径来执行此操作,以便它在本地和部署的实例上都有效吗?

【问题讨论】:

  • JSP 和 servlet 是同一个应用程序的一部分吗?如果是这样,那么您不应该对 servlet 进行 HTTP 调用。您应该重构您的代码,以便可以从 JSP 访问生成 JSON 字符串的代码。
  • @Michael 是的,它是同一个应用程序 - 在标准场景中,我会按照您的建议从 jsp 直接转到数据存储区,但是其他应用程序也已经访问了 servlet,所以我宁愿不要重复那个逻辑。我可能最终会为了性能而改变它,但我只是想知道是否有一种方法可以在不指定完整路径的情况下做到这一点:)

标签: java google-app-engine servlets urlconnection


【解决方案1】:

你可以使用带有标签的 JSTL

<c:import>   

或者,对于您发布的代码,您可以使用

   String requestURL = request.getRequestURL().toString();
   String servletPath = request.getServletPath();
   String serverPath = requestURL.substring(0,requestURL.indexOf(servletPath));
   URL url = new URL(serverPath + "/myservlet");

【讨论】:

    【解决方案2】:

    你的意思是这样的?

    String urlString = "http://localhost/myservlet/";
    

    localhost 是 127.0.0.1 的别名,它始终是“本地计算机”。

    ServletRequest.getServerPort() 会让你知道用户连接的端口。

    根据发生的位置,您可能真正想要使用的是 ServletRequest.getRequestDispatcher(),它绕过网络层,并保留在您的 servlet 容器中。

    您可以包装 HttpResponse,并将其发送到 RequestDispatcher,然后提取使用以下内容生成的字符串:

    http://goo.gl/kRW1b
    

    【讨论】:

    • 谢谢,但我不需要指定端口吗?开发环境中的端口是已知的,但我不知道如何确定部署的应用程序引擎实例上的端口(如果它不同,那么就像指定不同的 url)。
    • 布拉德我不认为使用ServletRequest.getRequestDispatcher() 会起作用。 RequestDispatcher 类只允许您将请求转发到另一个 servlet 或将另一个 servlet 的响应包含在调用 servlet 的响应中。你不能,比如,调用一个 servlet,然后将响应作为字符串返回。
    • 关于端口的扩展建议以及如何通过 RequestDispatcher 从子请求中获取响应。
    猜你喜欢
    • 2019-09-26
    • 2010-11-28
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 2020-10-30
    • 1970-01-01
    相关资源
    最近更新 更多