【jQuery】JQuery-ui autocomplete与strtus2结合使用

  汉字搜索效果图:

【jQuery】JQuery-ui autocomplete与strtus2结合使用

  拼音首字母搜索效果图:

【jQuery】JQuery-ui autocomplete与strtus2结合使用

   1)数据库表及函数(SQL Server 2008)

  先来建立数据库表City,它包含两个字段CityID,CityName。

CREATE TABLE City

 (

   CityID INT IDENTITY(1,1) Primary KEY ,  --城市主键

   CityName NVARCHAR(50)  NOT NULL,    --城市名称

 ) 

  然后再插入一些示例数据

【jQuery】JQuery-ui autocomplete与strtus2结合使用
 1 INSERT City(CityName) Values('北京市')

 2 INSERT City(CityName) Values('天津市')

 3 INSERT City(CityName) Values('上海市')

 4 INSERT City(CityName) Values('重庆市')

 5 INSERT City(CityName) Values('邯郸市')

 6 INSERT City(CityName) Values('石家庄市')

 7 INSERT City(CityName) Values('保定市')

 8 INSERT City(CityName) Values('张家口市')

 9 INSERT City(CityName) Values('承德市')

10 INSERT City(CityName) Values('唐山市')

11 //省略...
View Code

  从表结构及示例数据来看,这里没有城市名称拼音首字母字段,那如何完成拼音搜索呢?不要着急,这得在数据库中建立一个函数,用来返回汉字的拼音首字母。

create   function  f_GetPy(@str   nvarchar(4000)) 

returns   nvarchar(4000) 

as 

begin 

declare   @strlen   int,@re   nvarchar(4000) 

declare   @t   table(chr   nchar(1)   collate   Chinese_PRC_CI_AS,letter   nchar(1)) 

insert   into   @t(chr,letter) 

    select   '', 'A '   union   all   select   '', 'B '   union   all 

    select   '', 'C '   union   all   select   '', 'D '   union   all 

    select   '', 'E '   union   all   select   '', 'F '   union   all 

    select   '', 'G '   union   all   select   '', 'H '   union   all 

    select   '', 'J '   union   all   select   '', 'K '   union   all 

    select   '', 'L '   union   all   select   '', 'M '   union   all 

    select   '', 'N '   union   all   select   '', 'O '   union   all 

    select   '', 'P '   union   all   select   '', 'Q '   union   all 

    select   '', 'R '   union   all   select   '', 'S '   union   all 

    select   '', 'T '   union   all   select   '', 'W '   union   all 

    select   '', 'X '   union   all   select   '', 'Y '   union   all 

    select   '', 'Z ' 

    select   @strlen=len(@str),@re= ' ' 

    while   @strlen> 0 

    begin 

        select   top   1   @re=letter+@re,@strlen=@strlen-1 

            from   @t   a   where   chr <=substring(@str,@strlen,1) 

            order   by   chr   desc 

        if   @@rowcount=0 

            select   @re=substring(@str,@strlen,1)+@re,@strlen=@strlen-1 

    end 

    return(@re) 

end

  如果调用f_GetPy('北京'),则返回拼音首字母  'bj'

  2)前台页面

【jQuery】JQuery-ui autocomplete与strtus2结合使用
 1 <!DOCTYPE html>

 2 <html>

 3 <head>

 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

 5 <link href="../js/jquery-ui/jquery-ui.min.css" rel="stylesheet" type="text/css"/>

 6  <style>

 7     .ui-autocomplete {

 8         max-height: 100px;

 9         overflow-y: auto;

10         /* prevent horizontal scrollbar */

11         overflow-x: hidden;

12     }

13     /* IE 6 doesn't support max-height

14      * we use height instead, but this forces the menu to always be this tall

15      */

16     * html .ui-autocomplete {

17         height: 100px;

18     }

19 </style>

20 <script type="text/javascript" src="../js/jquery-ui/jquery-1.9.0.min.js"></script>

21 <script type="text/javascript" src="../js/jquery-ui/jquery-ui.min.js"></script>        

22 <script type="text/javascript">

23         $( "#cityNameId" ).focus(function(){

24             //智能提示

25             $( "#cityNameId" ).autocomplete({

26                  source:function(request,response){

27                     $.ajax({

28                         type:"POST",

29                         url:"../cityManage/showTipsByCityName.action",

30                         dataType:"json",

31                         cache : false,

32                         async: false,

33                         data : {

34                             "cityName": $("#cityNameId").val(),

35                         },

36                         success:function(json){

37                             response($.map(json.autoSuggests,function(item){    

38                                 return {

39                                     label:item,

40                                     value:item

41                                 };

42                             }));

43                         }

44                     });

45                 }

46             });

47         });

48 </script>    

49 </head>

50 <body>

51 城市名称:

52 <div class="ui-widget" style="display:inline">

53 <input type ="text" id="cityNameId" name="cityName" >

54 </div>

55 </body>    

56 </html>
View Code

  cityName的值提交到服务器,作为搜索关键字。为了实现Ajax智能提示,需要用到JQuery UI AutoComplete插件,它要求返回JSON格式的数据。所以,下一步就是要在Action中返回JSON数据。

  3)ACTION层

【jQuery】JQuery-ui autocomplete与strtus2结合使用
package com.dong.action;



import java.util.ArrayList;

import java.util.List;

import org.apache.struts2.json.annotations.JSON;

import com.dong.po.City;

import com.dong.service.ICityService;

import com.opensymphony.xwork2.ActionSupport;



/**

 * 城市搜索Action

 * @version 1.0 2013/01/12

 * @author dongliyang

 *

 */

public class CityAction extends ActionSupport{

    

    /** SerialVersionUID*/

    private static final long serialVersionUID = -8042695641942800870L;

    /** 城市Service */

    private ICityService cityService;

    /** 搜索关键字,城市名称 */

    private String cityName;

    /** 城市列表 */

    private List<City> cityList;

    /** 智能提示列表,以JSON数据格式返回 */

    private List<String> autoSuggests = new ArrayList<String>();

    

    /**

     * 智能提示,自动补全功能

     * @return String

     */

    public String autoComplete(){

    

        cityList = cityService.findByName(cityName);

        

        for(City city : cityList){

            autoSuggests.add(city.getCityName());

        }

        

        return SUCCESS;

    }

    

    public void setCityService(ICityService cityService) {

        this.cityService = cityService;

    }



    //搜索关键字不作为JSON数据返回,设置serialize=false

    @JSON(serialize=false)

    public String getCityName() {

        return cityName;

    }



    public void setCityName(String cityName) {

        this.cityName = cityName;

    }

    

    //搜索结果列表不作为JSON数据返回,设置serialize=false

    @JSON(serialize=false)

    public List<City> getCityList() {

        return cityList;

    }



    public void setCityList(List<City> cityList) {

        this.cityList = cityList;

    }

    

    //智能提示列表作为JSON数据返回,设置serialize=true

    @JSON(serialize=true)

    public List<String> getAutoSuggests() {

        return autoSuggests;

    }



    public void setAutoSuggests(List<String> autoSuggests) {

        this.autoSuggests = autoSuggests;

    }

}
View Code

  4)DAO层

【jQuery】JQuery-ui autocomplete与strtus2结合使用
 1 package com.dong.dao.impl;

 2 

 3 import java.util.List;

 4 

 5 import com.dong.dao.ICityDao;

 6 import com.dong.framework.BaseDao;

 7 import com.dong.po.City;

 8 

 9 public class CityDaoImpl extends BaseDao<City> implements ICityDao {

10     

11     /**

12      * 根据名称或拼音搜索城市

13      * @param cityName

14      * @return List<City> 城市列表

15      */

16     public List<City> findByName(String cityName){

17         

18         String hql = "from City c where c.cityName like ? or dbo.f_GetPy(c.cityName) like ?";

19         return find(hql, "%" + cityName + "%",cityName + "%");

20         

21     }

22     

23 }
View Code

  hql语句中,使用cityName和f_GetPy(cityName) 来跟关键字进行like匹配。

  比如:汉字搜索时,关键字"北京"传入方法,hql  where子句中的c.cityName将能够匹配。

           拼音搜索时,关键字"BJ"传入方法,hql where子句中的dbo.f_GetPy(c.cityName)将能够匹配。

  5)struts.xml配置

 <package name="cityManage" namespace="/cityManage" extends="json-default">

   <action name="showTipsByCityName" class="cityAction" method="autoComplete">

     <result name="success" type="json"></result>

   </action>

 </package>

  备注:

  如果城市名称有重名的可能性,那么我们就要考虑在前台页面加上一个hidden存放与之对应的编码。在这种情况下,我们需要修改前台页面html,action层。

  (1)首先我们需要把前台html的页面修改为:

【jQuery】JQuery-ui autocomplete与strtus2结合使用
 1 <!DOCTYPE html>

 2 <html>

 3 <head>

 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

 5 <link href="../js/jquery-ui/jquery-ui.min.css" rel="stylesheet" type="text/css"/>

 6  <style>

 7     .ui-autocomplete {

 8         max-height: 100px;

 9         overflow-y: auto;

10         /* prevent horizontal scrollbar */

11         overflow-x: hidden;

12     }

13     /* IE 6 doesn't support max-height

14      * we use height instead, but this forces the menu to always be this tall

15      */

16     * html .ui-autocomplete {

17         height: 100px;

18     }

19 </style>

20 <script type="text/javascript" src="../js/jquery-ui/jquery-1.9.0.min.js"></script>

21 <script type="text/javascript" src="../js/jquery-ui/jquery-ui.min.js"></script>        

22 <script type="text/javascript">

23         $( "#cityNameId" ).focus(function(){

24             //智能提示

25             $( "#cityNameId" ).autocomplete({

26                  source:function(request,response){

27                     $.ajax({

28                         type:"POST",

29                         url:"../cityManage/showTipsByCityName.action",

30                         dataType:"json",

31                         cache : false,

32                         async: false,

33                         data : {

34                             "cityName": $("#cityNameId").val(),

35                         },

36                         success:function(json){

37                             response($.map(json.autoSuggests,function(item){    

38                                 return {

39                                     label:item.cityName,

40                                     value:item.cityName,

41                                     id:item.cityId

42                                 };

43                             }));

44                         }

45                     });

46                 },

47                 select:function( event, ui ) {

48                     $("#cityId").val(ui.item.id);

49                 }

50             });

51         });

52 </script>    

53 </head>

54 <body>

55 城市名称:

56 <div class="ui-widget" style="display:inline">

57 <input type ="text" id="cityNameId" name="cityName" />

58 <input type="hidden" id="cityCode" /> 

59 </div>

60 </body>    

61 </html>
View Code

  (2)action层修改为:

【jQuery】JQuery-ui autocomplete与strtus2结合使用
 1 package com.dong.action;

 2 

 3 import java.util.ArrayList;

 4 import java.util.List;

 5 import org.apache.struts2.json.annotations.JSON;

 6 import com.dong.po.City;

 7 import com.dong.service.ICityService;

 8 import com.opensymphony.xwork2.ActionSupport;

 9 

10 /**

11  * 城市搜索Action

12  * @version 1.0 2013/01/12

13  * @author dongliyang

14  *

15  */

16 public class CityAction extends ActionSupport{

17     

18     /** SerialVersionUID*/

19     private static final long serialVersionUID = -8042695641942800870L;

20     /** 城市Service */

21     private ICityService cityService;

22     /** 搜索关键字,城市名称 */

23     private String cityName;

24     /** 智能提示列表,以JSON数据格式返回 */

25     private List<City> autoSuggests = new ArrayList<City>();

26     

27     /**

28      * 智能提示,自动补全功能

29      * @return String

30      */

31     public String autoComplete(){

32     

33         autoSuggests = cityService.findByName(cityName);

34         return SUCCESS;

35     }

36     

37     public void setCityService(ICityService cityService) {

38         this.cityService = cityService;

39     }

40 

41     //搜索关键字不作为JSON数据返回,设置serialize=false

42     @JSON(serialize=false)

43     public String getCityName() {

44         return cityName;

45     }

46 

47     public void setCityName(String cityName) {

48         this.cityName = cityName;

49     }

50     

51     //智能提示列表作为JSON数据返回,设置serialize=true

52     @JSON(serialize=true)

53     public List<City> getAutoSuggests() {

54         return autoSuggests;

55     }

56 

57     public void setAutoSuggests(List<City> autoSuggests) {

58         this.autoSuggests = autoSuggests;

59     }

60 }
View Code

  

参考资料:

  1.参考资料:http://www.cnblogs.com/dongliyang/archive/2013/01/20/2868699.html

  2.获取汉字拼音首字母的函数,来自:http://www.cnblogs.com/wuhuacong/archive/2010/01/25/1655916.html

你可能感兴趣的:(autocomplete)