OpenLayers学习笔记8——使用servlet实现从数据库获取数据并标注

这两天在图书馆边看jsp边查边写代码,改完了老板交给的任务,也顺带实现了查询的效果,先来看下最终实现的效果图:

整个实现思路是:服务器端采用servlet+mysql模糊查询,servlet返回json数据,客户端解析json数据以表格形式显示并根据经纬度在地图上进行标注。

1、服务器端Servlet代码:

package edu.whu.vge.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import edu.whu.vge.dbUtil.PoiDBBean;

public class SchoolQueryServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	/*
	 * (non-Javadoc)
	 *
	 * @see
	 * javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest
	 * , javax.servlet.http.HttpServletResponse)
	 */
	@Override
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// 设置输出内容格式和编码
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		// 设置接收参数编码格式
		response.setCharacterEncoding("utf-8");
		String schoolID = request.getParameter("schoolID");
		String schoolName = request.getParameter("schoolName");
		String schoolAddress = request.getParameter("schoolAddress");
		String sql = "select * from school where ID like " + "\'" + "%"
				+ schoolID + "%" + "\'" + " and name like " + "\'" + "%"
				+ schoolName + "%" + "\'" + " and address like " + "\'" + "%"
				+ schoolAddress + "%" + "\'";
		PoiDBBean poiDBBean = new PoiDBBean();

		//
		JSONArray array = new JSONArray();
		try {
			ResultSet resultSet = poiDBBean.query(sql);
			while (resultSet.next()) {
				JSONObject object = new JSONObject()
						.element("schoolName", resultSet.getString(4))
						.element("schoolAddress", resultSet.getString(5))
						.element("schoolTel", resultSet.getString(6))
						.element("schoolKind", resultSet.getString(7))
						.element("schoolLat", resultSet.getDouble(3))
						.element("schoolLon", resultSet.getDouble(2));
				array.add(object);

			}
			out.println(array.toString());
			System.out.println(array.toString());

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				poiDBBean.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}

	/**
	 * Initialization of the servlet. <br>
	 *
	 * @throws ServletException
	 *             if an error occurs
	 */
	public void init() throws ServletException {
		// Put your code here
	}

}

这里看一下servlet的知识就可以了。

2、客户端请求代码:

这里采用jquery  ajax方法异步请求服务器端servlet,jquery及ajax见:w3cschool。代码如下:

  $.ajax({

            url: "http://127.0.0.1:8080/taxGIS/servlet/SchoolQueryServlet",
            type: 'post',
            dataType: 'json',
            data: {
                schoolID: $("#schoolID").val(),
                schoolName: $("#schoolName").val(),
                schoolAddress: $("#schoolAddress").val()
            },
            success: function(jsonData){
                //查询返回数据后标注在地图上并启用查询结果显示对话框
                patchAddMarker(jsonData);
                showQueryRes(jsonData);
            }

        });

3、解析json并标注在地图上:

以一次查询为例,得到的json数据如下:

[
    {
        "schoolName": "城阳区第二实验中学",
        "schoolAddress": "山东省青岛市城阳区礼阳路107号",
        "schoolTel": "0532-81156666",
        "schoolKind": "教育学校:中学",
        "schoolLat": 36.28491,
        "schoolLon": 120.40238
    },
    {
        "schoolName": "小寨子幼儿园",
        "schoolAddress": "山东省青岛市城阳区 ",
        "schoolTel": " ",
        "schoolKind": "教育学校:幼儿园",
        "schoolLat": 36.29791,
        "schoolLon": 120.39172
    },
    {
        "schoolName": "新太阳托管中心",
        "schoolAddress": "山东省青岛市市北区嘉兴路11-2",
        "schoolTel": " ",
        "schoolKind": "教育学校:幼儿园",
        "schoolLat": 36.10921,
        "schoolLon": 120.35659
    },
    {
        "schoolName": "金苹果幼儿园(香江医院西)",
        "schoolAddress": "山东省青岛市黄岛区香江路311号(香江医院西)",
        "schoolTel": " ",
        "schoolKind": "教育学校:幼儿园",
        "schoolLat": 35.97422,
        "schoolLon": 120.16204
    },
    {
        "schoolName": "锦桥社区托辅中心",
        "schoolAddress": "山东省青岛市黄岛区王家石桥村锦桥社区",
        "schoolTel": " ",
        "schoolKind": "教育学校:幼儿园",
        "schoolLat": 35.87418,
        "schoolLon": 120.00619
    },
    {
        "schoolName": "艺星幼儿园",
        "schoolAddress": "山东省青岛市城阳区岙东北路541",
        "schoolTel": " ",
        "schoolKind": "教育学校:幼儿园",
        "schoolLat": 36.33419,
        "schoolLon": 120.2701
    },
    {
        "schoolName": "隐珠街道办事处中心幼儿园",
        "schoolAddress": "山东省青岛市胶南市灵海路126号",
        "schoolTel": " ",
        "schoolKind": "教育学校:幼儿园",
        "schoolLat": 35.89869,
        "schoolLon": 120.0444
    },
    {
        "schoolName": "慧诺托管家园",
        "schoolAddress": "山东省青岛市黄岛区虹桥大街83-5",
        "schoolTel": " ",
        "schoolKind": "教育学校:幼儿园",
        "schoolLat": 35.87653,
        "schoolLon": 120.00338
    },
    {
        "schoolName": "四方区尚志幼儿园",
        "schoolAddress": "山东省青岛市市北区尚志路4",
        "schoolTel": " ",
        "schoolKind": "教育学校:幼儿园",
        "schoolLat": 36.11456,
        "schoolLon": 120.35691
    },
    {
        "schoolName": "宝贝之家亲子园",
        "schoolAddress": "山东省青岛市崂山区松岭路58-1",
        "schoolTel": "(0532)88891918,(0532)88893227",
        "schoolKind": "教育学校:幼儿园",
        "schoolLat": 36.10406,
        "schoolLon": 120.47963
    },
    {
        "schoolName": "天真幼儿园(灵山卫街道办事处人大工作办公室北)",
        "schoolAddress": "山东省青岛市黄岛区329省道(灵山卫街道办事处人大工作办公室北)",
        "schoolTel": " ",
        "schoolKind": "教育学校:幼儿园",
        "schoolLat": 35.93806,
        "schoolLon": 120.15021
    },
    {
        "schoolName": "城阳区城阳街道皂户幼儿园",
        "schoolAddress": "山东省青岛市城阳区正阳中路",
        "schoolTel": " ",
        "schoolKind": "教育学校:幼儿园",
        "schoolLat": 36.30772,
        "schoolLon": 120.35847
    },
    {
        "schoolName": "胶南市王台镇石梁小学",
        "schoolAddress": "山东省青岛市黄岛区 ",
        "schoolTel": "0532-83116752",
        "schoolKind": "教育学校:小学",
        "schoolLat": 36.07053,
        "schoolLon": 120.03613
    }
]

json解析可以采用json2.js也可以使用js的eval函数。这里采用后者,代码如下,很简单就不做解释了。

function patchAddMarker(jsonData){
    var jsonArray = eval(jsonData);
    for (var i = 0; i < jsonArray.length; i++) {
        var schoolName = jsonArray[i].schoolName;
        var schoolAddress = jsonArray[i].schoolAddress;
        var schoolTel = jsonArray[i].schoolTel;
        var schoolKind = jsonArray[i].schoolKind;
        var schoolLat = jsonArray[i].schoolLat;
        var schoolLon = jsonArray[i].schoolLon;

        var lonlat = corTransform(schoolLon, schoolLat);
        var lonLatStr = lonlat.toShortString();
        var lonLatArr = lonLatStr.split(",");
        var lon = lonLatArr[0];
        var lat = lonLatArr[1];

        var att = {
            名称: schoolName,
            地址: schoolAddress,
            电话: schoolTel,
            类别: schoolKind

        };
        addMarke(lon, lat, att);
    }
}

4、表格显示:

这里采用jquery easyui的datagrid控件来实现,其表格控件的使用网上有很多博客,参考就可以实现了,这里不再展开了。

5、总结

1、遇到跨域问题,客户端请求不到访问结果。解决办法:访问地址为:http://127.0.0.1:8080/taxGIS/index.jsp;而不是http://localhost:8080/taxGIS/index.jsp

2、jquery-ui和jquery easyui冲突问题。这两个都是基于jquery,有些方法和属性名称都是相同的,导致冲突,就看引入其js的先后顺序,后引入的覆盖先引入的。我这里主要用到jquery-ui的对话框和按钮以及折叠栏,而jquery easyui只用到了datagrid,所以我的引用是这样的:jquery--->jquery-ui--->jquery easyui

 <script src="lib/jquery/js/jquery-1.10.2.js"></script>
        <script src="lib/jquery-easyui-1.4.2/jquery.easyui.min.js"></script>
        <script src="lib/jquery/js/jquery-ui-1.10.4.custom.js"></script>

3、前端开发用到的知识比较多而且杂,不像C#、java开发那般只用一种语言。刚开始可能会觉得手足无措,但是只要用心,入了门后面就会轻松些了。

4、注重开发部署的便宜性、用户体验度,不能做出来的东西部署非常复杂而又不实用。

时间: 2024-10-13 00:11:43

OpenLayers学习笔记8——使用servlet实现从数据库获取数据并标注的相关文章

OpenLayers学习笔记9——使用servlet与jquery-ui实现自动提示输入

做软件都要从用户的角度来做,怎么样让用户输入的更少,体验更好,我们就应该怎么来做,也就是需求驱动,客户都是大爷!题外话说完了,步入正题,本文实现在查询时输入查询条件时,自动提示数据库中包含改值所有记录(注意,我这里用的是包含,not start,not end,这是跟mysql的模糊查询相关的),看下实现效果: 1.使用jquery ui的autocomplete控件 jQuery UI Autocomplete是jQuery UI的自动完成组件它支持本地的Array/JSON数组.通过ajax

ObjectARX2010 学习笔记003:增加实体到数据库

AcDbObjectId PostToModelSpace(AcDbEntity *pEnt) { //定义块表 AcDbBlockTable *pBlk; acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlk,AcDb::kForRead); //定义块表记录 AcDbBlockTableRecord *pBlkTblRcd; pBlk->getAt(ACDB_MODEL_SPACE,pBlkTblR

【Ext.Net学习笔记】04:Ext.Net中使用数据、Ext.Net Store的用法、Ext.Net ComboBox用法

之前的几篇文章都是介绍Ext.Net较为基础的东西,今天的这一篇将介绍数据的一些用法,包括XTemplate绑定数据.Store(Modal.Proxy).ComboBox的用法等. XTemplate绑定数据 XTemplate是个模板,当我们为一个XTemplate绑定数据之后,将会按照模板的预定格式进行显示. <ext:Window runat="server" ID="win1" Title="XTemplates用法" Width

Android学习笔记(十二)——使用意图传递数据的几种方式

使用意图传递数据的几种方式 点此获取完整代码 我们除了要从活动返回数据,也常常要传递数据给活动.对此我们可以使用Intent对象将这些数据传递给目标活动. 1.创建一个名为PassingData的项目,在activity_main.xml文件中添加一个Button: <Button android:id="@+id/btn_SecondActivity" android:layout_width="fill_parent" android:layout_hei

Sharepoint2013商务智能学习笔记之使用Current User Filter筛选Excel 数据(六)

Sharepoint自带的filter可以和Excel Web Access互动,下面将制作一个Demo,使用Current User Filter根据当前登录用户自动筛选Excel. 第一步,用Excel打开章节五制作的Excel文件 第二步,新建筛选器 第三步,给gender筛选器命名 第四步,保存文件并上传到sharepoint 第五步,修改用户配置文件,从管理中心,应用程序管理区域点击管理服务应用程序,进入到应用程序管理列表,然后点击User Profile Service实例 第六步,

[原创]java WEB学习笔记05:Servlet中的ServletConfig对象

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

[原创]java WEB学习笔记04:Servlet 简介及第一个Servlet程序

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

OpenLayers学习笔记4——使用jQuery UI实现测量对话框

OpenLayers学习最好的方式就是跟着其自带的示例进行学习,另外对web前端的开发设计要了解,慢慢积累,这样在一般的小项目中应该是足够用了.本篇参照量测demo实现对话框形式的量测,抛砖引玉,通过这个功能,后面的查询.定位等基于对话框的形式就很容易实现了.先看下效果图: 长度测量: 面积测量: 代码基本都是demo里的代码,就不贴出来了.这里需要注意的问题是,在关闭窗口的时候一定要使measureTools   deactive //测量 $("#Measure").click(f

OpenLayers学习笔记6——使用jQuery UI实现查询并标注(功能实现篇)

本篇博客接上篇是关于OpenLayers的地图标注及弹出窗(marker+popup),先来看下效果图: 下面给出代码,都写了注释,不做过多解释了: ///添加标记 function addMarke(x, y, attribute) { //设置marker样式 var style_mark = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']); style_mark.graphicWidth = 64