不管是获取一个对象还是多个对象
servlet的建立过程都是 类 web.xml映射路径 html文件
其中html文件里的才是要点所在 JSON对象表示法(数据格式) 及jqueryAjax的写法
以下是获取一个对象的servlet:
- 创建一个Hero对象
- 创建一个JSONObject 对象
- 把Hero对象转换为JSONObject 对象,并放在上一个JSONObject对象上,key是"hero"
- 设置编码方式为UTF-8
- 通过response返回
Hero hero=new Hero();
hero.setName("yaso");
hero.setHp(112);
JSONObject json=new JSONObject();
json.put("hero",JSONObject.fromObject(hero));//键值对因为JSONObject实现了map接口,补充:JSONArray实现了List接口。所以他们分别有其实现的接口的所有方法其中键值一定是对应实例化对象的名称——"hero"作为key
response.setContentType("text/html;charset=UTF-8");
response.getWriter().print(json);
不然点击按钮无任何反应
相关html文件:
- 点击按钮之后,通过ajax访问getOneServlet
- 获取都数据后,通过JSON.parse 转换为json对象
- 获取name和hp
- 显示在div里
<body>
<input type="button" value="通过AJAX获取一个Hero对象" id="sender">
<div id="messageDiv"></div>
<script>
$('#sender').click(function(){ //jquery框架写的Ajax请求
var url="getOneServlet";
$.post(
url,
function(data) {
var json=JSON.parse(data);
var name =json.hero.name;
var hp = json.hero.hp;
$("#messageDiv").html("英雄名称:"+name + "<br>英雄血量:" +hp );
});
});
</script>
</body>
web.xml就不用多说了
获取多个对象
和之前的servlet差不多 建立getManyServlet类
改一改就可以——
- 准备一个集合
- 向集合中放入 10个Hero对象
- 通过JSONSerializer.toJSON(heros)把集合转换为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);
}
String result =JSONSerializer.toJSON(heros).toString();
response.setContentType("text/html;charset=utf-8");
response.getWriter().print(result);
其html文件:
- 通过ajax访问getManyServlet
- 把返回的数据,通过 $.parseJSON 转换为json数组
- 遍历数组,显示在div中
<script> //唯独这一部分不一致
$('#sender').click(function(){
var url="getManyServlet";
$.post(
url,
function(data) {//参数只设为data 就和之前的key是一样的只能是实例化对象名称 不然点击无反应
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>
var old = $("#messageDiv").html();
old的作用是获取messageDiv中的html代码,最后一段中加上old,就是把之前显示列表的html代码添加到新的html里。比如old是name0————500。那第二次循环就是old(name0———500)+hero.name(name1)+“————”+hero.hp(501)。那么最后的html结果才会是
name0————500
name1————501
如果不加old,那只是数据不断的写入messageDiv,之前的数据就被覆盖掉了
就是把一条条的数据拼接出来显示 避免覆盖 就相当于div这个容器可以多次使用来装每条数据 即容器的一个复制 可以这么理解