【问题标题】:Not able to retrieve data from Servlet无法从 Servlet 检索数据
【发布时间】:2014-10-03 07:52:02
【问题描述】:

我正在尝试在HttpURLConnection 中写入一些消息,并且我正在尝试在 Servlet 中检索相同的消息。这是两个不同的应用程序。

消息写入代码 (无异常处理)

   public static void formUrlAndWrite() 
   {
    URL url = null;
    HttpURLConnection httpConnection = null;
    OutputStreamWriter outStream = null;
    String host = "http://127.0.0.1:8080/HttpTester";
    url = new URL(host);
    httpConnection = (HttpURLConnection) url.openConnection();
    httpConnection.setDoOutput(true);
    httpConnection.setAllowUserInteraction(true);
    httpConnection.setDefaultUseCaches(false);  
    outStream = new OutputStreamWriter(httpConnection.getOutputStream());
    outStream.write("This is a plain text");
    outStream.flush();
}

Servlet 代码 (无异常处理)

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException
{
        BufferedReader reader = null;
        PrintWriter out = null;
        StringBuffer buffer = new StringBuffer();
        try
        {
            //reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
            reader = request.getReader();
            int read = 0;
            char[] charArray = new char[2000];

            while((read=reader.read(charArray))>-1)
            {
                buffer.append(charArray, 0, read);
            }
            response.setContentType("text/html");
            out = response.getWriter();

            out.println("<html><body>");
            out.print("<h2> Request Buffer is"+buffer+"</h2>");
            out.println("</body></html>");
        } 
}

这两个应用程序异步运行,我没有从我的 servlet 获得输出。我的疑问是如果我运行消息写入应用程序,它会将数据写入 url。那么当我运行servlet时,它是如何获取请求的呢?可能我在这方面做错了什么。任何帮助表示赞赏。

我尝试了以下与我的问题非常相似的 URL,但没有帮助。

Getting request payload from POST request in Java servlet

【问题讨论】:

    标签: java servlets


    【解决方案1】:

    如果您无法在第二个 servlet 中检索任何数据,可能是因为您在某处调用了类似 request.getParameter() /getParameterValues()/getParameterMap() 的东西。事实上,这些方法调用getInputStream(),您只能读取一次请求的内容。

    【讨论】:

    • 感谢您的回复。这个想法是我的第一个应用程序总是会在 url 中写入一些内容。在第二个应用程序中,我的 servlet 应该检索我的第一个应用程序编写的内容。我的问题是第一个应用程序的编写很好,但是在我的 servlet 中我没有得到内容。我需要 servlet 中的内容,我不想将任何内容发送回我的第一个应用程序。
    • @Som Sry 不太了解您的需求,我已经编辑了答案。
    • 感谢您的回复。你之前的回答是正确的。我有一个 Java 程序,它在 url 中写入一些消息。我有一个单独的 servlet(一个单独的应用程序),它假设接收请求并打印由第一个 java 程序编写的消息。但我无法实现它。到目前为止,我所取得的成就是 Write the message in URL (Java Program1) -&gt; do the processing in Servlet (Java Program2) -&gt; Print the processed message (Java Program1) 感谢您展示路径。但是我原来的问题仍然没有解决。
    • 好的,如果你调试,你的阅读器里有内容吗?根据当前信息,我无法为您提供更多帮助。要么是已经读取的请求,因此不能被读取两次。或者你正确地阅读了请求,但你阅读它的方式是错误的。另外,当您说print the message written by first java program 时,您的意思是打印在哪里?
    【解决方案2】:

    我在android中使用过这段代码, 它可能会帮助你,它可能不是完整的解决方案

    写入服务器

     try{
    
                   String u="hello";
                   String p="world";
    
                     URL url=new URL("http://localhost:8080/LoginExample/LoginServlet?"+"key1="+u+"&key2="+p);
    
                    HttpURLConnection urlConnection=(HttpURLConnection)url.openConnection();
    
                    urlConnection.setRequestMethod("GET");
                    urlConnection.connect();
    
    
                }catch(Exception e)
                    {
                    e.printStackTrace();    
                    System.out.println("ERROR IN URL CONNECTION---"+e);
                    }
    

    Servlet 页面

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    public class LoginServlet extends HttpServlet {
    
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
                   throws ServletException, java.io.IOException {
    
        try
        {       
            System.out.println("-----servlet--------------");
            // UserBean user = new UserBean();
            String uname=request.getParameter("key1");
            String password=request.getParameter("key2");
    
            System.out.println("uname ins ervlet==="+uname);
    
            System.out.println("password in servlet==="+password);
        }               
        catch (Throwable theException)      
        {
            System.out.println(theException); 
        }
    
     }
    
     }
    

    【讨论】:

    • 非常感谢您的回复。我试过你的程序。但这不起作用。我运行第一个程序,然后运行 ​​servlet,我得到 uname ins ervlet===nullpassword in servlet===null
    【解决方案3】:

    我认为您应该将结果转换为字符串,以便代码类似于此(在您的 servlet 页面中):

    String uname=(String)request.getParameter("key1");//cast to string
    String password=(String)request.getParameter("key2");//cast to string
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-24
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多