DWR 对象的传递不会写,请大家帮忙看看要怎么改,谢谢了!前台的方法:
function add(){
         //获取页面表单的值
         var username=document.getElementById("username").value;
var password=document.getElementById("password").value;
var sex=document.getElementById("sex").value;
var tea=document.getElementById("tea").value;         //下面的Map用法有错,不懂怎么写,各位帮我看一下
         //把上面获取的值放到Map中           
         var userMap=new Map();
userMap.put("username",username);
userMap.put("password",password);
userMap.put("sex",sex);
userMap.put("tea",tea);


         //执行dwr的方法把Map传入后台
submit.saveUser(userMap,function callback(data){
alert(data);
});
}后台java方法直接使用User的实体来接收:
         
         public boolean saveUser(User user){
         ……
         }那么,在配置文件里应该怎么配置呢? 我在网上看了很多都不行,郁闷死了a !

解决方案 »

  1.   

    好像是要在dwr.xml中配置<signatures></signatures> 来实现实体与Map的转换,具体我也不是很清楚!  
      

  2.   

    既然后台接受的是一个User user对象,前台调用的时候就要传递一个类似js对象
    var user = {};
    把获取页面表单的值设置为user的属性
    user.username=username;
    user.password=password;
    ...
    把该user对象传递给方法submit.saveUser(....);记得要在dwr.xml文件中配置bean转化器转换java的User类
    js构造对象的属性名字要和javabean的属性名字一样
      

  3.   

    噢~用Map不行哦?   那个bean转换器就是一楼说的那个吗?
    具体该怎么写啊?
      

  4.   

    dwr用过,但是对象转换没怎么研究。搞了半天,终于搞出来了。js是没有map的,但是有object对象的,在页面可以定义一个object对象,然后给对象赋值,可以用json格式给赋值,也可以用对象.属性赋值。然后最重要的就是dwr的配置文件了,要注意转换对象。帖代码:
    1.index.jsp<%@ page language="java" import="java.util.*" pageEncoding="gbk"
    isELIgnored="false"%>
    <%
    String path = request.getContextPath();
    %>
    <html>
    <head>
    <script type='text/javascript' src='<%=path%>/dwr/interface/user.js'>
    </script>
    <script type='text/javascript' src='<%=path%>/dwr/engine.js'>
    </script>
    <script type='text/javascript' src='<%=path%>/dwr/util.js'>
    </script>
    <script type="text/javascript">
    function checkLogin() {
    var username = document.getElementById("username").value;
    var password = document.getElementById("password").value;
    var u = {
    username : username,
    password : password
    };
    if (username.match(/^\s*$/)) {
    alert("请输入用户名!");
    } else if (password.match(/^\s*$/)) {
    alert("请输入密码!");
    } else {
    user.checkLogin(u, function(data) {
    if (data == true) {
    alert("用户名密码验证成功!");
    } else {
    alert("验证失败,请重试!");
    }
    })
    }
    }
    </script>
    </head>
    <body>
    <form>
    用户名:
    <input type="text" name="username" id="username" />
    <br />
    密 码:
    <input type="password" name="password" id="password" />
    <br />
    <input type="button" value="验证" onclick="checkLogin()" />
    </form>
    </body>
    </html>
    2.User.javapackage bean;public class User {
    private String username;
    private String password;
    public String getUsername() {
    return username;
    }
    public void setUsername(String username) {
    this.username = username;
    }
    public String getPassword() {
    return password;
    }
    public void setPassword(String password) {
    this.password = password;
    }
    public boolean checkLogin(User user){
        return user.password.equals("123")&&user.username.equals("123")?true:false;
        }
    }
    3.dwr配置文件dwr.xml<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd">
    <dwr> 
    <!-- without allow, DWR isn't allowed to do anything --> 
    <allow> 
    <create creator="new" javascript="user" > 
    <param name="class" value="bean.User" /> 
    <include method="checkLogin"/> 
    </create> 
    <convert converter="bean" match="bean.User" > 
    <param name="include" value="username,password" /> 
    </convert>
    </allow>
    </dwr>
    4.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>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>dwr-invoker</servlet-name>
    <url-pattern>/dwr/*</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    </web-app>
    有问题可以给我留言
      

  5.   

    好久没用了,复习下,我以前好像是用json处理的!
      

  6.   

    是这样的,你的代码只传username和passowrd两个属性,String类型当然好传. 而我要传的User里还有sex,teacher这样的非一般类型的属性。  而且我现在连从js把一个Map传到后台都没弄得,不知道错在哪,郁闷死!!! var u={};
    u['username']=username;   
             u['sex']=sex;   
             u['tea']=tea;                 能帮我看一下吗?  这样建立Map是没问题的,但是传到后台就不行。这是为什么~
      

  7.   

    DWR 保存数据 安全么??
      

  8.   

    用json确实可以解决呀!在客户端将脚步对象转换为字符,传到服务器端再转换为对象!
      

  9.   

    6、调用返回List、Set或者Map的java方法   6.1、dwr.xml的配置   配置同4.1   <dwr>   <allow>   <create creator="new" javascript="testClass" >   <include method="testMethod6"/>   </create>   <convert converter="bean" match="com.dwr.TestBean">   </convert>   </allow>   </dwr>   注意:如果List、Set或者Map中的元素均为简单类型(包括其封装类)或String、Date、数组和集合类型,则不需要<convert>标签。   6.2、javascript中调用(以返回List为例,List的元素为TestBean)   首先,引入javascript脚本   其次,编写调用java方法的javascript函数和接收返回值的回调函数   Function callTestMethod6(){   testClass.testMethod6(callBackFortestMethod6);   }   Function callBackFortestMethod6(data){   //其中data接收方法的返回值   //对于JavaBean返回值,有两种方式处理   //不知道属性名称时,使用如下方法   for(var i=0;i<data.length;i++){   for(var property in data[i]){   alert("property:"+property);   alert(property+":"+data[i][property]);   }   }   //知道属性名称时,使用如下方法   for(var i=0;i<data.length;i++){   alert(data[i].username);   alert(data[i].password);   }   }   7、调用有List、Set或者Map参数的java方法   7.1、dwr.xml的配置   <dwr>   <allow>   <create creator="new" javascript="testClass" >   <include method="testMethod7"/>   </create>   <convert converter="bean" match="com.dwr.TestBean">   </convert>   </allow>   <signatures>   <![CDATA[   import java.util.List;   import com.dwr.TestClass;   import com.dwr.TestBean;   TestClass.testMethod7(List<TestBean>);   ]]>   </signatures>   </dwr>   <signatures>标签是用来声明java方法中List、Set或者Map参数所包含的确切类,以便java代码作出判断。   7.2、javascript中调用(以返回List为例,List的元素为TestBean)   首先,引入javascript脚本   其次,编写调用java方法的javascript函数   Function callTestMethod7(){   //定义要传到java方法中的参数   var data;   //构造参数,data实际上是一个object数组,即数组的每个元素均为object   data = [   {   username:"user1",   password:"password2"   },   {   username:"user2",   password:" password2"   }   ];   testClass.testMethod7(data);   }   注意:   1、对于第6种情况,如果java方法的返回值为Map,则在接收该返回值的javascript回调函数中如下处理:   function callBackFortestMethod(data){   //其中data接收方法的返回值   for(var property in data){   var bean = data[property];   alert(bean.username);   alert(bean.password);   }   }   2、对于第7种情况,如果java的方法的参数为Map(假设其key为String,value为TestBean),则在调用该方法的javascript函数中用如下方法构造要传递的参数:   function callTestMethod (){   //定义要传到java方法中的参数   var data;   //构造参数,date实际上是一个object,其属性名为Map的key,属性值为Map的value   data = {   "key1":{   username:"user1",   password:"password2"   },   "key2":{   username:"user2",   password:" password2"   }   };   testClass.testMethod(data);   }   并且在dwr.xml中增加如下的配置段   <signatures>   <![CDATA[   import java.util.List;   import com.dwr.TestClass;   import com.dwr.TestBean;   TestClass.testMethod7(Map<String,TestBean>);   ]]>   </signatures>   3、由以上可以发现,对于java方法的返回值为List(Set)的情况,DWR将其转化为Object数组,传递个javascript;对于java方法的返回值为Map的情况,DWR将其转化为一个Object,其中Object的属性为原Map的key值,属性值为原Map相应的value值。   4、如果java方法的参数为List(Set)和Map的情况,javascript中也要根据3种所说,构造相应的javascript数据来传递到java中   特别说明:   创建时要先实例化:var obj = new Object(); obj = {key:"value"}; 也可以obj.key = "value"; 如果没有初始化,则会转换出错。
      

  10.   


    不知道~ 不安全的话 DWR能做什么?
      

  11.   

    <script type="text/javascript">
    function transObj(){
    var user = {
    userName:'abc',
    pwd:'123',
    male:true,
    teacher:{teacherName:'tName'}
    };
    DwrPull.getUser(user,cb);
    }
    function cb(){
    alert(1);
    }
    </script>
    <input type="button" onclick="transObj()" value="obj">
    ============================
    public class User {
    private String userName;
    private String pwd;
    private Teacher teacher;
    private boolean male;
    public boolean isMale() {
    return male;
    }
    public void setMale(boolean male) {
    this.male = male;
    }
    public String getPwd() {
    return pwd;
    }
    public void setPwd(String pwd) {
    this.pwd = pwd;
    }
    public Teacher getTeacher() {
    return teacher;
    }
    public void setTeacher(Teacher teacher) {
    this.teacher = teacher;
    }
    public String getUserName() {
    return userName;
    }
    public void setUserName(String userName) {
    this.userName = userName;
    }


    }public class Teacher {
    private String teacherName; public String getTeacherName() {
    return teacherName;
    } public void setTeacherName(String teacherName) {
    this.teacherName = teacherName;
    }
    }public class OrderNotice {
    public void getUser(User user){
    System.out.println(user);
    System.out.println(user.getUserName());
    System.out.println(user.isMale());
    System.out.println(user.getPwd());
    System.out.println(user.getTeacher());
    System.out.println(user.getTeacher().getTeacherName());
    }
    }
    ========================
    <create creator="new" javascript="DwrPull" scope="page">
          <param name="class" value="com.dwr.pull.OrderNotice"/>
        </create>
    <convert match="com.dwr.pull.User" converter="bean"/>
    <convert match="com.dwr.pull.Teacher" converter="bean"/>
    =================
    结果
    com.dwr.pull.User@2e242b
    abc
    true
    123
    com.dwr.pull.Teacher@148bd9d
    tName
      

  12.   

    是这样的,你的代码只传username和passowrd两个属性,String类型当然好传. 而我要传的User里还有sex,teacher这样的非一般类型的属性。 而且我现在连从js把一个Map传到后台都没弄得,不知道错在哪,郁闷死!!!回复:User里的性别属性我不清楚你是怎么设计的,一般弄成字符串或者整形,用1代表男性,2代表女性就行了,至于teacher对象,也可以用json格式来表示,修改代码如下:
    1.index.jsp<%@ page language="java" import="java.util.*" pageEncoding="gbk"
    isELIgnored="false"%>
    <%
    String path = request.getContextPath();
    %>
    <html>
    <head>
    <script type='text/javascript' src='<%=path%>/dwr/interface/user.js'>
    </script>
    <script type='text/javascript' src='<%=path%>/dwr/engine.js'>
    </script>
    <script type='text/javascript' src='<%=path%>/dwr/util.js'>
    </script>
    <script type="text/javascript">
    function checkLogin() {
    var username = document.getElementById("username").value;
    var password = document.getElementById("password").value;
    if (username.match(/^\s*$/)) {
    alert("请输入用户名!");
    } else if (password.match(/^\s*$/)) {
    alert("请输入密码!");
    } else {
    var u = {
    username : username,
    password : password,
    teacher  : {tName:"jim",tAge:32},
    sex:1
    };
    user.checkLogin(u, function(data) {
    alert(data);
    if(data!=null)
        alert("username="+data.username+";password="+data.password+";sex="+data.sex+";tName="+data.teacher.tName+";tAge="+data.teacher.tAge);
    })
    }
    }
    </script>
    </head>
    <body>
    <form>
    用户名:
    <input type="text" name="username" id="username" />
    <br />
    密 码:
    <input type="password" name="password" id="password" />
    <br />
    <input type="button" value="验证" onclick="checkLogin()" />
    </form>
    </body>
    </html>
    2.User.javapackage bean;public class User {
    private String username;
    private String password;
    private Teacher teacher;
    private int sex;//1表示男,2表示女
    public User(){
    }
    public User(String username){
    this.username=username;

    }
    public String getUsername() {
    return username;
    }
    public void setUsername(String username) {
    this.username = username;
    }
    public String getPassword() {
    return password;
    }
    public void setPassword(String password) {
    this.password = password;
    }
    public User checkLogin(User user){
    return user.password.equals("123")&&user.username.equals("123")?user:null;
        }
    public void setTeacher(Teacher teacher) {
    this.teacher = teacher;
    }
    public Teacher getTeacher() {
    return teacher;
    }
    public void setSex(int sex) {
    this.sex = sex;
    }
    public int getSex() {
    return sex;
    }
    }3.Teacher.java
    package bean;public class Teacher {
    private String tName;
    private int tAge;
    public Teacher(){

    }
    public String gettName() {
    return tName;
    }
    public void settName(String tName) {
    this.tName = tName;
    }
    public int gettAge() {
    return tAge;
    }
    public void settAge(int tAge) {
    this.tAge = tAge;
    }
    }4.dwr配置文件dwr.xml<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd">
    <dwr>  
    <!-- without allow, DWR isn't allowed to do anything -->  
    <allow>  
    <create creator="new" javascript="user" >  
    <param name="class" value="bean.User" />  
    <include method="checkLogin"/>  
    </create>  
    <convert converter="bean" match="bean.User">
    <param name="include" value="username,password,teacher,sex" />
    </convert>
    <convert converter="bean" match="bean.Teacher">
    <param name="include" value="tName,tAge" />
    </convert></allow>
    </dwr>
    4.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>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>dwr-invoker</servlet-name>
    <url-pattern>/dwr/*</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    </web-app>
      

  13.   


    hi,你好,我试了一下你的传值方法还是不行,不知道为什么
    var u = {
    username : username,
    password : password,
    teacher  : {tName:"jim",tAge:32},
    sex:1
    };
    user.checkLogin(u, function(data)..... {
    只要我传的是对象,就无法到达后台的方法,前台就报ERROR了,但后台没报错。后来的解决方法是:
    var u=new function(){};
    u.name='name';
    u.password='123';
    user.checkLogin(u,function(data)......
    不过现在还没完全搞清楚这两者之间的区别
    希望大家帮忙解释解释看