将数据从Servlet传递到JSP(实时)

时间:2015-08-10 16:22:44

标签: java eclipse jsp tomcat servlets

我有一个通过HTTP POST将JSON消息发送到Web服务器的设备。服务器接收JSON消息作为有效负载并解码并将其打印在网页上,并向该帖子发回200 OK响应。

现在,我试图用假的Java客户端代码复制它作为设备和使用servlet和JSP的虚假服务器。 servlet代码和JSP作为一个项目运行,Java代码作为另一个项目运行。

我正在使用Eclipse和Tomcat服务器。

我的代码如下: Servlet代码: (这保存在Java Resources> src> DefaultPackage中)

import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import org.json.JSONException;
import org.json.JSONObject;

@WebServlet("/HelloWorld")
public class HelloWorld extends HttpServlet {  
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        StringBuilder sb = new StringBuilder();

        BufferedReader reader = request.getReader();
        try {
            String line;

            while ((line = reader.readLine()) != null) {

                    sb.append(line).append('\n');
            }
        } finally {
            reader.close();
        }
        System.out.println(sb.toString());

        String api_key = null; 
        try {
            //JSONObject jsonObj = new JSONObject(sb.toString().substring(sb.toString().indexOf('{')));
            //JSONTokener t = new JSONTokener(sb.toString());
                JSONObject obj = new JSONObject(sb.toString().replace("\uFEFF", ""));
                System.out.println(obj.toString());
                api_key= (String) obj.get("api_key");
                //String node_number = (String) obj.get("node_number");
                //String tag_statuses = (String) obj.get("tag_statuses");
                //String voltage = (String) obj.get("voltage");

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        System.out.println("api_key:"+ api_key+"\n");
        response.setStatus(response.SC_OK);

        //response.setContentType("text/html");  
        //PrintWriter out = response.getWriter();  
        //out.println("<h1>"+out +"</h1>");

        RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/NewFile.jsp");
        request.setAttribute("api_key", api_key); // set your String value in the attribute
        dispatcher.forward( request, response );
    }
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws  ServletException, IOException {
        doPost(req, res);
    }
}

JSP代码: (保存在WebContent中)

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<table>
    <tr>
        <td><%=request.getAttribute("api_key")%></td>
    </tr>
</table>
</body>
</html>

Java应用程序代码:

    import java.io.*;
import java.net.*;
import org.json.JSONObject;
public class Client {
    public static void main( String [] args ) {

        try
        {
          JSONObject jsonObj = new JSONObject("{\"api_key\" : \"rien\", \"node_number\" : \"40\", \"tag_statuses\" : [[100,\"MISSING\"]], \"voltage\": \"345\", \"location\": [42.3432,23.0098]}"); 
          URL url = new URL("http://localhost:95/sample/HelloWorld");
          URLConnection uc = url.openConnection();
          HttpURLConnection conn = (HttpURLConnection) uc;
          conn.setDoInput(true);
          conn.setDoOutput(true);
          conn.setRequestMethod("POST");
          conn.setRequestProperty("Content-type", "application/json");        
          PrintWriter pw = new PrintWriter(conn.getOutputStream());
          //pw.write(jsonObj.toString());
          pw.write(jsonObj.toString());
          pw.close();
          BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
          bis.close();

          int responseCode = conn.getResponseCode();
          System.out.println("Response Code recieved is: " + responseCode);

        }
        catch (Exception e)
        {
          e.printStackTrace();
        }
    }
}

在这里,我希望看到servlet收到的内容在JSP上更新,只要servlet上出现一些新内容,可能是刷新网页。

现在,当我尝试运行代码时,如果没有jsp页面,我将从应用程序接收内容,并且java应用程序将获得200状态更新。

但是当我尝试包含JSP代码时,JSP将运行并且我得到一个&#39; null&#39;在JSP上打印,但我在servlet控制台上获取数据,我在Java应用程序代码上得到以下异常(而不是200状态消息),

java.io.FileNotFoundException: http://localhost:95/sample/HelloWorld
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at Client.main(Client.java:21)

有人可以帮我实时获取JSP上打印的内容并避免Java应用程序出错吗?我在这里做错了什么?

感谢。

2 个答案:

答案 0 :(得分:0)

我建议你做的第一件事就是调试不是用自己的客户端进行调试,而是使用curl,这是稳定的,已经经过测试并且令人作呕。

请参阅以下内容:How to POST JSON data with Curl from Terminal/Commandline to Test Spring REST?

看起来您的响应是500或404错误代码。我打赌500,因为你的服务器端似乎没有产生404。

另外,考虑将客户端和服务器迁移到Jersey,这已经解决了所有问题。

https://jersey.java.net/

但是如果你想坚持你的实现,看起来问题就在于你编写客户端的方式。客户端认为您正在尝试读取文件(URL也可能指向文件,而不仅仅是网络URL)。在这里,泽西岛再次成为你的朋友,因为我之前说过,它还有一个HTTP客户端库。

答案 1 :(得分:0)

根据我对Java Servlet和JSP的个人经验,通过您实现的方法无法实现实时更新的功能。这是因为当呈现JSP的请求时,它将使用您的应用在收到请求时包含的任何信息进行呈现,然后发送到浏览器。一旦在浏览器中都是html / css,没有java scriptlet,所以它不会自动更新。

您可以使用Web套接字来实现此实时内容功能,或者只是运行调用某些servlet(ajax调用)的javascript函数,检索信息并更改html内容。

过去使用的Ajax Call for email验证示例。

  $.ajax(
            {
                url: "/validation",     //URL of request
                data:
                {
                    param1:  form.email.value   //Parameter that will be sent.
                },
                async: false,                   // You can make it Async.
                type: "POST",                   // Type of request.
                dataType: "text",               // Expected data type, might be json.
                success: function(data)         // If Ajax is success it will execute this function
                {
                    if(data=="true")
                    {
                        missingStuff =" This email is already registered \n";
                        correoDiv.attr("class", "form-inline has-error");

                    }
                    else
                    {
                        correoDiv.attr("class", "form-inline has-success");
                    }
                }

            }
        );

另一个人认为你可能想看看它是:Socket.io, 它们为实时内容提供了许多功能。