1 关于前后端分离的一些基本概念
1.1 向某个url提交数据表达的方法
- 通过form的action属性指定提交的url,这种提交方法会刷新页面。
通过ajax,实现某些数据提交到url,这种提交方法不会刷新整个页面。
1.2 JSON(JavaScript Object Notation)
JSON是一种轻量级的数据交换格式,是一种特殊格式的字符串。各个编程语言中都可以使用某些模块把JSON转化一些基础的数据类型的数据。在前后端传输的过程中只能传送字符串,因此需要一种特殊的格式来组织字符串,这种格式就是JSON。
1.3 前后端分离
前面的做法都是前后端不分离的,实现某些特定功能的页面把html写在java代码里。
- 今天要学的是前后端不分离的,把某些特定功能的页面分离出来,通过JSON的数据格式在前后端之间传递数据。
- 要解决两点
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>用AJAX以JSON方式提交数据</title>
<script type="text/javascript" src="jquery.min.js"></script>
</head>
<body>
<form>
名称:<input type="text" id="name" /><br /> 血量:<input type="text"
id="hp" /><br /> <input type="button" value="提交" id="sender">
</form>
<div id="messageDiv"></div>
<script>
/* jquery方法为结点添加动作 */
$('#sender').click(function() {
/* jquery选择结点获得结点值 行不通,因为它只是获取页面刚刚加载完成之后的值,而不是新的值
var name=$("#name").value();
var hp=$("#hp").value(); */
var name = document.getElementById('name').value;
var hp = document.getElementById('hp').value;
var hero = {
"name" : name,
"hp" : hp
};
/* alert(name);
alert(hp); */
var url = "submitServlet";
/*调用post方法向指定URL提交表单数据,提交完成后调用回调函数 */
$.post(url,/* 目标URL */
{/* 表单数据 */
"data" : JSON.stringify(hero)
},
function(data) { /* 回调函数 */
alert("提交成功,请在Tomcat控制台查看服务端接收到的数据");
});
});
</script>
</body>
</body>
</html>
2.2 后端页面
public class SubmitServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data =request.getParameter("data");
System.out.println("服务端接收到的数据是:" +data);
//JSON字符串解析为JSON对象
//如果参数是字符串,那么是把字符串解析为JSON字符串
JSONObject json=JSONObject.fromObject(data);
System.out.println("转换为JSON对象之后是:"+ json);
//把JSON对象映射为Hero对象
Hero hero = (Hero)JSONObject.toBean(json,Hero.class);
System.out.println("转换为Hero对象之后是:"+hero);
}
}
2.3 web.xml
<!-- 从客户端获得JSON数据 -->
<servlet>
<servlet-name>SubmitServlet</servlet-name>
<servlet-class>SubmitServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SubmitServlet</servlet-name>
<url-pattern>/submitServlet</url-pattern>
</servlet-mapping>
3 从后端向前端传数据-单个对象
3.1 前端页面
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>用AJAX以JSON方式获取数据</title>
<script type="text/javascript" src="jquery.min.js"></script>
</head>
<body>
<input type="button" value="通过AJAX获取一个Hero对象" id="sender">
<div id="messageDiv"></div>
<script>
$('#sender').click(function(){
var url="getoneservlet";
$.post(
url,
/* 此处的data是后端返回的response数据 */
function(data) {
var json=JSON.parse(data);
var name =json.hero.name;
var hp = json.hero.hp;
$("#messageDiv").html("英雄名称:"+name + "<br>英雄血量:" +hp );
});
});
</script>
</body>
</body>
</html>
3.2 后端页面
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONObject;
public class GetOneServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
//获取
Hero hero = new Hero();
hero.setName("盖伦");
hero.setHp(353);
JSONObject json= new JSONObject();
json.put("hero", JSONObject.fromObject(hero));
response.setContentType("text/html;charset=utf-8");
response.getWriter().print(json);
}
}
3.3 web.xml
<!-- 从服务端获取响应返回单个JSON对象,response内容作为参数传入AJAX -->
<servlet>
<servlet-name>GetOneServlet</servlet-name>
<servlet-class>GetOneServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GetOneServlet</servlet-name>
<url-pattern>/getoneservlet</url-pattern>
</servlet-mapping>
4 从后端向前端传数据-多个对象
4.1 前端页面
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>用AJAX以JSON方式获取数据</title>
<script type="text/javascript" src="jquery.min.js"></script>
</head>
<body>
<input type="button" value="通过AJAX获取多个Hero对象" id="sender">
<div id="messageDiv"></div>
<script>
$('#sender').click(function(){
var url="getmanyservlet";
$.post(
url,
function(data) {
/* 用jquery把JSON转化为数组 */
var heros = $.parseJSON(data);
for(i in heros){
var old = $("#messageDiv").html();
var hero = heros[i];
$("#messageDiv").html(old + "<br>"+hero.name+" ----- "+hero.hp);
}
});
});
</script>
</body>
</body>
</html>
4.2 后端页面
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONSerializer;
public class GetManyServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List<Hero> heros = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Hero hero = new Hero();
hero.setName("name"+i);
hero.setHp(500+i);
heros.add(hero);
}
//List类型JSON 序列化
String result =JSONSerializer.toJSON(heros).toString();
response.setContentType("text/html;charset=utf-8");
response.getWriter().print(result);
}
public static void main(String[] args) {
//用来测试,看一看List在JSON序列化之后是什么
List<Hero> heros = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Hero hero = new Hero();
hero.setName("name"+i);
hero.setHp(500+i);
heros.add(hero);
}
System.out.println(JSONSerializer.toJSON(heros).toString());
}
}
4.3 web.xml
<!-- 从服务端获取响应返回JSON数组,response作为参数传入AJAX -->
<servlet>
<servlet-name>GetManyServlet</servlet-name>
<servlet-class>GetManyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GetManyServlet</servlet-name>
<url-pattern>/getmanyservlet</url-pattern>
</servlet-mapping>
5 更多
更多的内容会在下学期Servlet、Ajax课程上学到