??xml version="1.0" encoding="utf-8" standalone="yes"?>av不卡在线观看,国产视频一区在线观看,精品欧美视频http://www.aygfsteel.com/jkluooop/zh-cnThu, 19 Jun 2025 21:40:44 GMTThu, 19 Jun 2025 21:40:44 GMT60转蝲:DWR提交表单http://www.aygfsteel.com/jkluooop/archive/2009/04/24/267313.htmljkluooopjkluooopFri, 24 Apr 2009 02:58:00 GMThttp://www.aygfsteel.com/jkluooop/archive/2009/04/24/267313.html用dwr装表单Ҏ交表?/a> 关键? 用dwr装表单Ҏ交表?/strong>
首先,配置dwr环境Q网上很多资料都说得很详l,q里׃写了?
dwr装form表单,需要用到dwr定义的一个jsҎQDWRUtil.getValues(yourform),q个Ҏ可以q回一个指定form中的表单的名称和?
的map对象?
例如Q?
<form name="myform">
<input type="text" name="userName" id="userName"/>
<input type="password" name="passWord" name="passWord"/>
</form>
那么DWRUtil.getValues("myform")返回该form中的表单的一个map对象。就不需要再写document.myform.username.valueq样的语句了?
我们可以通过dwr这个自动封装好的表单对象返传给服务器端相关Ҏq行操作。如果需要的话,q可以在服务器端定义好对应的formbean来接收这个表单map?
下面具体操作Q?
1.配置好dwrq行环境。网上有很多例子Qdwr所带的文档里也有说明?
2.写一个formbean来接收表单,必须有对应的set、getҎQ?
package dwr.test;
public class FormBean {
private String userName;
private String passWord;
public String getPassWord() {
  return passWord;
}
public void setPassWord(String passWord) {
  this.passWord = passWord;
}
public String getUserName() {
  return userName;
}
public void setUserName(String userName) {
  this.userName = userName;
}
}
3再写一个类来处理客L发来的ajaxhQ?
package dwr.test;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
public class Service {
public FormBean getFormBean(Map formMap){
  FormBean formBean = new FormBean();
  try{
   BeanUtils.populate(formBean, formMap);
  }catch(Exception e){
   e.printStackTrace();
  }
  System.out.println("==============客户端传来的信息==============");
  System.out.println("FormBean.username:"+formBean.getUserName());
  System.out.println("FormBean.password:"+formBean.getPassWord());
  System.out.println("=========================================");
 
  return formBean;
}
}
其中用到的BeanUtils.populate(formBean, formMap)Ҏ可以formMap内的对象复制lformBean对象的属性?
BeanUtilscdstruts库所带的包commons-beanutils.jar中。这P来自客户端的表单的值就被封装到服务器端的formBean中了Q之后,?
作formBean可以了。ؓ了证实结果,用return formBean把封装后的表单内容返回到客户端?
4.在dwr.xml中注册相关的cdҎ?
<!DOCTYPE dwr PUBLIC
    "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
    "
http://www.getahead.ltd.uk/dwr/dwr10.dtd
">
<dwr>
  <allow>
<convert converter="bean" match="dwr.test.FormBean"/>
    <create creator="new" javascript="Service">
    <param name="class" value="dwr.test.Service"/>
  <include method="getFormBean"/>
</create>  
  </allow>
</dwr>
注册FormBean是让客户端能够识别服务端q回的FormBean型数?
5.~写试面Qtest.htm
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
   <title>test</title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
   
  </head>
   <script src='./dwr/interface/Service.js'></script>
        <script src='./dwr/engine.js'></script>
        <script src='./dwr/util.js'></script>
       <script>
  function formsubmit(){
         var formMap  = DWRUtil.getValues("testform");
         alert("客户端读取到的表单项Q\nuserName:"+formMap["userName"]+"\npassWord:"+formMap["passWord"]);
         Service.getFormBean(result,formMap);
        }
        function result(data)
        {
   alert("从服务端q回的数据:\nuserName:"+data.userName+"\npassWord:"+data.userName);
        }
    </script>
  <body>
          <form name="testform">
          userName:<input id="userName" name="userName" type="text"/><br/>
          passWord:<input id="passWord" name="passWord" type="password" /><br/>
         
          </form>
         <input type="button" value="submit" onClick="formsubmit()"/>
  </body>
</html>
注意Q表单中的表单项的id的大写必须和FormBean中定义的一?


jkluooop 2009-04-24 10:58 发表评论
]]>
转蝲:DWR入门http://www.aygfsteel.com/jkluooop/archive/2009/04/24/267306.htmljkluooopjkluooopFri, 24 Apr 2009 02:54:00 GMThttp://www.aygfsteel.com/jkluooop/archive/2009/04/24/267306.html

最q闲暇时,研究了一下DWR框架,个h感觉是一个很不错很好用的Ajax框架,装的很?/u>

DWR入门
1.1 ?/strong>
DWR是一个可以允怽d建AJAX WEB站点的JAVA开源库。它可以让你在浏览器中的Javascript代码调用Web服务器上的Java代码Q就像在Java

代码在览器中一栗?DWR包含2个主要部分:
?一个运行在服务器端的Java ServletQ它处理hq且向浏览器发回响应?br /> ?q行在浏览器端的JavaScriptQ它发送请求而且q能动态更新网c?br /> DWR工作原理是通过动态把Javacȝ成ؓJavascript。它的代码就像Ajax法一P你感觉调用就像发生在览器端Q但是实际上代码调用发生

在服务器端,DWR负责数据的传递和转换。这U从Java到JavaScript的远E调用功能的方式使DWR用v来有U非常像RMI或者SOAP的常规RPC机制

Q而且DWR的优点在于不需要Q何的|页览器插件就能运行在|页上?Java从根本上讲是同步机制Q然而AJAX却是异步的。所以你调用q程

ҎӞ当数据已l从|络上返回的时候,你要提供有反?QcallbackQ?功能的DWR?br /> http://www.java3z.com/cwbwebhome/article/article2/img4/r_howitworks.png
1.2 W一个DWRE序QHello World
1.2.1 DWR攑օ你的工程
1Q?从官方网站下载dwr.jar包。然后将它放在你webapp的WEB-INF/lib目录下?br /> 2Q?下载的dwr-版本?src.zip \java\org\directwebremoting内的engine.js和util.js攑օWEB应用中,比如js文g夹下?br /> 1.2.2 ~辑配置文g
1). ------------------web.xml---------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
   xmlns="    xmlns:xsi="    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
      <servlet>
     <servlet-name>dwr-invoker</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的加载顺?数字小代表加蝲的优先񔭑高 -->
     <load-on-startup>1</load-on-startup>
   </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>
2).--------------------------dwr.xml----------------------------------------------
在web.xml的同一目录下,创徏dwr.xmlQ?br /> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "

<dwr>

   <allow>

     <create creator="new" javascript="service">
       <param name="class" value="helloWorld.Service"/>
     </create>

   </allow>

</dwr>
3)?~写---------------------------service.java--------------------------------
像没有dwr一P写一个简单类q加一个方??
package helloWorld;
public class Service
{ public String sayHello(String yourName)
{ //可以是访问数据库的复杂代?
return "Hello World " + yourName;
}
}
4)?-----------------------------------试DWR-------------------------------------
代码放入应用服务器Q比如TomcatQ,启动?br /> 然后在地址栏输?a href="http://localhost:8080/">http://localhost:8080/
你的工程/dwr 然后点击serviceQ会看到刚才写的sayHello()的方法,输入自己的名字然

后点?#8220;Execute”Q如果发现确实是正确的返回结果,说明试通过了,可以q入下一步了?br /> 5)?-------------------------------- ~写一?index.jsp---------------------------------
<%@ page language="java" pageEncoding="UTF-8"%>
<html>
   <head>
    <title>My JSP 'first_dwr.jsp' starting page</title>
    <script type='text/javascript' src="js/util.js"></script>
    <script type='text/javascript' src="js/engine.js"></script>
    <script type='text/javascript' src="js/service.js"> </script>
<script type="text/javascript">
   function firstDwr()
   {
       service.sayHello("孤魂",callBackHello);
   }
   function callBackHello(data){
      alert(data);
    }
</script>
</head>
<body>
<input type="button" name="button" value="试" onclick="firstDwr()">
</body>
</html>

2.2 常用<init-param>参数列表(web.xml中的)

2.2.1 安全参数
allowGetForSafariButMakeForgeryEasier
开始版本:2.0
默认|false
描述Q置成true使DWR工作在Safari 1.x , 会稍微降低安全性?br /> crossDomainSessionSecurity
开始版本:2.0
默认|true
描述Q设|成false使能够从其他域进行请求。注意,q样做会在安全性上有点冒险Q参考一下这文章,在没有理解这个后果前不要讄成ؓfalse?br /> debug
开始版本:1.0
默认|false
描述Q设|成true使DWR能够debug和进入测试页?
scriptSessionTimeout
开始版本:2.0
默认|1800000(30分钟)
描述Qscript session 的超时设|?
maxCallCount
开始版本:2.0rc2 ?1.1.4
默认|20
描述Q一ơ批?batch)允许最大的调用数量?帮助保护Dosd)
2.2.2 Ajax服务器加载时保护参数
pollAndCometEnabled
开始版本:2.0
默认|false
描述Q设|成true能增加服务器的加载能力,管DWR有保护服务器q蝲的机制?br /> maxWaitingThreads
开始版本:2.0
默认|100
描述Q最大等待线E数量?
preStreamWaitTime
开始版本:2.0
默认|29000(单位Q毫U?
描述Q对一个打开前的反应,{待的最大时?
postStreamWaitTime
开始版本:2.0
默认|1000(单位Q毫U?
描述Q对一个打开后的反应,{待的最大时?br />
2.3 日志配置
DWR工作在JDK1.3中不支持java.util.loggingQ但我们q不M人都M用commons-logging或者log4jQ所以在使用HttpServlet.log()Ҏ时DWR正常工作,如果没有日志cȝ话。然而如果DWR可以使用Q那么它用日志?br /> Commoms-Logging
׃大多数servlet容器都用它Q几乎每个h都将使用commons-logging。所以如果你的webapp不明用commons-loggingQ它被默认设ؓ可以使用?在这些日志将被一些配|文件所U束Q比如java.util.logging或者log4jQ可以去查看他们各自的文档获得详情?br /> HttpServlet.log()
如果你正在用HttpServlet.log()Q?以下的代码用来控制DWR日志
<init-param>
<param-name>logLevel</param-name>
<param-value>DEBUG</param-value>
</init-param>
值可以是QFATALQERRORQWARN(默认)QINFOQDEBUG


DWR2.0插g
?org.directwebremoting.Container
?org.directwebremoting.WebContextFactory.WebContextBuilder
?org.directwebremoting.ServerContextFactory.ServerContextBuilder
?org.directwebremoting.servlet.UrlProcessor
?org.directwebremoting.extend.AccessControl
?org.directwebremoting.extend.AjaxFilterManager
?org.directwebremoting.extend.ConverterManager
?org.directwebremoting.extend.CreatorManager
?org.directwebremoting.extend.DebugPageGenerator
?org.directwebremoting.extend.HtmlCallMarshaller
?org.directwebremoting.extend.HtmlPollHandler
?org.directwebremoting.extend.PageNormalizer
?org.directwebremoting.extend.PlainCallMarshaller
?org.directwebremoting.extend.PlainPollHandler
?org.directwebremoting.extend.Remoter
?org.directwebremoting.extend.ScriptSessionManager
?org.directwebremoting.extend.ServerLoadMonitor

--------------------------------------------------------dwr.xml配置----------------------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" " <dwr>
<!-- 仅当需要扩展DWR时才需?-->
<init>
   <creator id="..." class="..." />
   <converter id="..." class="..." />
</init><!-- 没有它DWR什么也做不?-->
<allow>
   <create creator="..." javascript="..." />
   <convert converter="..." match="..." />
</allow><!-- 有必要告诉DWRҎ{֐ -->
<signatures>...</signatures>
</dwr>

3.2 <init>标签
q个初始化部分申明被用来创徏q程beans而且q个c能被用来以某种q程转换。大多数例子你将不需要用它,如果你想d义一个新的Creator或者ConverterQ就要在此被x?在init部分里有了定义只是告诉DWRq些扩展cȝ存在Q给Z如何使用的信息。这时他们还没有被用。这U方式很像Java中的import语句。多数类需要在使用前先import一下,但是只有import语句q不表明q个cdl被使用了。每一个creator和converter都用id属性,以便后面使用?/p>

3.3 <allow>标签
allow部分定义了DWR能够创徏和{换的cR?br /> 3.3.1 Creator
每一个在cM被调用的Ҏ需要一?lt;create …>有若q类型的creatorQ?#8220;new”关键字或者Spring 框架{?/p>

create元素是如下的l构Q?/p>

<allow>
<create creator="..." javascript="..." scope="...">
   <param name="..." value="..." />
   <auth method="..." role="..." />
   <exclude method="..." />
   <include method="..." />
</create>
...
</allow>

1)QnewQJava?#8220;new”关键字创造对?是DWR默认的creatorQ如下所C?<create id="new" class="org.directwebremoting.create.NewCreator"/>
没有必要把它加入dwr.xmlQ它已经在DWR内部文g了?q个creator用默认构造器创徏cȝ实例Q以下是用new创徏器的好处
?安全:DWR创造的对象生存的时间越短,多次调用中间的g一致的错误Z少?br /> ?内存消耗低Q?如果你的站点用户量非常大Q这个创造器可以减少VM的内存溢出?br /> 2)Qnone: 它不创徏对象Q看下面的原因?/em>

(v1.1+) none创徏器不创徏M对象Q它会假设你不须要创建对象。有2个用的原因Q?br /> ?你可能在使用的scope不是"page"(看上?Qƈ在在前面已经把这个对象创建到q个scope中了Q这时你׃需要再创徏对象了?br /> ?q有一U情冉|要调用的Ҏ是静态的Q这时也不需要创建对象。DWR会在调用创徏器之前先查一下这个方法是不是静态的?/p>

2. javascript属?/strong>
在浏览器里给你创建的对象命名。避免用JavaScript保留字。这个名字将在页面里作ؓjs被导入,像W?章节的那个jspQ?dwr.xml

<create creator="new" javascript="service">

   <param name="class" value="helloWorld.Service" />

</create>
html / jspQ?/em>

<html> <head>

<script type='text/javascript' src='dwr/interface/service.js'>

3. scope属?br /> 和定义在servlet的scope一样大的范_它允怽指定哪个bean是可以获得的。选项可以是:application, session, request和page。这些值应该已l被开发者们熟悉了?/p>

4. param元素
被用来指定创造器的其他参敎ͼ每种构造器各有不同。例如,"new"创造器需要知道要创徏的对象类型是什么。每一个创造器的参数在各自的文档中能找到?br /> 5. include和exclude元素
允许一个创造器去限制进入类的方法。一个创造器必须指定include列表或exclude列表之一。如果是include列表则暗C默认的讉K{略?拒绝"Qinclude中的每个Ҏ是允许讉K的方法;如果是exclude列表则暗C默认的讉K{略?允许"Qexclude中的每个Ҏ是拒绝讉K的方法?比如Q?/p>

<create creator="new" javascript="Fred">
   <param name="class" value="com.example.Fred" />
   <include method="setWibble" />
</create>


3.3.2 Converter
我们需要确认所有的参数能被转换。许多JDK提供的类型你能够用,但是你如果要转换你自q代码Q就必须告诉DWR。一般是指JavaBean的参数需要一?lt;convert…>标签作ؓ入口?/p>

你不需要在dwr.xml?lt;allow>部分?lt;convert>中定义。它们默认支持?br /> ?所有主要的cdQboolean, int , double{等?br /> ?包装c,Boolean, Integer{等?br /> ?java.lang.String
?java.util.Date ?java.sql.TimesQjava.sql.Timestamp?br /> ?数组(存放以上cd?
?集合cd (List, Set, Map, Iterator{等) (存放以上cd?
?DOM对象(来自于DOM, XOM, JDOM和DOM4J)

1. 日期转换?/strong>
如果你有一个String(例如Q?#8220;2001Q?2Q?1”)在JavascriptQ你x它{换成Java日期。那么你?U选择Q一是用Date.parse()然后使用DataConverter传入服务器端Q还有一U选择是把该String传入Q然后用java的SimpleDateFormat(或者其他的)来{换?同样Q如果你有个Java的Datecdq且希望在HTML使用它。你可以先用SimpleDateFormat把它转换成字W串再用。也可以直接传DatelJavascriptQ然后用Javascript格式化。第一U方式简单一些,管费了你的{换器Q而且q样做也会是览器上的显C逻辑受到限制。其实后面的Ҏ更好Q也有一些工具可以帮?/p>

2. 数组转换?/strong>
数组实体不太Ҏ理解。默认情况下DWR能{换所有原生类型的数组Q还有所有marshallable对象的数l。这些marshallable对象包括前面介绍的String和Datecd。match属性看上去很怪?br /> 3. bean和对象{换器
两个没有默认打开的{换器是Bean ?Object 转换器。Bean转换器可以把POJO转换成Javascript的接合数l?cM与Java中的Map)Q或者反向{换。这个{换器默认情况下是没打开的,因ؓDWR要获得你的允许才能动你的代码?Object转换器很怼Q不同的是它直接应用于对象的成员Q而不是通过getter和setterҎ。下面的例子都是可以用object来替换bean的来直接讉K对象成员?如果你有一个在 <create ...> 中声明的q程调用Bean。它有个一参数也是一个beanQƈ且这个bean有一个setter存在一些安全隐患,那么d者就可能利用q一炏V?你可以ؓ某一个单独的cL开转换器:

<convert converter="bean" match="your.full.package.BeanName"/>
如果要允许{换一个包或者子包下面的所有类Q可以这样写Q?<convert converter="bean" match="your.full.package.*"/>
显而易见,q样写是允许转换所有的JavaBeanQ?<convert converter="bean" match="*"/>
?BeanConverter ?JavaBeans 规范 用于被BeanConverter转换的Bean必须W合JavaBeans的规范,因ؓ转换器用的是IntrospectionQ而不是Reflection?/p>

q就是说属性要W合一下条Ӟ有getter和setterQsetter有一个参敎ͼq且q个参数的类型是getter的返回类型。setter应该q回voidQgetter应该没有M参数。setter没有重蝲。以上这些属于常识。就在eclipse里自动ؓ每个属性添加setterQgetter那种cdQ如果你用的不是JavaBeanQ那么你应该用ObjectConverter.
?讄Javascript变量 DWR可以把Javascript对象(又名mapsQ或联合数组)转换成JavaBean或者Java对象。例子:
public class Remoted {

public void setPerson(Person p) { // ... } }

public class Person {

    public void setName(String name) { ... }

public void setAge(int age) { ... } // ... }

如果q个Remoted已经被配|成Creator了,PersioncM定义了BeanConverterQ那么你可以通过下面的方式调用Java代码Q?/p>

var p = { name:"Fred", age:21 }; Remoted.setPerson(p);

4. 集合cd转换?/strong>
有个两个默认的{换器Q针对Map和CollectionQ?/p>

<convert converter="collection" match="java.util.Collection"/>

<convert converter="map" match="java.util.Map"/>

4.7 DWR与WebWork
WebWork支持在DWR2.0m3以后才有?要可以通过DWR调用WW的ActionQ要做两件事?br /> 4.7.1 配置dwr.xml
你必ddwr的配|文件中加入q样的配|:

<create creator="none" javascript="DWRAction">
<param name="class" value="org.directwebremoting.webwork.DWRAction" />
<include method="execute" />
</create>
<convert converter="bean"
match="org.directwebremoting.webwork.ActionDefinition">
<param name="include" value="namespace,action,method,executeResult" />
</convert>
<convert converter="bean"
match="org.directwebremoting.webwork.AjaxResult" />
<convert converter="bean" match="your_action_package.*"/>

q样你AjaxWebWork Action调用q回一个action实例(而不是文?。然后你必须包括action对象的{?br /> 器定?packageU别或单独action)?/p>

------------------------------------------DWR中的JavaScript?--------------------------------------------

DWRҎdwr.xml生成和Java代码cM的Javascript代码?相对而言Java同步调用Q创ZJava代码匚w的Ajaxq程调用接口的最大挑战来至与实现Ajax的异步调用特性?/p>

5.1 单的回调函数

假设你有一个这LJavaҎQ?br /> public class Remote {
        public String getData(int index)
         { ... }
}

<script type='text/javascript' src='[WEBAPP]/dwr/engine.js'></script>
<script type='text/javascript' src='[WEBAPP]/dwr/interface/Remote.js'></script>
……
<script type="text/javascript">
function handleGetData(str) { alert(str); } Remote.getData(42,
handleGetData);
</script>

42是JavaҎgetData()的一个参数?/em>

此外你也可以使用q种减羃格式Q?Remote.getData(42, function(str) { alert(str); });

5.2 调用元数据对?br /> 另外一U语法时使用"调用元数据对?来指定回调函数和其他的选项。上面的例子可以写成q样Q?/p>

Remote.getData(42, {

   callback:function(str) { alert(str);

} });

---------------------------------------------------- util.js 功能-----------------------------------------------------
util.js包含了一些工具函数来帮助你用javascript数据(例如从服务器q回的数?来更C的web面?你可以在DWR以外使用它,因ؓ它不依赖于DWR的其他部分。你可以下蝲整个DWR或者单独下? 4个基本的操作面的函敎ͼgetValue[s]()和setValue[s]()可以操作大部分HTML元素除了tableQlist和image。getText()可以操作select list?要修改table可以用addRows()和removeAllRows()。要修改列表(select列表和ul,ol列表)可以用addOptions()和removeAllOptions()?q有一些其他功能不是DWRUtil的一部分。但它们也很有用Q它们可以用来解决一些小问题Q但是它们不是对于所有Q都通用的?br /> 7.1 $()
$() 函数(它是合法的Javascript名字) 是从Protoypeh的主意?大略上的Ԍ $ = document.getElementById?因ؓ在AjaxE序中,你会需要写很多q样的语句,所以?$() 会更z?通过指定的id来查扑ֽ前HTML文档中的元素Q如果传递给它多个参敎ͼ它会q回扑ֈ的元素的数组。所有非Stringcd的参C被原不动的q回。这个函数的灉|来至于prototype库,但是它可以在更多的浏览器上运行?可以看看DWRUtil.toDescriptiveString的演C?从技术角度来讲他在IE5.0中是不能使用的,因ؓ它用了Array.pushQ尽如此通常它只是用来同engine.js一起工作。如果你不想要engine.jsq且在IE5.0中用,那么你最好ؓArray.push找个替代品?br /> 7.2 addOptions and removeAllOptions
DWR的一个常遇到的Q务就是根据选项填充选择列表。下面的例子是Ҏ输入填充列表?下面介l?DWRUtil.addOptions() 的几U是用方法?如果你希望在你更Cselect以后Q它仍然保持q来的选择Q你要像下面q样做: var sel = DWRUtil.getValue(id); DWRUtil.removeAllOptions(id); DWRUtil.addOptions(id, ...); DWRUtil.setValue(id, sel);
55 / 92
如果你想加入一个初始的"Please select..." 选项那么你可以直接加入下面的语句Q?DWRUtil.addOptions(id, \["Please select ..."]);
DWRUtil.addOptions?U模?br /> ?数组: DWRUtil.addOptions(selectid, array) 会创Z堆optionQ每个option的文字和值都是数l元素中的倹{?br /> ?对象数组 (指定text): DWRUtil.addOptions(selectid, data, prop) 用每个数l元素创造一个optionQoption的值和文字都是在prop中指定的对象的属性?br /> ?对象数组 (指定text和value?: DWRUtil.addOptions(selectid, array, valueprop, textprop) 用每个数l元素创造一个optionQoption的值是对象的valueprop属性,option的文字是对象的textprop属性?br /> ?对象: DWRUtil.addOptions(selectid, map, reverse)用每个属性创Z个option。对象属性名用来作ؓoption的|对象属性值用来作为属性的文字Q这听上L些不寏V但是事实上却是正确的方式。如果reverse参数被设|ؓtrueQ那么对象属性值用来作为选项的倹{?br /> ?对象的Map: DWRUtil.addOptions(selectid, map, valueprop, textprop) 用map中的每一个对象创Z个option。用对象的valueprop属性做为option的valueQ用对象的textprop属性做为option的文字?br /> ?ol ?ul 列表: DWRUtil.addOptions(ulid, array) 用数l中的元素创Z堆li元素Q他们的innerHTML是数l元素中的倹{这U模式可以用来创建ul和ol列表?br /> q是|上的例?/p>

7.3 addRows and removeAllRows
DWR通过q两个函数来帮你操作tableQ?DWRUtil.addRows() ?DWRUtil.removeAllRows() 。这个函数的W一个参数都是table、tbody、thead、tfoot的id。一般来说最好用tbodyQ因样可以保持你的header和footer行不变,q且可以防止Internet Explorer的bug?br /> ?DWRUtil.removeAllRows()
DWRUtil.removeAllRows(id);
描述: 通过id删除table中所有行?参数: idQ?table元素的id(最好是tbody元素的id)

?DWRUtil.addRows()
DWRUtil.addRows(id, array, cellfuncs, [options]);
描述: 向指定id的table元素d行。它使用数组中的每一个元素在table中创Z行。然后用cellfuncs数组中的没有函数创徏一个列。单元格是依ơ用cellfuncҎ没有数组中的元素创徏出来的?DWR1.1开始,addRows()也可以用对象做ؓ数据。如果你用一个对象代替一个数l来创徏单元|q个对象会被传递给cell函数?参数: id: table元素的id(最好是tbody元素的id) array: 数组(DWR1.1以后可以是对?Q做为更新表格数据?cellfuncs: 函数数组Q从传递过来的行数据中提取单元格数据?options: 一个包含选项的对?见下? 选项包括: rowCreator: 一个用来创的函?例如Q你希望个tr加个css). 默认是返回一个document.createElement("tr") cellCreator: 一个用来创建单元格的函?例如Q用th代替td). 默认q回一个document.createElement("td")
q是|上的例?br /> 7.4 getText
getText(id)和getValue(id)很相伹{出了它是ؓselect列表设计的。你可能需要取得显C的文字Q而不是当前选项的倹{?br /> q是|上的例?br /> 7.5 getValue
DWRUtil.getValue(id)?setValue()对应?ȝ?。它可以从HTML元素中取出其中的|而你不用这个元素是select列表q是一个div?q个函数能操作大多数HTML元素包括select(d当前选项的D不是文?、input元素(包括textarea)、div和span?br /> q是|上的例?/p>

7.6 getValues
getValues()和getValue()非常怼Q除了输入的是包含name/value对的javascript对象。name是HTML元素的IDQvalue会被更改些ID对象元素的内宏V这个函C会返回对象,它只更改传递给它的倹{?从DWR1.1开始getValues()可以传入一个HTML元素(一个DOM对象或者id字符?Q然后从它生成一个reply对象?br />
7.7 onReturn

当按下return键时Q得到通知?当表单中有input元素Q触发return键会D表单被提交。当使用AjaxӞq往往不是你想要的。而通常你需要的触发一些Javscript?不幸的是不同的浏览器处理q个事g的方式不一栗所以DWRUtil.onReturn修复了这个差异。如果你需要一个同表单元素中按回R相同的特性,你可以用q样代码实现Q?<input type="text" onkeypress="DWRUtil.onReturn(event,submitFunction)"/> <input type="button" onclick="submitFunction()"/>
你也可以使用onkeypress事g或者onkeydown事gQ他们做同样的事情?一般来说DWR不是一个JavascriptcdQ所以它应该试图满q个需求。不怎样Q这是在使用Ajaxq程中一个很有用函数?q个函数的工作原理是onSubmit()事g只存在于<FORM ...>元素?br /> q是|上的例?br /> 7.8 selectRange
选择一个输入框中的一定范围的文字?你可能ؓ了实现类?Google suggest"cd的功能而需要选择输入框中的一定范围的文字Q但是不同浏览器间选择的模型不一栗这DWRUtil函数可以帮你实现?DWRUtil.selectRange(ele, start, end)
q是|上的例?/p>

7.9 setValue
DWRUtil.setValue(id, value)ҎW一个参C指定的id扑ֈ相应元素QƈҎW二个参数改变其中的倹{?q个函数能操作大多数HTML元素包括select(d当前选项的D不是文?、input元素(包括textarea)、div和span?br /> q是|上的例?br /> 7.10 setValues
setValues()和setValue()非常怼Q除了输入的是包含name/value对的javascript对象。name是HTML元素的IDQvalue是你惌讄l相应的元素的倹{?br /> q是|上的例?br /> 7.11 toDescriptiveString
DWRUtil.toDescriptiveString()函数比默认的toString()更好。第一个参数是要调试的对象Q第二个参数是可选的Q用来指定内Ҏ入的层次Q?0: 单行调试 1: 多行调试Q但不深入到子对象?2: 多行调试Q深入到W二层子对象 以此cL。一般调试到W二U是最佳的?q有W三个参敎ͼ定义初始~进。这个函C应该被用于调式程序之外,因ؓ以后可能会有变化?br /> q是|上的例?br /> 7.12 useLoadingMessage
q个Ҏ来可能被废弃,因ؓq个实现实在太专断了。ؓ什么是U色Qؓ什么在右上角,{等。唯一的真正答案就是:抄袭GMail。这里的是以本页面中的代码ؓ模板Q根据你的需求自定义?你必d面加蝲以后调用q个Ҏ(例如Q不要在onload()事g触发之前调用)Q因为它要创Z个隐藏的div来容Ux息?/p>

最单的做法时在onload事g中调用DWRUtil.useLoadingMessageQ像q样Q?<head> <script> function init() { DWRUtil.useLoadingMessage(); } </script> ... </head> <body onload="init();"> ...
可能有些情况下你是不能容易的~辑header和body标签(如果你在使用CMSQ这很正?Q在q样的情况下你可以这样做Q?<script> function init() { DWRUtil.useLoadingMessage(); } if (window.addEventListener) { window.addEventListener("load", init, false); } else if (window.attachEvent) { window.attachEvent("onload", init); } else { window.onload = init; } </script>
下面q些是这个函数的代码Q它对于你要实现自己的加载消息很有用。这个函数的主要内容是动态创Z个div(id是disabledZone)来容Ux息。重要的代码是当q程调用时它显C和隐藏Q?DWREngine.setPreHook(function() { $('disabledZone').style.visibility = 'visible'; }); DWREngine.setPostHook(function() { $('disabledZone').style.visibility = 'hidden'; }); This is fairly simple and makes it quite easy to implement your own "loading" message.

function useLoadingImage(imageSrc) { var loadingImage; if (imageSrc) loadingImage = imageSrc; else loadingImage = "ajax-loader.gif"; DWREngine.setPreHook(function() { var disabledImageZone = $('disabledImageZone'); if (!disabledImageZone) { disabledImageZone = document.createElement('div'); disabledImageZone.setAttribute('id', 'disabledImageZone'); disabledImageZone.style.position = "absolute"; disabledImageZone.style.zIndex = "1000"; disabledImageZone.style.left = "0px"; disabledImageZone.style.top = "0px"; disabledImageZone.style.width = "100%"; disabledImageZone.style.height = "100%"; var imageZone = document.createElement('img'); imageZone.setAttribute('id','imageZone'); imageZone.setAttribute('src',imageSrc); imageZone.style.position = "absolute"; imageZone.style.top = "0px"; imageZone.style.right = "0px"; disabledImageZone.appendChild(imageZone); document.body.appendChild(disabledImageZone); } else { $('imageZone').src = imageSrc; disabledImageZone.style.visibility = 'visible'; } }); DWREngine.setPostHook(function() { $('disabledImageZone').style.visibility = 'hidden'; }); }
然后你就可以q样使用:useLoadingImage("images/loader.gif");

7.13 Submission box
h1 非util.js中的功能 q里有一些功能不适合加入到DWRUtil中。它们在解决一下特D问题是很有用,但是他们q不够通用以适用M场合?br /> 62 / 92
修补览器事?如果你创Z一个DOM元素Q然后用addAttribute在这个元素上创徏了一个事Ӟ那么他们不能被正常的触发。你可以使用下面的脚本来遍历一个DOM树,qCؓ他们l定事gQ这样他们就能正常的触发了??click'Ҏ你希望的事g?DWREngine._fixExplorerEvents = function(obj) { for (var i = 0; i < obj.childNodes.length; i++) { var childObj = obj.childNodes [i]; if (childObj.nodeValue == null) { var onclickHandler = childObj.getAttribute('onclick'); if (onclickHandler != null) { childObj.removeAttribute('onclick'); // If using prototype: // Event.observe(childObj, 'click', new Function(onclickHandler)); // Otherwise (but watch out for memory leaks): if (element.attachEvent) { element.attachEvent("onclick", onclickHandler); } else { element.addEventListener("click", onclickHandler, useCapture); } } DWREngine._fixExplorerEvents(childObj); } }

8.5 安全
我们很}慎的对待DWR的安全问题,q且认ؓ有必要解释一下避免错误要做的事情?首先DWR让你明确哪些是被q程调用的,是如何被q程调用。原则就是DWR必须调用那些你明允许的代码?dwr.xml要求你ؓ每一个远E类定义一?create'V你q可以通过指定include和exclude元素来更_的控制远E调用Bean中可以被调用的方法?除此之外如果你希望允许DWR在{换你的JavaBean到Javascript或者从Javascript转换到JavaBean时有一定的许可限制Q同样可以精控制哪些Bean的属性可以被转换?一个很明显但又必须指出?– 不要在生产环境中打开test/debug模式控制台。如何打开或关闭debug控制台在配置web.xml部分可以扑ֈ详细描述?br /> ?审查 - DWR带来的最大好?br /> 很值得Ҏ一下DWR和Servlet、JSP或周围的其他web框架?如果你要审查ZDWR的功能,那是非常单的。看看dwr.xml你就能得C个哪些方法被暴露到外面的描述了。你也可以俯视全局用DWR可以讉K哪些资源?但是要在其他pȝ里做qg事可不是q么Ҏ。如果是Servlet你需要检查WEB-INF/web.xml文gQ然后检查写在Servlet中的request.getParameter(...)。如果是Struts和其他Framework你需要检查配|文Ӟ然后着程查代码,看请求信息出了什么问题?br /> ?讉K控制
DWR允许你通过两种ZJ2EE的机制来q行讉K控制。首先你可以ZJ2EE角色定义DWR的访问。其ơ你可以在DWR里面定义讉KҎ的角艌Ӏ?br /> ?其他斚w
DWR不允怽定义M内部cȝcreate和convert。这栯计是Z不出现意外的d来操作DWR的核心文件以提升讉K权限?br /> ?风险
有什么机会可以让d者窥视你的系l呢Q用DWR你攻击者可以服务器创ZQ何你在dwr.xml中指定的Java对象的实例。ƈ?如果你用BeanConverter)JavacȝMҎ、以及方法Q何参数都是可见的。这些类的Q何一个属性都有可能是d者需要的?如果你知道DWR是怎么工作的,q些都是很显而易见的l论Q但是往往_心会造成问题。如果你创徏了一个有appendStringToFile()Ҏ的FileBean的类Q而且用DWR把它暴露出去Q那么你q了攻击者一个机会来填满你的文gpȝ?br /> 69 / 92
你必LL意用了DWR以后Q有没有l攻击者什么机会?一般来说这L情景让h感觉使用DWR是有风险的,但是q样的问题在所有的传统web架构中都存在Q只是在那些架构中这些不明显Q所以就很难被修复?br /> ?保证更加安全
q已l很安全了,那么你还能做什么来保证更加安全了?首先C上面q些关于审查的内容,当web应用的其他地方不安全Ӟ即它看上去很安全,q多的关注DWR是很愚蠢的。如果DWR让h感觉恐惧Q那是因为它的问题都在明处。所以第一步是多检查几遍传l架构的问题?你可以通过把可q程讉K的类攑ֈ不同的包里,q且使用代理来防止DWR讉K机制出问题。如果你愿意q可以再ơ检查基于角色的安全控制。这些内容只是在查DWR已经Z做的事情?比多查几ơ更好的Ҏ是检查DWR的源码,保证它是在正的工作。这些代码已l被很多人检查过了,但多双眼睛L有好处的?br /> ?整合Acegi
DWR可以整合Acegi security framework。更多的信息见整合DWR和Acegi.
         

完结。?nbsp;                                       



jkluooop 2009-04-24 10:54 发表评论
]]>
Java各种对象理解http://www.aygfsteel.com/jkluooop/archive/2009/04/24/267302.htmljkluooopjkluooopFri, 24 Apr 2009 02:50:00 GMThttp://www.aygfsteel.com/jkluooop/archive/2009/04/24/267302.html关于VO、PO的理?java?PO,VO,TO,BO,DAO,POJO)解释收藏

O/R Mapping ?Object Relational MappingQ对象关pL)的羃写。通俗点讲Q就是将对象与关pL据库l定Q用对象来表C关pL据。在O/R Mapping的世界里Q有两个基本的也是重要的东东需要了解,即VOQPO?br />   VOQ值对?Value Object)QPOQ持久对?Persisent Object)Q它们是׃l属性和属性的get和setҎl成。从l构上看Q它们ƈ没有什么不同的地方。但从其意义和本质上来看是完全不同的?/font>

Q.VO是用new关键字创建,由GC回收的?
  PO则是向数据库中添加新数据时创建,删除数据库中数据时削除的。ƈ且它只能存活在一个数据库q接中,断开q接卌销毁?

Q.VO是值对象,_点讲它是业务对象Q是存活在业务层的,是业务逻辑使用的,它存zȝ目的是为数据提供一个生存的地方?
  PO则是有状态的Q每个属性代表其当前的状态。它是物理数据的对象表示。用它Q可以我们的程序与物理数据解耦,q且可以化对象数据与物理数据之间的{换?/font>

Q.VO的属性是Ҏ当前业务的不同而不同的Q也是_它的每一个属性都一一对应当前业务逻辑所需要的数据的名U?
  PO的属性是跟数据库表的字段一一对应的?/font>

PO对象需要实现序列化接口?br /> -------------------------------------------------

PO是持久化对象Q它只是物理数据实体的一U对象表C,Z么需要它Q因为它可以化我们对于物理实体的了解和耦合Q简单地Ԍ可以化对象的数据转换为物理数据的~程。VO是什么?它是值对象,准确地讲Q它是业务对象,是生zd业务层的Q是业务逻辑需要了解,需要用的Q再单地Ԍ它是概念模型转换得到的?
首先说PO和VO吧,它们的关pd该是怺独立的,一个VO可以只是PO的部分,也可以是多个PO构成Q同样也可以{同于一个POQ当然我是指他们的属性)。正因ؓq样QPO独立出来Q数据持久层也就独立出来了,它不会受CQ何业务的q涉。又正因P业务逻辑层也独立开来,它不会受到数据持久层的媄响,业务层关心的只是业务逻辑的处理,至于怎么存怎么Ml别人吧Q不q,另外一点,如果我们没有使用数据持久层,或者说没有使用hibernateQ那么PO和VO也可以是同一个东西,虽然qƈ不好?/font>


----------------------------------------------------
java?PO,VO,TO,BO,DAO,POJO)解释

PO(persistant object) 持久对象
在o/r映射的时候出现的概念Q如果没有o/r映射Q没有这个概念存在了。通常对应数据模型(数据?,本nq有部分业务逻辑的处理。可以看成是与数据库中的表相映射的java对象。最单的PO是对应数据库中某个表中的一条记录,多个记录可以用PO的集合。PO中应该不包含MҎ据库的操作?

VO(value object) 值对?
通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,q根据业务的需?个h觉得同DTO(数据传输对象),在web上传递?

TO(Transfer Object)Q数据传输对?br /> 在应用程序不同tie(关系)之间传输的对?

BO(business object) 业务对象
从业务模型的角度?见UML元g领域模型中的领域对象。封装业务逻辑的java对象,通过调用DAOҎ,l合PO,VOq行业务操作?

POJO(plain ordinary java object) 单无规则java对象
U的传统意义的java对象。就是说在一些Object/Relation Mapping工具中,能够做到l护数据库表记录的persisent object完全是一个符合Java Bean规范的纯Java对象Q没有增加别的属性和Ҏ。我的理解就是最基本的Java BeanQ只有属性字D及setter和getterҎQ?

DAO(data access object) 数据讉K对象
是一个sun的一个标准j2ee设计模式Q这个模式中有个接口是DAOQ它负持久层的操作。ؓ业务层提供接口。此对象用于讉K数据库。通常和POl合使用QDAO中包含了各种数据库的操作Ҏ。通过它的Ҏ,l合POҎ据库q行相关的操作。夹在业务逻辑与数据库资源中间。配合VO, 提供数据库的CRUD操作...

O/R Mapper 对象/关系 映射  
定义好所有的mapping之后Q这个O/R Mapper可以帮我们做很多的工作。通过q些mappings,q个O/R Mapper可以生成所有的关于对象保存Q删除,d的SQL语句Q我们不再需要写那么多行的DAL代码了?

实体Model(实体模式)
DAL(数据讉K?
IDAL(接口?
DALFactory(cd?
BLL(业务逻辑?
BOF     Business Object Framework       业务对象框架
SOA     Service Orient Architecture     面向服务的设?
EMF     Eclipse Model Framework         Eclipse建模框架

----------------------------------------

POQ全U是
persistant object持久对象
最形象的理解就是一个PO是数据库中的一条记录?br /> 好处是可以把一条记录作Z个对象处理,可以方便的{为其它对象?/font>

BOQ全U是
business object:业务对象
主要作用是把业务逻辑装Z个对象。这个对象可以包括一个或多个其它的对象?br /> 比如一个简历,有教育经历、工作经历、社会关pȝ{?br /> 我们可以把教育经历对应一个POQ工作经历对应一个POQ社会关pd应一个PO?br /> 建立一个对应简历的BO对象处理历,每个BO包含q些PO?br /> q样处理业务逻辑Ӟ我们可以针对BOd理?/font>

VO Q?br /> value object值对?br /> ViewObject表现层对?br /> 主要对应界面昄的数据对象。对于一个WEB面Q或者SWT、SWING的一个界面,用一个VO对象对应整个界面的倹{?/font>

DTO Q?br /> Data Transfer Object数据传输对象
主要用于q程调用{需要大量传输对象的地方?br /> 比如我们一张表?00个字D,那么对应的PO有100个属性?br /> 但是我们界面上只要显C?0个字D,
客户端用WEB service来获取数据,没有必要把整个PO对象传递到客户端,
q时我们可以用只有q?0个属性的DTO来传递结果到客户端,q样也不会暴露服务端表结?到达客户端以后,如果用这个对象来对应界面昄Q那此时它的w䆾p{为VO

POJO Q?br /> plain ordinary java object 单java对象
个h感觉POJO是最常见最多变的对象,是一个中间对象,也是我们最常打交道的对象?/font>

一个POJO持久化以后就是PO
直接用它传递、传递过E中是DTO
直接用来对应表示层就是VO

DAOQ?br /> data access object数据讉K对象
q个大家最熟悉Q和上面几个O区别最大,基本没有互相转化的可能性和必要.
主要用来装Ҏ据库的访问。通过它可以把POJO持久化ؓPOQ用POl装出来VO、DTO

-----------------------------------------------------------------

PO:persistant object持久对象,可以看成是与数据库中的表相映的java对象。最单的PO是对应数据库中某个表中的一条记录,多个记录可以用PO的集合。PO中应该不包含MҎ据库的操?                                                                                       
       
VO:value object值对象。通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,q根据业务的需?个h觉得同DTO(数据传输对象),在web上传?


DAO:data access object数据讉K对象Q此对象用于讉K数据库。通常和POl合使用QDAO中包含了各种数据库的操作Ҏ。通过它的Ҏ,l合POҎ据库q行相关的操?


BO:business object业务对象,装业务逻辑的java对象,通过调用DAOҎ,l合PO,VOq行业务操作;


POJO:plain ordinary java object 单无规则java对象,我个得它和其他不是一个层面上的东?VO和PO应该都属于它.


---------------------------------------------
VOQ值对象、视囑֯?br /> POQ持久对?br /> QOQ查询对?br /> DAOQ数据访问对?br /> DTOQ数据传输对?/font>
----------------------------------------
struts 里的 ActionForm 是个VO;
hibernate里的 实体bean是个PO,也叫POJO;
hibernate里的Criteria q当于一个QO;
在用hibernate的时候我们会定义一些查询的Ҏ,q些Ҏ写在接口?可以有不同的实现c?而这个接口就可以说是个DAO.
个h认ؓQO和DTO差不?
----------------------------------------
PO或叫BOQ与数据库最接近的一层,是ORM中的OQ基本上是数据库字段对应BO中的一个属性,Z同步与安全性考虑Q最好只lDAO或者Service调用Q而不要用packcode,backingBean,或者BO调?br /> DAOQ数据访问层Q把VOQbackingBean中的对象可以攑օ。。。?br /> DTOQ很用Q基本放入到DAO中,只是起到q渡的作用?br /> QOQ是把一些与持久性查询操作与语句攑օ。?br /> VOQV层中用到的基本元素与Ҏ{放其中。如果要其调用BOQ则要做BO转换VOQVO转换BO操作。VO的好处是光面的元素属性多于BOQ可起到很好的作用。。。?br /> -----------------------------------------
g的不对吧QPO是持久化对象。BOQbusiness object—业务对象?br /> PO可以严格对应数据库表Q一张表Ҏ一个PO?br /> BO则是业务逻辑处理对象Q我的理解是它装满了业务逻辑的处理,在业务逻辑复杂的应用中有用?br /> VOQvalue object值对象、view object视图对象
POQ持久对?br /> QOQ查询对?br /> DAOQ数据访问对象——同时还有DAO模式
DTOQ数据传输对象——同时还有DTO模式



jkluooop 2009-04-24 10:50 发表评论
]]>
վ֩ģ壺 | | | żҿ| ɽ| Ӣɳ| | | | ʢ| | Ĭ| | | ƽȪ| ֹ| ʯ| Ӫ| | ȳ| | | ӯ| ͨɽ| ͷ| | | ˮ| | | | | «Ϫ| | â| | Ϫ| ͨ| | ɽ| ʡ|