展开全部
Servlet的不写了,也就是how to use HttpRequest和HttpResponse。主要是在Struts2身上。
以文章所描述的方法似乎总是差了那么点东e68a84e8a2ad62616964757a686964616f31333339666165西:可以不使用那么多配置吗?
于是研究了些时间,可以这么玩:
1)Eclipse引用Struts2的JSON plug-in和Convertion plug-in。
2)struts.xml这么写:
/p>
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
上面有两个注释了,使用方法已经有写在里头,如果需要,可以加上或在类中加入@Results。
关键点在于把中的 extends设置为json-default,以及在global-results中的这个json result。
3)加入一个UserControl.java
package com.my.controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import net.sf.json.JSONObject;
import com.my.beans.User;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
public class UserController extends ActionSupport {
private User user = new User();
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
private String json;
public String getJson() {
return json;
}
public void setJson(String json) {
this.json = json;
}
private List users = new ArrayList();
public List getUsers() {
return users;
}
public void setUsers(List users) {
this.users = users;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
public String loadModel() throws IOException {
System.out.println("json=" + getJson());
System.out.println("user=" + getUser().getUsername());
System.out.println("users=" + getUsers().size());
User userBean = new User();
userBean.setUsername("robin");
users.add(userBean);
this.setJson(JSONObject.fromObject(userBean).toString());
return "json";
}
}
这里没有什么特别的东西,就是一些getter/setter,以及一个loadModel() action
4)JS对JSON的提交:
var url = "user!loadModel";
var params = {
"json": "json string",
"user.username" : "zhang",
"users[0].username" : "zhang1",
"users[0].password" : "1",
"users[1].username" : "zhang2",
"users[1].password" : "2",
};
$.post(url, params, function callback(data) {
console.log(data)
});
这里是重点。
可以看到这段JS里的params有:json/user.username/users[X].username
其中:
a) json
对应的就是上页java中的getJson/setJson,这个东东列出来是可以用于在页面与服务器之间传递JSON字符串用的。如果你需要在action中输出或提交json的字符串,它有很大作用,直接到位。但是缺点是要自己去将对象转化为json string以及json string转化为对象。
b) user.username
这样的写法可以在后台java中直接转化成了对象。user.username中的user就是java中的user object。
c) users[0].username
这可以直接转化成后台java中的List对象users。
可以看出,Struts2是可以完成将json直接转化成java object的。不过这样的写法,不是好的。因为这个JS的JSON只能称作是一个字符串拼接,不是一个JSON object
还有一种方法,使用ModelDriven:
package com.my.controller;
import com.my.beans.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
@SuppressWarnings("serial")
public class UserModelController extends ActionSupport implements
ModelDriven {
private User user = new User();
@Override
public Object getModel() {
return user;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
public String load() {
return "json";
}
}
使用ModelDriven,可以JS直接提交JSON了:
var url = "user-model!load";
var params = {
"username": "zhang1",
"password": "123456"
};
$.post(url, params, function callback(data) {
console.log(data)
});
这个params才是真正的JSON object,它会被ModelDriven直接转成user model。
但是:它似乎不能提交List object。至今写文时也没有找到在ModelDriven中可以提交JSON array to List的方法。
如果需要提交复杂的JSON到服务器,如果你用的是Struts,使用第一种方法的json的getter/setter吧。
已赞过
已踩过<
你对这个回答的评价是?
评论
收起