У меня есть устройство, которое отправляет сообщение JSON через HTTP POST, на веб-сервер. Сервер получает сообщение JSON как полезную нагрузку и декодирует и печатает его на веб-странице, а также отправляет ответ 200 OK на сообщение.Передача данных из сервлета в JSP (в реальном времени)
Теперь я пытаюсь повторить то же самое с поддельным кодом клиента Java, чтобы действовать как устройство и поддельный сервер, используя сервлет и JSP. Код сервлета и JSP запускаются как один проект, а код Java - как другой проект.
Я использую сервер Eclipse и Tomcat.
Мой код выглядит следующим образом: Servlet Код: (Это сохраняется в Java Resources> ЦСИ> 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();
}
}
}
Здесь я хотел бы, чтобы содержимое, полученное сервлетом, обновлялось в JSP, всякий раз, когда на сервлете появляется какой-то новый контент, возможно, обновив веб-страницу.
Теперь, когда я пытаюсь запустить код, без страницы jsp, я получаю содержимое из приложения, а приложение java получает обновление статуса 200.
Но когда я пытаюсь включить JSP-код, JSP запустится, и я получу «нуль», напечатанный на JSP, но я получаю данные на консоли сервлета, и я получаю следующее исключение в коде приложения 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? Что я здесь делаю неправильно?
Спасибо.
Вы уверены, что ваш URL-адрес «http: // localhost: 95/sample/HelloWorld»? (порт обычно 8080 не 95) –
Номера портов могут быть любыми, что вы хотите (есть верхний предел). Ограничения зависят от ОС (для * unix, ниже 1024, если вы не являетесь суперпользователем) и существуют ли другие процессы с тем же портом, связанным с одним и тем же IP. – Akira
@RC. для доступа к сервлету, да. Данные отправляются с клиента на Servlet, но я не могу его отобразить на веб-странице с помощью JSP. – Qkxx