[项目实战] ibatis +spring+struts2+jquery.autocomple...

这两天忙公司的项目,没有把项目的demo写出来。趁现在空闲,偷偷的写一下。奋斗
先上demo结构目录图:

[项目实战] ibatis +spring+struts2+jquery.autocomple...

大家看到了吧,项目层次分得很清楚。
config  是 spring和itatis的配置文件。接下来就是经典的mvc分层架构啦,bean  ----  dao ---- service -----  action ---  view。理论的东西,我就不多说了。下面我按照这个demo开发流程一步一步写出来:
一。在eclipse新建项目,导入jar包,有木有??!!!

 

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

view plain
  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。相关的配置文件如下图:

[项目实战] ibatis +spring+struts2+jquery.autocomple...

 

四。在classpath路径下,新建struts.xml 和log4j.properties 文件,分别是 struts的映射文件 和 日志信息的配置。

 

五。把配置文件建好以后,就开始写代码了。这个demo业务很简单,只有一个bean,一张表就足够了。表的话 大家就自己建把,一个主键,一个产品名就OK啦。

bean的代码就不贴出来了,就是getter 和setting方法。

 

六。建立ibatis的sql配置文件,StoreProduct.xml如下:

view plain
  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为返回值类型。

select S.name from zy_store_product S where lower(S.name) LIKE lower('%$productName$%')  就是一句标准的sql语句了,$productName$ 代表参数。在这里可以执行任何复杂的sql语句,这就是

ibatis的灵活之处。ibatis的用法这里就不详细说了,以后有机会贴上一篇ibatis的增删查改的demo。

 

七。封装一个操作ibatis的类,用于简化ibatis的crud(增删查改)操作,每个dao都要继承这个类。BaseIbaitsDAO 如下:

view plain
  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层了。

view plain
  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的配置文件如下:

view plain
  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,该类如下:

view plain
  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的实现页面:

view plain
  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!搞定!再看一下效果图:

[项目实战] ibatis +spring+struts2+jquery.autocomple...

你可能感兴趣的:(jquery,autocomplete)