繁体   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