簡體   English   中英

將數據從Servlet傳遞到JSP(實時)

[英]Passing data from Servlet to JSP (real time)

我有一台通過HTTP POST將JSON消息發送到Web服務器的設備。 服務器接收JSON消息作為有效載荷,然后將其解碼並打印在網頁上,還向該帖子發送200 OK響應。

現在,我正在嘗試使用偽造的Java客戶端代碼使用servlet和JSP將其復制為設備和偽造的服務器。 Servlet代碼和JSP作為一個項目運行,而Java代碼作為另一個項目運行。

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

我的代碼如下:Servlet代碼:(保存在Java資源> 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將運行,並且在JSP上顯示“ null”,但在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應用程序上的錯誤嗎? 我在這里做錯了什么?

謝謝。

我建議您要做的第一件事不是使用自己的客戶端調試東西,而是使用curl,它是穩定的並且已經過測試,非常惡心。

請參閱以下內容: 如何使用Curl從終端/命令行發布JSON數據以測試Spring REST?

看來您的回應是500或404錯誤代碼。 我敢打賭500,因為您的服務器端似乎沒有產生404。

另外,考慮將客戶端和服務器都遷移到Jersey,這已經解決了所有問題。

https://jersey.java.net/

但是,如果您想堅持自己的實現,看來問題出在編寫客戶端的過程中。 客戶端認為您正在嘗試讀取文件(URL可能還指向文件,而不僅僅是網絡URL)。 正如我之前所說,Jersey又是您的朋友,因為它也具有HTTP客戶端庫。

根據我在Java Servlet和JSP方面的個人經驗,無法通過您所實現的方法來實現實時更新的功能。 這是因為呈現JSP的請求時,它將在接收到該請求時與您的應用程序包含的任何信息一起呈現,然后將其發送到瀏覽器。 一旦進入瀏覽器,所有的html / css都不會包含Java scriptlet,因此它不會自動更新。

您可以使用Web套接字實現此實時內容功能,也可以簡單地運行javascript函數來調用某些servlet(ajax調用),檢索信息並更改html內容。

過去使用Ajax Call進行電子郵件驗證的示例。

  $.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 ,它們提供了許多用於實時內容的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM