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课程上学到
