JAVA学习札记

人生起航点!
posts - 18, comments - 0, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2011年10月10日

一.DWR概述   
    DWR是Direct Web Remoting 的缩写。
    DWR 是一个开放源码的使用 Apache 许可协议的解决方案,它包含服务器端 Java 库、一个 DWR servlet 以及 JavaScript 库。虽然 DWR 不是 Java 平台上唯一可用的 Ajax-RPC工具包,但是它是最成熟的,而且提供了许多有用的功能。
    从最简单的角度来说,DWR 是一个引擎,可以把服务器端 Java对象的方法公开给 JavaScript 代码。使用 DWR 可以有效地从应用程序代码中把 Ajax 的全部请求-响应循环消除掉这意味着客户端代码再也不需要直接处理 XMLHttpRequest 对象或者服务器的响应。不再需要编写对象的序列化代码或者使用第三方工具才能把对象变成 XML。甚至不再需要编写 servlet 代码把 Ajax 请求调整成对 Java 域对象的调用。 ]
    DWR 是作为 Web 应用程序中的 servlet 部署的。把它看作一个黑盒子,这个 servlet 有两个主要作用:首先,对于公开的每个类,DWR 动态地生成包含在 Web 页面中的 JavaScript。
成的JavaScript包含存根函数,代表Java类上的对应方法并在幕后执行 XMLHttpRequest。这些请求被发送给 DWR,这时它的第二个作用就是把请求翻译成服务器端 Java 对象上的方法调用并把方法的返回值放在 servlet 响应中发送回客户端,编码成 JavaScript。DWR 还提供了帮助执行常见的用户界面任务的 JavaScript 工具函数。
二.使用方法
    DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站.它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样。
 它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据.另外一方面一个JavaScript库可以帮助网站开发人员轻松地利用获取的数据来动态改变网页的内容. DWR采取了一个类似AJAX的新方法来动态生成基于JAVA类的JavaScript代码.这样WEB开发人员就可以在JavaScript里使用Java代码就像它们是浏览器的本地代码(客户端代码)一样;但是Java代码运行在WEB服务器端而且可以自由访问WEB 服务器的资源.出于安全的理由,WEB开发者必须适当地配置哪些Java类可以安全的被外部使用.
2.1、dwr.xml的配置
1   <dwr>
2     <allow>
3       <create creator="new" javascript="testClass" >
4          <include method="testMethod1"/> 
5     </create>
6    </allow>
7  </dwr>
8 

<allow>标签中包括可以暴露javascript访问的东西。

<create>标签中指定javascript中可以访问的java类,并定义DWR应当如何获得要进行远程的类的实例。creator="new"属性指定java类实例的生成方式,new意味着DWR应当调用类的默认构造函数来获得实例,其他的还有spring方式,通过与IOC容器Spring进行集成来获得实例等等。javascript=" testClass "属性指定javascript代码访问对象时使用的名称。标签指定要公开给javascriptjava类名。

<include>标签指定要公开javascript的方法。不指定的话就公开所有方法。

<exclude>标签指定要防止被访问的方法。

入门视频:

http://www.verycd.com/groups/@g1897244/737357.topic

 

拓展阅读:

http://baike.baidu.com/view/73492.htm

http://blog.csdn.net/zhaizhanpo/archive/2008/09/27/2988512.aspx

 

http://blog.csdn.net/caterpillar_here/archive/2006/09/06/1186566.aspx

 

三.实例

先下载DWR的JAR包,下载地址:

 

 

http://getahead.ltd.uk/dwr/

将demo(dwr-3.0.0.116.rc1-src\core\impl\demo\web\WEB-INF\lib)实例下的jar文件导入新建项目的web-inf/lib目录下,另外还要加入dwr.jar.

(注意:要加入commons-logging-1.0.4.jar,缺少有时候会报错.)

1.在web.xml文件中注册DWRServlet:负责处理客户端的请求,并呼叫Java物件的是DWRServlet

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
 5     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">    
 6     <servlet>
 7         <servlet-name>dwr-invoker</servlet-name>
 8         <servlet-class>
 9             org.directwebremoting.servlet.DwrServlet
10         </servlet-class>
11         <init-param>
12             <param-name>debug</param-name>
13             <param-value>true</param-value>
14         </init-param>
15     </servlet>
16     
17     <servlet-mapping>
18         <servlet-name>dwr-invoker</servlet-name>
19         <url-pattern>/dwr/*</url-pattern>
20     </servlet-mapping>    
21 </web-app>

2.编写Java物件,即业务Bean:

1 package helloWorld;
2 
3 public class Service {
4     
5     public String sayHello(String yourName) { 
6         //可以是访问数据库的复杂代码
7         return "Hello World " + yourName;
8         }
9 }

3.编写dwr.xml:客户端要呼叫这个Java物件,传给它参数,而返回一個字串,客戶端再展示这个字串,很神奇吧?其实就是是要告訴DWRServlet这件事情:

1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">
3 <dwr>
4     <allow>
5         <create creator="new" javascript="service">
6             <param name="class" value="helloWorld.Service" />
7         </create>
8     </allow>
9 </dwr>

4.测试DWR

将代码放入应用服务器(比如Tomcat),启动。然后在地址栏输入http://localhost:8080/你的工程/dwr

5.编写一个jsp
接下来最后一步就是创建一个jsp文件
1) 要引用几个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js
2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样
 3) js里的service.sayHello和java类的那个有一点区别,多了个参数,用来callback返回的数据
index.jsp
 1 <%@ page language="java" pageEncoding="UTF-8"%>
 2 <html>
 3     <head>
 4         <title>testDWR</title>
 5         <script type='text/javascript' src='dwr/util.js'> </script>
 6         <script type='text/javascript' src='dwr/engine.js'> </script>
 7         <script type="text/javascript" src="dwr/interface/service.js"></script>
 8         <script type="text/javascript">
 9             function firstDwr() {
10                 service.sayHello("Jorwen", callBackHello);
11             }
12             function callBackHello(data) {
13                 alert(data);
14             }
15         </script>
16     </head>
17     <body>
18         <input type="button" name="button" value="测试" onclick="firstDwr();">
19     </body>
20 </html>
6.地址栏输入http://localhost:8080/你的工程/index.jsp 显示的结果如下:

 


 



posted @ 2011-10-10 16:07 簡簡單單 | 编辑 收藏

本文介绍了几乎所有关于对象的基本概念,什么是对象,如何创建对象,对象的属性的设置和读取,删除属性的方法,构造函数,对象原型,父类,子类,继承等等。
1.对象
* 对象是一种复合数据类型,它们将多个数据值集中在一个单元中,而且运行使用名字来存取这些值。解释对象的另一种方式是,对象是一个无序的属性集合,每个属性都有自己的名字和值。存储在对象中的已命名的值可以是数字和字符串这样的原始值,也可以是对象。
*/
var o = new Object();


2.对象直接量创建对象
* 对象直接量由属性说明列表构成,列表包含在大括号中,其中的属性说明由逗号隔开。
* 对象直接量中的每个属性说明都由属性名加上冒号和属性值构成。
*/
var zhangsan = {name:”zhangsan”, age:34, married:true};
window.alert(typeof zhangsan); //输出object

3.属性的读取和设置
* 对象的属性通过点号运算符读取和设置。对象的新属性可以通过直接创建。
*/
window.alert(zhangsan.car); //输出undefined
zhangsan.car=”BMW”; //直接赋值
window.alert(zhangsan.car); //输出BMW

 4.属性的枚举
* 通过for循环枚举每一个属性,顺序不能保证固定。
* 注意枚举出的是属性名称,并不是属性值。
*/
var values = “”;
for(var v in zhangsan)values += v+”\n”; //枚举每一个属性
window.alert(values);

5.属性的删除使用delete,如delete zhangsan.car
*/

6.构造函数
* 构造函数是具有两个特性的javascript函数:
* (1)它由new 运算符调用;
* (2)传递给它的是一个对新创建的空对象的应用,将该引用作为关键字this的值,而且它还要对新创建的对象进行适当的初始化。
* 记住:构造函数只是初始化对象,并不返回新创建的对象。
*/
function Rectangle(w, h){
this.width = w;
this.height = h;
}
var ret1 = new Rectangle(2, 1);
//注意构造函数是如何使用它的参数来初始化this关键字所引用的对象的属性

7.对象的方法
* 所谓方法,就是通过对象调用的javascript函数。我们知道,函数就是数值,它们所使用的名字没有任何特殊之处,可以将函数赋给任何变量,甚至赋给一个对象的任何属性,那么这个属性就是对象的方法了。
* 在对象的方法体内,关键字this的值就成了调用该方法的对象。
*/
function print(){}
ret1.print = print;

 8.关于this的讨论
* 任何一个用作方法的函数都会得到一个额外的实际参数,即调用该函数的对象。由于方法通常是对那个对象执行某种操作,所以要表达函数作用于对象这一事实,最好采用方法的调用语法。
* 如rect.setSize(width, height);
* setSize(rect, width, height);
* 虽然这两行代码对对象rect执行相同的操作,但是第一行代码在表达对象rect是操作的焦点(或者说操作的目标)这一观点时显然清楚得多。
*
* 虽然有区别地对待函数和方法比较有用,但实际上它们之间的差别并不大。回忆一下,函数是存储在变量中的值,而那个变量也不过是全局对象的一个属性。因此,当你调用一个函数时,实际上调用的是全局对象的一个方法。
* 在这样的函数中,关键字this引用的是全局对象。所以函数和方法之间在技术上没有差别,真正的差别在于设计和目的上,方法是用来对this对象进行操作的,而函数通常会是独立的,并不需要使用this对象。
*/
(function f(){
var values = “”;
for(var v in this)values += v + ” “;
window.alert(values);
})(); //返回window对象的所有属性和方法名称

9.原型对象和继承
* javascript每个对象都有原型对象,每个对象都继承原型对象的所有属性。
* 一个对象的原型是由创建并初始化该对象的构造函数定义的。javascript中的所有函数都有prototype属性,它引用了一个对象。虽然原型对象初始化时是空的,
* 但是你在其中定义的任何属性都会被该构造函数创建的所有对象继承。
*
* 构造函数定义了对象的类,并初始化了类中状态变量的属性,如width和height。因为原型对象和构造函数关联在一起,所以类的每个成员都从原型对象继承了相同的属性。
* 这说明原型对象是存放方法和其他常量属性的理想场所。

* 注意,继承是在查询一个属性值时自动发生的。属性并非从原型对象复制到新的对象的,它们只不过看起来像是那些对象的属性。这其中有两点重要的含义。
* 一是使用原型对象可以大量减少每个对象对内存的需求量,因为对象可以继承许多属性。二是即使属性在对象被创建之后才添加到它的原型对象中,对象也能够继承这些属性。
*
* 每个类都有一个原型对象,这个原型对象都具有一套属性。但是实际上却有大量的类实例,每个实例都能继承原型对象的属性。由于一个原型对象能够被多个对象继承,所以javascript
* 必须强化读写属性值之间的不对称性。在读对象o的属性p时,javas会首先检查o是否具有一个名为p的属性。如果o没有这个属性,javascript就会再检查o的原型对象是否具有这个属性。这样才使得以原型为基础的继承机制起作用。
*
* 但是当写一个属性的值时,javascript并不会检查原型对象中是否有这个属性的值。因为,如果允许改变原型对象的这一属性,那就改变了整个对象类的p值,包括其他new出来的对象变量的属性值。
*
* 因此,属性的继承只发生在读属性值时,而不会发生在写属性值时。如果你设置的对象o的属性p是对象o从它的原型对象继承而来的,那么结果就是你直接在对象o中创建了一个新属性p。现在o已经有了一个自己的名为p的属性,它就不会再从它的原型对象继承p的值了。当你读p的值时,java首先查询o的属性。
* 由于它发现了o中定义的p,就不必再查询原型对象,也就不会再发现原型对象中定义的p值了。我们称之为o中的p”遮蔽”了或者说”隐藏”了原型对象中的属性p。
*
* 因为原型对象的属性被一个类的所有对象共享,所以通常只用它们来定义类中所有对象的相同的属性。这使得原型对象适用于方法定义和常量的定义。
*/

10. 实例属性、实例方法、类属性、类方法
* 每个对象都有它自己单独的实例属性的副本。我们说javas中的实例属性是那些在对象中用构造函数创建的或初始化的属性。
*
* 实例方法是由特定对象或实例调用的。实例方法使用了关键字this来引用它们要操作的对象或实例。虽然一个类的任何实例都可以调用实例方法,并不意味着每个对象都像实例属性那样含有自己专有的方法副本。相反,每个实例方法都是由类的所有实例共享的。在javascript中,给类定义一个实例方法,是通过把构造函数的原型对象中的一个属性设置为函数值来实现的。
* 这样,由那个构造函数创建的所有实例都会共享一个已继承的对函数的引用。
*
* 类属性表示在所有类实例中只有一个副本。在javascript中,类属性本质上就是全局变量。但是它们与一个类关联在一起,在javascript的名字空间中拥有一个逻辑位置,这样它们就不会被其他的同名属性覆盖。
* 如Circle.PI=3.14。虽然Circle是一个构造函数,但是由于javascript函数是对象,所以我们可以创建函数的属性,就像创建对象的属性一样。
*
* 类方法与类属性相似。在javascript中,要定义一个类方法,只需要用合适的函数作为构造函数的属性即可。
*/

11. 父类和子类
* 在javascript中,Object类所有类的父类,处于类层次图的最上层。所有的类都继承了Object类的所有方法。
*
* 我们已经学会了对象如何从它们构造函数的原型对象中继承属性,那么它们又是如何继承类Object的属性哪?我们知道,原型对象本身就是一个对象,它是由构造函数Object()创建的。
* 这就意味着原型对象继承了Object.prototype属性。因此,ret1会继承Rectangle.prototype的属性,还会继承Object.prototype的属性。整因为所有对象的prototype属性会继承Object.prototype属性,
* 所以所有javascript子类都继承了Object的所有属性,也即Object类是javascript的根类,处于类层次图的最顶层。
*/

 12.使用[]读取和设置对象的属性
* 通常会采用点号运算符访问对象的属性,但是点号后面的属性是标识符。在javascript中,标识符必须逐字输入,它们不是一种数据类型。如果程序中属性是动态的、不确定的,那么我们将无法访问。
* 前面解释过,对象是一群属性的集合,也就是数组。那么可以使用数组访问成员的运算符[]来访问对象的属性。[]中是属性名称,是字符串类型,我们就可以动态的确定对象属性名称了。
*
* 使用[]运算符的对象我们也称之为关联数组。关联数组是一种数据结构,允许你动态地将任意值和任意字符串关联在一起。实际上,javascript对象在内部就是用关联数组实现的。使用点号运算符只是为了是他们看起来更像C++和Java的静态对象而已。
*
* 前面的for/in循环实际上是对数组的操作。
*
* 我们通常意义说的数组是将任何值和非负整数关联在一起的数据结构。
*
* 数组实际上是一个具有额外功能层的对象。如var a = new Array();window.alert(typeof a);输出Object。
*/

13. Object类的属性和方法
* constructor属性表示初始化该对象的构造函数。因此,可以使用该属性来判断对象的类型。
*/
function A(){return “aaaaaaaaa”};
var a = new A();
window.alert(a.constructor); //输出的是A的函数定义
window.alert(a.constructor==A); //结果是true
window.alert(a.constructor()); //输出aaaaaaaaaa

/**
* toString()方法没有任何实际参数,它返回的是一个字符串,该字符串代表了调用它的对象的类型或值。当javascript需要将一个对象转化成字符串时就调用这个对象的toString方法。
* 例如,当用运算符”+”把一个字符串和一个对象连接到一起时,或者把一个对象传递给alert()或document.write()方法时,就会调用toString()方法。
*/

 

posted @ 2011-10-10 16:06 簡簡單單 | 编辑 收藏

     摘要: 一.概述:Dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platform using the Java Collections Framework and with full support for DOM, SAX and JAXP. dom4j是一个Ja...  阅读全文

posted @ 2011-10-10 15:44 簡簡單單 阅读(653) | 评论 (0)编辑 收藏

     摘要: 一.数据库连接池的概念及作用     数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超...  阅读全文

posted @ 2011-10-10 15:38 簡簡單單 阅读(1014) | 评论 (0)编辑 收藏