java前后端数据交互_前后端数据交互之数据接⼝废话就不多说了,我们都知道,前端通常会通过后台提供的接⼝来获取数据来完成前端页⾯的渲染。
1.前端通过接⼝调⽤后台返回的数据
test page
this ismy jsp
type:"Get",
url:"servlet/JJJJ",
success: function(data){
$("#json").text(data);
}
})
这是⼀个jsp页⾯:
向服务器发起了⼀个ajax请求,请求的地址是"servlet/JJJJ",请求成功后执⾏回调函数,这个data就是这个url
返回的数据,⼀般是⼀个json格式的字符串,它的根本还是⼀个字符串。所以前端拿到这个字符串之后,要
将它转化为json(数组)对象,然后访问这个对象的键/值,从⽽进⾏页⾯数据渲染。
2.后台接⼝(servlet)
//JJJJ.java
public voiddoGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setHeader("contentType", "text/html; charset=utf-8");
PrintWriter out =Writer();
String jsonstr= "[{\"name\": \"eco\", \"age\": \"21\"}]";out.print(jsonstr);
out.flush();
out.close();
}
这是⼀个servlet,定义了⼀个json格式的字符串jsonstr,前端对这个servlet发起http请求后,它就返回给前端⼀
个json字符串。这个⼿写的json字符串,注意了⾥⾯的冒号要⽤转义字符“\”。
注意:红字固定写法,前⾯两句是为了防⽌输出的json字符串中⽂乱码。
3.后台servlet内数据转换
前后端数据交互⼀般数据有两个格式:json、xml;⼤多数情况下还是json。
所以后台获取的数据最终都要以json字符串的形式响应给前台。⽽后台从数据库获取数据,⼀般会以java对象或
者java对象列表的形式返回。下⾯就是这之间的转换操作。
//java对象转化为json字符串
User user= new User("eco", "567568"); //java对象
JSONObject json = JSONObject.fromObject(user); //转为json对象
String jsonstr = String(); //转为json字符串
//java对象列表转化为json字符串
User user1= new User("eco", "567568");
User user2= new User("桔⼦桑", "123123");
List list= new ArrayList(); //数组列表,并添加两个user对象
list.add(user1);
list.add(user2);
JSONArray array= JSONArray.fromObject(list); //java对象列表转化为json对象数组
String jsonstr = String(); //json对象数组转化为json字符串
4.前端数据转换
前端通过后台提供的接⼝获得了json字符串,接下来就是将其转化为json对象(列表),然后再对其属性进⾏操作。//json字符串转化为json对象
var a = JSON.parse( data ); //浏览器⽀持的⽅式
var b = $.parseJSON( data ); //jQuery⽀持的⽅式
上⾯是两种将json字符串转化为json对象的⽅式,jQuery⽅式需要事先导⼊jQuery框架。
下⾯是json对象的数据访问⽅式。
a.username; //a是⼀个json对象,返回对象的username属性值
a[1].username; //a是⼀个json对象数组,返回第⼆个对象的username属性值
5.前端发起含参数的ajax请求
type:"Get",
url:"servlet/JJJJ",
data:{username:"eco",password:"23423"},
success: function(data){var a =JSON.parse(data);
$("#json").text(a.username);
}
})
前端向服务器发出ajax请求,并且在request中提供参数,这⾥有两个data,
第⼀个红⾊data是前端发起请求时附带的参数,
第⼆个⾦⾊data是后台返回的数据(json字符串)。
public voiddoGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setHeader("contentType", "text/html; charset=utf-8");
PrintWriterout =Writer();
String username= Parameter("username");
String password = Parameter("password");
User user = new User(username, password);
JSONObject json = JSONObject.fromObject(user);
String jsonstr = String();out.print(jsonstr);out.flush();out.close();
jquery的attr属性
}
后台的这个servlet收到前端的请求后,先获取request⾥⾯的Parameter,然后将属性值赋给User对象,
java对象---->json对象---->json字符串,最后将json字符串返回给前端。
后⾯的就不⽤我说了。
更多的时候,我们并不是像上⾯写的那样,通常我们会将前台request传来的参数作为数据库查询的条件,
将查询结果(java对象列表)经过处理(转为json字符串)返回给前端,再由前端渲染页⾯。
前端对服务器发起请求request、后台做出响应response都会存在编码不⼀致导致字符乱码的问题
通常我们会在servlet的doGet()、doPost()⽅法开始添加⼀下语句:
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
但是,这种⽅法只对前台发出的Post请求有效,对于Get请求是不起作⽤的。
个⼈推荐以下⽅式,⼀劳永逸:
< Connector port="8080"protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"URIEncoding="UTF-8" useBodyEncodingForURI="true" />
红字是新加的字段,更改⽂件后要重启Tomcat才能⽣效(注意:不是Myeclipse⾥⾯的服务器重启按钮)。
7.数据库查询的返回值问题
先来看⼀个doGet()⽅法:
public voiddoGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriterout =Writer();
String username= Parameter("username");
String sex= Parameter("sex");
Session();
transaction=session.beginTransaction();
String hql= "select sname,sex from Student where sex = ?";
Query query = ateQuery(hql);
query.setString(0, sex);
List list = query.list();
Object[] a = Array();
User user = new User("桔⼦桑", "男");
User user1 = new User("eco", "男");
User user2 = new User("官⽅", "男");
List b = newArrayList();
b.add(user);
b.add(user1);
b.add(user2);
System.out.println("list类型:" + Class().getName() +
"a类型:"+ a.getClass().getName() +
"b类型:"+b.getClass().getName());
JSONArray array= JSONArray.fromObject(a);
String jsonstr = String();
out.print(jsonstr);out.flush();out.close();
transactionmit();
session.close();
}
注意看红字和紫字:
依次将三种形式的数据转为json字符串输出到前台:
list--ArrayList:[["桔⼦桑","男"],["eco","男"],["官⽅","男"]]
a-------Object:[["桔⼦桑","男"],["eco","男"],["官⽅","男"]]
b----ArrayList:[{"password":"男","username":"桔⼦桑"},{"password":"男","username":"eco"},{"passwo
rd":"男","username":"官⽅"}]再将他们转为json对象后,获得数据⽅式⾃然为以下(var obj = JSON.parse(data)):
list、a:obj[0][0]--------------"桔⼦桑";
b :obj[0].username---"桔⼦桑";
其余数据类推,得出结论:数据库查询返回的是类⼆维数组形式,实际上是Object[]的集合。
8.数据库查询返回值转化
通常情况下,当然不可能让前端按照obj[1][0]的⽅式去使⽤数据,那样的话不利于代码维护,所以我们就
有必要将数据库查询的返回值由Object[]的集合转化为javaBean对象的集合。
综合⽹上的前⼈的经验,现针对⼏种查询贴出⽅法:
①from Student
即查询全部字段
String hql = "from Student";
Query ateQuery(hql);
List listDB = query.list();
List listOut = new ArrayList();for(Student str : listDB) {
String Sname();
String Sex();
Integer Sid();
Students stu= newStudents(sid, sname, sex);
listOut.add(stu);
}
查询全部字段,查询结果的泛型⾃然为Student,可以通过getter⽅法获得个字段属性值,
然后传给新建对象,进⽽添加到集合listOut,响应出去。
②select sname,sex from Student
即:查询部分字段
String hql = "select sname,sex from Student";
Query ateQuery(hql);
List listDB = query.list();
List listOut = new ArrayList();for(Object[] object : listDB) {
String sname= (String) object[0];Student stu= newStudent(sname);
listOut.add(stu);
}
遍历查询结果的每⼀项,由于该项是⼀个Object[],获得数组每项的数据传递给javaBean对象的构造器参数,然后将这个对象添加到⾃定义泛型的集合listOut中,再处理成json字符串响应给前端。
这⾥要注意两个集合的泛型
③select sname from Student
即:查询单个字段
String hql = "select sname from Student";
Query ateQuery(hql);
List listDB = query.list();
List listOut = new ArrayList();for(String str : listDB) {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论