最近,咱组在搞一个物流系统,老大让我搞个类似google/baidu的自动查询匹配功能,第一反应,网上太多例子了,当即回复老大:放心吧,搞得定。
网上的资料确实多得很,但想不动脑筋找到适合自己的,总感觉不是那么容易。前前后后,折腾得不行了!
在实现这个功能的时候,主要有以下的几个问题:用jquery和dwr,两者有冲突;找到spring与dwr完美整合的,浏览器兼容性差;另一方面,要导入的依赖第三方的js库太多;还有一点很重要,对中文输入好像总不能及时的触发后台调用方法。所以基于上面的一些我强加给他们的缺陷,我决定,自己写个这样的功能组件(说实话,我喜欢干这种事情!
)
在进入主题之前,罗列出我在网上搜索出来的一些不错的实现autocomplete的例子:
1)http://www.gridshore.nl/blog/index.php?/archives/52-Creating-an-autocomplete-with-Spring-and-DWR.html:spring+dwr实现的一autocompletor,效果还不错,需要依赖prototype.js库及其扩展包,浏览器兼容有点问题,我实现就是基于这个,只不过去掉了prototype.js的支持。
2)jquery autocompletor插件,资料多得令人发指,文档、资料、实例相当的丰富。支持多种数据源查询方式,并且有强大的jquery支持。缺点有点跟我这个平台框架里的dwr有些许的冲突,用jQuery.noConflict();貌似也不能很好的解决,so,对我来说就out!而且要导入的库也实在不少。附上一链接:http://www.iteye.com/topic/284154.
如果你有过DWR的使用经历,那你肯定熟悉dwr.xml,为了把Java文件暴露为JS,我们必须在dwr.xml文件中配置Java文件生成JS的方式(new、Spring等等)。重复的配,项目大了,导致dwr.xml文件异常的庞大,后期也难以维护。如果Spring整合DWR,Spring的配置文件的庞大也可见一斑。我本来就是一个讨厌做重复工作的人,既然DWR3.0引入了annotation,当然得用,Spring也早已引入annotation,用。Spring与DWR的整合?必须的,不要再为每写一个Bean、写一个Service再配置Spring的applicationContext.xml文件了,一切交由Spring的annotation完成。(我看网上好多Spring与DWR的整合示例有欠完整,故贴出Spring与DWR整合的部分代码和说明,具体例子见附件,有兴趣的朋友可以拿下来看看,并请指正,谢谢)
贴出web.xml文件配置代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>autoComplete-servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/*-context.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>autoComplete-servlet</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
注意:没org.directwebremoting.servlet.DwrServlet、org.directwebremoting.spring.DwrSpringServlet的配置,一切交由org.springframework.web.servlet.DispatcherServlet,当然了,这得引入spring-webmvc.jar。
现在写一个需要暴露为JS的Bean:
package com.autocomplete.web;
import java.util.List;
import org.directwebremoting.annotations.RemoteMethod;
import org.directwebremoting.annotations.RemoteProxy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import com.autocomplete.logic.IAutoCompleteDemoService;
@Component
@Scope("prototype")
@RemoteProxy(name = "AutoCompleteDemoBean")
public class AutoCompleteDemoBean
{
@Autowired
private IAutoCompleteDemoService autoCompleteDemoService;
@RemoteMethod
public List findDepartmentName(String departmentName){
return autoCompleteDemoService.findDepartmentName(departmentName);
}
}
对于注释的具体含义,尽可以google/baidu,讲得绝对比我详尽,不再献丑。
其中引入了另外一个Service接口,现贴出该接口的实现类代码:
package com.autocomplete.logic;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
@Service
@Scope("prototype")
public class AutoCompleteDemoServiceImpl implements IAutoCompleteDemoService
{
private static List<String> datas = new ArrayList<String>();
//数据集合初始化
static {
datas.add("开发部WMS");
datas.add("开发部EC");
datas.add("开发部CRM");
datas.add("开发部OA");
datas.add("研发部");
datas.add("人力资源部");
datas.add("客服部");
datas.add("财务部");
datas.add("市场部");
datas.add("总载办公室");
}
//根据
@Override
public List findDepartmentName(String param) {
List result = new ArrayList();
if(null!=param&¶m.length()>0){
for(String data:datas){
if(data.startsWith(param)){
result.add(data);
}
}
}
return result;
}
}
OK,代码现在算是写完了,每个类的上面都写了些Spring、DWR的注释类,没引入注释类之前,如果我们要让Spring容器知道我们写的类,那我们得在Spring的配置文件里配置这些接口、类。写一个,配置一个,痛苦幺。现在用了annotation注释,Spring容器可扫描并实例化这些类,当然,这个扫描也是设置个范围,也得让Spring容器有的放矢的实例化类呀。
我们都知道,Spring默认加载WEB-INF/applicationContext.xml,为了实现模块化,我现在一分为二:web-context.xml(bean配置文件)、service-context.xml(service配置文件)。当然了,这两个文件也是相当的简单,至少我认为没你想象中的复杂,我保证。
web-context.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dwr ="http://www.directwebremoting.org/schema/spring-dwr"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.directwebremoting.org/schema/spring-dwr
http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd">
<context:component-scan base-package="com.autocomplete.web" scoped-proxy="targetClass">
<context:include-filter type="regex" expression="com.autocomplete.web.*Bean*"/>
</context:component-scan>
<dwr:configuration>
<dwr:signatures>
<![CDATA[
import java.util.List;
import java.util.Map;
]]>
</dwr:signatures>
</dwr:configuration>
<dwr:controller id="dwrController" debug="true">
<dwr:config-param name="crossDomainSessionSecurity" value="false"/>
<dwr:config-param name="allowScriptTagRemoting" value="true"/>
<dwr:config-param name="debug" value="true"/>
</dwr:controller>
<dwr:annotation-config/>
<dwr:url-mapping />
</beans>
service-context.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<context:component-scan base-package="com.autocomplete.logic" scoped-proxy="targetClass">
<context:include-filter type="regex" expression="com.autocomplete.logic.*ServiceImpl*"/>
</context:component-scan>
</beans>
基础设施已经搞定,现在,让我们开始autocomplete组件的实现之旅吧:
autocomplete组件只由一个JS和一个CSS文件组成,分别为autoCompleterSupport.js和autocomplete.css。在需要使用autocomplete的页面上导入即可。具体实现,请看附件。
发布到web容器,比如Tomcat,输入“开”,并可看到实现效果。
分享到:
相关推荐
公文管理、申请审批、公告管理、会议管理、权限管理、个人办公、客户管理、人事等等。项目技术:Struts1.2 + Hibernate3.0 + Spring2 +DWR。java毕业设计 jsp毕业设计 ssh毕业设计
学习这些资料,开发者可以掌握如何在实际项目中有效地利用Struts1.2处理请求、通过Hibernate3.2管理数据库、借助Spring2.5实现依赖注入和业务逻辑控制,以及利用DWR2.0创建实时的Web应用。此外,还可能涵盖了如何...
ssm整合开发,小程序毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统...
本系统采用经典的SSH(Struts1.2、Hibernate3.0、Spring2)框架与DWR(Direct Web Remoting)技术进行构建,实现了后端与前端的高效交互。 **Struts1.2** 是一款基于MVC(Model-View-Controller)设计模式的Java ...
自已写的一个demo 1 基于SSH,service采用 annotation注入减少配置 ...暴露DWR,写了一个验证用户名的流程 4 采用jpa作为POJO,还是减少配置 5 加入display的分页,并且是物理分页 打开后自已建表sql.txt jdbc.properties
本系统基于Struts1.2、Hibernate3.0、Spring2和DWR四个核心技术框架构建,下面将详细介绍这些技术及其在OA系统中的应用。 **Struts1.2** 是一个开源的MVC(Model-View-Controller)框架,用于构建Java Web应用程序...
这个"struts2.2.1+spring 3.0.3+hibernate3.6+dwr3.0全注解整合包"是将这些框架结合在一起,使用注解方式配置,简化了传统的XML配置文件,提高了开发效率和代码的可读性。以下是关于这四个框架及其整合的知识点: 1...
综合以上,本项目通过Struts2、Spring、Hibernate和DWR的整合,构建了一个具备用户注册、多级下拉联动和表格刷新功能的Web应用。这种整合不仅提高了开发效率,也提升了用户体验,展示了Java Web开发的强大能力。在...
OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR)
OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR).zip
OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR)130224
OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR).zip项目JAVA源码+资料打包OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR).zip项目JAVA源码+资料打包 1.适合学生做毕业设计参考 2.适合...
本文将详细介绍如何配置新版SSH+DWR框架,即Struts2.1.8、Spring3.0和Hibernate3.3.2与Direct Web Remoting (DWR) 2.0.6的集成。这个配置示例是基于目前最新的技术栈,旨在提供一个高效、稳定的开发环境。 首先,...
在“EXTJS+DWR3.0实现文件上传”这个主题中,我们将探讨如何结合这两者来实现一个高效且用户友好的文件上传功能。在实际的Web应用中,文件上传是一个常见的需求,例如在社交媒体平台上传图片、在文档分享网站上传...
该项目采用了Struts1.2作为前端框架,Hibernate3.0作为数据库持久层框架,Spring2作为业务层框架,以及DWR作为远程调用技术,实现了前后端分离的开发模式。 项目功能丰富,包括用户管理、部门管理、职位管理、员工...