struts使用JSON(解决JsonArray终止且不报错问题)



在引入json-lib2.1.jar之后,可以很方便在struts配置文件中使用json-default来使Action中的成员变量(有getter&setter)自动获得前端传来的JSON参数,并且前端可以在action返回中获得这些变量的值,当然,前提是这些成员变量与在页面中的变量名称一致且他们都是可序列化的。


我的struts中的配置如下:

 <package name="jsonpack" extends="json-default" namespace="/">
       <action name="*_*" class="{1}" method="{2}">
			<result name="success" type="json"/>
       </action>
      </package>


如果有的变量不用序列化,可以在该变量上用@JSON(serialize=false)注解。


本来是用这种方式可以很顺利地传递Json参数,但在使用JsonArray时,发现方法抛异常且无异常信息,执行到此终断。查了一下这个问题,根源在于缺包,struts2.1.6要完整使用Json的所有功能,总共需要引入7个包:

commons-beanutils-1.7.0.jar

commons-lang-2.1.jar

commons-collections-3.1.jar

ezmorph-1.0.3.jar

json-lib-2.1.jar

jsonplugin-0.33.jar

包引入多了或少了都不行,多了会冲突。我一开始有引入struts2-json-plugin-2.1.8.1.jar,后来发现它和jsonplugin-0.33.jar有冲突。还有一点,Json的包最好不要以Library的形式引入,会出错。最好直接放在web-inf/lib中。


使用JsonArray生成json类型数据可以通过PrintWriter 向前台输出,我们在需要改变json字段的格式时可以使用(EXT的展示会用到)。这种情况不能用 extends="json-default"的形式调用action,只能用原来的extends="struts-default"。

PrintWriter out = getResponse().getWriter();
out.print(str);//向前台输出json串str
struts同时配置两种模式:
<struts>
	<!-- 设置Struts2应用是否处于开发模式,通常在开发调试阶段设为true,正式上线后可设为false -->
	<constant name="struts.devMode" value="true" />
	<!-- 设置Web应用的默认编码集为UTF-8 -->
	<constant name="struts.i18n.encoding" value="UTF-8"/>
	
	<package name="registration" extends="struts-default" namespace="/">
       <action name="contact_listPublicCont" class="contact" method="listPublicCont">
       </action>
       <action name="contact_search" class="contact" method="search">
       </action>       
       <action name="user_login" class="user" method="login">
       		<result name="success" type="redirect">/jsp/main/index.jsp</result>
       </action>
      </package>
   
	  <package name="jsonpack" extends="json-default" namespace="/">
       <action name="*_*" class="{1}" method="{2}">
			<result name="success" type="json"/>
       </action>
      </package>

</struts>

贴一个我用的BaseAction,大多数Json功能都有了,继承即可,注意在用到这些方法时要用struts-default形式映射action:

package com.ksms.action;


import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


import net.sf.json.JSONArray;


import org.apache.struts2.ServletActionContext;


import com.opensymphony.xwork2.ActionSupport;


@SuppressWarnings("serial")
public class BaseAction extends ActionSupport{
	/**
	 * 获得request
	 * 
	 * @return
	 */
	public HttpServletRequest getRequest() {
		return ServletActionContext.getRequest();
	}


	/**
	 * 获得response
	 * 
	 * @return
	 */
	public HttpServletResponse getResponse() {
		return ServletActionContext.getResponse();
	}


	/**
	 * 获得session
	 * 
	 * @return
	 */
	public HttpSession getSession() {
		return getRequest().getSession();
	}


	public void outJsonString(String str) {
		getResponse().setContentType("text/json;charset=UTF-8");
		outString(str);
	}


	public void outString(String str) {
		try {
			PrintWriter out = getResponse().getWriter();
			out.print(str);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}


	@SuppressWarnings("unchecked")
	public void outListString(List list) {
		try {
			JSONArray jsonArray = new JSONArray();
			if (list.size() > 0) {
				jsonArray = JSONArray.fromObject(list);
			}
			String jsonString = "{total:" + list.size() + ",root:"
					+ jsonArray.toString() + "}";
			outString(jsonString);


		} catch (Exception e) {
			e.printStackTrace();
		}
	}


	public void outError() {
		outString("{success:false,errors:'操作失败!'}");
	}
}

你可能感兴趣的:(struts使用JSON(解决JsonArray终止且不报错问题))