Есть ли способ синтаксического анализа Java-сети каждый раз, когда веб-данные изменяются без вмешательства пользователя? - PullRequest
0 голосов
/ 31 марта 2019

Я создал устройство Arduino, которое преобразует данные каждый раз, когда поступает почта. Arduino отправляет данные на указанный ниже веб-сервер через Wi-Fi.

<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
<%@ page import="java.sql.*"%>
<!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=EUC-KR">
<title>Mail Log</title>
</head>
<body>
	<table id="mail" align="center" border="0" cellspacing="1" cellpadding="3">
		<tr align="center">
			<td>&nbsp;<strong>Time</strong>&nbsp;</td><td>&nbsp;<strong>Mail</strong>&nbsp;</td>
		</tr>
	<%
		Connection conn=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		try{
			Class.forName("com.mysql.jdbc.Driver");
			conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/STACK","root","mingky1218");
			ps=conn.prepareStatement("SELECT * FROM MESSAGE ORDER BY TIMESTAMP DESC");
			rs=ps.executeQuery();
			while(rs.next()){
				String time=rs.getString("timeStamp");
				String stack=rs.getString("STACK");
				out.println("<tr><td>&nbsp;"+time+"&nbsp;</td><td>&nbsp;Letter: "+stack+"&nbsp;</td></tr>");
			}
		}catch(SQLException e){
			e.printStackTrace();
		}
	%>
	</table>
</body>
</html>

Графический интерфейс Java Fx, который появляется всякий раз, когда данные вводятся в таблицу на веб-сервере, должен изменять значение в режиме реального времени, но оно не изменяется.

    public class Mail {
String mail;
public Mail() {
    try {
        Document doc = Jsoup.connect("http://localhost14999/stackserver/index.jsp").get();
        Element table = doc.select("table").get(0);
        Elements rows = table.select("tr");

        Element row = rows.get(1);
        Elements cols = row.select("td");

        mail=cols.get(1).text();
        }catch(IOException e) {
            System.out.println(e.getMessage());
            System.out.println(e.toString());
        }
}

    public String getMail() {
        return mail;
    }
    }

Выше приведен Jsoup, класс синтаксического анализа, а ниже - контроллер Java fx.

public class Controller implements Initializable {
    @FXML private Label mail;
    private Mail mt=new Mail();

    @Override
    public void initialize(URL location, ResourceBundle resources) {

        Thread thread = new Thread() {
            @Override
            public void run() {                     
                while(true) {
                    String wfmail = mt.getMail();
                    Platform.runLater(()->{         
                        mail.setText(wfmail);
                    });
                    try {Thread.sleep(1000);}catch(InterruptedException e) {}
                }
            }
        };
        thread.setDaemon(true);
        thread.start();
    };
}

Я также пытался выполнить синтаксический анализ с использованием селена, но результаты были такими же.Синтаксический анализ определенных данных завершился успешно, но значение не изменяется в реальном времени.Есть ли хороший способ?

1 Ответ

0 голосов
/ 31 марта 2019

Я не уверен, как работает контроллер Java FX, но я предполагаю, что будет создан только один экземпляр Controller, и если это правильно, вы создаете объект Mail только один раз. Поэтому вы пытаетесь каждый раз вызывать объект getMail () для одного и того же объекта. Поскольку вы запрашиваете index.jsp из своего класса Mail во время создания объекта (т.е. в конструкторе Mail), единственный момент, когда вы действительно читаете данные из index.jsp, - это когда создается объект Mail. И из вышеприведенного предположения это происходит только один раз, когда загружается контроллер FX. Поэтому самый простой способ достичь желаемого - переместить код из конструктора Mail в метод getMail ().

public String getMail() {    
    try {
        Document doc = Jsoup.connect("http://localhost14999/stackserver/index.jsp").get();
        Element table = doc.select("table").get(0);
        Elements rows = table.select("tr");

        Element row = rows.get(1);
        Elements cols = row.select("td");

        return cols.get(1).text();
    }catch(IOException e) {
        System.out.println(e.getMessage());
        System.out.println(e.toString());
        return "";
    }
}

Но имейте в виду, что весь код выглядит уродливо и неочевидно, поэтому его можно использовать только для быстрой попытки.

...