--------------------struts2所需jar包及错误总结-----------------------
红色是struts2必须jar包,黄色是出现警告但不会报错
因struts2整合json必须的jar 包及struts2版本出现的问题
要用json插件jar包必须用以下6个jar包
------------------------------------------------------
----------------------json错误汇总------------------------
java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException------缺少conmmons-lang.jar
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory-----------------------------缺少commons-loggin.jar
java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher-----------------------------------------------缺少ezmorph.jar/本人用的版本ezmorph-1.0.6.jar
java.lang.NoClassDefFoundError: org/apache/commons/collections/map/ListOrderedMap----------------缺少commons-collections.jar/本人所用版本commons-collections-3.2.1.jar
java.lang.NoClassDefFoundError: org/apache/commons/beanutils/DynaBean-----------------------------缺少commons-beantils-core.jar/本人所用版本commons-beantils-core-1.7.0.jar
------------配置-----------------
src目录下struts.properties文件内容
------------begin-----------
struts.devMode = true
struts.enable.DynamicMethodInvocation = false -------------end---------
src目录下struts.xml内容
---------------------------begin-------------------------------------------
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts./dtds/struts-2.0.dtd"> <struts> <package name="struts2" extends="json-default">
<action name="doquery" class="com.action.TestAction" method="execute">//当一个action里有多个请求时可以用method=""说<result type="json"/> //明调用的方法
</action> <action name="dojson" class="com.action.TestAction" method="jsontest"> <result type="json"/> </action> <action name="insertstatus" class="com.action.MyAction" >
<result type="json" > </action> </package> </struts>
--------------end-------------
TestAction.java代码
@SuppressWarnings("serial")
public class TestAction extends ActionSupport{ private String jsonResult; @JSON(name="JSONRESULT")
public String getJsonResult() { return jsonResult; } public void setJsonResult(String jsonResult) {
this.jsonResult = jsonResult; } public String execute(){ System.out.println("doquery########"); return SUCCESS; //return "success"; } public String jsontest(){//这里返回的是list的字符串 List<Users> userList = new ArrayList<Users>();
Users users = new Users(); users.setUserId(1);
users.setUserName("test1"); users.setSex("男人"); userList.add(users); users = null; users = new Users(); users.setUserId(2); users.setUserName("test2"); users.setSex("女人"); userList.add(users); jsonResult =JSONArray.fromObject(userList).toString();
}
}
---页面解析json(list)-------
$.post("dojson.action",{},function(data){
var userList = eval('(' + data + ')'); var user = eval(userList.JSONRESULT);//JSONRESULT和java代码@JSON(name="JSONRESULT")一致,不写就是属性名 for(var i=0;i<user.length;i++){ alert(user[i].userName); } }); 也可以---
$.getJSON("dojson.action",{},function(data){
var user=eval(data.JSONRESULT); //for(var i=0;i<user.length;i++){ //alert(user[i].userName); //} $.each(user,function(i,value){ alert(value["userName"]); }); }); ------------
Users.java代码
public class Users {
private Integer userId;
private String userName;
private String sex;
public Users() {
}
public String getSex() {
return sex; } public void setSex(String sex) {
this.sex = sex; } public Integer getUserId() {
return userId; } public void setUserId(Integer userId) {
this.userId = userId; } public String getUserName() {
return userName; } public void setUserName(String userName) {
this.userName = userName; } }
-----------------------MyAction.java代码-----------------------
public class MyAction {
private String email; private String content; private Map<String,String> addstatus; private String result; public String execute()throws Exception {
HttpServletResponse response=ServletActionContext.getResponse(); response.setContentType("application/json"); addstatus= new HashMap<String, String>(); addstatus.put("email", "1@1.com"); addstatus.put("content", "asd"); setEmail("1@1.com"); setContent("asd"); JSONObject jsonobj =JSONObject.fromObject(addstatus); result=jsonobj.toString();
return "status"; }
public String getEmail() {
return email; } public void setEmail(String email) {
this.email = email; } public String getContent() {
return content; } public void setContent(String content) {
this.content = content; } public String getResult() {
return result; } public void setResult(String result) {
this.result = result; } public Map<String, String> getAddstatus() {
return addstatus; } public void setAddstatus(Map<String, String> addstatus) {
this.addstatus = addstatus; } } -------页面解析json(string和map)
$.post("insertstatus.action",function(data){
alert(data); var vv=eval('('+data+')'); alert(vv.content); var qq=eval('('+vv.result+')');//result是map的字符串 alert(qq.email); }); ----也可以 $.getJSON("insertstatus.action",function(data){
alert(data); alert(data.content); var qq=eval('('+data.result+')'); alert(qq.email); }); ---------struts.xml也可以
输出UserInfo的所有属性及UserInfo的userName属性
<result type="json">
<param name="includeProperties"> userInfo.*, userInfo \. userName </param> </result> <result type="json"> <param name="includeProperties"> userInfo.*, userInfo \. userName </param> </result> ---excludeProperties 参数:输出结果需要剔除的属性值,也支持正则表达式匹配属性名,可以用“,”分割填充多个正则表达式,类同includeProperties
---
输出一个JSON List列表
<result name="success" type="json"> <param name="includeProperties"> userInfosList\[\d+\]\.userName,userInfosList\[\d+\]\.password </param> </result> 其中userInfosList是action中的一个List类型的属性, userInfosList \[\d+\]\. userName表示,userInfosList中存储的对象0..end的userName属性 (list中存储的对象必须有userName属性)。 为什么要用includeProperties或excludeProperties 参数:主要是为了过滤掉接口, pojo的set、list、其它对象等不需要的数据防止循环取其它关联对象或找不到接口。 如果不配置,默认是处理action中的所有属性,如果action中有接口注入,json拦截器可能找不到接口而返回不了结果, 还有如果action中有一个对象,这个对象与好多对象都有关联,json拦截器会将相关联的所有对象的属性全部转换成json格式, 如果其它对象有list、set,其返回结果相当庞大,有可能是死循环而无法返回 。 如果不用<param name="includeProperties">或其他方式进行json数据过滤,通过debug你会发现前台返回的json字符串, 是把action中的所有属性全部转化成json字符串返回给客户端(包括service接口、pojo所有属性及有关联的pojo。 有时候根本返回不了结果,也不报错,后台执行了,但前台执行不到callback function, 这主要是因为找不到接口或者关联的pojo太多,造成死循环),一般情况下用的最多的就是root、includeProperties 和excludeNullProperties参数。当然还有其他的方法,如给pojo的属性加json注解。 |
|