2015-08-10 8 views
0

У меня есть устройство, которое отправляет сообщение 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? Что я здесь делаю неправильно?

Спасибо.

+0

Вы уверены, что ваш URL-адрес «http: // localhost: 95/sample/HelloWorld»? (порт обычно 8080 не 95) –

+0

Номера портов могут быть любыми, что вы хотите (есть верхний предел). Ограничения зависят от ОС (для * unix, ниже 1024, если вы не являетесь суперпользователем) и существуют ли другие процессы с тем же портом, связанным с одним и тем же IP. – Akira

+0

@RC. для доступа к сервлету, да. Данные отправляются с клиента на Servlet, но я не могу его отобразить на веб-странице с помощью JSP. – Qkxx

ответ

0

Первое, что я рекомендую вам сделать, - это отлаживать вещи не у вашего собственного клиента, а с помощью завитка, который является стабильным и уже протестированным ad nauseam.

Смотрите следующее: How to POST JSON data with Curl from Terminal/Commandline to Test Spring REST?

Похоже, что ваш ответ либо код ошибки 500 или 404. Я ставлю 500, так как ваша серверная сторона, похоже, не производит 404.

Кроме того, рассмотрите возможность переноса как клиента, так и сервера на Джерси, который уже решает все ваши проблемы.

https://jersey.java.net/

Но если вы хотите, чтобы придерживаться своей реализации, это выглядит как проблема на том, как вы пишете ваш клиент. Клиент считает, что вы пытаетесь прочитать файл (URL-адрес также может указывать на файлы, а не только на сетевые URL-адреса). И снова Джерси - ваш друг, поскольку, как я уже говорил, он также имеет клиентскую библиотеку HTTP.

+0

Привет, Акира, спасибо за ответ. Есть ли другой способ без использования дополнительных платформ. Я видел похожие вопросы к этому при переполнении стека, и я следил за решениями, но, похоже, он не работает в моем случае. – Qkxx

+0

Ваш код выглядит отлично. Но я подозреваю, что вы получаете ошибку HTTP 400, как я уже сказал. Кажется, что вы получаете исключение, сгенерированное этой строкой: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/net/www /protocol/http/HttpURLConnection.java#1259 Вот почему я предложил сначала проверить, доступен ли URL и какой HTTP-код вы получаете, обратившись к нему с помощью CURL. Таким образом, вы сначала проверяете сервер и только после того, как убедитесь, что сервер работает, вы можете начать пытаться исправить клиента. – Akira

+0

Но клиент и сервер отлично работают без страницы JSP, когда я пытаюсь включить JSP, я получаю сообщение об ошибке на стороне клиента. Кроме того, вы предлагаете другой способ отображения содержимого, полученного от клиента на веб-странице. – Qkxx

0

Из моего личного опыта использования Java-сервлетов и JSP функциональность обновления в реальном времени не реализуется с помощью метода, который вы реализуете.Это связано с тем, что когда запрос на JSP отображается, он будет отображаться с любой информацией, которую содержит ваше приложение при получении запроса, а затем отправляется в браузер. Однажды в браузере все html/css, нет java scriptlets, поэтому он не будет обновляться автоматически.

Вы можете использовать веб-сокеты для достижения этой функции живого контента или просто запустить функцию javascript, которая вызывает некоторый сервлет (вызовы 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, они предлагают много возможностей для контента в реальном времени.

+0

Привет, Дэнни, не могли бы вы направить меня на какой-то пример или образец кода, который делает то, что вы предложили. – Qkxx

+0

Я отредактировал ответ, пожалуйста, дайте мне знать, если у вас возникнут дополнительные вопросы ... –

Смежные вопросы