[項目實戰] ibatis +spring+struts2+jquery.autocomple...

這兩天忙公司的項目,沒有把項目的demo寫出來。趁如今空閒,偷偷的寫一下。奮鬥
先上demo結構目錄圖:

你們看到了吧,項目層次分得很清楚。
config  是 spring和itatis的配置文件。接下來就是經典的mvc分層架構啦,bean  ----  dao ---- service -----  action ---  view。理論的東西,我就很少說了。下面我按照這個demo開發流程一步一步寫出來:
一。在eclipse新建項目,導入jar包,有木有??!!!

 

二。集成spring和struts,web.xml文件配置以下:javascript

  1. <span style="font-size:16px;"><?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   
  5.     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  6.     <display-name>ctcoms</display-name>  
  7.     <description>A Java Forum System Based on Struts2</description>  
  8.     <!--  加載spring 配置文件 -->  
  9.     <context-param>  
  10.         <param-name>contextConfigLocation</param-name>  
  11.         <param-value>classpath*:config/spring*.xml</param-value>  
  12.     </context-param>  
  13.     <listener>  
  14.         <listener-class>  
  15.             org.springframework.web.context.ContextLoaderListener  
  16.         </listener-class>  
  17.     </listener>  
  18.   
  19.     <!-- 定義Struts 2的FilterDispatcher的Filter -->  
  20.     <filter>  
  21.         <!-- 定義核心Filter的名字 -->  
  22.         <filter-name>struts2</filter-name>  
  23.         <!-- 定義核心Filter的實現類 -->  
  24.         <filter-class>  
  25.             org.apache.struts2.dispatcher.FilterDispatcher  
  26.         </filter-class>  
  27.         <!-- 設置編碼 -->  
  28.         <init-param>  
  29.             <param-name>encoding</param-name>  
  30.             <param-value>utf-8</param-value>  
  31.         </init-param>  
  32.     </filter>  
  33.   
  34.     <!-- FilterDispatcher用來初始化Struts 2而且處理全部的Web請求 -->  
  35.     <filter-mapping>  
  36.         <filter-name>struts2</filter-name>  
  37.         <url-pattern>/*</url-pattern>  
  38.     </filter-mapping>  
  39.       
  40.     <!-- jsp等頭文件的過濾器,解決亂碼用 -->  
  41.     <filter>  
  42.         <filter-name>AddHeaderFilter</filter-name>  
  43.         <filter-class>  
  44.             org.mission.ctcoms.web.filter.AddHeaderFilter  
  45.         </filter-class>  
  46.         <init-param>  
  47.             <param-name>headers</param-name>  
  48.             <param-value>Content-Encoding=gzip</param-value>  
  49.         </init-param>  
  50.     </filter>  
  51.     <filter-mapping>  
  52.         <filter-name>AddHeaderFilter</filter-name>  
  53.         <url-pattern>*.gzjs</url-pattern>  
  54.     </filter-mapping>  
  55.     <welcome-file-list>  
  56.         <welcome-file>/login.jsp</welcome-file>  
  57.         <welcome-file>/index.jsp</welcome-file>  
  58.     </welcome-file-list>  
  59.   
  60.   
  61.     <error-page>  
  62.         <exception-type>java.lang.Exception</exception-type>  
  63.         <location>/error.jsp</location>  
  64.     </error-page>  
  65. </web-app>  
  66. </span>  


三。項目裏,spring是用來配置數據庫,事物管理,配置ibatis, 管理struts的action,管理dao層的bean,管理service的bean。相關的配置文件以下圖:css

 

四。在classpath路徑下,新建struts.xml 和log4j.properties 文件,分別是 struts的映射文件 和 日誌信息的配置。html

 

五。把配置文件建好之後,就開始寫代碼了。這個demo業務很簡單,只有一個bean,一張表就足夠了。表的話 你們就本身建把,一個主鍵,一個產品名就OK啦。java

bean的代碼就不貼出來了,就是getter 和setting方法。jquery

 

六。創建ibatis的sql配置文件,StoreProduct.xml以下:web

  1. <span style="font-size:16px;"><?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE sqlMap        
  3.     PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"        
  4.     "http://ibatis.apache.org/dtd/sql-map-2.dtd">  
  5. <sqlMap namespace="StoreProduct">  
  6.     <select id="findStoreProdctListNameForJson"  parameterClass="java.lang.String" resultClass="java.lang.String" >  
  7.         select S.name from zy_store_product S where lower(S.name)  LIKE lower('%$productName$%')  
  8.     </select>  
  9. </sqlMap>  
  10. </span>  

namespace 就是 sql的命名空間;findStoreProdctListNameForJson   爲 調用sql 的惟一標識id; parameterClass 爲參數類型,這裏是傳了一個產品名的字符串;resultClass爲返回值類型。spring

select S.name from zy_store_product S where lower(S.name) LIKE lower('%$productName$%')  就是一句標準的sql語句了,$productName$ 表明參數。在這裏能夠執行任何複雜的sql語句,這就是sql

ibatis的靈活之處。ibatis的用法這裏就不詳細說了,之後有機會貼上一篇ibatis的增刪查改的demo。數據庫

 

七。封裝一個操做ibatis的類,用於簡化ibatis的crud(增刪查改)操做,每一個dao都要繼承這個類。BaseIbaitsDAO 以下:apache

  1. <span style="font-size:16px;">package org.mission.ctcoms.ibatis;  
  2.   
  3. import java.util.Date;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6.   
  7. import org.apache.log4j.Logger;  
  8. import org.apache.struts2.ServletActionContext;  
  9. import org.mission.ctcoms.exception.ApplicationException;  
  10. import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;  
  11.   
  12. /**  
  13.  *   
  14.  * @author 黃宇強  
  15.  * @date  2011-8-5 上午09:27:06  
  16.  * @description This base class is prepared for subclass to do CRUD easily.  
  17.  */  
  18. public class BaseIbaitsDAO extends SqlMapClientDaoSupport {  
  19.     private Logger log4j = Logger.getLogger(BaseIbaitsDAO.class);  
  20.   
  21.     /**  
  22.      * 根據條件查詢對象集合  
  23.      *   
  24.      * @param sqlid  
  25.      *            對應IBATIS xml SQL_ID  
  26.      * @param paramObj  
  27.      *            參數對象  
  28.      * @return  
  29.      */  
  30.     @SuppressWarnings("unchecked")  
  31.     public <T> List<T> loadList(String sqlid, Object paramObj) {  
  32.         return (List<T>) getSqlMapClientTemplate()  
  33.                 .queryForList(sqlid, paramObj);  
  34.     }  
  35.   
  36.     /**  
  37.      * 根據條件查詢對象全部數據  
  38.      *   
  39.      * @param <T>  
  40.      * @param sqlid  
  41.      *            對應IBATIS xml SQL_ID  
  42.      * @return  
  43.      */  
  44.     @SuppressWarnings("unchecked")  
  45.     public <T> List<T> loadList(String sqlid) {  
  46.         return (List<T>) getSqlMapClientTemplate().queryForList(sqlid);  
  47.     }  
  48.   
  49.     /**  
  50.      * 根據ID查詢ENTITY 對象  
  51.      *   
  52.      * @param <T>  
  53.      * @param sqlid對應IBATIS  
  54.      *            xml SQL_ID  
  55.      * @return <T> 實體對象  
  56.      */  
  57.     @SuppressWarnings("unchecked")  
  58.     public <T> T loadObject(String sqlid) {  
  59.         return (T) getSqlMapClientTemplate().queryForObject(sqlid);  
  60.     }  
  61.   
  62.     /**  
  63.      * 根據ID查詢ENTITY 對象  
  64.      *   
  65.      * @param <T>  
  66.      * @param sqlid對應IBATIS  
  67.      *            xml SQL_ID  
  68.      * @param id  
  69.      *            實體ID  
  70.      * @return <T> 實體對象  
  71.      */  
  72.     @SuppressWarnings("unchecked")  
  73.     public <T> T loadObject(String sqlid, String id) {  
  74.         return (T) getSqlMapClientTemplate().queryForObject(sqlid, id);  
  75.     }  
  76.   
  77.     /**  
  78.      * 根據ID查詢ENTITY 對象  
  79.      *   
  80.      * @param <T>  
  81.      * @param sqlid對應IBATIS  
  82.      *            xml SQL_ID  
  83.      * @param id  
  84.      *            實體ID  
  85.      * @return <T> 實體對象  
  86.      */  
  87.     @SuppressWarnings("unchecked")  
  88.     public <T> T loadObject(String sqlId, Long id) {  
  89.         return (T) getSqlMapClientTemplate().queryForObject(sqlId, id);  
  90.     }  
  91.   
  92.     /**  
  93.      * 根據條件查詢對象  
  94.      *   
  95.      * @param <T>  
  96.      * @param sqlid對應IBATIS  
  97.      *            xml SQL_ID  
  98.      * @param paramObj  
  99.      *            參數  
  100.      * @return <T> 實體對象  
  101.      */  
  102.     @SuppressWarnings("unchecked")  
  103.     public <T> T loadObject(String sqlId, Object paramObj) {  
  104.         return (T) getSqlMapClientTemplate().queryForObject(sqlId, paramObj);  
  105.     }  
  106.   
  107.     /**  
  108.      * 保存對象  
  109.      *   
  110.      * @param sqlid  
  111.      *            對應IBATIS xml SQL_ID  
  112.      * @param entity  
  113.      *            保存的對象  
  114.      */  
  115.     public void save(String sqlid, Object entity) {  
  116.         getSqlMapClientTemplate().insert(sqlid, entity);  
  117.     }  
  118.   
  119.     /**  
  120.      * 保存對象  
  121.      *   
  122.      * @param sqlid  
  123.      *            對應IBATIS xml SQL_ID  
  124.      * @param entity  
  125.      *            保存的對象  
  126.      */  
  127.     public void save(String sqlid, Map<String, Object> entity) {  
  128.         getSqlMapClientTemplate().insert(sqlid, entity);  
  129.     }  
  130.   
  131.     /**  
  132.      * 更新對象  
  133.      *   
  134.      * @param sqlid  
  135.      *            對應IBATIS xml SQL_ID  
  136.      * @param entity  
  137.      *            修改對象  
  138.      */  
  139.     public void update(String sqlId, Map<String, Object> entity) {  
  140.         getSqlMapClientTemplate().update(sqlId, entity);  
  141.     }  
  142.   
  143.     /**  
  144.      * 更新對象  
  145.      *   
  146.      * @param sqlid  
  147.      *            對應IBATIS xml SQL_ID  
  148.      * @param entity  
  149.      *            修改對象  
  150.      */  
  151.     public void update(String sqlId, Object entity) {  
  152.         getSqlMapClientTemplate().update(sqlId, entity);  
  153.     }  
  154.   
  155.     /**  
  156.      * 刪除指定的對象  
  157.      *   
  158.      * @param sqlId  
  159.      * @param object  
  160.      *            須要刪除的對象  
  161.      */  
  162.     public void delete(String sqlId, Object object) {  
  163.         getSqlMapClientTemplate().delete(sqlId, object);  
  164.     }  
  165.   
  166.     /**  
  167.      * 查詢數據總條數  
  168.      *   
  169.      * @param sqlid  
  170.      * @param object  
  171.      * @return  
  172.      */  
  173.     public Long loadRecordCountObject(String sqlid, Object object) {  
  174.         log4j.info("sqlid====" + sqlid);  
  175.         return (Long) getSqlMapClientTemplate().queryForObject(sqlid, object);  
  176.     }  
  177.   
  178.     /**  
  179.      * 查詢數據總條數  
  180.      *   
  181.      * @param sqlid  
  182.      * @param object  
  183.      * @return 返回Int  
  184.      */  
  185.     public Integer loadRecordCount(String sqlid, Object object) {  
  186.         log4j.info("sqlid====" + sqlid);  
  187.         return (Integer) getSqlMapClientTemplate()  
  188.                 .queryForObject(sqlid, object);  
  189.     }  
  190.   
  191.     /**  
  192.      * @Title: findTNextId  
  193.      * @Description: 返回表中ID最大值加一  
  194.      * @param:  
  195.      * @param tabName  
  196.      *            表名  
  197.      * @return:  
  198.      * @returnType: Long  
  199.      * @throws  
  200.      */  
  201.     public Long findTNextId(String tabName) {  
  202.         Long id = 0l;  
  203.         String seqName = tabName.substring(3) + "_S";  
  204.         id = (Long) getSqlMapClientTemplate().queryForObject(  
  205.                 "Common.findTNextId", seqName);  
  206.         if (id == null || id.equals(0l))  
  207.             throw new ApplicationException("ID查詢錯誤");  
  208.         return id;  
  209.     }  
  210.   
  211.     public Date findOracleSysdate() {  
  212.   
  213.         return (Date) getSqlMapClientTemplate().queryForObject(  
  214.                 "Common.findOracleSysdate", null);  
  215.     }  
  216.   
  217. }  
  218. </span>  


 

八。用到spring ,是基於接口的編程了。分別實現 service、dao層的接口以及其實現類。須要注意的是,每一個service、dao都要寫進spring的相關配置文件去,實現spring對bean的管理。

 

 

九。crum的代碼寫好了,就到action層了。

  1. <span style="font-size:16px;">package org.mission.ctcoms.web.action.storage;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.apache.log4j.Logger;  
  6. import org.mission.ctcoms.business.storage.IStoreProductService;  
  7. import org.mission.ctcoms.web.code.BaseAction;  
  8.   
  9. public class StorageProductAction extends BaseAction {  
  10.   
  11.     /** 
  12.      *  
  13.      */  
  14.     private static final long serialVersionUID = 1L;  
  15.   
  16.   
  17.     private Logger log4j = Logger.getLogger(StorageProductAction.class);  
  18.   
  19.     private IStoreProductService storeProductService;  
  20.   
  21.     private List<String> content;  //傳到前臺顯示用  
  22.   
  23.     private String productName; // 產品名  
  24.   
  25.   
  26.     public String findStoreProdctListNameForJson() {  
  27.         try {  
  28.             String newProductName = new String(productName.getBytes("ISO-8859-1"),"utf-8");  // !!!解決參數亂碼  
  29.             List<String> list = storeProductService.findStoreProdctListNameForJson(newProductName);  
  30.             this.setContent(list);  
  31.         } catch (Exception e) {  
  32.             log4j.error("findStoreProdctListNameForJson error", e);  
  33.         }  
  34.   
  35.         return SUCCESS;  
  36.   
  37.     }  
  38.   
  39.   
  40.   
  41.     public Logger getLog4j() {  
  42.         return log4j;  
  43.     }  
  44.   
  45.     public void setLog4j(Logger log4j) {  
  46.         this.log4j = log4j;  
  47.     }  
  48.   
  49.   
  50.     public IStoreProductService getStoreProductService() {  
  51.         return storeProductService;  
  52.     }  
  53.   
  54.     public void setStoreProductService(IStoreProductService storeProductService) {  
  55.         this.storeProductService = storeProductService;  
  56.     }  
  57.   
  58.     public String getProductName() {  
  59.         return productName;  
  60.     }  
  61.   
  62.     public void setProductName(String productName) {  
  63.         this.productName = productName;  
  64.     }  
  65.   
  66.     public List<String> getContent() {  
  67.         return content;  
  68.     }  
  69.   
  70.     public void setContent(List<String> content) {  
  71.         this.content = content;  
  72.     }  
  73.   
  74.   
  75. }  
  76. </span>  

 

而後,該action查詢到的數據庫數據是以json方傳遞到前臺的,因此該action註冊到struts的配置文件以下:

  1. <span style="font-size:16px;"><?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5.   
  6. <struts>  
  7.   
  8.     <package name="json-storage"  
  9.         extends="json-default">  
  10.          <action name="findStoreProdctListNameForJson" method="findStoreProdctListNameForJson"  
  11.             class="storageProductAction">  
  12.             <result type="json">  
  13.                 <param name="root">content</param>  
  14.             </result>  
  15.         </action>  
  16.     </package>      
  17.     <constant name="struts.action.extension" value="do" />  
  18. </struts>  
  19. </span>  


其中 content是json的標識,與action的content和稍後說起的jquery調用 相對應。extends="json-default" 是繼承 struts-json插件的方法。


注: 該action 繼承了封裝好了的BaseAction,該類以下:

  1. <span style="font-size:16px;">package org.mission.ctcoms.web.code;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5.   
  6. import javax.servlet.ServletContext;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9. import javax.servlet.http.HttpSession;  
  10.   
  11. import org.apache.log4j.Logger;  
  12. import org.apache.struts2.ServletActionContext;  
  13.   
  14. import com.opensymphony.xwork2.ActionSupport;  
  15.   
  16. /** 
  17.  *  
  18.  * @author 黃宇強 
  19.  * @date  2011-8-5 上午09:25:04 
  20.  * @description 抽象類 
  21.  */   
  22. public class BaseAction extends ActionSupport {  
  23.     /** 
  24.      *  
  25.      */  
  26.     private static final long serialVersionUID = -4025716041310497629L;  
  27.   
  28.     private Logger log4j = Logger.getLogger(BaseAction.class);  
  29.   
  30.     public String jsonString;  
  31.   
  32.     public void outJsonString(String str) {  
  33.         getResponse().setContentType("text/javascript;charset=UTF-8");  
  34.         outString(str);  
  35.     }  
  36.   
  37.     public void outString(String str) {  
  38.         try {  
  39.             PrintWriter out = getResponse().getWriter();  
  40.             out.write(str);  
  41.         } catch (IOException e) {  
  42.             e.printStackTrace();  
  43.             log4j.error("out print failed:" + e);  
  44.         }  
  45.     }  
  46.   
  47.     public void outXMLString(String xmlStr) {  
  48.         getResponse().setContentType("application/xml;charset=UTF-8");  
  49.         outString(xmlStr);  
  50.     }  
  51.   
  52.     /** 
  53.      * 得到request 
  54.      *  
  55.      * @return 
  56.      */  
  57.     public HttpServletRequest getRequest() {  
  58.         return ServletActionContext.getRequest();  
  59.     }  
  60.   
  61.     /** 
  62.      * 得到response 
  63.      *  
  64.      * @return 
  65.      */  
  66.     public HttpServletResponse getResponse() {  
  67.         return ServletActionContext.getResponse();  
  68.     }  
  69.   
  70.     /** 
  71.      * 得到session 
  72.      *  
  73.      * @return 
  74.      */  
  75.     public HttpSession getSession() {  
  76.         return getRequest().getSession();  
  77.     }  
  78.   
  79.     /** 
  80.      * 得到servlet上下文 
  81.      *  
  82.      *  
  83.      *  
  84.      * @return 
  85.      */  
  86.     public ServletContext getServletContext() {  
  87.         return ServletActionContext.getServletContext();  
  88.     }  
  89.   
  90.     public String getRealyPath(String path) {  
  91.         return getServletContext().getRealPath(path);  
  92.     }  
  93.   
  94. }  
  95. </span>  


十。最後一步了,就是到前臺頁面。如何調用jquery.autocomplete,這個很簡單,下載官方的demo下來,很容易就看明白了。貼出jsp的實現頁面:

  1. <span style="font-size:16px;"><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  3. <html>  
  4.   <head>  
  5.       
  6.     <title>產品自動補全</title>  
  7.       
  8.     <meta http-equiv="pragma" content="no-cache">  
  9.     <meta http-equiv="cache-control" content="no-cache">  
  10.     <meta http-equiv="expires" content="0">      
  11.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  12.     <script type="text/javascript" src="jquery/jquery.js"></script>  
  13.     <script type="text/javascript" src="jquery/jquery.autocomplete.js"></script>  
  14.     <link rel="Stylesheet" type="text/css" href="jquery/jquery.autocomplete.css" />  
  15.     <script type="text/javascript">  
  16.         var v_product_Store ;  
  17.         $().ready(function() {  
  18.             $("#productName").autocomplete("findStoreProdctListNameForJson.do", {  //當用戶輸入關鍵字的時候 ,經過 url的方式調用action的findStoreProdctListNameForJson方法  
  19.                 minChars: 1,  //最小顯示條數  
  20.                 max: 12,  //最大顯示條數  
  21.                 autoFill: false,  
  22.                 dataType : "json",  //指定數據類型的渲染方式  
  23.                 extraParams:   
  24.                 {     
  25.                      productName: function()   
  26.                       {   
  27.                        return $("#productName").val();    //url的參數傳遞  
  28.                       }     
  29.                    },  
  30.   
  31.                  //進行對返回數據的格式處理  
  32.                  parse: function(data)   
  33.                     {  
  34.                      var rows = [];  
  35.                        for(var i=; i<data.length; i++)  
  36.                          {    
  37.                              rows[rows.length] = {  
  38.                                data:data[i],  
  39.                                value:data[i],  
  40.                               //result裏面顯示的是要返回到列表裏面的值    
  41.                                result:data[i]  
  42.                              };  
  43.                        }             
  44.                     return rows;  
  45.                 },  
  46.                 formatItem: function(item) {  
  47.                     //沒有特殊的要求,直接返回了  
  48.                         return item;  
  49.                 }  
  50.             });  
  51.           
  52.         });  
  53.     </script>       
  54.           
  55.   </head>  
  56.     
  57.   <body>  
  58.       <div>  
  59.          產品名: <input type="text" id="productName" />  
  60.       </div>  
  61.   </body>  
  62. </html>  
  63. </span>  


OK!搞定!再看一下效果圖:

相關文章
相關標籤/搜索