程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> SSH框架網上商城項目第7戰之整合Struts2和Json

SSH框架網上商城項目第7戰之整合Struts2和Json

編輯:關於JAVA

SSH框架網上商城項目第7戰之整合Struts2和Json。本站提示廣大學習愛好者:(SSH框架網上商城項目第7戰之整合Struts2和Json)文章只能為提供參考,不一定能成為您想要的結果。以下是SSH框架網上商城項目第7戰之整合Struts2和Json正文


上篇我們完成了DataGrid顯示json數據,然則沒有和後台接洽在一路,只是純真地顯示了我們本身弄的json數據,這一節我們將json和Struts2整合,買通EasyUI和Struts2之間的交互。

1. json情況的搭建
json情況搭建很簡略,導入json的jar包便可,以下:

(注:json-lib-2.4的jar包下載地址:http://xiazai.jb51.net/201605/yuanma/json-lib-2.4(jb51.net).rar )

2. 完美Action
在DataGrid控件中有個屬性是url,可以指定要求數據的url地址,在上一節我們將這個地址直接設置成了一個詳細的json文件,這裡我們將這個url設置成一個action,如url:'category_queryJoinAccount.action',表現會去要求categoryAction的queryJoinAccount辦法(文章最初會給出query.jsp的代碼)。所以我們須要去完成categoryAction中的queryJoinAccount辦法。
在Struts2和json整合前,我們先看一下之前顯示一次json數據都發了哪些要求:

由於type是Category類的一個屬性,我們在BaseAction中曾經完成了ModelDriven<Category>接口,所以這個type會被封裝到model中,我們不須要管它,可以經由過程model來獲得,然則EasyUI主動發過去的page和rows參數我們須要本身獲得了,所以我們可以在BaseModel中增長兩個成員變量page和rows並完成get和set辦法,最初還要斟酌一點,這些參數都取得了後,我們依據這些參數去數據庫中查詢數據,那末我們查出來的數據放到哪呢?並且還要打包成json格局發到前台能力被DataGrid顯示。我們先不斟酌將查詢到的數據若何打包成json格局,我們先斟酌把這些數據放到一個處所,很天然的想到了應用Map,由於json格局的數據就是key-value情勢的。想到這裡,我們持續完美BaseAction:

@Controller("baseAction") 
@Scope("prototype") 
public class BaseAction<T> extends ActionSupport implements RequestAware,SessionAware,ApplicationAware,ModelDriven<T> { 
 
  //page和rows和分頁有關,pageMap寄存查詢的數據,然後打包成json格局用的 
  //page和rows完成get和set辦法,pageMap只須要完成get辦法便可,由於pageMap不是吸收前台參數的,是讓struts獲得的 
  protected Integer page; 
  protected Integer rows; 
  protected Map<String, Object> pageMap = null;//讓分歧的Action本身去完成 
    //省略get和set辦法…… 
   
  /******************* 上面照樣本來BaseAction部門 *************************/ 
  //service對象 
  @Resource 
  protected CategoryService categoryService; 
  @Resource 
  protected AccountService accountService; 
 
  //域對象 
  protected Map<String, Object> request; 
  protected Map<String, Object> session; 
  protected Map<String, Object> application; 
     
  @Override 
  public void setApplication(Map<String, Object> application) { 
    this.application = application; 
  } 
  @Override 
  public void setSession(Map<String, Object> session) { 
    this.session = session; 
  } 
  @Override 
  public void setRequest(Map<String, Object> request) { 
    this.request = request; 
  } 
   
  //ModelDriven 
  protected T model; 
  @Override 
  public T getModel() { 
    ParameterizedType type = (ParameterizedType)this.getClass().getGenericSuperclass(); 
    Class clazz = (Class)type.getActualTypeArguments()[0]; 
    try { 
      model = (T)clazz.newInstance(); 
    } catch (Exception e) { 
      throw new RuntimeException(e); 
    }   
    return model; 
  } 
} 

 好,完美了BaseCategory後,我們可以寫categoryAction中的queryJoinAccount辦法了,我們將categoryAction華夏來的辦法全刪失落,由於那些都是之前搭建情況時刻測試用的,都不消了,如今真正開端項目代碼了:

@Controller("categoryAction") 
@Scope("prototype") 
public class CategoryAction extends BaseAction<Category> { 
   
  public String queryJoinAccount() { 
 
    //用來存儲分頁的數據 
    pageMap = new HashMap<String, Object>(); 
     
    //依據症結字和分頁的參數查詢響應的數據。這個辦法我們在Service中寫過了,其時完成級聯查詢 
    List<Category> categoryList = categoryService.queryJoinAccount(model.getType(), page, rows); 
    pageMap.put("rows", categoryList); //存儲為JSON格局,從上一節的json文件可以看出,一個key是total,一個key是rows,這裡先把rows寄存好 
    //依據症結字查詢總記載數 
    Long total = categoryService.getCount(model.getType()); //這個辦法沒寫,我們等會兒去Service層完美一下 
//   System.out.println(total); 
    pageMap.put("total", total); //存儲為JSON格局,再把total寄存好 
 
    return "jsonMap"; 
  } 
} 

        如許Action我們就寫好了,如今Action拿到前台傳來的參數,然後依據參數查詢了指定type的總記載數,和指定type的一切商品,而且依照json中指定的key(即total和rows)停止寄存,放在HashMap中了,以後只需將這個HashMap中的數據打包成json格局發送到前台便可以被DataGrid顯示了。我們先把這個HashMap放這,先去完美了Service層的代碼後,再來打包這個HashMap中的數據。

3. 完美categoryService
從下面的categoryAction中可知,須要在categoryService中增長一個getCount辦法,而且要在詳細完成類中完成好,完成以下:

//CategoryService接口 
public interface CategoryService extends BaseService<Category> { 
  //查詢種別信息,級聯治理員 
  public List<Category> queryJoinAccount(String type, int page, int size); //應用種別的稱號查詢 
  //依據症結字查詢總記載數 
  public Long getCount(String type); 
} 
 
//CategoryServiceImpl完成類 
@SuppressWarnings("unchecked") 
@Service("categoryService") 
public class CategoryServiceImpl extends BaseServiceImpl<Category> implements CategoryService { 
 
  @Override 
  public List<Category> queryJoinAccount(String type, int page, int size) { 
    String hql = "from Category c left join fetch c.account where c.type like :type"; 
    return getSession().createQuery(hql) 
        .setString("type", "%" + type + "%") 
        .setFirstResult((page-1) * size) //從第幾個開端顯示 
        .setMaxResults(size) //顯示幾個 
        .list(); 
  } 
 
  @Override 
  public Long getCount(String type) { 
    String hql = "select count(c) from Category c where c.type like :type"; 
    return (Long) getSession().createQuery(hql) 
      .setString("type", "%" + type + "%") 
      .uniqueResult(); //前往一筆記錄:總記載數 
  } 
} 

到如今為止,這個數據庫中數據的獲得這條路就買通了,後面兩步完成了早年台-->數據庫-->取數據,接上去就開端打包HashMap中寄存的數據,然後發給前台了。

4. 設置裝備擺設struts.xml
在struts.xml中經由過程設置裝備擺設便可以完成對指定命據的打包,我們先看一下struts.xml中的設置裝備擺設:

<struts> 
   
  <constant name="struts.devMode" value="true" /> 
   
  <package name="shop" extends="json-default"><!-- jason-default繼續了struts-default --> 
   
    <global-results> 
      <result name="aindex">/WEB-INF/main/aindex.jsp</result> 
    </global-results> 
 
    <!-- class對應的是Spring中設置裝備擺設該Action的id值,由於要交給Spring治理 --> 
    <action name="category_*" class="categoryAction" method="{1}"> 
      <!-- 必需要先添加json包,然後下面繼續json-default --> 
      <result name="jsonMap" type="json"> 
        <!-- 要轉換成json對象的數據 --> 
        <param name="root">pageMap</param> 
        <!-- 設置裝備擺設黑名單,過濾不須要的選項 ,支撐正則表達式 
        json格局:{total:3,rows:[{account:{id:2,login:"user",name:"客服A",pass:"user"},hot:true,id:3,…}]} 
        --> 
        <param name="excludeProperties"> 
          <!-- rows[0].account.pass--> 
                    <!-- 這裡顯示不了正則表達式, CSDN的一個bug,我接個圖放上面 --> 
        </param> 
      </result> 
    </action> 
     
    <action name="account_*" class="accountAction" method="{1}"> 
      <result name="index">/index.jsp</result> 
    </action> 
     
    <!-- 用來完成體系 要求轉發的action,一切的要求都交給execute--> 
    <action name="send_*_*" class="sendAction"> 
      <result name="send">/WEB-INF/{1}/{2}.jsp</result> 
    </action> 
  </package> 
 
</struts> 

從下面的設置裝備擺設可以看出,起首package要繼續json-default,由於json-default繼續了struts-default,由於在json的jar包裡有個struts2-json-plugin-2.3.24.1.jar,翻開便可看到外面有個struts-plugin.xml,翻開便可看到json-default是繼續了struts-default:

接上去我設置裝備擺設<result>,name是方才action前往的字符串,type必定要配成json。然後就是result中的參數了,起首必需要配的就是name為root的參數,這個參數要配成方才須要轉換的HashMap對象,即我們界說的pageMap,有了這個參數的設置裝備擺設,struts才會將pageMap中的數據打包成json格局。然後就是設置裝備擺設黑名單,黑名單的意思就是告知struts在打包的時刻,哪些字段不須要打包,好比治理員暗碼之類的信息,由下面正文中的jason格局可以看出rows[0].account.pass表現暗碼字段,然則數據確定不止一條,所以我們得用正則表達式來表現,如許一切暗碼都不會被打包到json中。

5. 修正query.jsp內容
到此,我們曾經將數據打包成了json格局了,接上去我們完美一下前台query.jsp的內容便可以讓DataGrid准確顯示了:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
 <head> 
  <%@ include file="/public/head.jspf" %> 
  <script type="text/javascript"> 
    $(function(){ 
      $('#dg').datagrid({   
        //url地址改成要求categoryAction 
        url:'category_queryJoinAccount.action', 
        loadMsg:'Loading......', 
        queryParams:{type:''},//type參數,這裡不須要傳詳細的type,由於我們要顯示一切的 
        //width:300, 
        fitColumns:true, 
        striped:true, 
        nowrap:true, 
        singleSelect:true, 
        pagination:true, 
        rowStyler: function(index,row){ 
          console.info("index" + index + "," + row) 
          if(index % 2 == 0) { 
            return 'background-color:#fff;'; 
          } else { 
            return 'background-color:#ff0;'; 
          } 
           
        },    
        frozenColumns:[[ 
          {field:'checkbox',checkbox:true}, 
          {field:'id',title:'編號',width:200}  //這裡的field字段要和數據庫中的一樣,也就是要跟json數據中的一樣        
        ]], 
        columns:[[            
          {field:'type',title:'種別稱號',width:100, //字段type 
            formatter: function(value,row,index){ 
              return "<span title=" + value + ">" + value + "</span>"; 
            } 
          },   
          {field:'hot',title:'熱賣',width:100, //字段hot 
            formatter: function(value,row,index){ 
              if(value) { //假如是hot,該值為true,value是boolean型變量 
                return "<input type='checkbox' checked='checked' disabled='true'"; //勾選 
              } else { 
                return "<input type='checkbox' disable='true'"; //不勾選 
              } 
            } 
          }, 
          {field:'account.login',title:'所屬治理員',width:200, //account.login治理員登錄名 
            formatter: function(value,row,index){ 
              if(row.account != null && row.account.login != null) { 
                return row.account.login; //假如登錄名不為空,顯示登錄名 
              } else { 
                return "此種別沒有治理員"; 
              } 
          }   
          } 
        ]]   
      });  
    }); 
  </script> 
 </head> 
  
 <body> 
  <table id="dg"></table> 
 </body> 
</html> 

6.  測試顯示成果
最初我們測試一下DataGrid的顯示成果,以下:

到這裡,我們勝利整合了Struts2和json,如今可以和前台傳輸json格局的數據了。
(注:到最初我會供給全部項目標源碼下載!迎接年夜家珍藏或分享)
原文地址:http://blog.csdn.net/eson_15/article/details/51332758
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved