您的位置:首页 > 编程语言 > Java开发

浅谈Struts2的命名空间及以传统形式返回json数据

2015-11-23 00:00 525 查看
摘要: Struts2,json,namespace,Xml

Struts2中在B/S传统应用中使用时需要配置struts.xml文件, 那么Struts2以传统形式 返回json
数据到客户端同样也需要配置 struts.xml文件,只是不同的是首先需要在配置文件中需要配置 如下
几项:1:extends,2:type,3contentType,先贴代码下面详细说说这几项的意思
<package name="json" namespace="/chat" extends="json-default">
<action name="*" class="chatAction" method="{1}">
<result name="success" type="json">
<param name="root">dataMap</param>
<param name="contentType">text/html</param>
<!-- 指定是否序列化空的属性 <param name="excludeNullProperties">true</param> -->
<--这里指定将序列化dataMap中的那些属性 -->
<!-- <param name="includeProperties"> userList.* </param>  -->
<--这里指定将要从dataMap中排除那些属性,这些排除的属性将不被序列化,一般不与上边的参数配置同时出现 -->
<!-- <param name="excludeProperties"> SUCCESS </param> -->
</result>
</action>
</package>
<package name="shop" namespace="/plat" extends="json-default">
<action name="*" class="platAction" method="{1}">
<result name="success" type="json">
<param name="root">dataMap</param>
<param name="contentType">text/html</param>
</result>
</action>
</package>
package中的extends属性在返回json数据时不再继承自struts-default ,而是继承json-default,同时
result里的type类型为json ,并且需要设置param的name属性contentType为text/html (此处 的设置为
了处理个别浏览器访问提示下载问题 ,网上大部分讲的是在Action中设置此项, 但是我只有 在这里设置有
效果不知原因。。。。), action的访问方式我选择的是动态路径即:设置name=“*” method=“{1}” (
该方式作用是指向chatAction中的所有方法), 至于namespce那处至少需要写上“/”,否则会访问失败,
当然这里也可以配置你要访问的路径,到时访问action的 时候只需要在action的name的名字前面+上namespace
的值, 本例中如下:chat/具体方法名即可,package的名字可以 随便写,只需保证不重复即可,不一定要是
具体类的的包路径 ,此举只是为了区分不同的类,至于param的name属性 root为dataMap,此处是依据在
Action中创建的map 等集合参数有关代码如下:
public Map<String, Object> getDataMap() {
return dataMap;
}
public ShopAction() {
// 初始化Map对象
dataMap = new HashMap<String, Object>();
}
// 查询地图对应的详细信息
public String getShopDetails() throws Exception {
// chatAction.getCommonParameters();
HttpServletResponse response = ServletActionContext.getResponse();
HttpServletRequest request = ServletActionContext.getRequest();
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
// String shop_id = URLDecoder.decode(request.getParameter("shop_id"),
// "UTF-8");
int shop_id = Integer.parseInt(request.getParameter("shop_id"));
// 查询商铺的属性
shopDetails = shopService.findByshop_id(shop_id);
shop_DetailsJSON.setAddress(shopDetails.getAddress());
shop_DetailsJSON.setPlace_introduce(shopDetails.getPlace_introduce());
shop_DetailsJSON.setBusiness_time(shopDetails.getBusiness_time());
shop_DetailsJSON.setPhone_number(shopDetails.getPhone_number());
// 查询shop_tag属性
JSONArray array = new JSONArray();
shop_tag = shopService.findTagById(shopDetails.getId());
shop_tagJSON.setTag_icon(shop_tag.getTag_icon());
shop_tagJSON.setTag_name(shop_tag.getTag_name());
shop_tagJSON.setTag_value(shop_tag.getTag_value());
shop_DetailsJSON.getShop_tag().add(shop_tagJSON);
// 查询评价属性
evaluate = shopService.findEvaluateById(shopDetails.getId());
evaluateJSON.setWord(evaluate.getWord());
evaluateJSON.setTime(evaluate.getTime());
evaluateJSON.setPerson(evaluate.getPerson());
shop_DetailsJSON.getEvaluate().add(evaluateJSON);
// 查询images的属性
List<Images> imagesList = shopService.findImageById(shopDetails.getId());
for (Images imageList : imagesList) {
System.out.println(imageList.getImage_url());
imagesJSON.setImage_url(imageList.getImage_url());
array.add(imageList);
}
// shop_DetailsJSON.getImages().add(imagesJSON);
dataMap.put("images", array);
dataMap.put("data", shop_DetailsJSON);
return SUCCESS;
}
需要指出的是,此时的map集合必须有get方法,否则显示json数据为null ,如果想要返回的json数据为
数组类型,只需要用JSONArray等 API把对象或者集合扔进去再放进map即可。 如果想要不序列化
或者序列化某一属性,只需要在struts.xml文件中配置 ,  这两项即可。如不足,欢迎指教!
<!-- 指定是否序列化空的属性 <param name="excludeNullProperties">true</param> -->
<--   这里指定将序列化dataMap中的那些属性 -->
<!-- <param name="includeProperties"> userList.* </param>  -->
<--这里指定将要从dataMap中排除那些属性,这些排除的属性将不被序列化,一般不与上边的参数配置同时出现 -->
<!-- <param name="excludeProperties"> SUCCESS </param> -->
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: