【问题标题】:get/post web service from db in java从java中的db获取/发布Web服务
【发布时间】:2017-05-02 10:49:04
【问题描述】:

您好,我正在编写一个本地托管的 Web 服务器,该服务器将在 Android 设备的 URL/URI 中发布纬度和经度,这将用作 SQL Select 查询中的搜索条件,以检索 5 个 clostes 火车站.

我已经使代码与硬编码的经度和纬度一起工作,但现在需要添加使用 Post/Get 函数从 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;
    }

}

我目前连接到另一个托管相同数据并且功能齐全的网络服务器,并且在端口号之后其格式如下

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

lat 和 lng 是我使用 GPS 获取的变量

【问题讨论】:

    标签: java android web-services sqlite restful-url


    【解决方案1】:

    流程是这样的:

    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) 将这些参数传递给 select 方法

     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-with-resource 自动关闭 ResultSet、PreparedStatement、Connection(即使出现错误)

    希望作为粗略的指导有所帮助:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 2018-07-03
      相关资源
      最近更新 更多