首先dwr介绍回顾
步骤1.将dwr.jar包放在工程目录LIB下面
2.在web.xml中加入dwr的<servlet>,如果整合了struts,则将dwr的配置文件放在struts配置文件下面 ,如下(红色为DWR配置文件)
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<!-- Tiles configuration -->
<init-param>
<param-name>definitions-config</param-name>
<param-value>/WEB-INF/tiles-defs.xml</param-value>
</init-param>
<!-- Struts configuration -->
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml,/WEB-INF/struts-config2.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
3.编写DAO类(操作类,相关的操作)
4.写dwr.xml文件,该文件必须放在跟WEB.xml同目录下面
5.写相关的JSp页面,在也面中必须引入如下几个JS文件
<script type="text/javascript" src="dwr/util.js"></script>
<script type="text/javascript" src="dwr/engine.js"></script>
<script type="text/javascript" src="dwr/interface/*.js"></script>
注意:*代表的是dwr.xml文件中的create标签中的属性javascript的值
6.在jsp页面中写上相关的js操作以及DIV
接下来就写一个模仿GOOGLE的搜索条,首先完成以上的1跟2两个步骤,不再说明
3.写相关的DAO层,跟service层,省去相关的代码
public List getxwdjlz(String xxhh) throws Exception {
List list = new ArrayList();
//list.add("33");
//list.add("301");
//list.add("304");
//如果结合spring一起写的,可以不用创建daos该对象,直接用SPRING容器自动创建,WEB启动的时候就已经创建好,直接用set方法调用就可以
HyzkzmDAO daos=new Db2ServerHyzkzmDAO(); try{
daos.getConncetion();
list = daos.getxwdjlz(xxhh);
System.out.println("列表 数值:"+list);
daos.releaseConncetion();
}
catch(Exception ex){
daos.releaseConncetion();
}
return list;
}
4.dw.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就是创建了刚才写的操作类对应的js-->
<create javascript="hyzkDao" creator="new">
<param name="class" value="service.impl.HyzkzmManagerImpl"></param>
<!--可以操作该类中的getxwdjlz方法-->
<include method="getxwdjlz"></include>
</create>
<!--一下可以参考,该例子用不到以下代码,省去-->
<!-- <create javascript="userDao" creator="new">
<param name="class" value="com.dwr.dao.UserDao"></param>
</create>
<convert converter="bean" match="com.dwr.model.User">
<param name="include" value="username,age"></param>
</convert> -->
<!-- 返回list
<convert converter="bean" match="org.coffee.oa.vo.Organise" />
</allow>
<!--如果返回的是一个list对象,其中list装载了其他对象,请参考如下-->
<signatures>
<![CDATA[
import java.util.List;
import org.coffee.oa.biz.OrganiseBIZ;
import org.coffee.oa.vo.Organise;
]]>
</signatures>
-->
</allow>
</dwr>
5.
<script type="text/javascript" src="dwr/util.js"></script>
<script type="text/javascript" src="dwr/engine.js"></script>
<script type="text/javascript" src="dwr/interface/hyzkDao.js"></script>
6.test.jsp代码如下
<!-- 模拟google搜索 -->
<script type="text/javascript">
/**//********************************可配置选项********************************/
// 被选中的相似关键字背景颜色
var selectedBgColor = "#CCCCCC";
// 未被选中的相似关键字背景颜色
var unselectedBgColor = "#FFFFFF";
// 相似关键字列表框的边框
var listBorder = "1 solid #000000";
/**//***************************************************************************/
/**//********************************不可配置选项********************************/
// 上一次输入的关键字(用来判断关键字是否有改变,没有则不再去服务端重新获取提示关键字)
var oldKeyValue;
// 鼠标相对于提示关键字列表框的位置(0:提示框外面,1:提示框里面)
var mouseLocation = 0;
// 当前选中的提示关键字索引(从0开始,等于-1表示没有被选中项)
var selectedKeyIndex = -1;
// 上一次选中的提示关键字索引(从0开始,等于-1表示没有上次被选中项)
var oldSelectedKeyIndex = -1;
// 提示关键字总数
var tdCount = 0;
/**//***************************************************************************/
/**//*
用途:给String对象添加去除左右空格方法
*/
String.prototype.trim = function() {
var m = this.match(/^/s*(/S+(/s+/S+)*)/s*$/);
return (m == null) ? "" : m[1];
}
/**//*
用途:初始化提示关键字列表框的状态
*/
function initKeyListState(){
selectedKeyIndex = -1;
oldSelectedKeyIndex = -1;
tdCount = 0;
}
/**//*
用途:将上一次选中的关键字项变为未选中
*/
function disSelectedOldKey(){
//判断说明:oldSelectedKeyIndex!=selectedKeyIndex
// 当只有一个相似关键字的时候,则不存在上一次选中和这次选中关键字,
// 只要第一次选中后,按向上或向下箭头都是选中。
if (oldSelectedKeyIndex!=-1&&oldSelectedKeyIndex!=selectedKeyIndex){
$('keyId'+ oldSelectedKeyIndex).bgColor=unselectedBgColor;
}
// 上一次选中项更新
oldSelectedKeyIndex = selectedKeyIndex;
}
/**//*
用途:当按上下箭头时选中新的提示关键字项,按回车时将选中的提示关键字输入到搜索框。
*/
function setSelectedKey(){
// $('keyId0')存在表示有相关提示关键字,不存在则不处理。
if($('keyId0')){
if (event.keyCode==38){
//------处理向上事件------
if (selectedKeyIndex==-1){
selectedKeyIndex = tdCount-1;
}else{
selectedKeyIndex= (selectedKeyIndex+tdCount-1)%tdCount;
}
$('keyId'+ selectedKeyIndex).bgColor= selectedBgColor;
disSelectedOldKey();
}else if (event.keyCode==40){
//------处理向下事件------
if (selectedKeyIndex==-1){
selectedKeyIndex = 0;
}else{
selectedKeyIndex = (selectedKeyIndex+1)%tdCount;
}
$('keyId'+ selectedKeyIndex).bgColor= selectedBgColor;
disSelectedOldKey();
}else if (event.keyCode==13){
//------处理回车事件------
$('cond').value=$('keyId'+ selectedKeyIndex).innerText;
setCursorLast($('cond'));
// 隐藏提示关键字列表框
$('dropdownlistDiv').style.display='none';
}
}
}
/**//*
用途:获取相似关键字
*/
function getConformKey(){
//得到输入的关键字
var keyValue = $('cond').value.trim();
// alert(keyValue);
// alert("老的关键字"+oldKeyValue);
// 如果这次的查询关键字和上次的一样,则不去服务器重新获取相似关键字列表。
if (keyValue!=oldKeyValue){
// 关键字为空则不去服务器获取相似关键字列表
if (keyValue==''){
dwr.util.removeAllRows('showKeyList');
setDropListVisible(false);
initKeyListState();
}else{
//采用ajax异步模式获取相似关键字(这里的useraction,改成自己的action)
//alert("执行");
hyzkDao.getxwdjlz(keyValue,conformKeyCallback); //调用了类中的方法getxwdjlz,其中keyValue为传进去的一个参数,conformKeyCallback为回调方法,下面有对应的js方法
}
}
}
/**//*
用途:获取关键字回调方法
*/
function conformKeyCallback(keyList){
// alert(keyList);
dwr.util.removeAllRows('showKeyList');
initKeyListState();
if (keyList.length>0){
// alert(keyList.length);
// 生成相似关键字提示框
dwr.util.addRows('showKeyList',keyList,cellFuncs, {
cellCreator:function(options) {
var td = document.createElement("td");
td.id = 'keyId' + tdCount++;
td.onmouseover = function (){selectedKeyIndex=parseInt(this.id.substring(5,td.id.length));this.bgColor=selectedBgColor;disSelectedOldKey();};
td.οnclick= function (){
$('cond').value=this.innerText;
$('cond').focus();
setCursorLast($('cond'));
$('dropdownlistDiv').style.display='none';
};
return td;
},escapeHtml:false});
setDropListVisible(true);
}else{
setDropListVisible(false);
}
}
/**//*
用途:表格数据显示处理方法
*/
var cellFuncs = [
function(data) { return data; }
];
/**//*
用途:将输入框的光标移到最后
*/
function setCursorLast(inputObj){
var inputRange = inputObj.createTextRange();
inputRange.collapse(true);
inputRange.moveStart('character',inputObj.value.length);
inputRange.select();
}
/**//*
用途:创建相似关键字列表框
*/
function createShowDiv(){
var showDiv = document.createElement("div");
//alert(showDiv);
// var showDiv = document.createElement("div");
// alert( dwr.util.getValue("cond"));
showDiv.id = "dropdownlistDiv";
with(showDiv.style){
position = "absolute";
//层的绝对位置从这调整
left = parseInt($('cond').style.left.replace('px',''))+190;
top = parseInt($('cond').style.top.replace('px',''))+parseInt($('cond').style.height.replace('px',''))+28;
width = parseInt($('cond').style.width.replace('px',''));
border = listBorder;
zIndex = "1";
display='none';
backgroundColor = unselectedBgColor;
}alert(showDiv);
showDiv.οnmοuseοver=function (){mouseLocation=1;};
showDiv.οnmοuseοut=function (){mouseLocation=0;};
//overflow设置滚动条
showDiv.innerHTML = "<div style='width:100%;height:150px;overflow:auto;'><table border='0' style='width: 100%;height:20%;font-size: 12;color:#33CC00;'><tbody id='showKeyList' style='margin-left: 0;margin-right: 0;margin-bottom: 0;margin-top: 0;'></tbody></table></div>";
document.body.appendChild(showDiv);
initKeyListState();
}
/**//*
用途:设置相似关键字列表框是否可见
参数:isDisplay,true表示可见,false表示不可见
*/
function setDropListVisible(isDisplay){
if (mouseLocation == 1){
return;
}
if (($('cond').value.trim()!='')&&(isDisplay==true)){
$('dropdownlistDiv').style.display='';
}
else{
$('dropdownlistDiv').style.display='none';
}
}
// 将创建相似关键字列表框方法附加到onload事件中
if (window.addEventListener){
window.addEventListener('load', createShowDiv, false);
}else if (window.attachEvent){
window.attachEvent('onload', createShowDiv);
}
</script>
</head>
<body>
<div style="position:absolute;left:190px;top:25px;">
<input AUTOCOMPLETE="off" οnkeydοwn="oldKeyValue=this.value.trim();setSelectedKey();" οnkeyup="getConformKey();" οnfοcus="if(this.value=='找人') this.value='';setDropListVisible(true);" οnblur="setDropListVisible(false);" style="width: 300; height: 23;z-index: 10;top:0;left:0;" type="text" name="cond" value="找人" id="cond" />
<input type="button" class="btn" value="搜一下" οnclick="findBylike();" />
</div>
</body>
</html>