json是一种轻量级的传输格式, 是javascript源生的传输数据的格式,最简单的json格式:
{"key":"value"} 键和值之间用冒号分隔
个人觉得json中最小的单元就是{"key":"value"},它可以组合成许多复杂的结构,json有两种结构:
1、key/value对的集合,就像上面最简单的例子一样,在许多不同的语言中,这种结构被理解为 对象(object)、记录(record)、结构(struct)、哈希表(HashTable)等,在java web开发中,常用到的model层模型就是这种结构的,比如一个对象里面有许多属性,属性的名字就相当于key,属性的值就是value
2、值的有序列表——数组
如果有多个key/value对,他们之间用逗号分隔
{"key0":"value0","key1":"value1","key2":"value2"}
复杂结构:
{
"students":[{"key0":"value0"},{"key1":"value1"}],
"teachers":[{"firstName":"阿坤"},{"123":"456"}],
"worker":[{"key1":{"name":"value1"}},{"key2":"value2"},{"key3":"value3"}]
}
使用方法: students[0].key0 得到字符串value0 teachers[1].123 得到字符串456 worker[0].key1.name 得到字符串value1
json与s2结合使用:
s2用package管理action :
<package name="gc" namespace="/gc" extends="json-default">
<action name="initData" class="GCSubplateAction" method="initData">
<result name="create">/pages/ipad/create.jsp</result>
<result name="query">/pages/ipad/query.jsp</result>
</action>
<action name="query" class="GCSubplateAction" method="query">
<result name="create">/pages/ipad/create.jsp</result>
<result name="query">/pages/ipad/query.jsp</result>
</action>
<action name="initDate" class="GCSubplateAction" method="initDate">
<result type="json">
<param name="includeProperties">
args123.*
</param>
</result>
</action>
</package>
关键点: extends="json-default" <result type="json"> <param name="includeProperties"> args123.* </param> 其实package继承的包只做了两个工作,
json-default其实也是最终继承struts-default的 json-plugn中struts-plugn.xml源码如下
<struts>
<package name="json-default" extends="struts-default">
<result-types>
<result-type name="json" class="org.apache.struts2.json.JSONResult"/>
</result-types>
<interceptors>
<interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>
</interceptors>
</package>
</struts>
这里你可以看到这个json-default是干了什么事情,无非就是:
1 加了个名为json的result类型
2 加了一层名为json的拦截器所以 对于你的问题,可以说 不继承json-default ,可以,但是你必须在你的struts.xml中添加一个resultType 也就是在你的struts.xml 的<struts>节点下添加以下内容:
<result-types>
<result-type name="json" class="org.apache.struts2.json.JSONResult"/>
</result-types>----这里的name就按照你喜欢的取了
然后在你配置的拦截器声明中加上
<interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>也就是json拦截器的声明
在浏览器中直接输入应用json的这个action的地址 :http://localhost:7001/gc/initDate.action struts配置文件里可以发现 initDate这个action是调用initDate方法, 方法的内容如下:
public String initDate() throws Exception{
Map<String,String> paramMap = new HashMap<String,String>();
String currentDate = CommUtil.getCurrentDate();//获取当前时间
String createEndDate = CommUtil.replaceAll(currentDate, "-", "");
String createBeginDate = CommUtil.replaceAll(CommUtil.addMonth(currentDate, -1), "-", "");
paramMap.put("createBeginDate", createBeginDate);
paramMap.put("createEndDate", createEndDate);
this.setArgs123(paramMap);
return SUCCESS;
}
这个action里有 个专门接收json数据的Map<String,String> args123 这里的名字可以随便取,只要在配置文件中写上相应的 XXX.*即可, 比如上面配置文件的 args123.* 不过这里有一个小bug 就是 属性名的第二个字符不要大写,因为这个属性的getter和setter会自动把第一个字母大写,如果你第二个字符是大写的 就成了 getARgs123 java就会认为, 原来的属性名是 args123 而不是你定义的aRgs123 就会抛异常
输入刚才的地址后,就会自动下载一个文件,下载下来以后, 文件的内容就是json格式的数据了