最近学习DWR,mark下
DWR框架常用于用户名的验证和注册
1.DWR介绍
DWR就是可以在javascript里面直接调用Java代码,它的实现是基于Ajax,可以实现无刷新效果(数据与服务器进行交互,用户完全感觉不到)
2.DWR配置和使用
1)web.xml的配置
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
通常要看DWR生成的测试页,通过测试页执行可以直接检测你写的java类代码正确性,
可以在上面servlet标签里面加入:
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
就可以访问网址:http://localhost:8080/app/dwr,查看运行(app为你创建的项目名称)
2)dwr.xml(新建这个xml文件在WEB-INF目录下)
下面的配置适合于js调用没有返回值和参数的java方法
配置dwr.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN"
"http://www.getahead.ltd.uk/dwr/dwr30.dtd"> //这行标签一定加上,否则会有错误
<dwr>
<allow>
<create creator="new" javascript="userdao" >
<param name="class" value= "com.dao.userDao" />
<include method="checkUser"/>
</create> //creator表示实例的生成方式为new,DWR会调用类的默认构造函数来构造
//javascipt表示java类让js访问类的对象时的名称,param表示公开给js的java类,
//include是公开给js的java方法,exclude表示禁止公开的java方法,如果不写include标签就代表此java类的所有方法都公开
</allow>
</dwr>
js调用:
先引入 javascript 脚本
<script src='dwr/interface/ userdao.js'></script>
<script src='dwr/engine.js'></script>
<script src='dwr/util.js'></script>
其中 userdao.js 是 dwr 根据配置文件公开给js的java对象的名称, engine.js 和 util.js 是 dwr 自带的脚本文件。
其次,编写调用 java 方法的 javascript 函数
Function check(){
userdao.checkUser();
}
3.错误
web.xml的<servlet>标签下面加入下面代码,跨域访问
<init-param>
<param-name>crossDomainSessionSecurity</param-name>
<param-value>false</param-value>
</init-param>
我做的一个用户名验证和注册时出现的错误:(你可能也会有的)
User:用户的实体类
UserDao:用户和数据库交互的类,方法checkUser(String name)检查用户名是否存在,
方法addUser(User user)来注册用户,(注意我传进来的是一个对象)
给方法传进来对象怎么解决?
在dwr.xml中配置<convert>标签
<convert converter="bean" match="com.bean.User" >
<param name="include" value="username,password"></param>
</convert>
Bean转换器,match为javabean的目录,param制定要转换的javabean的属性
js接受到表单的数据,你可以用json的格式表示,比如:
var user={username:”zhangsan”,password:”123”};
转换器可以自动把json格式的数据转换为javabean的形式,new创建一个实例,通过set和get函数把参数传给对象。
(一定要注意,实体类User一定要有空的构造函数,没有会出现Error错误的)
注册还有传值方式:
js直接传进来的是两个参数,java的方法参数是username和password。
或者
传给Java的是json,java导入json类库来解析json数据
我的实验的一些配置和主页代码:(web.xml,dwr.xml,index.jsp)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <?xml version="1.0" encoding="UTF-8"?> 3 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns="http://java.sun.com/xml/ns/javaee" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 6 id="WebApp_ID" version="3.0"> 7 <display-name>Test</display-name> 8 <welcome-file-list> 9 <welcome-file>index.html</welcome-file> 10 <welcome-file>index.htm</welcome-file> 11 <welcome-file>index.jsp</welcome-file> 12 <welcome-file>default.html</welcome-file> 13 <welcome-file>default.htm</welcome-file> 14 <welcome-file>default.jsp</welcome-file> 15 </welcome-file-list> 16 <servlet> 17 <servlet-name>dwr-invoker</servlet-name> 18 <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class> 19 <init-param> 20 <param-name>debug</param-name> 21 <param-value>true</param-value> 22 </init-param> 23 <init-param> 24 <param-name>crossDomainSessionSecurity</param-name> 25 <param-value>false</param-value> 26 </init-param> 27 </servlet> 28 <servlet-mapping> 29 <servlet-name>dwr-invoker</servlet-name> 30 <url-pattern>/dwr/*</url-pattern> 31 </servlet-mapping> 32 33 </web-app> 34 <!DOCTYPE dwr PUBLIC 35 "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" 36 "http://www.getahead.ltd.uk/dwr/dwr30.dtd"> 37 <dwr> 38 <allow> 39 <create creator="new" javascript="userdao" > 40 <param name="class" value= "com.dao.userDao" /> 41 <include method="checkUser"/> 42 <include method="addUser"/> 43 </create> 44 <convert converter="bean" match="com.bean.User" > 45 <param name="include" value="username,password"></param> 46 </convert> 47 48 </allow> 49 </dwr> 50 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 51 <% 52 String path = request.getContextPath(); 53 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 54 %> 55 56 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 57 <html> 58 <head> 59 <base href="<%=basePath%>"> 60 61 <title>My JSP 'index.jsp' starting page</title> 62 <meta http-equiv="pragma" content="no-cache"> 63 <meta http-equiv="cache-control" content="no-cache"> 64 <meta http-equiv="expires" content="0"> 65 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 66 <meta http-equiv="description" content="This is my page"> 67 <!-- 68 <link rel="stylesheet" type="text/css" href="styles.css"> 69 --> 70 </head> 71 72 73 <body align=center> 74 <h1> 用户注册</h1> <br> 75 用户名:<input type="text" id="username" onblur="check()"> <span id="msg" style="color:red;"></span><br> 76 密码:<input type="text" id="password"><br> 77 <input type="button" value="注册" onclick="submit()"> 78 </body> 79 <script src='dwr/interface/userdao.js'></script> 80 <script src='dwr/engine.js'></script> 81 <script src='dwr/util.js'></script> 82 <script type="text/javascript"> 83 function check(){ 84 var name=document.all.username.value; 85 userdao.checkUser(name,onData); 86 } 87 function onData(result){ 88 if(result==false){ 89 document.getElementById("msg").innerHTML="用户名可以注册"; 90 }else{ 91 document.getElementById("msg").innerHTML="用户名重复了"; 92 } 93 } 94 function submit(){ 95 var user; 96 user={username:document.all.username.value,password:document.all.password.value}; 97 //alert(JSON.stringify(user)); 98 userdao.addUser(user,onRe); 99 } 100 function onRe(dat){ 101 if(dat>0){ 102 alert("注册成功"); 103 } 104 else{ 105 alert("注册失败"); 106 } 107 } 108 </script> 109 </html>
一些运行结果: