1. 程式人生 > >java連線MySQL資料庫 json資料前後端互動

java連線MySQL資料庫 json資料前後端互動

先在下圖資料夾中匯入相應的jar包,其中第一個紅框中的是使用json資料需匯入的7個包,第二個紅框是用JDBC連線MySQL資料庫必須的包。
所用jar包

連線MySQL的工具類:

package com.XXXXXX.util;

import java.sql.Connection;
import java.sql.DriverManager;

public class MysqlUtil
{
    private static Connection conn = null; //資料庫連線
    private static String server = "localhost"; //服務ip
private static String port = "3306"; //服務埠 public static String dbname = "XXXXX"; //資料庫名 private static String user = "root"; //資料庫使用者名稱 private static String pass = "XXXXX"; //資料庫密碼 private static String drivername = "com.mysql.jdbc.Driver"; //MySql驅動類名 private static String url = "jdbc:mysql://"
+ server + ":" + port + "/" + dbname + "?user=" + user + "&password=" + pass + "&useUnicode=true&characterEncoding=UTF-8"; //連線地址 public static Connection getConn() { try { Class.forName(drivername).newInstance(); //載入JDBC驅動 conn = DriverManager.getConnection(url); //建立連線
} catch (Exception e) { e.printStackTrace(); } return conn; } }

服務端上的查詢Servlet:

package com.XXXXX.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
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 com.webmappoi.util.MysqlUtil;

public class GetPoiInfoServlet extends HttpServlet
{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    /**
     * The doGet method of the servlet. <br>
     * 
     * This method is called when a form has its tag value method equals to get.
     * 
     * @param request
     *            the request send by the client to the server
     * @param response
     *            the response send by the server to the client
     * @throws ServletException
     *             if an error occurred
     * @throws IOException
     *             if an error occurred
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {

        /*
         * response.setContentType("text/html"); PrintWriter out =
         * response.getWriter();out.println(
         * "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
         * out.println("<HTML>");
         * out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
         * out.println("  <BODY>"); out.print("    This is ");
         * out.print(this.getClass()); out.println(", using the GET method");
         * out.println("  </BODY>"); out.println("</HTML>"); out.flush();
         * out.close();
         */

        this.doPost(request, response);
    }

    /**
     * The doPost method of the servlet. <br>
     * 
     * This method is called when a form has its tag value method equals to
     * post.
     * 
     * @param request
     *            the request send by the client to the server
     * @param response
     *            the response send by the server to the client
     * @throws ServletException
     *             if an error occurred
     * @throws IOException
     *             if an error occurred
     */
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {

        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        JSONArray array = new JSONArray();
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "select * from university";
        try
        {
            con = MysqlUtil.getConn();
            ps = con.prepareStatement(sql);
            rs = ps.executeQuery();
            while (rs.next())
            {
                JSONObject temp = new JSONObject().element("id", rs.getInt("U_ID")).element("point", rs.getString("U_Point")).element("title", rs.getString("U_Title")).element("address", rs.getString("U_Addr")).element("tel", rs.getString("U_Tel"));
                array.add(temp);
            }
            out.print(array.toString()); //將array物件傳到前端
            System.out.println(array.toString());
            out.flush();
            out.close();
        } catch (SQLException e)
        {
            e.printStackTrace();
        } finally
        {
            try
            {
                //依次關閉連線
                if (rs != null)
                {
                    rs.close();
                    rs = null;
                }
                if (ps != null)
                {
                    ps.close();
                    ps = null;
                }
                if (con != null)
                {
                    con.close();
                    con = null;
                }
            } catch (SQLException e)
            {
                e.printStackTrace();
            }
        }
    }
}

前端js接收array物件並解析:

$.getJSON("./servlet/GetPoiInfoServlet",function(json)
{  
for(var i=0;i<json.length;i++)
        {
        //var json = eval(json);
            //console.log(JSON.stringify(json));
            //獲取經緯度
            ulng = parseFloat(json[i].point.split(",")[0]); //以,分割成陣列
            ulat = parseFloat(json[i].point.split(",")[1]);  
            var uid = parseFloat(json[i].id);
            var title = json[i].title;
            var address = json[i].address;
            var point = json[i].point;
            var tel = json[i].tel;
        }
});

/********************************************************************
getJSON函式所接收的資料就是json格式,所以可以不用eval函式轉化。function中引數json就是後臺Servlet傳來的array物件。getJSON函式還有一個問題就是,用它從前端傳資料到後臺時,如果有中文的話,傳到後臺的資料就會亂碼。(網上有解決辦法,但我沒試過,我就用post方法將就了,post方法不會亂碼,但是在接收是需要用eval函式轉化。)
********************************************************************/

前端js中封裝表單成json資料:

function GetJsonData() 
{
    var json = 
    {
            "point": GID("point").value,
            "title": GID("title").value,
            "address": $("#address").val(),
            "tel": $("#tel").val()
        };
        return json;
}

前端js中封裝document.getElementById方法:

function GID(id) 
{
    return document.getElementById(id);
}

前端js中用Jquery post方法提交表單json資料:

function post()
{
/*$("#status").html("正在提交資料,請勿關閉當前視窗...");
    var url = GID("form1").action;
        //alert(JSON.stringify(GetJsonData()));
        $.ajax(
        {
            type: "POST",
            //url: "./servlet/AddPoiDataServlet",
            url: url,
            //contentType: "application/json; charset=utf-8",
            data: {data: JSON.stringify(GetJsonData())},
            //dataType: "json",
            success: function (json) 
            {
                if (json.length > 0) 
                {
                    alert("提交成功!");
                }
            },
            error: function (json) 
            {
                $("#status").html("提交資料失敗!");
            }
        });*/

    var url = GID("form1").action;
    //alert(url);
    $("#status").html("正在提交資料,請勿關閉當前視窗...");
    $.post(url,{data:JSON.stringify(GetJsonData())},function (msg) 
{
    //alert("提交成功!");
            $("#status").html("提交成功!");
     });
}

/*******************************************************************************
JSON.stringify()函式是為了將json資料字串化。Jquery ajax和post方法都能將表單傳到後端,post方法封裝了ajax,用起來更簡單。
******************************************************************************/

後臺Servlet接收前端傳來的json資料並儲存到MySQL資料庫中:

//System.out.println("地名:" + request.getParameter("title") + "<br>");
        JSONObject json = JSONObject.fromObject(request.getParameter("data")); //獲取前端傳來的data
        System.out.println(json.toString());
        Connection con = null;
        PreparedStatement ps = null;
        int result = 0;
        String sql = "insert into university(U_Point,U_Title,U_Addr,U_Tel) values(?,?,?,?)";
        try
        {
            con = MysqlUtil.getConn();
            ps = con.prepareStatement(sql);
            ps.setString(1, json.getString("point"));
            ps.setString(2, json.getString("title"));
            ps.setString(3, json.getString("address"));
            ps.setString(4, json.getString("tel"));
            result = ps.executeUpdate();
            out.print(json.toString());
            System.out.println(json.toString());
            out.flush();
            out.close();
        } catch (SQLException e)
        {
            e.printStackTrace();
        } finally
        {
            try
            {
                if (ps != null)
                {
                    ps.close();
                    ps = null;
                }
                if (con != null)
                    con.close();
                    con = null;
            } catch (SQLException e)
            {
                e.printStackTrace();
            }
        }

其它的修改,刪除Servlet:
刪除servlet:

String sql = "delete from university where U_ID=?";
try
{
    con = MysqlUtil.getConn();
    ps = con.prepareStatement(sql);
    ps.setInt(1, json.getInt("id"));
    result = ps.executeUpdate();
    json.put("result", true);
    out.print(json.toString());
    System.out.println(json.toString());
    out.flush();
    out.close();
}

修改servlet:

String sql = "update university set U_Title=?,U_Addr=?,U_Tel=? where U_Point=?";
try
{
    con = MysqlUtil.getConn();
    ps = con.prepareStatement(sql);
    ps.setString(1, json.getString("title"));
    ps.setString(2, json.getString("address"));
    ps.setString(3, json.getString("tel"));
    ps.setString(4, json.getString("point"));
    result = ps.executeUpdate();
    //json.put("result", true);
    out.print(json.toString());
    System.out.println(json.toString());
    out.flush();
    out.close();
}

模糊查詢:
前端js傳輸查詢條件並接受後臺查詢資料庫之後傳過來的json資料:

function selectInfo()  //模糊查詢
{
    var json =
    {
        "title": GID("info").value
    };
    //alert(JSON.stringify(json));
    $.post("./servlet/SelectPoiInfoServlet",{data:JSON.stringify(json)},function(json)
    {  
         for(var i=0;i<json.length;i++)
         {
            var json = eval(json);
             //獲取經緯度
             ulng = parseFloat(json[i].point.split(",")[0]);
             ulat = parseFloat(json[i].point.split(",")[1]);    

             var uid = parseFloat(json[i].id);
             var title = json[i].title;
             var address = json[i].address;
             var point = json[i].point;
             var tel = json[i].tel;
           }
    });
}   

/*****************************************************************************************
這裡不能用getJSON方法,因為如果前端傳過來json資料有中文,到後臺就會亂碼,所以就用post方法。如果這裡傳的不是json陣列,而僅僅是一個json物件,就需要將eval函式改為var json = eval("(" + json + ")");,不然前端會報錯:SyntaxError: missing ; before statement
******************************************************************************************/

後臺模糊查詢的servlet:

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {

        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        JSONObject json = JSONObject.fromObject(request.getParameter("data"));
        System.out.println(json.toString());
        JSONArray array = new JSONArray();
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "select * from university where U_Title like ?";
        try
        {
            con = MysqlUtil.getConn();
            ps = con.prepareStatement(sql);
            ps.setString(1, "%" + json.getString("title") + "%");
            rs = ps.executeQuery();
            while (rs.next())
            {
                JSONObject temp = new JSONObject().element("id", rs.getInt("U_ID")).element("point", rs.getString("U_Point")).element("title", rs.getString("U_Title")).element("address", rs.getString("U_Addr")).element("tel", rs.getString("U_Tel"));
                array.add(temp);
            }
            out.print(array.toString()); //將array物件傳到前端
            System.out.println(array.toString());
            out.flush();
            out.close();
        }

關於模糊查詢:
參考JDBC 模糊查詢 傳參問題,附文如下:
錯誤寫法:String sql = “select * from tableName where column like ‘%?%’”;
這樣寫,?是不能傳參進來的,因為編譯的時候?沒被編譯成傳參標識,所以執行時會丟擲SQLException。
正確寫法有兩種:
1、String sql = “select * from tableName where column like ‘%” + columnValue + “%’”; //可以直接將變數值寫進sql語句
2、String sql = “select * from tableName where column like ?”; //可以利用jdbc的傳參函式傳進
PreparedStatement ps = conn.PreparedStatement(sql);
ps.setString(1, “%” + columnValue + “%”);

其中遇到的問題:
1. 使用自己安裝的jdk時會報錯(如下圖),只有用Myeclipse自帶的版本才可以。
這裡寫圖片描述
我所使用的JDK版本及MyEclipse的JDK版本如下:
這裡寫圖片描述
只有選中下面那個Sun JDK 1.6.0_13才不會報錯,不知道why?
 
2. 在Servlet中修改doPost()或doGet()方法,釋出到瀏覽器時,仍出現This is class XXXXXXXX, using the POST method的字樣,如圖:
這裡寫圖片描述
解決辦法是:重啟Tomcat,重新發布。