我有一个通过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应用程序出错吗?我在这里做错了什么?
感谢。
答案 0 :(得分:0)
我建议你做的第一件事就是调试不是用自己的客户端进行调试,而是使用curl,这是稳定的,已经经过测试并且令人作呕。
请参阅以下内容:How to POST JSON data with Curl from Terminal/Commandline to Test Spring REST?
看起来您的响应是500或404错误代码。我打赌500,因为你的服务器端似乎没有产生404。
另外,考虑将客户端和服务器迁移到Jersey,这已经解决了所有问题。
但是如果你想坚持你的实现,看起来问题就在于你编写客户端的方式。客户端认为您正在尝试读取文件(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, 它们为实时内容提供了许多功能。