[英]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,这已经解决了所有问题。
但是,如果您想坚持自己的实现,看来问题出在编写客户端的过程中。 客户端认为您正在尝试读取文件(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");
}
}
}
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.