首先,在后台建立一个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]
];
至此,终于完成了从后台去数据到前台的任务。