使用DWR实现自动补全

自动补全:是指用户在文本框中输入前几个字母或汉字的时候,自动在存放数据的文件或数据库中将所有以这些字母或汉字开头的数据提示给用户供用户选择

在日常上网过程中,我们经常使用搜索引擎,当我们输入想要检索的关键字时,搜索引擎会提示我们相关的关键字

训练要点:

掌握使用DWR框架开发Ajax程序

使用MyEclipse 10.0 + MySql5.0

新建数据库:可以手动随便新建一个测试用的

DROP TABLE IF EXISTS `books`;
CREATE TABLE `books` (
  `id` varchar(100) NOT NULL,
  `isbn` varchar(25) default NULL,
  `title` varchar(100) default NULL,
  `price` double default NULL,
  `pubdate` date default NULL,
  `intro` bigint(20) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

随便插入几条数据:

INSERT INTO `books` VALUES ('1', 'BH123', 'java编程思想昂', '55', '2014-06-10', '333');
INSERT INTO `books` VALUES ('2', 'BH23', 'JS实战经典', '22', '2014-06-10', '3');
INSERT INTO `books` VALUES ('3', '1231232', 'Java核心技术卷', '66', '2014-06-13', '3');
INSERT INTO `books` VALUES ('4', '2342', 'java开发实战经典', '33', '2014-06-13', '98');

使用myeclipse 切换到database视图,右击新建一个数据连接

新建web project 项目:BookShop,使用MyEclipse添加SSH支持;

先加Spring支持,选择前四个库AOP,Core,Persistence Core,JDBC 选择spring3.0;

添加dwr的jar包到lib下;

添加hibernate支持;

下一步,选择Spring configuration file

下一步,选择Existing Spring configuration file

下一步选择刚刚配置好的JDBC Driver:mysql;

下一步,不选择 创建SessionFactory;

添加Sturts2支持:

选择struts2.1,下一步记得选择Struts2 Spring包;

在web.xml配置spring 和dwr;

<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

<servlet>
		<servlet-name>dwr</servlet-name>
		<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
		<init-param>
			<param-name>debug</param-name>
			<param-value>true</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>dwr</servlet-name>
		<url-pattern>/dwr/*</url-pattern>
	</servlet-mapping>

在WEB-INF新建dwr.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC
    "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN"
    "http://getahead.org/dwr/dwr30.dtd">
<dwr>
	<allow>
		<create javascript="BooksBiz" creator="spring" scope="application">
			<param name="beanName" value="BooksBiz"></param>
			<include method="findTitle" />
		</create>
		<convert converter="bean" match="com.books.entity.Books" />
		<create creator="new" javascript="validator">
			<param name="class" value="org.apache.struts2.validators.DWRValidator"></param>
		</create>
		<convert converter="bean" match="com.opensymphony.xwork2.ValidationAwareSupport" />
	</allow>
</dwr>

将books反向工程: 切换到Database Explorer模式,选择mysql 的books表右击表选择Hibernate Reverse …

在Java package新建包com.books.eneity

说明上面三部:

创建一个hibernate实体配置文件books.hbm.xml

创建一个实体类Books

创建Spring Dao

下一步:

Id策略选择 assigned;

完成;



将类BooksDao移到com.books.dao;

新建接口BooksBiz在com.books.biz下,添加如下方法:

public List<Books> findTitle(String title);

新建实现类BooksBizImpl implements BooksBiz 在com.books.biz.impl下

	private BooksDAO booksDAO;

	public List<Books> findTitle(String title) {
		List<Books> list = booksDAO.findTitle(title);
		return list;
	}

	public void setBooksDAO(BooksDAO booksDAO) {
		this.booksDAO = booksDAO;
	}

在BooksDAO下新建 findTitle方法:

	public List<Books> findTitle(String title2) {
		Query query = this.getSession().createQuery("from Books b where b.title like :title order by b.pubdate desc");
		query.setParameter("title", title2 + "%");
		return query.list();
	}

配置 applicationContext:

头部添加tx和aop支持

	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="
	http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/tx
	http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
	">

在</beans>前添加:

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	<tx:advice transaction-manager="transactionManager" id="txAdvice">
		<tx:attributes>
			<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
			<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
			<tx:method name="*" propagation="REQUIRED" read-only="false" />
		</tx:attributes>
	</tx:advice>

	<aop:config>
		<aop:pointcut expression="execution( * com.books.biz.*.*(..))" id="pointcut" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut" />
	</aop:config>

	<bean id="BooksBiz" class="com.books.biz.impl.BooksBizImpl">
		<property name="booksDAO" ref="BooksDAO"></property>
	</bean>

Index.jsp页面

在head下面加:

	<script type='text/javascript' src='dwr/engine.js'></script>
  	<script type='text/javascript' src='dwr/interface/BooksBiz.js'></script>
  	<script type='text/javascript' src='dwr/util.js'></script>
  	<style type="text/css">
  		#sel{
  			position: absolute;
  			top: 34px;
  			left:90px;
  			visibility: hidden;

  		}
  	</style>
  	<script type="text/javascript">
  		function getTitle(){
  			var title=dwr.util.getValue('title');
  			if(title==''){
  				$('sel').style.visibility="hidden";
  				return ;
  			}
  			BooksBiz.findTitle(title,callback);
  		}
  		function callback(list){
  			if(list.length==0){
  				$('sel').style.visibility="hidden";
  				return ;
  			}else{
  				$('sel').style.visibility="visible";
  			}
  			$('sel').size=list.length;
  			dwr.util.removeAllOptions('sel');
  			dwr.util.addOptions('sel',list,"title","title");
  		}
  		function getValue(){
  			$('title').value=$('sel').options[$('sel').selectedIndex].innerHTML;
  			$('sel').style.visibility="hidden";
  		}
  	</script>

  <body>
    图书搜索:<input type="text" id="title"  onkeyup="getTitle()">
    <select id="sel" ondblclick="getValue()" multiple="multiple"></select>
    <input type="button" value="搜 索">
  </body>
</html>

部署运行的时候,会有包冲突,

打开部署的目录F:\Java\apache-tomcat-6.0.37\webapps\BookShop\WEB-INF\lib,将里面的jar包拷贝出来 重复的antlr删掉最低版本的,然后将项目停掉吧我们之前工具导入的jar库都remove,再将拷贝出来的jar们复制到lib下;



部署,访问主页,输入数据库数据 的首个字就有对应数据显示;

源码下载:

http://pan.baidu.com/s/1eQtJhiq

dwr jar下载:http://pan.baidu.com/s/1o61Auee

使用DWR实现自动补全 类似百度搜索框的自动显示效果的更多相关文章

  1. 使用DWR实现自己主动补全 相似百度搜索框的自己主动显示效果

    使用DWR实现自己主动补全 自己主动补全:是指用户在文本框中输入前几个字母或汉字的时候,自己主动在存放数据的文件或数据库中将全部以这些字母或汉字开头的数据提示给用户供用户选择 在日常上网过程中,我们常 ...

  2. JavaScript实现模糊推荐的input框(类似百度搜索框)

    如何用JS实现一个类似百度搜索框的输入框呢,再填充完失去焦点时,自动填充配置项,最终效果如下图: 实现很简单,但是易用性会上升一大截,需要用到的有jquery-ui的autocomplete,jque ...

  3. Ajax以及类似百度搜索框的demo

    public class Ajax01 extends HttpServlet{ @Override protected void service(HttpServletRequest request ...

  4. idea中scala语言自动补全变量的同时,也自动补全类型

    IDE是IDEA,scala中,在new一个对象时,通过快捷键ctrl + Alt + V自动补全变量,但是我还想自动补全变量的类型,就像图中所示,在Specify type前面自动帮你打勾. 可以按 ...

  5. 仿Google首页搜索自动补全

    仿Google自动补全,实现细节: 后台是简单的servlet(其实就是负责后台处理数据交互的,没必要非跌用个struts...什么的) 传输介质:xml 使用jQuery js框架 功能实现: 如果 ...

  6. IntelliJ IDEA中类似Eclipse自动补全变量名称和属性名称的快捷键

    IntelliJ IDEA 默认快捷键模式下 自动补全变量名称 : Ctrl + Alt + v 自动补全属性名称 : Ctrl + Alt + f

  7. jQuery AutoComplete 自动补全

    jQuery.AutoComplete是一个基于jQuery的自动补全插件.借助于jQuery优秀的跨浏览器特性,可以兼容Chrome/IE/Firefox/Opera/Safari等多种浏览器. 特 ...

  8. Python2.7.12开发环境构建(自动补全)

    一.安装readline-devel包 Python的编译安装依赖于这个包 yum -y install readline-devel 二.安装Python2.7.12 Python官方网站(到此处下 ...

  9. Python自动补全

    转自:http://blog.linuxeye.com/324.html Python自动补全有vim编辑下和python交互模式下,下面分别介绍如何在这2种情况下实现Tab键自动补全. 一.vim ...

随机推荐

  1. [SHOI2011]双倍回文

    Description   Input 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. Output 输出文件只有一行,即:输入数据中字符串的最长 ...

  2. [AHOI2009]中国象棋

    题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...

  3. C++函数的重载

    两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参与形参的类型以及个数的最佳匹配,自动确定调用的函数,这就是函数的重载. 两个名字相同的函数必须具有不同的形参,这里的不同指的 ...

  4. Java连接FTP成功,但是上传是失败,报错:Connected time out

    Java代码在本机上传文件到FTP服务器的时候成功,但是部署到测试服务器的时候出现,连接FTP成功但是上传失败,并且报Connected time out错误: 测试服务器和FTP服务都在阿里云上:( ...

  5. Python中模块之queue的功能介绍

    模块之queue的功能介绍 队列的分类: 队列主要要分为两种 1.双向队列 2.单项队列 1. 单项队列 创建单项队列 格式:queue.Queue(obj) 例如:que = queue.Queue ...

  6. C语言程序设计实验第四次作业

    (一)改错题 输出三角形的面积和周长,输入三角形的三条边a.b.c,如果能构成一个三角形,输出面积area和周长perimeter(保留2位小数):否则,输出"These sides do ...

  7. js添加key为数字的对象,通过类似于通过访问数组的中括号形式访问对象属性

    var obj={};obj[1] = "mm";obj[2]="nn";console.log(obj[1]); 同var obj={};obj[" ...

  8. Map value类型不同的写法

    Map value类型不同的写法 Map<String, Object> accountMap=new HashMap<String, Object>(); int userI ...

  9. java总结之基础类型与常量池

    1.基础类型有byte short int long char boolean float double八种. 其中byte short int long char 的包装类型是存放在常量池(用来维护 ...

  10. Missing URI template variable 'XXXX' for method parameter of type String

    原因:就是spring的controller上的@RequestMapping的实参和方法里面的形参名字不一致 方法:改成一样就可. ps.还能用绑定的方法,不建议,因为太麻烦了 @RequestMa ...