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

原创
2015/11/23 19:25
阅读数 67
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> -->
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部