2017-05-02 131 views
0

您好我正在编写一个本地托管的Web服务器,它将在Android设备的URL/URI中发布纬度和经度,并将用作SQL中的搜索条件选择查询以检索5个关闭的火车站。从数据库获取/发布web服务

我与硬编码的经度和纬度的代码工作,但现在需要在它的功能添加动态地添加形式使用Post /获取功能格兰Adnroid内设备,不幸的是我从来没有使用GET/POST等等不知道从哪里开始。

下面是我在网络服务器的所有类的代码,正如所说的所有工作硬编码,但现在需要接受来自android设备的输入并返回相同的预期结果。由于

public class WebServer { 

    static String jArray = ""; 
    public static void main(String[] args) { 


     try{ 

      HttpServer server = HttpServer.create(new InetSocketAddress(8080),0); 
      server.createContext("/",new HttpHandler(){ 

       public void handle(HttpExchange he) throws IOException{ 



         try { 
          jArray = sqlConnector.train(jArray); 
         } catch (Throwable e) { 
          e.printStackTrace(); 
         } 

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(he.getResponseBody())); 
        System.out.println("Processing Request"); 
        he.sendResponseHeaders(200, 0); 
        String output = "<html><head></head><body><p>" + jArray + "</p></body></html>"; 
        bw.write(output); 
        bw.close(); 
       } 
      }); 
      server.start(); 
      System.out.println("Started up . . ."); 
     } 
     catch (IOException ioe){ 
      System.err.println("problems Starting Webserver: " + ioe); 
     } 

    } 

} 

public class sqlConnector { 

    public static String train(String jArray) throws Exception{ 
     PreparedStatement s = null; 
     try 
     { 
      Connection c = DriverManager.getConnection("jdbc:sqlite:C:/Users/Colin/trainstations.db"); 
      s = c.prepareStatement("SELECT Latitude, Longitude, StationName,(3959 * acos(cos(radians(53.4355)) * cos(radians(Latitude)) * cos(radians(Longitude) - radians(-3.0508)) + sin(radians(53.4355)) * sin(radians(Latitude)))) AS distance FROM stations ORDER BY distance ASC LIMIT 0,5;"); 
      ResultSet rs = s.executeQuery(); 
      jArray = jsonConverter.convertResultSetIntoJSON(rs, jArray); 

     } 
     catch (SQLException se) 
     { 
      se.printStackTrace(); 
     } 
     return jArray; 

    } 
} 

public class jsonConverter { 

    public static String convertResultSetIntoJSON(ResultSet rs, String jArray) throws Exception { 
     JSONArray jsonArray = new JSONArray(); 
     while (rs.next()) { 
      int total_rows = rs.getMetaData().getColumnCount(); 
      JSONObject obj = new JSONObject(); 
      for (int i = 0; i < total_rows; i++) { 
       String columnName = rs.getMetaData().getColumnLabel(i + 1).toString(); 
       Object columnValue = rs.getObject(i + 1); 
       obj.put(columnName, columnValue); 
      } 
      jsonArray.put(obj); 
     } 
     jArray = jsonArray.toString(); 
     return jArray; 
    } 

}

我目前连接到主机相同的数据并完全functinal和端口号后,其格式如下

/stations?lat=" + lat + "&lng=" + lng); 

其中纬度和经度另一个网站服务器是我的变量采用GPS

回答

0

该过程将是这样的:

1)从解析查询字符串he.getRequestURI()的参数。getQuery()

/** 
    * returns the url parameters in a map 
    * @param query 
    * @return map 
    */ 
    public static Map<String, String> queryToMap(String query){ 
    Map<String, String> result = new HashMap<String, String>(); 
    for (String param : query.split("&")) { 
     String pair[] = param.split("="); 
     if (pair.length>1) { 
      result.put(pair[0], pair[1]); 
     }else{ 
      result.put(pair[0], ""); 
     } 
    } 
    return result; 
    } 

2)这些参数传递到选择方法

public static String train(String jArray, double lat, double long) throws Exception{ 

3)在声明中使用它

s = c.prepareStatement("SELECT Latitude, Longitude, StationName, 
     (3959 * acos(cos(radians(?)) * cos(radians(Latitude)) 
     * cos(radians(Longitude) - radians(?)) + sin(radians(?)) 
     * sin(radians(Latitude)))) 
    AS distance FROM stations ORDER BY distance ASC LIMIT 0,5;"); 
s.setDouble(1, lat); 
s.setDouble(2, long); 
s.setDouble(3, lat);  

最后

4)修正你的代码。

  • 使用数据库连接池,而不是连接到数据库,每个呼叫
  • 使用try-与资源以自动关闭ResultSet,PreparedStatement中的连接(即使是在错误的情况下)

希望有助于作为粗略指导:-)