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
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。