java servlet 後臺響應ajax請求

網頁異步請求在各種網站、系統中可謂無處不在,本文就介紹一個最簡單的從前端發送請求-->java後臺連接數據庫-->從數據庫讀取數據-->把數據返回前端-->前端接收請求的例子。

首先,在後臺建立一個servlet:右鍵一個包,new-->servlet,輸入類名,就可以創建一個空白的servlet了。剛創建的servlet包含如下內容:

package com.zhao;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Zhao1
 */
@WebServlet("/Zhao1")              //這裏是註解,設置請求的地址,默認是斜槓加類名。也可以採用配置的方式,下面會介紹。
public class Zhao1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Zhao1() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//這裏是響應post請求的方法,一會我們就發post請求,所以一會的代碼寫在這裏。這裏標記爲"後臺post方法"
	}

}



其中上面那個註解也可以不用,而採取xml配置的方式,具體做法是:
在web.xml文件中添加一下內容:

  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>zhao1</servlet-name>
    <servlet-class>com.zhao.zhao1</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>zhao1</servlet-name>
    <url-pattern>/Zhao1</url-pattern>
  </servlet-mapping>

兩個servlet-name對應起來,servlet-class就是類那個文件,按住ctrl鼠標指上去應該可以變成小手。url-pattern就是發送ajax請求的Url地址,在註解裏就是括號裏的字符串。
現在就可以響應請求啦!先返回一個字符串試試,前臺能不能接收到。
ajax代碼就不詳細介紹了,只貼一段代碼:

$("#zhaotestAjax").click(function(){        
	$.ajax({
            url:"Zhao1",
            type: "post",
            contentType:"application/json",
            success: function (result, status) {
                    var str=result;
		    alert(str);
            }, error: function (res) {
            }
        });
});

這裏有一點需要注意的,Url在註解裏是“/Zhao1”,在發ajax請求的時候則是“Zhao1”,沒有那一個斜槓。
這時候沒出錯的話點擊按鈕是沒反應的,也不出錯,因爲我們還沒寫返回什麼。沒錯的話下面就寫返回什麼。
在後臺post方法處添加下面兩句:

response.setCharacterEncoding("utf-8");
//寫入到前臺         	
response.getWriter().write("測試成功");

第一句是設置編碼,以免因爲中文出現亂碼。第二句就是向前臺傳輸數據了。
點擊id爲zhaotestAjax的這個按鈕,出現彈框:測試成功。或者在調試裏看到str這個變量有值了,是這句話,那表示前後臺傳輸數據成功了,就像打通了任督二脈,人類登上月球邁出的第一步,從此再複雜的業務邏輯,都是在這個過程的基礎上添磚加瓦,在前後臺進行數據處理。數據傳輸的一小步,網頁請求的一大步!
但是這樣肯定是不夠的,前後臺通了,後臺和數據庫還沒通。數據庫我用的是mysql,簡單粘貼一下連接數據庫的代碼。
因爲是個小例子,這裏也不用框架了,也不用配置文件了,連接字符串什麼的都放在類裏了。

    private static final String driver = "com.mysql.jdbc.Driver"; //數據庫驅動  
    private static final String url="jdbc:mysql://localhost:3306/gaofen_pie?serverTimezone=UTC"; //連接數據庫的URL地址  
    private static final String username="root";//數據庫的用戶名  
    private static final String password="root";//數據庫的密碼</span>  
    private static Connection conn=null;  

上面這是連接字符串,Url地址後面加的serverTimezone是因爲不加它會有亂碼。

Class.forName(driver);
if(conn==null){ 	
        conn=DriverManager.getConnection(url, username, password);  
	Statement stmt =  conn.createStatement(); 
	ResultSet rs = stmt.executeQuery("select * from pie1");
	//下面進行數據操作
}

上面是連接過程,最後那個rs就是獲取到的結果了,數據庫和數據表請自己創建,這是我創建的。


數據庫名就是gaofen_pie,表名就是pie1。
獲取到了rs,還要遍歷把裏面的數據讀出來,就是用它的next方法。

		try {
			Class.forName(driver);
	        if(conn==null){  
	            conn=DriverManager.getConnection(url, username, password);  
	            Statement stmt =  conn.createStatement(); 
	            ResultSet rs = stmt.executeQuery("select * from pie1"); 
	            JSONObject jsonObject = new JSONObject();
	            ArrayList<Object> arrList=new ArrayList<Object>();
	            //int i=0;
	            while (rs.next()) {
			此處進行數據操作//
	            }
                response.getWriter().write(jsonObject.toString());
	            if (rs != null) { 
	                rs.close(); 
	            } 
	            if (stmt != null) { 
	                stmt.close();    
	            } 
	            if (conn != null) { 
	                conn.close();    
	            } 
	    		//out.print("1");
	            //return conn;  
	        }else{
	        	//out.print("連接失敗");
	        	
	        }
	        //return conn;
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

其中缺什麼包就引用一下(mysql的jdbc connector),出錯了就自動修正一下,一般就是用try catch包裹一下。
while(rs.next)這一句相當於遍歷,每次對rs中的一條記錄進行操作。這裏就要考慮一下我要用的這個數據應該怎麼獲取,怎麼封裝。
前臺和後臺傳輸數據都是用字符串來傳輸的,但是數據量大的時候一個個的讀字符串很麻煩,於是就有了json這種偉大的發明。
json其實也是一串字符串,但是它有特定的格式,可以被JSON對象解析成對象。就好像螃蟹不好運輸,我把它捆一下,運到了目的地再拆開。數據對象封裝成json字符串,傳遞給前臺,前臺解析後又還原成和原來一樣的對象。這就是json的意義。
至於怎麼封裝數據,就要結合實際情況選擇相對的方法了。我是先把我需要的數據組成一個二維數組,然後分別把這個二維數組放到json對象裏。因爲在前臺用的也是二維數組,所以選擇這樣組裝。
最後貼上post裏面的所有代碼

		try {
			Class.forName(driver);
	        if(conn==null){  
	            conn=DriverManager.getConnection(url, username, password);  
	            Statement stmt =  conn.createStatement(); 
	            ResultSet rs = stmt.executeQuery("select * from pie1"); 
	            JSONObject jsonObject = new JSONObject();
	            ArrayList<Object> arrList=new ArrayList<Object>();
	            //int i=0;
	            while (rs.next()) {
	            	Object[] obj=new Object[8];
	            	for(int i1=1;i1<obj.length+1;i1++){
	            	obj[i1-1]=rs.getString(i1);
	            	}
	            	arrList.add(obj);
	            }
            	
	            jsonObject.put("Consumption", arrList);
            	response.setCharacterEncoding("utf-8");
                //寫入到前臺
            	
                response.getWriter().write(jsonObject.toString());
	            if (rs != null) { 
	                rs.close(); 
	            } 
	            if (stmt != null) { 
	                stmt.close();    
	            } 
	            if (conn != null) { 
	                conn.close();    
	            } 
	    		//out.print("1");
	            //return conn;  
	        }else{
	        	//out.print("連接失敗");
	        	
	        }
	        //return conn;
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

前臺ajax所有代碼:

        $.ajax({
            url:"Response2",
            type: "post",
            contentType:"application/json",
            success: function (result, status) {
                
                    var str=result;
                    var obj = JSON.parse(str);  //用這個方法可以把json字符串解析成對象。
                    
                    for(var i=0;i<obj.Consumption.length;i++){    //這裏因爲是二維數組,用了倆循環
                    	for(var j=1;j<obj.Consumption[i].length;j++){
                    		obj.Consumption[i][j]=parseFloat(obj.Consumption[i][j]);
                    	}
                    	chinaConsumptionLevel.push(obj.Consumption[i]);
                    }

    
            }, error: function (res) {

            }
        });

其中chinaConsumptionLevel是一個事先聲明的空的一維數組。這樣最終組裝之後,最後得到我想要的數據和數據形式,就是這樣的:

chinaConsumptionLevel=[
 ["一區",119.44507245851,34.613350841033, 22023, 24982, 27760, 30350, 33337], ["二區",119.46848114625,34.619757429255, 15200, 17852, 20624, 22984, 26261]
];

至此,終於完成了從後臺去數據到前臺的任務。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章