??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲网站在线免费观看,亚洲av乱码一区二区三区按摩,日本红怡院亚洲红怡院最新 http://m.tkk7.com/jelver/category/7671.html每天q步一点点zh-cnThu, 24 Mar 2011 12:35:12 GMTThu, 24 Mar 2011 12:35:12 GMT60Ajax 跨域讉K ?Ҏ大全http://m.tkk7.com/jelver/articles/346337.html都市淘沙?/dc:creator>都市淘沙?/author>Tue, 15 Mar 2011 09:58:00 GMThttp://m.tkk7.com/jelver/articles/346337.htmlhttp://m.tkk7.com/jelver/comments/346337.htmlhttp://m.tkk7.com/jelver/articles/346337.html#Feedback0http://m.tkk7.com/jelver/comments/commentRss/346337.htmlhttp://m.tkk7.com/jelver/services/trackbacks/346337.htmlhttp://www.cftea.com/c/2008/06/9QA4QM0238B2C0SF.asp
Case I. Web代理的方?nbsp;(on Server A)

即用戯?nbsp;A |站时所产生的对 B |站的跨域访问请求均提交?nbsp;A |站的指定页面,p面代替用户面完成交互Q从而返回合适的l果。此Ҏ可以解决现阶D|能够惛_的多数跨域访问问题,但要?nbsp;A |站提供 Web 代理的支持,因此A|站?nbsp;B |站之间必须是紧密协作的Q且每次交互q程QA |站的服务器负担增加Q且无法代用户保?nbsp;Session 状态?br />
Case II. on-Demand方式 (on Server A)

MYMSN 的门户就用的q种方式Q不q?nbsp;MYMSN 中不涉及跨域讉K问题。在面内动态生成新?nbsp;
<script>Q将?nbsp;src 属性指向别的网站的|址Q这个网址q回的内容必L合法?nbsp;Javascript 脚本Q常用的?nbsp;JSON 消息。此Ҏ存在的缺hQscript ?nbsp;src 属性完成该调用旉取的方式?nbsp;get 方式Q如果请求时传递的字符串过大时Q可能会无法正常q行。不q此Ҏ非常适合聚合c门户用?br />
<html>
<head>
<script language="javascript" type="text/javascript">
function loadContent()
{
    
var s=document.createElement('script');
    s.src
='http://www.anotherdomain.com/TestCrossJS.aspx?f=setDivContent';
    document.body.appendChild(s);
}


 
function setDivContent(v)
{
    
var dv = document.getElementById("dv");
    dv.innerHTML 
= v; 
}
</script>
 

<div id=dv></div>
 
<input onclick=loadContent() type=button value="Click Me">

其中?nbsp;www.anotherdomain.com/TestCrossJS.aspx 是这LQ?br />
<script language="C#" runat="server">
void Page_Load(object sender, EventArgs e)
{
  string f 
= Request.QueryString["f"];
  Response.Clear();
  Response.ContentType 
= "application/x-javascript";
  Response.Write(String.Format(@
"
                   {0}('{1}');
"
                   f,
                   DateTime.Now));
  Response.End();
}
</script> 

点击“Click Me”按钮Q生成一个新?nbsp;script tagQ下载对应的 Javascript 脚本Q结束时回调其中?nbsp;setDivContent()Q从而更新网上一?nbsp;div 的内宏V?br />
~者注Q如?nbsp;Ajax ?nbsp;js 内容?nbsp;B 提供Q则 A 可以利用 B 提供?nbsp;js 方便地访?nbsp;B 的资源。比?nbsp;A 中的 js 代码Q?br />
<script type="text/javascript" src="B/core.js"></script>

Case III. iframe 方式 (on Server A)

查看q醒来在 javaeye 上的一关于跨域访问的帖子Q他提到自己已经?nbsp;iframe 的方式解决了跨域讉K问题。数据提交跟获取Q采用iframeq种方式的确可以了,但由于父H口与子H口之间不能交互Q跨域访问的情况下,q种交互被拒l)Q因此无法完成对父窗口效果的影响?br />
在页面内嵌或动态生成指向别的网站的 IFRAMEQ然后这 2 个网间可以通过改变Ҏ?nbsp;anchor hash fragment 来传输消息。改变一个网늚 anchor hash fragment q不会ɋ览器重新装载网,所以一个网늚状态得以保持,而网|w则可以通过一个计时器(timer)来察觉自?nbsp;anchor hash 的变化,从而相应改变自q状态?br />
1. http://domain1/TestCross.html:

<html>
<head>
<script language="javascript" type="text/javascript">
var url = "http://domain2/TestCross.html"
var oldHash = null;
var timer = null

 
function getHash() 
{
    
var hash = window.location.hash;
    
if ((hash.length >= 1&& (hash.charAt(0== '#')) 
    {
        hash 
= hash.substring(1);
    }
    
return hash;
}
 
function sendRequest()
{
    
var d = document;
    
var t = d.getElementById('request');
    
var f = d.getElementById('alienFrame');
    f.src 
= url + "#" + t.value + "<br/>" + new Date();
}
 
function setDivHtml(v)
{
    
var d = document;
    
var dv = d.getElementById('response');
    dv.innerHTML 
= v;
}
 
function idle()
{
    
var newHash = getHash(); 
    
if (newHash != oldHash)
    {
        setDivHtml(newHash);
        oldHash 
= newHash;
    } 
    timer 
= window.setTimeout(idle, 100);
}
 
function window.onload()
{
    timer 
= window.setTimeout(idle, 100);
}
</script>
</head>
 
<body>
hQ?/span><input type="text" id="request">
<input type="button" value="发? onclick="sendRequest()" /><br/>
回复Q?/span><div id="response"></div>
<iframe id="alienFrame" src="http://domain2/TestCross.html"></iframe>
</body>
</html>  

2. http://domain2/TestCross.html:

<html>
<head>
<script language="javascript" type="text/javascript">
var url = "http://domain1/TestCross.html"
var oldHash = null;
var timer = null;
 
function getHash() 
{
    
var hash = window.location.hash;
    
if ((hash.length >= 1&& (hash.charAt(0== '#')) 
    {
        hash 
= hash.substring(1);
    } 
    
return hash;
}
 
function sendRequest()
{
    
var d = document;
    
var t = d.getElementById('request');
    
var f = parent;
    
//alert(f.document); //试着Lq个注释Q你会得?#8220;Access is denied”
    f.location.href = url + "#" + t.value + "<br/>" + new Date();
}
 
function setDivHtml(v)
{
    
var d = document;
    
var dv = d.getElementById('response');
    dv.innerHTML 
= v;
}
 
function idle()
{
    
var newHash = getHash(); 
    
if (newHash != oldHash)
    {
        setDivHtml(newHash);
        oldHash 
= newHash;
    } 
    timer 
= window.setTimeout(idle, 100);
}
 
function window.onload()
{
    timer 
= window.setTimeout(idle, 100);
}
</script>
</head>
 
<body> 
hQ?/span><input type="text" id="request">
<input type="button" value="发? onclick="sendRequest()" /><br/>
回复Q?/span><div id="response"></div> 
</body>
</html> 

两个|页基本相同Q第一个网内嵌一?nbsp;IFRAMEQ在点击“发?#8221;按钮后,会将文本框里的内定w过 hash fragment 传给 IFRAME。点?nbsp;IFRAME 里的“发?#8221;按钮后,它会文本框里的内容通过 hash fragment 传给父窗口。因为是只改动了 hash fragmentQ浏览器不会重新 load |页内容Q这里用了一个计时器来检?nbsp;URL 变化Q如果变化了Q就更新其中一?nbsp;div 的内?nbsp;?br />
Case IV. 用户本地转储方式 (local)

IE 本n依附?nbsp;Windows q_的特性ؓ我们提供了一U基?nbsp;iframeQ利用内存来“l行”的方案,即两?nbsp;Window 之间可以在客L通过 Windows 剪脓板的方式q行数据传输Q只需要在接受数据的一方设|?nbsp;Interval q行轮询Q获得结果后清除 Interval 卛_。FF 的^台独立性决定了它不支持剪脓板这U方式,而以往版本?nbsp;FF 中存在的插g漏洞又被 fixed 了,所?nbsp;FF 无法通过内存来完成暗渡陈仓。而由于文件操?nbsp;FF 也没有提供支持(无法通过 Cookie 跨域完成数据传递)Q致使这U技巧性的方式只能?nbsp;IE 中用?br />
Case V: Q其实还是在服务?nbsp;A ?nbsp;iframe 解决了与服务?nbsp;B 通信的问题)

要解决的问题Q发生在用户提交|页 URLQ还包括 Tag, Notes {)l?nbsp;Bookmark 服务器时?br />
关于 URL 的提交至可以有三种方式Q?nbsp; 

   1. 登陆 Bookmark 服务器的提交面Q将要收藏的 URL 通过该页面提交给服务器?br />    2. 安装览器插Ӟ通过插g?nbsp;URL 提交l服务器?br />    3. ?nbsp;Bookmark 服务器动态加?nbsp;javascript 工具到当前面Q通过它来完成提交工作?br />
W一U方式开发v来最单,但对用户来讲比较ȝQ每ơ都需要先登陆 Bookmark 服务器才能完成提交;W二U方式我q不熟悉插g开发,而且用户也不喜欢太多的插件堆满自q览器;W三U方式开发难度小Q又避免了每ơ登陆服务器的麻烦,所以最l采用它。第三种方式中动态加载的 javascript 工具除了需要生?nbsp;UI 供用户填写信息(URLQtagQnotes {)Q当用户点击提交的时候,q要完成与服务器通信的功能?br />
跨域讉KQ简单来说就?nbsp;A |站?nbsp;javascript 代码试图讉K B |站Q包括提交内容和获取内容。由于安全原因,跨域讉K是被各大览器所默认止的。写q跨域访?nbsp;ajax 的朋友相信都遇到q被告知“没有权限”的情c通过 XMLHttp 来发送数据给 Bookmark 服务器的试p|了。于是,看到|上的一些资料,我又开始尝试用 javascript 工具在用户|页动态创Z个隐藏的 iframe, iframe ?nbsp;src 指向服务器的一?nbsp;servlet Q试N过调用 iframe 中提供的 javascript 来完成与服务器的通信。但不幸的是Q用L中?nbsp;javascript 代码讉K iframe 也被览器归域访问(Ҏ iframe ?nbsp;src 指向其它|站的情形)Q尝试再ơ失败?br />
最l,在一文章中看到Q与 iframe 不同Q如?nbsp;A |站?nbsp;B |站加蝲 javascript Q?nbsp;A |站可以自由的访问该 javascript 的内容,q不会被览器认为是跨域讉K。模仿刚?nbsp;iframe 的思\Q当用户点击提交Ӟ可以动态创Z?nbsp;javascript 对象Q该对象?nbsp;src 指向 Bookmark 服务器的一?nbsp;servletQ注意:URL、Tag、Notes、User、Password {信息被作ؓ src URL 参数传给服务器。请看下面的代码Q?br />
var url = "http://localhost:8080/Deeryard/BookmarkServlet?" +
          "url=" + url_source + "&" + "title=" + title + "&" +
          "tag=" + tag + "&" + "notes=" + notes + "&" +
          "user=" + user + "&" + "password=" + password; 
 
url = encodeURI(url); 
 
//Submit to server with a trick 
var js_obj = document.createElement( "script" ); 
js_obj.type = "text/javascript" ; 
js_obj.setAttribute( "src" , url); 
 
//Get response from server by appending it to document 
document.body.appendChild(js_obj);

上面例子中, js_obj.setArrribute() 信息作?nbsp;src ?nbsp;URL 参数提交l了 Bookmark servlet 。那么用户又如何取得服务器的响应信息呢?{案是最末一行代码, servlet 的输出必L javascript 代码Q它可以调用用户|页上的其他 javascript 函数Q以及操?nbsp;dom 对象。下面的 servlet 代码生成了一?nbsp;javascript 函数调用Q?br />
out.write("onServerResponse(INADEQUATE_INFORMATION);"); 

document.body.appendChild(js_obj) 执行?nbsp;onServerResponse( INADEQUATE_INFORMATION) ׃得到执行Q客户|页响应服务器结果。这样一个完整的通信q程完成了?br />
CaseVI:Tomcat + PHP + HTML(含JS)(on Server A)

服务?nbsp;A 上已l装好了 Tomcat, 我们写一?nbsp;test.html(含JS)Q再写一?nbsp;PHP 文gQ由其来完成跨域通信要求Q?br />
更多Q请参考:

    * https://www6.software.ibm.com/developerworks/cn/education/xml/x-ajaxtrans/index.html
    * http://www.xyhhxx.com/news/net/20061013121041.htm

相关阅读

    * http://www-128.ibm.com/developerworks/library/x-securemashups/




]]>
javascript转换字符串ؓjson对象的方?http://m.tkk7.com/jelver/articles/346182.html都市淘沙?/dc:creator>都市淘沙?/author>Mon, 14 Mar 2011 01:46:00 GMThttp://m.tkk7.com/jelver/articles/346182.htmlhttp://m.tkk7.com/jelver/comments/346182.htmlhttp://m.tkk7.com/jelver/articles/346182.html#Feedback0http://m.tkk7.com/jelver/comments/commentRss/346182.htmlhttp://m.tkk7.com/jelver/services/trackbacks/346182.htmlJSON是一U便于操作用的轻量U数据交换格式。易于h阅读和编写。同时也易于机器解析和生成。具体介l请查看Qhttp://www.json.org? 很多时候我们需要组装字W串为json...  阅读全文

]]>
Web 服务~程QREST ?SOAPhttp://m.tkk7.com/jelver/articles/331273.html都市淘沙?/dc:creator>都市淘沙?/author>Tue, 07 Sep 2010 01:12:00 GMThttp://m.tkk7.com/jelver/articles/331273.htmlhttp://m.tkk7.com/jelver/comments/331273.htmlhttp://m.tkk7.com/jelver/articles/331273.html#Feedback0http://m.tkk7.com/jelver/comments/commentRss/331273.htmlhttp://m.tkk7.com/jelver/services/trackbacks/331273.htmlhttp://www.ibm.com/developerworks/cn/webservices/0907_rest_soap/

REST ?/a>

在开始我们的正式讨论之前Q让我们单看一?REST 的定义?/p>

RESTQRepresentational State TransferQ是 Roy Fielding 提出的一个描qC联系l架构风格的名词。ؓ什么称?RESTQWeb 本质上由各种各样的资源组成,资源?URI 唯一标识。浏览器Q或者Q何其它类g览器的应用E序Q将展示资源的一U表现方式,或者一U表现状态。如果用户在该页面中定向到指向其它资源的? 接,则将讉K该资源,q表现出它的状态。这意味着客户端应用程序随着每个资源表现状态的不同而发生状态{U,也即所?REST?/p>

关于 REST 本nQ本文就不再q里q多地讨论,读者可以参?developerWorks 上其它介l?REST 的文章。本文的重点在于通过 REST ?SOAP Web 服务的对比,帮助读者更深刻理解 REST 架构风格的特点,优势?





回页?/strong>


应用场景介绍Q在U用L理)

本文借助于一个应用场景,通过Z REST ?SOAP Web 服务的不同实玎ͼ来对两者进行对比。该应用场景的业务逻辑会尽量保持简单且易于理解Q以有助于把我们的重心放?REST ?SOAP Web 服务技术特质对比上?

需求描q?/a>

q是一个在U的用户理模块Q负责用户信息的创徏Q修改,删除Q查询。用L信息主要包括Q?

  • 用户名(唯一标志在系l中的用P
  • 头衔
  • 公司
  • EMAIL
  • 描述

需求用例图如下Q?


?1. 需求用例图
REST

如图 1 所C,客户?1QClient1Q与客户?2QClient2Q对于信息的存取h不同的权限,客户?1 可以执行所有的操作Q而客L 2 只被允许执行用户查询QQuery UserQ与用户列表查询QQuery User ListQ。关于这一点,我们在对 REST Web 服务?SOAP Web 服务安全控制Ҏ时会具体谈到。下面我们将分别向您介绍如何使用 REST ?SOAP 架构实现 Web 服务?/p>



回页?/strong>


使用 REST 实现 Web 服务

本部分将Z Restlet 框架来实现该应用。Restlet 为那些要采用 REST l构体系来构建应用程序的 Java 开发者提供了一个具体的解决Ҏ。关于更多的 Restlet 相关内容Q本文不做深入讨论,误参考资源列表?/p>

设计

我们采用遵?REST 设计原则?ROAQResource-Oriented ArchitectureQ面向资源的体系架构Q进行设计。ROA 是什么?单点_ROA 是一U把实际问题转换?REST ?Web 服务的方法,它?URI、HTTP ?XML h跟其?Web 应用一L工作方式?/p>

在?ROA q行设计Ӟ我们需要把真实的应用需求{化成 ROA 中的资源Q基本上遵@以下的步骤:

  • 分析应用需求中的数据集?/li>
  • 映射数据集到 ROA 中的资源?/li>
  • 对于每一资源Q命名它?URI?/li>
  • 为每一资源设计?Representations?/li>
  • ?hypermedia links 表述资源间的联系?/li>

接下来我们按照以上的步骤来设计本文的应用案例?/p>

在线用户理所涉及的数据集是用户信息Q如果映到 ROA 资源Q主要包括两c资源:用户及用户列表。用戯源的 URI ?http://localhost:8182/v1/users/{username} 表示Q用户列表资源的 URI ?http://localhost:8182/v1/users 表示。它们的 Representation 如下Q它们都采用了如清单 1 和清?2 所C的 XML 表述方式?/p>
清单 1. 用户列表资源 Representation
				
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<users>
<user>
<name>tester</name>
<link>http://localhost:8182/v1/users/tester</link>
</user>
<user>
<name>tester1</name>
<link>http://localhost:8182/v1/users/tester1</link>
</user>
</users>


清单 2. 用户资源 Representation
				
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<user>
<name>tester</name>
<title>software engineer</title>
<company>IBM</company>
<email>tester@cn.ibm.com</email>
<description>testing!</description>
</user>

客户端通过 User List Resource 提供?LINK 信息 ( ?: <link>http://localhost:8182/v1/users/tester</link> ) 获得具体的某?USER Resource?/p>

Restful Web 服务架构

首先l出 Web 服务使用 REST 风格实现的整体架构图Q如下图所C:


?2. REST 实现架构
REST

接下来,我们基于该架构Q?Restlet l出应用?RESTful Web 服务实现?/p>

下面的章节中Q我们将l出 REST Web 服务实现的核心代码片Dc关于完整的代码清单Q读者可以通过资源列表下蝲?/p>

客户端实?/a>

清单 3 l出的是客户端的核心实现部分Q其主要由四部分l成Q?HTTP PUT 增加、修改用戯源,使用 HTTP GET 得到某一具体用户资源Q?HTTP DELETE 删除用户资源Q?HTTP GET 得到用户列表资源。而这四部分也正对应了?2 关于架构描述的四?HTTP 消息来回。关?UserRestHelper cȝ完整实现Q请读者参见本文所附的代码CZ?/p>
清单 3. 客户端实?/strong>
				
public class UserRestHelper {
//The root URI of our ROA implementation.
public static final tring APPLICATION_URI = "http://localhost:8182/v1";

//Get the URI of user resource by user name.
private static String getUserUri(String name) {
return APPLICATION_URI + "/users/" + name;
}

//Get the URI of user list resource.
private static String getUsersUri() {
return APPLICATION_URI + "/users";
}
//Delete user resource from server by user name.
//使用 HTTP DELETE Ҏl由 URI 删除用户资源
public static void deleteFromServer(String name) {
Response response = new Client(Protocol.HTTP).delete(getUserUri(name));
……
}
//Put user resource to server.
//使用 HTTP PUT Ҏl由 URI 增加或者修改用戯?br /> public static void putToServer(User user) {
//Fill FORM using user data.
Form form = new Form();
form.add("user[title]", user.getTitle());
form.add("user[company]", user.getCompany());
form.add("user[email]", user.getEmail());
form.add("user[description]", user.getDescription());
Response putResponse = new Client(Protocol.HTTP).put(
getUserUri(user.getName()), form.getWebRepresentation());
……
}
//Output user resource to console.
public static void printUser(String name) {
printUserByURI(getUserUri(name));
}

//Output user list resource to console.
//使用 HTTP GET Ҏl由 URI 昄用户列表资源
public static void printUserList() {
Response getResponse = new Client(Protocol.HTTP).get(getUsersUri());
if (getResponse.getStatus().isSuccess()) {
DomRepresentation result = getResponse.getEntityAsDom();
//The following code line will explore this XML document and output
//each user resource to console.
……
} else {
System.out.println("Unexpected status:"+ getResponse.getStatus());
}
}

//Output user resource to console.
//使用 HTTP GET Ҏl由 URI 昄用户资源
private static void printUserByURI(String uri) {
Response getResponse = new Client(Protocol.HTTP).get(uri);
if (getResponse.getStatus().isSuccess()) {
DomRepresentation result = getResponse.getEntityAsDom();
//The following code line will explore this XML document and output
//current user resource to console.
……
} else {
System.out.println("unexpected status:"+ getResponse.getStatus());
}
}
}

服务器端实现

清单 4 l出的是服务器端对于用户资源c(UserResourcQ的实现Q其核心的功能是响应有关用户资源?HTTP GET/PUT/DELETE hQ而这些请求响应逻辑正对应了 UserRestHelper cM关于用户资源cȝ HTTP h?/p>
清单 4. 服务器端实现
				
public class UserResource extends Resource {
private User _user;
private String _userName;
public UserResource(Context context, Request request, Response response) {
//Constructor is here.
……
}
//响应 HTTP DELETE h逻辑
public void delete() {
// Remove the user from container.
getContainer().remove(_userName);
getResponse().setStatus(Status.SUCCESS_OK);
}

//This method will be called by handleGet.
public Representation getRepresentation(Variant variant) {
Representation result = null;
if (variant.getMediaType().equals(MediaType.TEXT_XML)) {
Document doc = createDocument(this._user);
result = new DomRepresentation(MediaType.TEXT_XML, doc);
}
return result;
}
//响应 HTTP PUT h逻辑?br /> public void put(Representation entity) {
if (getUser() == null) {
//The user doesn't exist, create it
setUser(new User());
getUser().setName(this._userName);
getResponse().setStatus(Status.SUCCESS_CREATED);
} else {
getResponse().setStatus(Status.SUCCESS_NO_CONTENT);
}
//Parse the entity as a Web form.
Form form = new Form(entity);
getUser().setTitle(form.getFirstValue("user[title]"));
getUser().setCompany(form.getFirstValue("user[company]"));
getUser().setEmail(form.getFirstValue("user[email]"));
getUser().setDescription(form.getFirstValue("user[description]"));
//Put the user to the container.
getApplication().getContainer().put(_userName, getUser());
}
//响应 HTTP GET h逻辑?br /> public void handleGet() {
super.handleGet();
if(this._user != null ) {
getResponse().setEntity(getRepresentation(
new Variant(MediaType.TEXT_XML)));
getResponse().setStatus(Status.SUCCESS_OK);
} else {
getResponse().setStatus(Status.CLIENT_ERROR_NOT_FOUND);
}
}
//build XML document for user resource.
private Document createDocument(User user) {
//The following code line will create XML document according to user info.
……
}
//The remaining methods here
……
}

UserResource cL对用戯源类的抽象,包括了对该资源的创徏修改Qput ҎQ,dQhandleGet Ҏ Q和删除Qdelete ҎQ,被创建出来的 UserResource cd例被 Restlet 框架所托管Q所有操U资源的Ҏ会在相应? HTTP h到达后被自动回调?/p>

另外Q在服务端,q需要实C表用户列表资源的资源c?UserListResourceQ它的实C UserResource cMQ响?HTTP GET hQ读取当前系l内的所有用户信息,形成如清?1 所C的用户列表资源 RepresentationQ然后返回该l果l客L。具体的实现误者参见本文所附的代码CZ?





回页?/strong>


使用 SOAP 实现 Web 服务

本文对于 SOAP 实现Q就不再?REST 那样Q具体到代码U别的实现。本节将主要通过 URI,HTTP ?XML 来宏观上表述 SOAP Web 服务实现的技术本质,Z一?REST Web 服务?SOAP Web 服务的对比做铺垫?/p>

SOAP Web 服务架构

同样Q首先给?SOAP 实现的整体架构图Q如下图所C:


?3. SOAP 实现架构
REST

可以看到Q与 REST 架构相比QSOAP 架构图明显不同的是:所有的 SOAP 消息发送都使用 HTTP POST ҎQƈ且所?SOAP 消息?URI 都是一LQ这是基?SOAP ?Web 服务的基本实늉征?/p>

获得用户信息列表

Z SOAP 的客L创徏如清?5 所C的 SOAP XML 文Q它通过c?RPC 方式来获得用户列表信息?/p>
清单 5. getUserList SOAP 消息
				
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<p:getUserList xmlns:p="http://www.exmaple.com"/>
</soap:Body>
</soap:Envelope>

客户端将使用 HTTP ?POST ҎQ将上述?SOAP 消息发送至 http://localhost:8182/v1/soap/servlet/messagerouter URIQSOAP SERVER 收到?HTTP POST hQ通过解码 SOAP 消息定需要调?getUserList Ҏ完成?WEB 服务调用Q返回如下的响应Q?/p>
清单 6. getUserListResponse 消息
				
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<p:get
UserListResponse xmlns:p="http://www.exmaple.com">
<Users>
<username>tester<username>
<username>tester1<username>
......
</Users>
<p: getUserListResponse >
</soap:Body>
</soap:Envelope>

获得某一具体用户信息


清单 7. getUserByName SOAP 消息
				
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<p:getUserByName xmlns:p="http://www.exmaple.com">
<username>tester</username>
</p:getUserByName >
</soap:Body>
</soap:Envelope>

同样圎ͼ客户端将使用 HTTP ?POST ҎQ将上述?SOAP 消息发送至 http://localhost:8182/v1/soap/servlet/messagerouter URIQSOAP SERVER 处理后返回的 Response 如下Q?/p>
清单 8. getUserByNameResponse SOAP 消息
				
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<p:getUserByNameResponse xmlns:p="http://www.exmaple.com">
<name>tester</name>
<title>software engineer</title>
<company>IBM</company>
<email>tester@cn.ibm.com</email>
<description>testing!</description>
</p:getUserByNameResponse>
</soap:Body>
</soap:Envelope>

实际上,创徏新的用户Q过E也比较cMQ在q里Q就不一一列出Q因两个例子对于本文在选定的点上对?REST ?SOAP 已经_了?/p>



回页?/strong>


REST ?SOAP 比较

本节从以下几个方面来Ҏ上面两节l出 REST 实现?SOAP 实现?/p>

接口抽象

RESTful Web 服务使用标准?HTTP Ҏ (GET/PUT/POST/DELETE) 来抽象所?Web pȝ的服务能力,而不同的是,SOAP 应用都通过定义自己个性化的接口方法来抽象 Web 服务Q这更像我们l常谈到?RPC。例如本例中? getUserList ?getUserByName Ҏ?/p>

RESTful Web 服务使用标准?HTTP Ҏ优势Q从大的斚w来讲Q标准化?HTTP 操作ҎQ结合其他的标准化技术,? URIQHTMLQXML {,会极大提高pȝ与系l之间整合的互操作能力。尤其在 Web 应用领域QRESTful Web 服务所表达的这U抽象能力更加脓q?Web 本n的工作方式,也更加自然?/p>

同时Q用标?HTTP Ҏ实现?RRESTful Web 服务也带来了 HTTP Ҏ本n的一些优势:

  • 无状态性(StatelessQ?/em>

HTTP 协议从本质上说是一U无状态的协议Q客L发出?HTTP h之间可以怺隔离Q不存在怺的状态依赖。基?HTTP ? ROAQ以非常自然的方式来实现无状态服务请求处理逻辑。对于分布式的应用而言QQ意给定的两个服务h Request 1 ?Request 2, ׃它们之间q没有相互之间的状态依赖,׃需要对它们q行怺协作处理Q其l果是:Request 1 ?Request 2 可以在Q何的服务器上执行Q这L应用很容易在服务器端支持负蝲q (load-balance)?/p>

  • 安全操作与幂指相{特性(Safety /IdempotenceQ?/em>

HTTP ?GET、HEAD h本质上应该是安全的调用,卻IGET、HEAD 调用不会有Q何的副作用,不会造成服务器端状态的改变。对于服务器来说Q客LҎ一 URI ?n ơ的 GET、HAED 调用Q其状态与没有做调用是一LQ不会发生Q何的改变?/p>

HTTP ?PUT、DELTE 调用Q具有幂指相{特?, 卻I客户端对某一 URI ?n ơ的 PUT、DELTE 调用Q其效果与做一ơ的调用是一L。HTTP ?GET、HEAD Ҏ也具有幂指相{特性?/p>

HTTP q些标准Ҏ在原则上保证你的分布式系l具有这些特性,以帮助构建更加健壮的分布式系l?/p>

安全控制

Z说明问题Q基于上面的在线用户理pȝQ我们给定以下场景:

参考一开始我们给出的用例图,对于客户?Client2Q我们只希望它能以只ȝ方式讉K User ?User List 资源Q?Client1 h讉K所有资源的所有权限?/p>

如何做这L安全控制Q?/p>

通行的做法是Q所有从客户?Client2 发出?HTTP h都经q代理服务器 (Proxy Server)。代理服务器制定安全{略Q所有经q该代理的访?User ?User List 资源的请求只hd权限Q即Q允? GET/HEAD 操作Q而像h写权限的 PUT/DELTE 是不被允许的?/p>

如果对于 RESTQ我们看看这L安全{略是如何部|的。如下图所C:


?4. REST 与代理服务器 (Proxy Servers)
REST

一般代理服务器的实现根?(URI, HTTP Method) 两元l来军_ HTTP h的安全合法性?/p>

当发现类gQhttp://localhost:8182/v1/users/{username}QDELETEQ这LhӞ予以拒绝?/p>

对于 SOAPQ如果我们想借助于既有的代理服务器进行安全控Ӟ会比较尴,如下图:


?5. SOAP 与代理服务器 (Proxy Servers)
REST

所有的 SOAP 消息l过代理服务器,只能看到Q?code>http://localhost:8182/v1/soap/servlet/messagerouter, HTTP POSTQ这L信息Q如果代理服务器想知道当前的 HTTP h具体做的是什么,必须?SOAP 的消息体解码Q这L话,意味着要求W三方的代理服务器需要理解当前的 SOAP 消息语义Q而这U?SOAP 应用与代理服务器之间的紧耦合关系是不合理的?/p>

关于~存

众所周知Q对于基于网l的分布式应用,|络传输是一个媄响应用性能的重要因素。如何用缓存来节省|络传输带来的开销Q这是每一个构建分布式|络应用的开发h员必考虑的问题?/p>

HTTP 协议带条件的 HTTP GET h (Conditional GET) 被设计用来节省客L与服务器之间|络传输带来的开销Q这也给客户端实?Cache 机制 ( 包括在客L与服务器之间的Q何代?) 提供了可能。HTTP 协议通过 HTTP HEADER 域:If-Modified-Since/Last- ModifiedQIf-None-Match/ETag 实现带条件的 GET h?/p>

REST 的应用可以充分地挖掘 HTTP 协议对缓存支持的能力。当客户端第一ơ发?HTTP GET hl服务器获得内容后,该内容可能被~存服务?(Cache Server) ~存。当下一ơ客Lh同样的资源时Q缓存可以直接给出响应,而不需要请求远E的服务器获得。而这一切对客户端来说都是透明的?/p>
?6. REST 与缓存服务器 (Cache Server)
REST

而对?SOAPQ情况又是怎样的呢Q?/p>

使用 HTTP 协议?SOAPQ由于其设计原则上ƈ不像 REST 那样?Web 的工作方式相一_所以,Z SOAP 应用很难充分发挥 HTTP 本n的缓存能力?/p>
?7. SOAP 与缓存服务器 (Cache Server)
REST

两个因素军_了基?SOAP 应用的缓存机制要q比 REST 复杂Q?/p>

其一、所有经q缓存服务器?SOAP 消息L HTTP POSTQ缓存服务器如果不解?SOAP 消息体,没法知道?HTTP h是否是想从服务器获得数据?/p>

其二、SOAP 消息所使用?URI L指向 SOAP 的服务器Q如本文例子中的 http://localhost:8182/v1/soap/servlet/messagerouterQ这q没有表辄实的资源 URIQ其l果是缓存服务器Ҏ不知道那个资源正在被hQ更不用谈进行缓存处理?/p>

关于q接?/a>

在一个纯?SOAP 应用中,URI 本质上除了用来指C?SOAP 服务器外Q本w没有Q何意义。与 REST 的不同的是,无法通过 URI 驱动 SOAP Ҏ调用。例如在我们的例子中Q当我们通过

getUserList SOAP 消息获得所有的用户列表后,仍然无法通过既有的信息得到某个具体的用户信息。唯一的方法只有通过 WSDL 的指C,通过调用 getUserByName 获得QgetUserList ?getUserByName 是彼此孤立的?/p>

而对?RESTQ情冉|完全不同的:通过 http://localhost:8182/v1/users URI 获得用户列表Q然后再通过用户列表中所提供?LINK 属性,例如 <link>http://localhost:8182/v1/users/tester</link>获得 tester 用户的用户信息。这L工作方式Q非常类g你在览器的某个面上点L?hyperlink, 览器帮你自动定向到你想讉K的页面,q不依赖MW三方的信息?/p>



回页?/strong>


ȝ

典型的基?SOAP ?Web 服务以操作ؓ中心Q每个操作接?XML 文作ؓ输入Q提?XML 文作ؓ输出。在本质上讲Q它们是 RPC 风格的。而在遵@ REST 原则?ROA 应用中,服务是以资源Z心的Q对每个资源的操作都是标准化? HTTP Ҏ?/p>

本文主要集中在以上的几个斚wQ对 SOAP ?REST q行了对比,可以看到Q基?REST 构徏的系l其pȝ的扩展能力要Z SOAPQ这可以体现在它的统一接口抽象、代理服务器支持、缓存服务器支持{诸多方面。ƈ且,伴随着 Web Site as Web Services 演进的趋势,Z REST 设计和实现的单性和强扩展性,有理q信,REST 会成ؓ Web 服务的一个重要架构实践领域?/p>




回页?/strong>


下蝲

描述名字大小下蝲Ҏ
本文代码CZ code_rest.zip 10 KB HTTP
关于下蝲Ҏ的信?/a>


参考资?





]]>
w䆾证号码校验js脚本 http://m.tkk7.com/jelver/articles/246441.html都市淘沙?/dc:creator>都市淘沙?/author>Mon, 15 Dec 2008 08:14:00 GMThttp://m.tkk7.com/jelver/articles/246441.htmlhttp://m.tkk7.com/jelver/comments/246441.htmlhttp://m.tkk7.com/jelver/articles/246441.html#Feedback0http://m.tkk7.com/jelver/comments/commentRss/246441.htmlhttp://m.tkk7.com/jelver/services/trackbacks/246441.html
这些代码保存在check.js的文件中

function checkIdcard(idcard){
var Errors=new Array(
"w䆾证验证通过!",
"w䆾证号码位C?",
"w䆾证号码出生日期超围或含有非法字符!",
"w䆾证号码校验错?",
"w䆾证地区非?"
);
var area={11:"北京",12:"天|",13:"沛_",14:"p",15:"内蒙?,21:"辽宁",22:"吉林",23:"黑龙?,31:"上v",32:"江苏",33:"江",34:"安徽",35:"徏",36:"江西",37:"׃",41:"沛_",42:"湖北",43:"湖南",44:"q东",45:"q西",46:"南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青v",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}


var idcard,Y,JYM;
var S,M;
var idcard_array = new Array();
idcard_array = idcard.split("");
//地区?br /> if(area[parseInt(idcard.substr(0,2))]==null) return Errors[4];
//w䆾L位数及格式检?br /> switch(idcard.length){
case 15:
if ( (parseInt(idcard.substr(6,2))+1900) % 4 == 0 || ((parseInt(idcard.substr(6,2))+1900) % 100 == 0 && (parseInt(idcard.substr(6,2))+1900) % 4 == 0 )){
ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;//试出生日期的合法?br /> } else {
ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;//试出生日期的合法?br /> }
if(ereg.test(idcard)) return Errors[0];
else return Errors[2];
break;
case 18:
//18位n份号码检?br /> //出生日期的合法性检?br /> //闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
//q_月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
if ( parseInt(idcard.substr(6,4)) % 4 == 0 || (parseInt(idcard.substr(6,4)) % 100 == 0 && parseInt(idcard.substr(6,4))%4 == 0 )){
ereg=/^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;//闰年出生日期的合法性正则表辑ּ
} else {
ereg=/^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;//q_出生日期的合法性正则表辑ּ
}
if(ereg.test(idcard)){//试出生日期的合法?br /> //计算校验?br /> S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7
+ (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9
+ (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10
+ (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5
+ (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8
+ (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4
+ (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2
+ parseInt(idcard_array[7]) * 1
+ parseInt(idcard_array[8]) * 6
+ parseInt(idcard_array[9]) * 3 ;
Y = S % 11;
M = "F";
JYM = "10X98765432";
M = JYM.substr(Y,1);//判断校验?br /> if(M == idcard_array[17]) return Errors[0]; //ID的校验位
else return Errors[3];
}
else return Errors[2];
break;
default:
return Errors[1];
break;
}

}
function check(obj){

alert(checkIdcard(obj.value));

}


function dosubmit(){
 var i = checkIdcard(document.getElementById('character_id').value);
   if(i != "w䆾证验证通过!"){
     return false;
   } else {
     document.getElementById('submit').submit;
     }
 }


下面是表单处的写?br />

<form action="" method="post" name="setICP">
<tr>
   
<td>中文?/span></td>
   
<td><input type='text' name='username_cn' value='<%{$res2[list].user_name_cn }%>' /> 您n份证上的名字</td>
 
</tr>
 
<tr>
   
<td>w䆾证号</td>
   
<td><input type='text' name='character_id' value='<%{$res2[list].character_id }%>' /> 您的w䆾证号?/span></td>
 
</tr>
<tr>
   
<td colspan="2">
   
<input type="submit" name="submit" value="提交" onclick="dosubmit()" />
   
</td>
</tr>

</form>



q要记得在html文g头部引用那个js文g

<script language="JavaScript" type="text/javascript" src="/tpl/js/union_user_beian.js"></script>

]]>
应用HttpClient来对付各U顽固的WEB服务?ZHUAN)http://m.tkk7.com/jelver/articles/221076.html都市淘沙?/dc:creator>都市淘沙?/author>Sat, 09 Aug 2008 14:51:00 GMThttp://m.tkk7.com/jelver/articles/221076.htmlhttp://m.tkk7.com/jelver/comments/221076.htmlhttp://m.tkk7.com/jelver/articles/221076.html#Feedback0http://m.tkk7.com/jelver/comments/commentRss/221076.htmlhttp://m.tkk7.com/jelver/services/trackbacks/221076.html阅读全文

]]>
JDK tomcat Axis的安装用(转)http://m.tkk7.com/jelver/articles/167230.html都市淘沙?/dc:creator>都市淘沙?/author>Wed, 12 Dec 2007 06:42:00 GMThttp://m.tkk7.com/jelver/articles/167230.htmlhttp://m.tkk7.com/jelver/comments/167230.htmlhttp://m.tkk7.com/jelver/articles/167230.html#Feedback0http://m.tkk7.com/jelver/comments/commentRss/167230.htmlhttp://m.tkk7.com/jelver/services/trackbacks/167230.html
一.?br /> 什么是SOAP?SOAP是一个应用程序间的基于XML的通信工具和规?SOAP最初由MicroSoft和Userland公司开?已经演化了好几个版本,当前的版本SOAP1.1正飞速发?W3C的XML协议工作l正努力把它发展Z个真正的开发的标准.SOAP1.2草案已经发布,它能澄清 1.1版规范的Ҏh的地?

什么是Axis?AxisM上是一个SOAP引擎,但又不仅仅是个引?它还:1)是一个简单的独立的服务器2)是一个可插入到servlet引擎(如Tomcat)中的服务3)可扩展的支持WSDL4)能根据WSDL产生JAVA文g/c?)包括一些例子程?)包括一个可以监控TCP/IP包的工具

Axish于IBM的SOAP4J,是Apache SOAP的第三代产品,相对于以前的版本,它有如下Ҏ?1)快?它用了Z事g的SAX解析机制.2)灉|,用户可以灉|定制扩展.3)E_,接口会变动很小.4)Zlg开?5)支持WSDL1.1

?准备
应用Axis开发Web ServicesQ你需要安装如下YӞ
1.jdk1.5
2.安装Tomcat5.0.28,q是当前E_版本.Tomcatq行?0端口.讉Khttp://localhost/8080查Tomcat是否安装成功.
3.下蝲AXIS:
官方站点:http://xml.apache.org/axis/index.html
下蝲软g:axis-bin-1_2_1.tar.gz
4.下蝲相关?
a.mail.jar 下蝲地址:http://java.sun.com/products/javamail
b.activation.jar 下蝲地址:http://java.sun.com/products/javabeans/glasgow/jaf.html
c.xerces.jar 下蝲地址:http://xml.apache.org/xerces-j/index.html
d.xmlsec-1.2.1.jar 下蝲地址:http://xml.apache.org/security/

?安装
1.jdk1.5.0_04安装在D:\jdk1.5.0_04?当然安装路径可Q意?好后Q环境变量配|如下:
JAVA_HOME=D:\jdk1.5.0_04
CLASSPATH=.;D:\jdk1.5.0_04\jre\lib\rt.jar;D:\jdk1.5.0_04\jre\lib\tools.jar
Path=D:\jdk1.5.0_04\bin
2.tomcat-5.0.28安装在D:\tomcat-5.0.28?安装路径可Q?好后Q环境变量配|如下:
CATALINA_BASE=D:\tomcat-5.0.28
CATALINA_HOME=D:\tomcat-5.0.28
3.axis的安?br /> a.下载的Axis软g包解压羃Q将其中?#8220;webapps”目录下的“axis”目录整个拯到Tomcat安装目录下的“webapps”目录下?br /> b.mail.jar、activation.jar、xerces.jar、xmlsec-1.2.1.jar四个?全部拷到D:\tomcat-5.0.28\webapps\axis\WEB-INF\lib?br /> c.环境变量配置
AXIS_HOME=D:\tomcat-5.0.28

AXIS_LIB=%AXIS_HOME%\WEB-INF\lib
AXISCLASSPATH=%AXIS_LIB%\activation.jar;%AXIS_LIB%\axis.jar;%AXIS_LIB%\axis-ant.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar;%AXIS_LIB%\mail.jar;AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\xerces.jar;%AXIS_LIB%\xmlsec-1.2.1.jar

CLASSPATH=%AXIS_HOME%\WEB-INF\lib
AXISCLASSPATH=%AXIS_LIB%\activation.jar;%AXIS_LIB%\axis.jar;%AXIS_LIB%\axis-ant.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar;%AXIS_LIB%\mail.jar;AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\xerces.jar;%AXIS_LIB%\xmlsec-1.2.1.jar
q里有几炚w要注意:中间不要有空|包的名字可能有不同的版本Q这旉要修改一下包名?/p>

?试
安装配置完毕后,应测试一下是否tomcat、Axis可以正确q行了?br /> 启动Tomcat服务器,在浏览器中访?a href="http://localhost:8080/axis/happyaxis.jsp">http://localhost:8080/axis/happyaxis.jspQ如果页面显C有错误Q则需要回头检查一下相关配|是否正,如果览面能正显C出pȝlg、属性等参数配置信息Q则表示安装成功。现在可以开始开发你的Web Services应用了。 

五、服务的发布
Axis提供了两U服务发布方式,一U是x发布QInstant DeploymentQ,一U是定制发布QCustom DeploymentQ?/p>

1. 使用x发布 Java Web Service(JWS)

  对即时发布的支持是Axis的特色之一Q用即时发布用户只需有提供服务的Javacȝ源代码,卛_其q速发布成Web服务。每当用戯用这cL务的时候,Axis会自动进行编译,即服务器重启了也不必对其做M处理Q用非常简单快捗?/p>

  使用x发布首先需要一个实现服务功能的Java源文Ӟ其扩展名改?jwsQJava Web Service的羃写)Q然后将该文件放?#8220;……\webapps\axis”目录下即可?br />  在此l出一个HelloWorldE序Q其源码如下Q?/p>

HelloWorld.java

public class HelloWorld {
  public String sayHello()
  {
    return "HELLO WORLD!";
  }
}


其攑ֈ“……\webapps\axis”目录Q通过讉Khttp://localhost:8080/axis/HelloWorld.jws?wsdl可以看到q个服务的WSDL描述文gQ这说明HelloWorld服务被成功发布了?br /> 现在写个客户端程序访问一下:

 1TestClient.java
 2
 3import org.apache.axis.client.Call;
 4import org.apache.axis.client.Service;
 5
 6import javax.xml.rpc.ParameterMode;
 7
 8public class TestClient
 9{
10   public static void main(String [] args) throws Exception {
11       
12       String endpoint = "http://localhost:" +"8080"+ "/axis/HelloWorld.jws";//指明服务所在位|?/span>
13
14       Service  service = new Service();  //创徏一个Service实例Q注意是必须的!
15       Call     call    = (Call) service.createCall();//创徏Call实例Q也是必ȝQ?/span>
16
17     call.setTargetEndpointAddress( new java.net.URL(endpoint) );//为Call讄服务的位|?/span>
18
19        call.setOperationName( "sayHello" );//注意Ҏ名与HelloWorld.java中一PQ?/span>
20
21         String res = (String) call.invoke( new Object[] {} );//q回StringQ没有传入参?/span>
22
23                         System.out.println( res );
24   }

25}

26

 


下面我们介绍W二U发布方式,q是常用的?/p>

我们的第二种发布方式Q?br /> 1、将HelloWorld.java~译成HelloWorld.class,攑ֈ%TOMCAT_HOME%\webapps\axis\WEB-INF\classes

      ?/p>

2、在%TOMCAT_HOME%\webapps\axis\WEB-INF下新建deploy.wsdd文gQ即SOAP服务发布描述文g

     deploy.wsdd

<deployment xmlns="         <parameter name="className" value="HelloWorld"/>
        <parameter name="allowedMethods" value="sayHello"/>
    </service>
</deployment>

在DOS下{换目录到%TOMCAT_HOME%\webapps\axis\WEB-INFQ命令:
java org.apache.axis.client.AdminClient deploy.wsdd 后会出现

Processing file deploy.wsdd
<Admin>Done processing</Admin>

q时你会发现目录下多了一个server-config.wsdd文gQ这是AXIS的配|文Ӟ以后所有的服务发布描述都会在里面找到。(当然Q你可以直接修改它,不用再写deploy.wsddQ然后打开览?a href="http://localhost:8080/axis/services/HelloWorld?wsdl">http://localhost:8080/axis/services/HelloWorld?wsdlQ你׃看到你的服务已发?/p>

同样用客LE序讉K一下:Q注意和上边的差别!Q)

 

 1HelloClient.java
 2
 3import org.apache.axis.client.Call;
 4import org.apache.axis.client.Service;
 5
 6public class HelloClient
 7{
 8   public static void main(String [] args) throws Exception {
 9
10       String endpoint = "http://localhost:" +"8080"+ "/axis/services/HelloWorld";//注意Q差别仅仅在q里Q!
11
12       Service  service = new Service();
13       Call     call    = (Call) service.createCall();
14       call.setTargetEndpointAddress( new java.net.URL(endpoint) );
15        call.setOperationName("sayHello"  );
16
17         String res = (String) call.invoke( new Object[] {} );
18
19                         System.out.println( res );
20   }

21}

22

 

  Web Services是未来网l应用的发展方向QSOAP和WSDL是Web Services的核心协议,Axisl出了一个很好的SOAP实现Q它使得开发Web Services应用变得L而有?/p>

]]>
SOAP中复杂类?JavaBean)调用实例实践Q{Q?/title><link>http://m.tkk7.com/jelver/articles/167189.html</link><dc:creator>都市淘沙?/dc:creator><author>都市淘沙?/author><pubDate>Wed, 12 Dec 2007 04:14:00 GMT</pubDate><guid>http://m.tkk7.com/jelver/articles/167189.html</guid><wfw:comment>http://m.tkk7.com/jelver/comments/167189.html</wfw:comment><comments>http://m.tkk7.com/jelver/articles/167189.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jelver/comments/commentRss/167189.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jelver/services/trackbacks/167189.html</trackback:ping><description><![CDATA[     摘要:   1SOAP中复杂类?JavaBean)调用实例实践  2   3    4   5使用工具Qaxis-1_1   6   7         &...  <a href='http://m.tkk7.com/jelver/articles/167189.html'>阅读全文</a><img src ="http://m.tkk7.com/jelver/aggbug/167189.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jelver/" target="_blank">都市淘沙?/a> 2007-12-12 12:14 <a href="http://m.tkk7.com/jelver/articles/167189.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用ant与jmeter实现负蝲试自动化(转脓Q?/title><link>http://m.tkk7.com/jelver/articles/146111.html</link><dc:creator>都市淘沙?/dc:creator><author>都市淘沙?/author><pubDate>Tue, 18 Sep 2007 03:49:00 GMT</pubDate><guid>http://m.tkk7.com/jelver/articles/146111.html</guid><wfw:comment>http://m.tkk7.com/jelver/comments/146111.html</wfw:comment><comments>http://m.tkk7.com/jelver/articles/146111.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jelver/comments/commentRss/146111.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jelver/services/trackbacks/146111.html</trackback:ping><description><![CDATA[                                                                                                                                 <a ><span><span>原脓地址Qhttp://blog.csdn.net/lemonfamily/archive/2007/05/17/1612826.aspx</span></span></a><br />         性能试一直以来都是测试领域一个oZ议的话题。测试的参考标准、评判依据及试的方法选择都很难有一个统一的说法。但无论如何Q对于需要能够承受一定压力而运行的E序来说Q进行其q行功能和性能试是一个必不可的q程?br /> 工欲善其事,必先利其器。性能试Q很必要的准备是要利用工L化测试的J杂E度。减Mh工操作的负担。在下面的例子中Q我们将会用C面几个YӞ<br /> Eclipse 3.2<span>        java IDE</span>Q对ant的强力支持,非常方便我们利用ant的task与target功能实现试的自动化?br /> Ant1.7<span>           </span>一个强大的构徏脚本工具Q在需要进行批处理操作或多dӞ非常有用?a ><span><span>下蝲地址</span></span></a><br /> Jakarta-jmeter 2.1  100%用java实现的性能试工具Q原来目的是用于web的压力测试,目前已经可以用于试静态或者动态资源的性能 包括java桌面应用E序、文件、数据库{。目前已l有更新的版本可用?a ><span><span>下蝲地址</span></span></a><br /> Badboy 2.0<span>        </span>一个非怸错的脚本录制工具Q支持导出jemter的jmx格式。虽然功能不如loadrunner和winrunner强大Q但如果只用于录制动作脚本,那么已经_了?a ><span><span>官方|站</span></span></a><span><br /> </span><br /> 下面以个单的webE序的负载测试的实现程介绍如何使用ant 与jmeter实现负蝲试自动化的?br />   一?span>   </span>利用badboy录制一D脚本,该脚本包含了所需q行负蝲试的urlD以及请求数据?/div> <div style="text-indent: 21.75pt"><img height="457" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/lemonfamily/878d380d0d4c4c47868e71e2926be2bf.png" width="750" /> <br /> <br /> 然后利用 ”File”->”Export to Jmeter…”导出jmx?br /> 二?span>    </span>q行jmeter。打开刚才的jmx。对其进行一定的~辑?img height="549" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/lemonfamily/c85247d9e0dd437eabc12025ed5dbffc.png" width="750" /><br /> <br /> 我们计划要对登陆q行试Q则可以在该h的节点上加上循环控制器:<img height="549" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/lemonfamily/505e9db6d80348e3b6c5e6b975ab632c.png" width="750" /><br /> <br /> q行无误后,取消掉监视器。保存该脚本<br /> 三、打开eclipseQ先Z个java工程用于q行ant脚本?br /> 在jmeter的安装目录的extras文g夹下有个CZ的antq行脚本以及一个演C教E的html文。我们直接copyq个build.xml到eclipse的新建工E目录下。利?#8221;Windows”<span>--></span>”Show View”<span>--></span>”Other”<span>--></span>”Ant”打开ant控制面板。通过”Add Buildfiles”按钮该build.xmldq去?br /> 因ؓCZ的脚本用相对目?Q我们需要修改一下这个build.xml使得ant可以扑ֈ所指定的资源。在我的jmeter版本中,有个的错误需要修改,原文件多打了个xQ?nbsp;</div> <table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1"> <tbody> <tr> <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568"><span style="font-size: 10pt; color: navy"><property </span><span style="font-size: 10pt; color: navy">name=</span><span style="font-size: 10pt; color: green">"jmeter.save.saveservice.bytes" </span><span style="font-size: 10pt; color: navy">value=</span><span style="font-size: 10pt; color: green">"true"</span><span style="font-size: 10pt; color: navy">/></span></td> </tr> </tbody> </table> <div style="text-indent: 21.75pt"><img height="459" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/lemonfamily/1d08f6d391484717983d342bd773e646.png" width="750" /> <br />       <br />        q行脚本成功后,会在指定的目录下生成一个html文Q?nbsp; <img height="459" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/lemonfamily/69d392cc28c849b5a163c28ca9e7d2a5.png" width="750" /><br /> <br />  提C:如果每次q行脚本不删除先前的jtl文gQ则报告内容会把以前的测试结果保留下来?br /><img src ="http://m.tkk7.com/jelver/aggbug/146111.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jelver/" target="_blank">都市淘沙?/a> 2007-09-18 11:49 <a href="http://m.tkk7.com/jelver/articles/146111.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ajax资料攉-Ajax文章(教程和实?http://m.tkk7.com/jelver/articles/87049.html都市淘沙?/dc:creator>都市淘沙?/author>Mon, 11 Dec 2006 12:42:00 GMThttp://m.tkk7.com/jelver/articles/87049.htmlhttp://m.tkk7.com/jelver/comments/87049.htmlhttp://m.tkk7.com/jelver/articles/87049.html#Feedback0http://m.tkk7.com/jelver/comments/commentRss/87049.htmlhttp://m.tkk7.com/jelver/services/trackbacks/87049.htmlajax web开?脚本和动态语a) ajax资料攉-ajax文章(教程和实?---ajax资源下蝲(源码和教E?---ajax规范标准 CSDN 推荐tag:.net asp.net w3c web2.0 教程 资源 


CSDN Blog Ajax文章搜烦Q?br />http://search.csdn.net/search/ajax/1/blog/

专题QAjax技术应用开?br />http://www.51cto.com/html/2005/1121/11736.htm

http://www.edufans.com/html/Ajax/
Ajax教程 
Ajax技?/font>
Ajax实例
Ajax下蝲

++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ajax联盟Q资源下?br />http://www.ajaxw3c.com/resource.html

  • 征服Ajax - Web20开发技术详解试ȝ【PDF电子版下载?/a>
  • AJAX 新手快R道【PDF电子版下载?/font>
  • Ajax 基础教程【html版下载?/font>
  • Ajax 修炼之道—Web2.0入门【全部源代码下蝲?/a>
  • Ajax 开发精?/a>
  • Ajax实战(ajax_in_action)【PDF电子版下载?/font>
  • |站重构【PDF电子版下载?/a>
  • 代码大全1.01中文版【PDF电子版下载?/a>
  • CSS 2.0手册中文?苏沈雨?【chm电子版下载?/a>
  • CSS 2.0样式表中文手?苏昱?【chm电子版下载?/a>
  • JScript 语言参考【chm电子版下载?/a>
  • JavaScript源码大全 v1.0【chm电子版下载?/a>
  • JavaScript 权威指南【chm电子版下载?/a>
  • VBScript 语言参考【chm电子版下载?/a>
  • XmlHttp对象参考【chm电子版下载?/font>
  • Flash 2004 ActionScript 字典【chm电子版下载?/a>
  • XML 指南【chm电子版下载?/a>
  • XML 学习手册英文W二版【chm电子版下载?/a>
  • Microsoft Windows脚本技术【chm电子版下载?/a>
  • |站目理规范【chm电子版下载?/a>
  • |页制作完全手册【chm电子版下载?/a>
  • SQL语言参考大全【chm电子版下载?/a>
  • 表单验证Validator v1.0【chm电子版下载?/a>
  • 新编 Win32API 大传【chm电子版下载?/a>
  • |站设计和制作理论知识【chm电子版下载?/a>

    ajax联盟Q规范标?br />
    http://www.ajaxw3c.com/webstandard.html

    CSS ~码规范
    ASP ~码规范
    PHP ~码规范
    Java ~码规范
    CQ编码规?/a>
    JSP ~码规范
    |站技术规?/a>
    |页制作规范及流E?/a>
    专业信息|站制作规范

    ajax联盟Q文章教E?br />http://www.ajaxw3c.com/article.html

    ajax联盟QWEB2.0
    http://www.ajaxw3c.com/web20.html

  • web 2.0 概念l构
  • Web 2.0 学习指南
  • Web 2.0中AJAX技术应用详?/a>
  • Web 2.0 |站成功的关?/a>
  • WEB2.0中AJAX应用的详l探?/a>
  • Web 2.0 ~程思想:16条法?/a>
  • 关于Web 2.0 |站的创业思?/a>


    +++++++++++++++++++++++++++++++++++++++++++++++++
    Ajax资料
    http://blog.csdn.net/bjoker/archive/2006/10/23/1347578.aspx
    一.资源cȝ?br />
    1,国内|站
    1)Ajax中国(推荐)
    一个专业的ajax技术网?分类清晰,有大量的电子版教E?以及AJAX源码下蝲!
    www.okajax.com

    2)ajaxcn.org
    李琨老师的blog。李?《ajax实战》译?
    www.ajaxcn.org
    -----------------------------------------
    2,国外|站
    1)、Ajax 的诞?
    Ajax: A New Approach to Web Applications
    www.adaptivepath.com/publications/essays/archives/000385.php

    2)、AJAX Matters
    www.ajaxmatters.com
    关于 Ajax 技术一个信息量非常大的|站Q有点像 Ajax 世界中的 TSS?

    3)、AJAX Patterns
    ?AJAX 设计模式相关的资源?
    www.ajaxpatterns.org
    www.softwareas.com/ajax-patterns

    4)、http://www.ajaxian.com

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

    ?热门文章

    1.什么是AJAX
    www.okajax.com/info/net/20060510.html
    2.ajax技术简?br />www.okajax.com/info/basic/200604654.html
    3.ajax.net
    www.okajax.com/info/basic/200604556.html
    www.okajax.com/info/tech/200605589.html
    weblogs.asp.net/mschwarz/archive/2005/04/11/399893.aspx(英文)

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

    ?ajax相关下蝲Q电子书教程/源码Q?br />1.Ajax基础教程电子?br />www.okajax.com/info/bookdown/200604950.htm
    2.《AJAX实战》ajax in action电子?br />www.okajax.com/info/bookdown/200604366.htm
    3.AJAX开发简?br />www.okajax.com/info/bookdown/20060538.htm
    ----------------------------
    4.AJAX版CD理pȝ (jsp)
    www.okajax.com/info/codedown/200604327.htm
    5.Alexa 查询pȝ (Xmlhttp + Ajax)
    www.okajax.com/info/codedown/200604982.htm
    6.ASP.NET+AJAX解决|页打开{待问题
    www.okajax.com/info/codedown/200604166.htm
    7.Ajax技术简?(ajax demo)
    www.okajax.com/info/codedown/200604576.htm

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

    ?ajax相关图书
    1.《Ajax实战?目前Ajax领域最为全面深入的一本著?
    www.china-pub.com/computers/common/info.asp?id=28433
    2.《Ajax基础教程》(亚马逊计机榜首图书Q国内第1本Ajax图书Q?br />www.china-pub.com/computers/common/info.asp?id=28432
    3.《Ajax 修炼之道-Web 2.0 入门》(Ajax从小工到专家的首选图书)
    www.china-pub.com/computers/common/info.asp?id=29430
    4.《征服Ajax+Lucene构徏搜烦引擎?br />www.china-pub.com/computers/common/info.asp?id=29996
    5.《征服Ajax--Web 2.0快速入门与目实践Q?netQ?br />www.china-pub.com/computers/common/info.asp?id=29995
    6.《Ajax开发精?-概念、案例与框架?br />www.china-pub.com/computers/common/info.asp?id=30006
    [Page]


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

    ?部分技术文?br />www.dragonson.com/doc/ajax.html
    Ajax内部交流文档
    info96.k12studio.com/~nio/comments.php?id=242_0_1_0_C
    单地?Ajax q行描述介绍
    www.adaptivepath.com/publications/essays/archives/000385.php
    Ajax: A New Approach to Web Applications
    jibbering.com/2002/4/httprequest.html
    Using the XML HTTP Request object
    developer.apple.com/internet/webcontent/xmlhttpreq.html
    Dynamic HTML and XML: The XMLHttpRequest Object
    del.icio.us/popular/ajax
    del.icio.us / popular / ajax
    www.fiftyfoureleven.com/resources/programming/xmlhttprequest/examples
    XMLHttpRequest & Ajax Working Examples
    www.xml.com/lpt/a/2005/02/09/xml-http-request.html
    Very Dynamic Web Interfaces
    www.standards-schmandards.com/index.php?2005/03/01/16-ajax-and-accessibility
    AJAX and Accessibility
    www.xml.com/lpt/a/2005/05/11/ajax-error.html
    Errors and AJAX
    www.softwareas.com/ajax-patterns
    AJAX Patterns: Design Patterns for AJAX Usability
    www.backbase.com/download/Whitepaper%20Backbase%20AJAX%20and%20Beyond.pdf
    Whitepaper Backbase AJAX and Beyond
    www.ajaxpatterns.org/index.php?title=Main_Page
    AJAX patterns
    www.onlamp.com/pub/a/onlamp/2005/05/19/xmlhttprequest.html
    A Simpler Ajax Path
    ++++++++++++++++++++++++++++++++++++++++++++++++++++
    AJAX技术初?
    http://blog.csdn.net/weihj1999/archive/2006/11/07/1370794.aspx
    AJAX学习
    http://blog.csdn.net/starshus/archive/2006/10/15/1335028.aspx
    AJAX技术汇?
    http://blog.csdn.net/aiwtu/archive/2006/10/06/1323397.aspx
    掌握 AjaxQ第 1 部分: Ajax ?br />http://blog.csdn.net/zhp80/archive/2006/10/12/1331538.aspx
    Ajax原理详细说明(转自ibm开发者网?
    http://blog.csdn.net/etnovo/archive/2006/11/04/1366493.aspx
    Ajax的定义与ȝ
    http://blog.csdn.net/xdy3008/archive/2006/10/30/1356778.aspx
    Thinking in AJAX -- ZAJAX的WEB设计
    http://blog.csdn.net/ljhj210423/archive/2006/11/01/1360136.aspx
    Ajax应用演示和源码下?
    http://blog.csdn.net/honglei225/archive/2006/11/07/1370409.aspx
    70个流行的AJAX应用的演C和源码下蝲
    http://blog.csdn.net/xwycs/archive/2006/10/01/1315222.aspx
    AJAX、AJAX实例及AJAX源代码(aspQ?
    http://blog.csdn.net/itfly8/archive/2006/10/30/1356293.aspx
    ZAjax的应用程序架构汇?br />http://blog.csdn.net/kastolo/archive/2006/11/07/1371545.aspx
    ASP.NETWeb应用E序的简单AJAX实现 (转婕舞飞?
    http://blog.csdn.net/lover_rong/archive/2006/11/09/1375031.aspx
    使用 Ajax 构徏 RSS 阅读?br />http://www-128.ibm.com/developerworks/cn/xml/x-ajaxrss/index.html



  •  


    ]]>
    Eclipse快速上手指南之使用ANThttp://m.tkk7.com/jelver/articles/81736.html都市淘沙?/dc:creator>都市淘沙?/author>Fri, 17 Nov 2006 04:34:00 GMThttp://m.tkk7.com/jelver/articles/81736.htmlhttp://m.tkk7.com/jelver/comments/81736.htmlhttp://m.tkk7.com/jelver/articles/81736.html#Feedback0http://m.tkk7.com/jelver/comments/commentRss/81736.htmlhttp://m.tkk7.com/jelver/services/trackbacks/81736.html
      Eclipse中已l集成了AntQ我们可以直接在Eclipse中运行Ant?br />
      以前面徏立的Hello工程ZQ创Z下目录结构:


      新徏一个build.xmlQ放在工E根目录下。build.xml定义了Ant要执行的批处理命令。虽然Ant也可以用其它文件名Q但是遵循标准能更开发更规范Q同时易于与别h交流?br />
      通常Qsrc存放Java源文Ӟclasses存放~译后的class文gQlib存放~译和运行用到的所有jar文gQweb存放JSP{web文gQdist存放打包后的jar文gQdoc存放API文?br />
      然后在根目录下创建build.xml文gQ输入以下内容:

    Q?xml version="1.0"?Q?br />Qproject name="Hello world" default="doc"Q?/font>

    Q?-- properies --Q?br />Qproperty name="src.dir" value="src" /Q?br />Qproperty name="report.dir" value="report" /Q?br />Qproperty name="classes.dir" value="classes" /Q?br />Qproperty name="lib.dir" value="lib" /Q?br />Qproperty name="dist.dir" value="dist" /Q?br />Qproperty name="doc.dir" value="doc"/Q?/font>

    Q?-- 定义classpath --Q?br />Qpath id="master-classpath"Q?br />Qfileset file="${lib.dir}/*.jar" /Q?br />Qpathelement path="${classes.dir}"/Q?br />Q?pathQ?/font>

    Q?-- 初始化Q?--Q?br />Qtarget name="init"Q?br />Q?targetQ?/font>

    Q?-- ~译 --Q?br />Qtarget name="compile" depends="init" description="compile the source files"Q?br />Qmkdir dir="${classes.dir}"/Q?br />Qjavac srcdir="${src.dir}" destdir="${classes.dir}" target="1.4"Q?br />Qclasspath refid="master-classpath"/Q?br />Q?javacQ?br />Q?targetQ?/font>

    Q?-- 试 --Q?br />Qtarget name="test" depends="compile" description="run junit test"Q?br />Qmkdir dir="${report.dir}"/Q?br />Qjunit printsummary="on"
    haltonfailure="false"
    failureproperty="tests.failed"
    showoutput="true"Q?br />Qclasspath refid="master-classpath" /Q?br />Qformatter type="plain"/Q?br />Qbatchtest todir="${report.dir}"Q?br />Qfileset dir="${classes.dir}"Q?br />Qinclude name="**/*Test.*"/Q?br />Q?filesetQ?br />Q?batchtestQ?br />Q?junitQ?br />Qfail if="tests.failed"Q?br />***********************************************************
    **** One or more tests failed! Check the output ... ****
    ***********************************************************
    Q?failQ?br />Q?targetQ?/font>

    Q?-- 打包成jar --Q?br />Qtarget name="pack" depends="test" description="make .jar file"Q?br />Qmkdir dir="${dist.dir}" /Q?br />Qjar destfile="${dist.dir}/hello.jar" basedir="${classes.dir}"Q?br />Qexclude name="**/*Test.*" /Q?br />Qexclude name="**/Test*.*" /Q?br />Q?jarQ?br />Q?targetQ?/font>

    Q?-- 输出api文 --Q?br />Qtarget name="doc" depends="pack" description="create api doc"Q?br />Qmkdir dir="${doc.dir}" /Q?br />Qjavadoc destdir="${doc.dir}"
    author="true"
    version="true"
    use="true"
    windowtitle="Test API"Q?br />Qpackageset dir="${src.dir}" defaultexcludes="yes"Q?br />Qinclude name="example/**" /Q?br />Q?packagesetQ?br />QdoctitleQ<![CDATA[Qh1QHello, testQ?h1Q]]Q</doctitleQ?br />QbottomQ<![CDATA[QiQAll Rights Reserved.Q?iQ]]Q</bottomQ?br />Qtag name="todo" scope="all" description="To do:" /Q?br />Q?javadocQ?br />Q?targetQ?br />Q?projectQ?/font>

      以上xml依次定义了initQ初始化Q,compileQ编译)QtestQ测试)QdocQ生成文档)QpackQ打包)dQ可以作为模ѝ?br />
      选中Hello工程Q然后选择“Project”,“Properties”,“Builders”,“New…”,选择“Ant Build”:


      填入NameQAnt_BuilderQBuildfileQbuild.xmlQBase DirectoryQ?{workspace_loc:/Hello}Q按“Browse Workspace”选择工程根目录)Q由于用Cjunit.jar包,搜烦Eclipse目录Q找到junit.jarQ把它复制到Hello/lib目录下,q添加到Ant的Classpath中:


      然后在Builder面板中钩上Ant_BuildQ去掉Java BuilderQ?br />

      再次~译Q即可在控制台看到Ant的输出:

    Buildfile: F:\eclipse-projects\Hello\build.xml

    init:

    compile:
    [mkdir] Created dir: F:\eclipse-projects\Hello\classes
    [javac] Compiling 2 source files to F:\eclipse-projects\Hello\classes


    test:
    [mkdir] Created dir: F:\eclipse-projects\Hello\report
    [junit] Running example.HelloTest
    [junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.02 sec


    pack:
    [mkdir] Created dir: F:\eclipse-projects\Hello\dist
    [jar] Building jar: F:\eclipse-projects\Hello\dist\hello.jar


    doc:
    [mkdir] Created dir: F:\eclipse-projects\Hello\doc
    [javadoc] Generating Javadoc
    [javadoc] Javadoc execution
    [javadoc] Loading source files for package example...
    [javadoc] Constructing Javadoc information...
    [javadoc] Standard Doclet version 1.4.2_04
    [javadoc] Building tree for all the packages and classes...
    [javadoc] Building index for all the packages and classes...
    [javadoc] Building index for all classes...
    [javadoc] Generating F:\eclipse-projects\Hello\doc\stylesheet.css...
    [javadoc] Note: Custom tags that could override future standard tags: @todo. To avoid potential overrides, use at least one period character (.) in custom tag names.
    [javadoc] Note: Custom tags that were not seen: @todo
    BUILD SUCCESSFUL
    Total time: 11 seconds

      Ant依次执行初始化,~译Q测试,打包Q生成API文档一pddQ极大地提高了开发效率。将来开发J2EE目Ӟq可加入部v{Q务。ƈ且,即q了Eclipse环境Q只要正安装了AntQ配|好环境变量ANT_HOME=QAnt解压目录Q,Path=?%ANT_HOME%\binQ在命o行提C符下切换到Hello目录Q简单地键入ant卛_?br />
    相关文章Q?a >http://www-128.ibm.com/developerworks/cn/java/j-lo-ant-eclipse/index.html

    ]]>
    Ant使用指南Q一Q?http://m.tkk7.com/jelver/articles/81568.html都市淘沙?/dc:creator>都市淘沙?/author>Thu, 16 Nov 2006 09:19:00 GMThttp://m.tkk7.com/jelver/articles/81568.htmlhttp://m.tkk7.com/jelver/comments/81568.htmlhttp://m.tkk7.com/jelver/articles/81568.html#Feedback0http://m.tkk7.com/jelver/comments/commentRss/81568.htmlhttp://m.tkk7.com/jelver/services/trackbacks/81568.html Ant使用指南Q一Q?/a> 原文Q?a >http://sgsoft.cnblogs.com/articles/81480.html?Pending=true#Post
    理你的代码Qdoc文g,~译,配置{开发工作你是怎末做的Q自q理源目录Q编译文Ӟcopy,实施... 在window写bat,在unix写shellQ?
         可惜我不怎末会写。所以我制作一个ejb的过E是q样的:
    写代?>写个bat~译代码->l织文g(ejb-jar.xml,jboss.xml...)->压羃文g生成jar文->
    实施......(q有同样的测试过E?(为甚末不用jbuild?)

        q中间每ơ修攚w要经q重复的无数ơ手工copy,paste...q程Q好累,好花旉。可我确实不惛_
    学脚本编写,unix,linux下我q得重学Q太累?/font>

        如果你和我一样希望自动执行预定义的动作却又不惛_累,那末Q我觉得ANT工具不错Q?
    它可以以相同的用法用在不同^?跨^?。它是JAVA做的Q免费的Q开源的Q据说网上已l成了事实的JAVA
    构徏标准Q还听说高手都用?..... ^_^

        我花?天时间才掌握了它的基本用法,我希望你能通过我的文章和试验花半天旉掌握它?/font>

    内容Q?/font>

    • 下蝲Q安?/font>
    • hello ant
    • hello ant q
    • 参考及下蝲

    下蝲Q安?
      
    又下?又是一大堆参数变量?  :(
        http://jakarta.apache.org/ant/index.html 它是apache的java子项?jakarta"的子目.你可以选择
    当前的版本,目前我是1.5?window版,以下q它讲?/font>

        解压后ant_home用来方便讉K。ƈ保你也讄了java_home ?
        set ant_home=D:\java\kit\ant\jakarta-ant-1.5.1    q是我的目录    

        p些,单吧?

    hello ant

    我们要开发一个javac:其内容只有一句,输出"hello ant"字符丌Ӏƈ使用ant完成~译和运行工作,q个例子只是Z跑通antQ不附加多余的东ѝ?/font>

    下图为文件组l,请徏立相应的目录Qƈ~写HelloAnt.java

    按照人家老外的文件组l规则咱也照搬?/font>

     hello.ant.HelloAnt.java

    在项目根目录(hello-ant\)?个文Ӟant执行配置文gbuild.xml

     build.xml

    ok,一切大功告成,哦,不,q没有运行它?/font>

    dos下进入hello-ant的目录,即build.xml所在的目录Q我们要用ant工具执行?Q?/font>

    执行: %ant_home%/bin/ant -file build.xml     用ant工具执行当前目录下的配置文gbuild.xml 

    或?Qant -file build.xml                    你如果设|?ant_home%/bin到path?/font>

    q次ok了,q是{案Q?/font>

    命o提示W窗?/font>
    D:\temp\hello-ant>ant -file build.xml
    Buildfile: build.xml

    main:
    [javac] Compiling 1 source file to D:\temp\hello-ant\build\classes
    [java] hello ant,ant 的第一ơ接触,好棒Q?

    BUILD SUCCESSFUL
    Total time: 2 seconds
    D:\temp\hello-ant>

    查一下build/classes目录Q哦Q看到编译过的文件就在这?
    build/classes/hello/ant/HelloAnt.class.

    hello ant q

    (此段比较废话Q可以略q?
    你也怼_q末单的工作写个批处理不得了,又xml又ant的,把我的时间都费完了Q我用jbuild?
    webShpere不就得了Q怎末说你才明白呢Q反正网上开源项目大多数都用ant,你M能给人家?.jpx吧,
    而且q样的工具太贵,受不?当然用D的兄弟不怕^_^ )Q而且ant可以让你明确的管理和自动化所有的东西:
    ~译-实施-试...,哎,E微ȝ一点点Q但节约你以前花在零的copy,paste上的旉.而且我发现管?
    代码的质量有所提高.

    我们要改qbuild.xmlQ让它做更多的事情:

    • 定义全局变量
    • 初始?主要是徏立目?/font>
    • ~译  (已有)
    • 打包为jar
    • 建立API documentation
    • 生成distribution产品

    凡事都讲I^衡,你要antl你做更多事Q当然要累一点点Q不q只用篏一ơ,以后的代码修改后的构建都?一键式"完成,我们制作一个hello的简单例子,你可以自己做j2ee的练习?/font>

    我们要扩充目录结构,使它更像回事Q?/font>

    ant处理~译之前的目录:

    ant处理之后的目录:

    图中Q\src,\docs,\lib是自ql的文gl构Q\build,\dist是ant动态生成的成品?/font>

    \src                     源文Ӟjava源,script源,jsp源,xml配置.....
    \src\main         java?
    \src\script     window,unix,liunx的执行scriptQ我们的单只有一个:
                      run.bat:  java hello.ant.HelloAnt

    \docs                手写说明文
    \lib                   E序所需cd的jar,比如j2ee.jar,mail,jar...

    \build               用ant动态生成的构徏目录
    \build\classes  ~译的类文g
    \build\docs         copy "\docs"的手写说明文,和ant生成的api文
    \build\lib           攄我们自己的HelloAnt.class打包成品hello-ant.jar

    \dist\bin        copy "\src\script" 得执行文?
    \dist\docs      copy "\build\docs" 的文?
    \dist\lib         除了copy "\build\lib"下的hello-ant.jar外,
                                  q应copy "\lib"的程序所需jarQ这里我们没有?/font>

    以上是我学老外的文件组l,大家可以按照自己的爱好组l?/font>

    我们~写必要的文Ӟ

    hello.ant. HelloAnt.java
    已有
    \src\script.bat
    \docs\index.html 随便写一个手写的文

    hello ant 软g目手册docs


    讉Kapi文档

     
    \build.xml 配置文g 


    build.xml多了些,但其实很单:(注释比较详细可以参照Q这里再单说一?

    一个build.xml包含一个工E的自动化处理的完整xml说明Qƈ且基本由3U东东组成:

    <project >

        1.全局变量的定?
        <property/>

        2.dl?
        <target>
            3.许多单项d... 像copy,delete,javac,jar...
            <task1/>
            <task2/>
            <task3/>
        </target>

    </project>



    ]]>
    使用xmlhttp和Java session监听改善站内消息pȝhttp://m.tkk7.com/jelver/articles/43316.html都市淘沙?/dc:creator>都市淘沙?/author>Wed, 26 Apr 2006 07:35:00 GMThttp://m.tkk7.com/jelver/articles/43316.htmlhttp://m.tkk7.com/jelver/comments/43316.htmlhttp://m.tkk7.com/jelver/articles/43316.html#Feedback0http://m.tkk7.com/jelver/comments/commentRss/43316.htmlhttp://m.tkk7.com/jelver/services/trackbacks/43316.html
       Session监听嘛,没什么好解释的,java提供了很灉|的事件机制来监听sessionQ可以监听session的创建和销毁,监控session所携带数据的创建、变化和销毁,可以监听session的锐化和钝化Q了解对象序列化的兄弟应该知道这个)Q其他的q_是个什么情冉|不太清楚Q估计也差不多吧。如果能够对所有客Lsessionq行监控Q就不用再去操作ȝ而危险的Application了?

          Xmlhttp是MS推的一Ҏ术,功能很复杂,可以做很多事情,比如客户端可以在单的HTML中打开HTTPq接Q主动向serverh数据q获得返回数据,是DOM技术一个非帔R要的应用Q利用它来写无刷新的动态页面简直是so easyQ做qweb开发的兄弟应该明白它的意义有多么重大?br />
    一、 session监听

       servlet中对session的监听有很多接口Q功能很灉|Q最常用的是监听Session和Attribute。这里要澄清一下概念,servlet中的session监听和Attribute监听含义有差别,session监听指的不是我们一般所理解的放|一个session或者销毁一个sessionQ这是Attribute监听的功能,因ؓservlet中放|session的语法是session.setAttribute(“session名?要放入的对象)。而session监听Q监听的是HTTPq接Q只要有用户与serverq接Q就连接的是一个空白的jsp面Q也会触发session事gQ所以此处的session实际上指的是connectionQ用来统计当前在U用h最合适了。不知道我说清楚了没有。下面分别讲解这两种监听方式?br />
    1、 session监听

       首先~写一个session监听c,实作HttpSessionListener接口Q它的作用是计算当前有多个在线用户Q?br />

    1. /**
    2. *@Author bromon
    3. *2004-6-12
    4. */
    5. package org.bromon.test;
    6. import javax.servlet.*;
    7. import javax.servlet.http.*;
    8. public class SessionCount implements HttpSessionListener
    9. {
    10.     private static int count=0;
    11.     public void sessionCreated(HttpSessionEvent se)
    12.     {
    13.         count++;
    14.         System.out.println(“session创徏Q?new java.util.Date());
    15.     }
    16.     public void sessionDestroyed(HttpSessionEvent se)
    17.     {
    18.        count--;
    19.        System.out.println(“session销??new java.util.Date());
    20.     }
    21.     public static int getCount()
    22.     {
    23.        return(count);
    24.      }
    25. }



       怎么P是不是一目了Ӟcount被定义ؓstaticQ是因ؓ要保证整个系l只有这一个count。如果你实在不放心,可以把它写成一个单例类?br />
       然后在web.xml中声明这个监听器Q?br /><listener>
    <listener-class>
    org.bromon.test.SessionCount
    </listener-class>
    </listener>

       ~写一个测试页面test.jspQ内Ҏ获得countQ?br /><%
    int count=org.bromon.test.SessionCount.getCount();
    out.println(count);
    %>

       需要注意的是,q里Ҏ不涉及Q何session的操作。重启动App serverQ试着q接test.jspQ可以看到监听器已经开始工作?br />
    2、 Attribute监听
       作ؓ一个站内消息系l,肯定要获得所有登陆者的IDQ才有可能互发消息。这涉及Attribute监听。假设我们写了个用户登陆的模块,用户通过w䆾验证之后会生一个sessionQ保存它的相关信息,比如Q?br />
    1. //check.jsp
    2. <%
    3.     String name=request.getParameter(“name?;
    4.     Name=new String(name.getBytes(“ISO8859-1?);
    5.     session.setAttribute(“user?name);
    6. %>


       做过jsp的兄弟应该对q段代码再熟悉不q了Q下面写个监听器来监听用L陆,把所有用LID保存C个List当中Q这个监听器实作HttpSessionAttributeListener接口Q?br />
    1. /**
    2. *@Author bromon
    3. *2004-6-12
    4. */
    5. package org.bromon.test;
    6. import javax.servlet.*;
    7. import javax.servlet.http.*;
    8. import java.util.*;
    9. public class OnlineList implements HttpSessionAttributeListener
    10. {
    11.     private static List list=new ArrayList();
    12.     public void attributeAdded(HttpSessionBindingEvent se)
    13.     {
    14.         if(“user?equals(se.getName()))
    15.         {
    16.             list.add(se.getValue());
    17.          }
    18.     }
    19.     public void attributeRemoved(HttpSessionBindingEvent se)
    20.     {
    21.          if(“user?equals(se.getName()))
    22.          {
    23.             list.remove(se.getValue());
    24.          }
    25.     }
    26.     public void attributeReplaced(HttpSessionBindingEvent se){}
    27.     public static List getList()
    28.     {
    29.          return(list);
    30.      }
    31. }


    写个单的jsp来得到用户列表:
    <%
        java.util.List list=org.bromon.test.OnlineList.getList();
        out.println(“共有?list.size()+”名用户已登陆:?;
        for(int I=0;I<lise.size();i++)
        {
            out.println(list.get(i));
        }
    %>

    也许你说Q这有什么神奇呢Q监听session而已Q不着急,看看xmlhttp?br />
    二、 XMLHTTP

       XMLHTTP的用处很多,q里只说我们需要的Q就是无h的与server通信Q看q段代码Q?br />
    1. <script language="javascript"
    2. xml = new ActiveXObject("Microsoft.XMLHTTP"); 
    3. var post=" ";//构造要携带的数据?/font>
    4. xml.open("POST","http://localhost:7001/TestWL/index.jsp",false);//使用POSTҎ打开一个到服务器的q接 
    5. xml.setrequestheader("content-length",post.length); 
    6. xml.setrequestheader("content-type","application/x-www-form-urlencoded"); 
    7. xml.send(post);//发送数据?/font>
    8. var res = xml.responseText;//接收服务器返回的数据 
    9. document.write(res); 
    10. </script>



       豁然开朗,q段代码是打开一个HTTPq接Q以标准的HTTP格式传递数据,如果你喜Ƣ,可以用XML的格式来传递。更改一下xml对象的构造方式就可以兼容Mozilla和Netscape。下面来写一个轮询,每隔一D|间刷Cơ用户列表,当然Q是不需要刷新页面的Q?br />
    1. <html>
    2. <head><title>探测?lt;/title>
    3. <script language="javascript">
    4. function detect()
    5. {
    6. xml = new ActiveXObject("Microsoft.XMLHTTP"); 
    7. var post=" ";//构造要携带的数据?/font>
    8. xml.open("POST","http://localhost:7001/TestWL/index.jsp",false);//使用POSTҎ打开一个到服务器的q接Q以异步方式通信 
    9. xml.setrequestheader("content-length",post.length); 
    10. xml.setrequestheader("content-type","application/x-www-form-urlencoded"); 
    11. xml.send(post);//发送数据?/font>
    12. var res = xml.responseText;//接收服务器返回的数据 
    13. list.innerText=res;
    14. setTimeout(“detect()?5000);//每隔5U钟轮询一?/font>
    15. </script>
    16. <body onload=”detect()?gt;
    17. <a id=”list?gt;</a>
    18. </body>
    19. </html>


       q样的通信方式数据量很,不用重新传递整个页面,5U钟轮一ơ,普通PC也能承受较大的在U数。构造一个探器来监听在U列表和消息Q效果是很好的,即你的客户坐在电脑前袖手旁观,键鼠都不C下,也能保证数据x传递,面也不会发生蟩转和h?br />
       Session监听加上XMLHTTP通信Q开发一个较为完善的站内消息pȝ实在易如反掌?


    ]]>
    关于web.xml配置的详l说?/title><link>http://m.tkk7.com/jelver/articles/40920.html</link><dc:creator>都市淘沙?/dc:creator><author>都市淘沙?/author><pubDate>Thu, 13 Apr 2006 07:58:00 GMT</pubDate><guid>http://m.tkk7.com/jelver/articles/40920.html</guid><wfw:comment>http://m.tkk7.com/jelver/comments/40920.html</wfw:comment><comments>http://m.tkk7.com/jelver/articles/40920.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jelver/comments/commentRss/40920.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jelver/services/trackbacks/40920.html</trackback:ping><description><![CDATA[ <font face="Arial">1 定义头和根元?br /><br />部v描述W文件就像所有XML文g一P必须以一个XML头开始。这个头声明可以使用的XML版本q给出文件的字符~码?br />DOCYTPE声明必须立即出现在此头之后。这个声明告诉服务器适用的servlet规范的版本(?.2?.3Qƈ指定理此文件其余部分内容的语法的DTD(Document Type DefinitionQ文档类型定??br />所有部|描q符文g的顶层(根)元素为web-app。请注意QXML元素不像HTMLQ他们是大小写敏感的。因此,web-App和WEB-APP都是不合法的Qweb-app必须用小写?br /><br />2 部v描述W文件内的元素次?br /><br />XML 元素不仅是大写敏感的,而且它们q对出现在其他元素中的次序敏感。例如,XML头必L文g中的W一,DOCTYPE声明必须是第二项Q而web- app元素必须是第三项。在web-app元素内,元素的次序也很重要。服务器不一定强制要求这U次序,但它们允许(实际上有些服务器是q样做的Q完全拒l执行含有次序不正确的元素的Web应用。这表示使用非标准元素次序的web.xml文g是不可移植的?br />下面的列表给Z所有可直接出现在web-app元素内的合法元素所必需的次序。例如,此列表说明servlet元素必须出现在所有servlet-mapping元素之前。请注意Q所有这些元素都是可选的。因此,可以省略掉某一元素Q但不能把它放于不正的位置?br />l icon icon元素指出IDE和GUI工具用来表示Web应用的一个和两个囑փ文g的位|?br />l display-name display-name元素提供GUI工具可能会用来标记这个特定的Web应用的一个名U?br />l description description元素l出与此有关的说明性文本?br />l context-param context-param元素声明应用范围内的初始化参数?br />l filter qo器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联?br />l filter-mapping 一旦命名了一个过滤器Q就要利用filter-mapping元素把它与一个或多个servlet或JSP面相关联?br />l listener servlet API的版?.3增加了对事g监听E序的支持,事g监听E序在徏立、修改和删除会话或servlet环境时得到通知。Listener元素指出事g监听E序cR?br />l servlet 在向servlet或JSP面制定初始化参数或定制URLӞ必须首先命名servlet或JSP面。Servlet元素是用来完成此项d的?br />l servlet-mapping 服务器一般ؓservlet提供一个缺省的URLQ?/font> <a href="http://host/webAppPrefix/servlet/ServletName"> <font face="Arial">http://host/webAppPrefix/servlet/ServletName</font> </a> <font face="Arial">。但是,常常会更改这个URLQ以便servlet可以讉K初始化参数或更容易地处理相对URL。在更改~省URLӞ使用servlet-mapping元素?br />l session-config 如果某个会话在一定时间内未被讉KQ服务器可以抛弃它以节省内存。可通过使用HttpSession的setMaxInactiveIntervalҎ明确讄单个会话对象的超时|或者可利用session-config元素制定~省时倹{?br />l mime-mapping 如果Web应用h惛_Ҏ的文Ӟ希望能保证给他们分配特定的MIMEcdQ则mime-mapping元素提供q种保证?br />l welcom-file-list welcome-file-list元素指示服务器在收到引用一个目录名而不是文件名的URLӞ使用哪个文g?br />l error-page error-page元素使得在返回特定HTTP状态代码时Q或者特定类型的异常被抛出时Q能够制定将要显C的面?br />l taglib taglib元素Ҏ记库描述W文ӞTag Libraryu Descriptor fileQ指定别名。此功能使你能够更改TLD文g的位|,而不用编辑用这些文件的JSP面?br />l resource-env-ref resource-env-ref元素声明与资源相关的一个管理对象?br />l resource-ref resource-ref元素声明一个资源工厂用的外部资源?br />l security-constraint security-constraint元素制定应该保护的URL。它与login-config元素联合使用<br />l login-config 用login-config元素来指定服务器应该怎样l试图访问受保护面的用h权。它与sercurity-constraint元素联合使用?br />l security-role security-role元素l出安全角色的一个列表,q些角色出现在servlet元素内的security-role-ref元素的role-name子元素中。分别地声明角色可高IDE处理安全信息更ؓҎ?br />l env-entry env-entry元素声明Web应用的环境项?br />l ejb-ref ejb-ref元素声明一个EJB的主目录的引用?br />l ejb-local-ref ejb-local-ref元素声明一个EJB的本C目录的应用?br /><br />3 分配名称和定制的UL<br /><br />在web.xml中完成的一个最常见的Q务是对servlet或JSP面l出名称和定制的URL。用servlet元素分配名称Q用servlet-mapping元素定制的URL与刚分配的名U相兌?br />3.1 分配名称<br />Z提供初始化参敎ͼ对servlet或JSP面定义一个定制URL或分配一个安全角Ԍ必须首先lservlet或JSP面一个名U。可通过 servlet元素分配一个名U。最常见的格式包括servlet-name和servlet-class子元素(在web-app元素内)Q如下所C:<br /><servlet><br /><servlet-name>Test</servlet-name><br /><servlet-class>moreservlets.TestServlet</servlet-class><br /></servlet> <br />q表CZ于WEB-INF/classes/moreservlets/TestServlet的servlet已经得到了注册名Test。给 servlet一个名U具有两个主要的含义。首先,初始化参数、定制的URL模式以及其他定制通过此注册名而不是类名引用此servlet。其?可在 URL而不是类名中使用此名U。因此,利用刚才l出的定义,URL </font> <a href="http://host/webAppPrefix/servlet/Test"> <font face="Arial">http://host/webAppPrefix/servlet/Test</font> </a> <font face="Arial"> 可用于?/font> <a href="http://host/webAppPrefix/servlet/moreservlets.TestServlet"> <font face="Arial">http://host/webAppPrefix/servlet/moreservlets.TestServlet</font> </a> <font face="Arial"> 的场所?br />误住:XML元素不仅是大写敏感的,而且定义它们的次序也很重要。例如,web-app元素内所有servlet元素必须位于所有servlet- mapping元素Q下一节介绍Q之前,而且q要位于5.6节和5.11节讨论的与过滤器或文相关的元素Q如果有的话Q之前。类似地Qservlet 的servlet-name子元素也必须出现在servlet-class之前?.2?部v描述W文件内的元素次?详l介l这U必需的次序?br />例如Q程序清?-1l出了一个名为TestServlet的简单servletQ它ȝ在moreservletsE序包中。因为此servlet是扎根在一个名为deployDemo的目录中的Web应用的组成部分,所以TestServlet.class攑֜deployDemo/WEB- INF/classes/moreservlets中。程序清?-2l出放|在deployDemo/WEB-INF/内的web.xml文g的一部分。此web.xml文g使用servlet-name和servlet-class元素名UTest与TestServlet.class相关联。图 5-1和图5-2分别昄利用~省URL和注册名调用TestServlet时的l果?br /><br />E序清单5-1 TestServlet.java<br />package moreservlets;<br /><br />import java.io.*;<br />import javax.servlet.*;<br />import javax.servlet.http.*;<br /><br />/** Simple servlet used to illustrate servlet naming<br />* and custom URLs.<br />* <P><br />* Taken from More Servlets and JavaServer Pages<br />* from Prentice Hall and Sun Microsystems Press,<br />* </font> <a > <font face="Arial">http://www.moreservlets.com/</font> </a> <font face="Arial">.<br />* © 2002 Marty Hall; may be freely used or adapted.<br />*/<br /><br />public class TestServlet extends HttpServlet {<br />public void doGet(HttpServletRequest request,<br />HttpServletResponse response)<br />throws ServletException, IOException {<br />response.setContentType("text/html");<br />PrintWriter out = response.getWriter();<br />String uri = request.getRequestURI();<br />out.println(ServletUtilities.headWithTitle("Test Servlet") +<br />"<BODY BGCOLOR=\"#FDF5E6\">\n" +<br />"<H2>URI: " + uri + "</H2>\n" +<br />"</BODY></HTML>");<br />}<br />}<br /><br /><br />E序清单5-2 web.xmlQ说明servlet名称的摘录)<br /><?xml version="1.0" encoding="ISO-8859-1"?><br /><!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />"http://java.sun.com/dtd/web-app_2_3.dtd"><br /><br /><web-app><br /><!-- …?-><br /><servlet><br /><servlet-name>Test</servlet-name><br /><servlet-class>moreservlets.TestServlet</servlet-class><br /></servlet><br /><!-- …?-><br /></web-app><br /><br />3.2 定义定制的URL<br />大多数服务器h一个缺省的serlvet URLQ?br />http://host/webAppPrefix/servlet/packageName.ServletName。虽然在开发中使用q个URL很方便,但是我们常常会希望另一个URL用于部v。例如,可能会需要一个出现在Web应用层的URLQ如Qhttp: //host/webAppPrefix/AnynameQ,q且在此URL中没有servletV位于顶层的URL化了相对URL的用。此外,对许多开发h员来_层URL看上L更长更麻烦的~省URL更简短?br />事实上,有时需要用定制的URL。比如,你可能想关闭~省URL映射Q以便更好地强制实施安全限制或防止用h外地讉K无初始化参数的servlet。如果你止了缺省的URLQ那么你怎样讉Kservlet呢?q时只有使用定制的URL了?br />Z分配一个定制的URLQ可使用servlet-mapping元素及其servlet-name和url-pattern子元素。Servlet- name元素提供了一个Q意名Uͼ可利用此名称引用相应的servletQurl-pattern描述了相对于Web应用的根目录的URL。url- pattern元素的值必M斜杠Q?Qv始?br />下面l出一个简单的web.xml摘录Q它允许使用URL http://host/webAppPrefix/UrlTest而不是http://host/webAppPrefix/servlet/Test?br />http: //host/webAppPrefix/servlet/moreservlets.TestServlet。请注意Q仍焉要XML头、 DOCTYPE声明以及web-app闭元素。此外,可回忆一下,XML元素出现地次序不是随意的。特别是Q需要把所有servlet元素攑֜所有 servlet-mapping元素之前?br /><servlet><br /><servlet-name>Test</servlet-name><br /><servlet-class>moreservlets.TestServlet</servlet-class><br /></servlet><br /><!-- ... --><br /><servlet-mapping><br /><servlet-name>Test</servlet-name><br /><url-pattern>/UrlTest</url-pattern><br /></servlet-mapping><br />URL模式q可以包含通配W。例如,下面的小E序指示服务器发送所有以Web应用的URL前缀开始,?.aspl束的请求到名ؓBashMS的servlet?br /><servlet><br /><servlet-name>BashMS</servlet-name><br /><servlet-class>msUtils.ASPTranslator</servlet-class><br /></servlet><br /><!-- ... --><br /><servlet-mapping><br /><servlet-name>BashMS</servlet-name><br /><url-pattern>/*.asp</url-pattern><br /></servlet-mapping><br />3.3 命名JSP面<br />因ؓJSP面要{换成sevletQ自然希望就像命名servlet一样命名JSP面。毕竟,JSP面可能会从初始化参数、安全设|或定制的URL中受益,正如普通的serlvet那样。虽然JSP面的后台实际上是servletq句话是正确的,但存在一个关键的猜疑Q即Q你不知道JSP面的实际类名(因ؓpȝ自己挑选这个名字)。因此,Z命名JSP面Q可jsp-file元素替换为servlet-calss元素Q如下所C:<br /><servlet><br /><servlet-name>Test</servlet-name><br /><jsp-file>/TestPage.jsp</jsp-file><br /></servlet><br />命名JSP面的原因与命名servlet的原因完全相同:即ؓ了提供一个与定制讄Q如Q初始化参数和安全设|)一起用的名称Qƈ且,以便能更Ҏz JSP面的URLQ比方说Q以便多个URL通过相同面得以处理Q或者从URL中去?jsp扩展名)。但是,在设|初始化参数Ӟ应该注意QJSP面是利用jspInitҎQ而不是initҎd初始化参数的?br />例如Q程序清?-3l出一个名为TestPage.jsp的简单JSP面Q它的工作只是打印出用来Ȁzd的URL的本地部分。TestPage.jsp攄在deployDemo应用的顶层。程序清?-4l出了用来分配一个注册名PageNameQ然后将此注册名与http://host/webAppPrefix/UrlTest2/anything 形式的URL相关联的web.xml文gQ即QdeployDemo/WEB-INF/web.xmlQ的一部分?br /><br />E序清单5-3 TestPage.jsp<br /><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><br /><HTML><br /><HEAD><br /><TITLE><br />JSP Test Page<br /></TITLE><br /></HEAD><br /><BODY BGCOLOR="#FDF5E6"><br /><H2>URI: <%= request.getRequestURI() %></H2><br /></BODY><br /></HTML><br /><br /><br />E序清单5-4 web.xmlQ说明JSP命名的摘录Q?br /><?xml version="1.0" encoding="ISO-8859-1"?><br /><!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />"http://java.sun.com/dtd/web-app_2_3.dtd"><br /><br /><web-app><br /><!-- ... --><br /><servlet><br /><servlet-name>PageName</servlet-name><br /><jsp-file>/TestPage.jsp</jsp-file><br /></servlet><br /><!-- ... --><br /><servlet-mapping><br /><servlet-name> PageName </servlet-name><br /><url-pattern>/UrlTest2/*</url-pattern><br /></servlet-mapping><br /><!-- ... --><br /></web-app><br /><br /><br />4 止Ȁzdservlet<br /><br />对servlet或JSP面建立定制URL的一个原因是Q这样做可以注册从 initQservletQ或jspInitQJSP面Q方法中d得初始化参数。但是,初始化参数只在是利用定制URL模式或注册名讉K servlet或JSP面时可以用,用缺省URL http://host/webAppPrefix/servlet/ServletName 讉K时不能用。因此,你可能会希望关闭~省URLQ这样就不会有h意外地调用初始化servlet了。这个过E有时称为禁止激zdservletQ因为多数服务器h一个用~省的servlet URL注册的标准servletQƈȀzȝ省的URL应用的实际servlet?br />有两U禁止此~省URL的主要方法:<br />l 在每个Web应用中重新映?servlet/模式?br />l 全局关闭Ȁzdservlet?br />重要的是应该注意刎ͼ虽然重新映射每个Web应用中的/servlet/模式比彻底禁止激zservlet所做的工作更多Q但重新映射可以用一U完全可UL的方式来完成。相反,全局止Ȁzdservlet完全是针对具体机器的Q事实上有的服务器(如ServletExecQ没有这L选择。下面的讨论Ҏ个Web应用重新映射/servlet/ URL模式的策略。后面提供在Tomcat中全局止Ȁzdservlet的详l内宏V?br />4.1 重新映射/servlet/URL模式<br />在一个特定的Web应用中禁止以http://host/webAppPrefix/servlet/ 开始的URL的处理非常简单。所需做的事情是建立一个错误消息servletQƈ使用前一节讨论的url-pattern元素所有匹配请求{向该 servlet。只要简单地使用Q?br /><url-pattern>/servlet/*</url-pattern><br />作ؓservlet-mapping元素中的模式卛_?br />例如Q程序清?-5l出了将SorryServlet servletQ程序清?-6Q与所有以http://host/webAppPrefix/servlet/ 开头的URL相关联的部v描述W文件的一部分?br /><br />E序清单5-5 web.xmlQ说明JSP命名的摘录Q?br /><?xml version="1.0" encoding="ISO-8859-1"?><br /><!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />"http://java.sun.com/dtd/web-app_2_3.dtd"><br /><br /><web-app><br /><!-- ... --><br /><servlet><br /><servlet-name>Sorry</servlet-name><br /><servlet-class>moreservlets.SorryServlet</servlet-class><br /></servlet><br /><!-- ... --><br /><servlet-mapping><br /><servlet-name> Sorry </servlet-name><br /><url-pattern>/servlet/*</url-pattern><br /></servlet-mapping><br /><!-- ... --><br /></web-app><br /><br /><br />E序清单5-6 SorryServlet.java<br />package moreservlets;<br /><br />import java.io.*;<br />import javax.servlet.*;<br />import javax.servlet.http.*;<br /><br />/** Simple servlet used to give error messages to<br />* users who try to access default servlet URLs<br />* (i.e., http://host/webAppPrefix/servlet/ServletName)<br />* in Web applications that have disabled this<br />* behavior.<br />* <P><br />* Taken from More Servlets and JavaServer Pages<br />* from Prentice Hall and Sun Microsystems Press,<br />* http://www.moreservlets.com/.<br />* © 2002 Marty Hall; may be freely used or adapted.<br />*/<br /><br />public class SorryServlet extends HttpServlet {<br />public void doGet(HttpServletRequest request,<br />HttpServletResponse response)<br />throws ServletException, IOException {<br />response.setContentType("text/html");<br />PrintWriter out = response.getWriter();<br />String title = "Invoker Servlet Disabled.";<br />out.println(ServletUtilities.headWithTitle(title) +<br />"<BODY BGCOLOR=\"#FDF5E6\">\n" +<br />"<H2>" + title + "</H2>\n" +<br />"Sorry, access to servlets by means of\n" +<br />"URLs that begin with\n" +<br />"http://host/webAppPrefix/servlet/\n" +<br />"has been disabled.\n" + <br />"</BODY></HTML>");<br />}<br /><br />public void doPost(HttpServletRequest request,<br />HttpServletResponse response)<br />throws ServletException, IOException {<br />doGet(request, response);<br />}<br />}<br /><br /><br />4.2 全局止ȀzdQTomcat<br />Tomcat 4中用来关闭缺省URL的方法与Tomcat 3中所用的很不相同。下面介l这两种ҎQ?br />1Q禁止激zdQ Tomcat 4<br />Tomcat 4用与前面相同的方法关闭激zdservletQ即利用web.xml中的url-mapping元素q行关闭。不同之处在于Tomcat使用了放在 install_dir/conf中的一个服务器专用的全局web.xml文gQ而前面用的是存攑֜每个Web应用的WEB-INF目录中的标准 web.xml文g?br />因此Qؓ了在Tomcat 4中关闭激zdservletQ只需在install_dir/conf/web.xml中简单地注释?servlet/* URL映射即可,如下所C:<br /><!-- <br /><servlet-mapping><br /><servlet-name>invoker</servlet-name><br /><url-pattern>/servlet/*</url-pattern><br /></servlet-mapping><br />--><br />再次提醒Q应该注意这个项是位于存攑֜install_dir/conf的Tomcat专用的web.xml文g中的Q此文g不是存放在每个Web应用的WEB-INF目录中的标准web.xml?br />2Q禁止激zdQTomcat3<br />在Apache Tomcat的版?中,通过在install_dir/conf/server.xml中注释出InvokerInterceptor全局止~省 servlet URL。例如,下面是禁止用缺省servlet URL的server.xml文g的一部分?br /><!-- <br /><RequsetInterceptor <br />className="org.apache.tomcat.request.InvokerInterceptor"<br />debug="0" prefix="/servlet/" /><br />--><br /><br />5 初始化和预装载servlet与JSP面<br /><br />q里讨论控制servlet和JSP面的启动行为的Ҏ。特别是Q说明了怎样分配初始化参C及怎样更改服务器生存期中装载servlet和JSP面的时刅R?br />5.1 分配servlet初始化参?br />利用init-param元素向servlet提供初始化参敎ͼinit-param元素hparam-name和param-value子元素。例如,在下面的例子中,如果initServlet servlet是利用它的注册名QInitTestQ访问的Q它能够从其方法中调用getServletConfig(). getInitParameter("param1")获得"Value 1"Q调用getServletConfig().getInitParameter("param2")获得"2"?br /><servlet><br /><servlet-name>InitTest</servlet-name><br /><servlet-class>moreservlets.InitServlet</servlet-class><br /><init-param><br /><param-name>param1</param-name><br /><param-value>value1</param-value><br /></init-param><br /><init-param><br /><param-name>param2</param-name><br /><param-value>2</param-value><br /></init-param><br /></servlet><br />在涉及初始化参数Ӟ有几炚w要注意:<br />l q回倹{GetInitParameter的返回值L一个String。因此,在前一个例子中Q可对param2使用Integer.parseInt获得一个int?br />l JSP中的初始化。JSP面使用jspInit而不是init。JSP面q需要用jsp-file元素代替servlet-class?br />l ~省URL。初始化参数只在通过它们的注册名或与它们注册名相关的定制URL模式讉KServlet时可以用。因此,在这个例子中Qparam1和 param2初始化参数将能够在用URL http://host/webAppPrefix/servlet/InitTest 时可用,但在使用URL http://host/webAppPrefix/servlet/myPackage.InitServlet 时不能用?br />例如Q程序清?-7l出一个名为InitServlet的简单servletQ它使用initҎ讄firstName和emailAddress字段。程序清?-8l出分配名称InitTestlservlet的web.xml文g?br />E序清单5-7 InitServlet.java<br />package moreservlets;<br /><br />import java.io.*;<br />import javax.servlet.*;<br />import javax.servlet.http.*;<br /><br />/** Simple servlet used to illustrate servlet<br />* initialization parameters.<br />* <P><br />* Taken from More Servlets and JavaServer Pages<br />* from Prentice Hall and Sun Microsystems Press,<br />* http://www.moreservlets.com/.<br />* © 2002 Marty Hall; may be freely used or adapted.<br />*/<br /><br />public class InitServlet extends HttpServlet {<br />private String firstName, emailAddress;<br /><br />public void init() {<br />ServletConfig config = getServletConfig();<br />firstName = config.getInitParameter("firstName");<br />emailAddress = config.getInitParameter("emailAddress");<br />}<br /><br />public void doGet(HttpServletRequest request,<br />HttpServletResponse response)<br />throws ServletException, IOException {<br />response.setContentType("text/html");<br />PrintWriter out = response.getWriter();<br />String uri = request.getRequestURI();<br />out.println(ServletUtilities.headWithTitle("Init Servlet") +<br />"<BODY BGCOLOR=\"#FDF5E6\">\n" +<br />"<H2>Init Parameters:</H2>\n" +<br />"<UL>\n" +<br />"<LI>First name: " + firstName + "\n" +<br />"<LI>Email address: " + emailAddress + "\n" +<br />"</UL>\n" + <br />"</BODY></HTML>");<br />}<br />}<br /><br /><br />E序清单5-8 web.xmlQ说明初始化参数的摘录)<br /><?xml version="1.0" encoding="ISO-8859-1"?><br /><!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />"http://java.sun.com/dtd/web-app_2_3.dtd"><br /><br /><web-app><br /><!-- ... --><br /><servlet><br /><servlet-name>InitTest</servlet-name><br /><servlet-class>moreservlets.InitServlet</servlet-class><br /><init-param><br /><param-name>firstName</param-name><br /><param-value>Larry</param-value><br /></init-param><br /><init-param><br /><param-name>emailAddress</param-name><br /><param-value>Ellison@Microsoft.com</param-value><br /></init-param><br /></servlet><br /><!-- ... --><br /></web-app><br /><br />5.2 分配JSP初始化参?br />lJSP面提供初始化参数在三个斚w不同于给servlet提供初始化参数?br />1Q用jsp-file而不是servlet-class。因此,WEB-INF/web.xml文g的servlet元素如下所C:<br /><servlet><br /><servlet-name>PageName</servlet-name><br /><jsp-file>/RealPage.jsp</jsp-file><br /><init-param><br /><param-name>...</param-name><br /><param-value>...</param-value><br /></init-param><br />...<br /></servlet><br />2) 几乎L分配一个明的URL模式。对servletQ一般相应地使用以http://host/webAppPrefix/servlet/ 开始的~省URL。只需CQ用注册名而不是原名称卛_。这对于JSP面在技术上也是合法的。例如,在上面给出的例子中,可用URL http://host/webAppPrefix/servlet/PageName 讉KRealPage.jsp的对初始化参数具有访问权的版本。但在用于JSP面Ӟ许多用户g不喜Ƣ应用常规的servlet的URL。此外,如果 JSP面位于服务器ؓ其提供了目录清单的目录中Q如Q一个既没有index.html也没有index.jsp文g的目录)Q则用户可能会连接到此 JSP面Q单dQ从而意外地ȀzL初始化的面。因此,好的办法是用url-patternQ?.3节)JSP面的原URL与注册的 servlet名相兌。这P客户机可使用JSP面的普通名Uͼ但仍然激zd制的版本。例如,l定来自目1的servlet定义Q可使用下面的 servlet-mapping定义Q?br /><servlet-mapping><br /><servlet-name>PageName</servlet-name><br /><url-pattern>/RealPage.jsp</url-pattern><br /></servlet-mapping><br />3QJSP用jspInit而不是init。自动从JSP面建立的servlet或许已经使用了intiҎ。因此,使用JSP声明提供一个initҎ是不合法的,必须制定jspInitҎ?br />Z说明初始化JSP面的过E,E序清单5-9l出了一个名为InitPage.jsp的JSP面Q它包含一个jspInitҎ且放|于 deployDemo Web应用层次l构的顶层。一般,http://host/deployDemo/InitPage.jsp 形式的URL激zL面的不h初始化参数访问权的版本,从而将对firstName和emailAddress变量昄null。但是, web.xml文gQ程序清?-10Q分配了一个注册名Q然后将该注册名与URL模式/InitPage.jsp相关联?br /><br />E序清单5-9 InitPage.jsp<br /><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><br /><HTML><br /><HEAD><TITLE>JSP Init Test</TITLE></HEAD><br /><BODY BGCOLOR="#FDF5E6"><br /><H2>Init Parameters:</H2><br /><UL><br /><LI>First name: <%= firstName %><br /><LI>Email address: <%= emailAddress %><br /></UL><br /></BODY></HTML><br /><%!<br />private String firstName, emailAddress;<br /><br />public void jspInit() {<br />ServletConfig config = getServletConfig();<br />firstName = config.getInitParameter("firstName");<br />emailAddress = config.getInitParameter("emailAddress");<br />}<br />%><br /><br /><br />E序清单5-10 web.xmlQ说明JSP面的init参数的摘录)<br /><?xml version="1.0" encoding="ISO-8859-1"?><br /><!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />"http://java.sun.com/dtd/web-app_2_3.dtd"><br /><br /><web-app><br /><!-- ... --><br /><servlet><br /><servlet-name>InitPage</servlet-name><br /><jsp-file>/InitPage.jsp</jsp-file><br /><init-param><br /><param-name>firstName</param-name><br /><param-value>Bill</param-value><br /></init-param><br /><init-param><br /><param-name>emailAddress</param-name><br /><param-value>gates@oracle.com</param-value><br /></init-param><br /></servlet><br /><!-- ... --> <br /><servlet-mapping><br /><servlet-name> InitPage</servlet-name><br /><url-pattern>/InitPage.jsp</url-pattern><br /></servlet-mapping><br /><!-- ... --><br /></web-app><br /><br /><br />5.3 提供应用范围内的初始化参?br />一般,对单个地servlet或JSP面分配初始化参数。指定的servlet或JSP面利用ServletConfig的getInitParameterҎdq些参数。但是,在某些情形下Q希望提供可׃Q意servlet或JSP面借助ServletContext的getInitParameterҎd的系l范围内的初始化参数?br />可利用context-param元素声明q些pȝ范围内的初始化倹{context-param元素应该包含param-name、param-value以及可选的description子元素,如下所C:<br /><context-param><br /><param-name>support-email</param-name><br /><param-value>blackhole@mycompany.com</param-value><br /></context-param><br />可回忆一下,Z保证可移植性,web.xml内的元素必须以正的ơ序声明。但q里应该注意Qcontext-param元素必须出现L与文有关的元素Qicon、display-name或descriptionQ之后及filter、filter-mapping、listener或 servlet元素之前?br />5.4 在服务器启动时装载servlet<br />假如servlet或JSP面有一个要花很长时间执行的init QservletQ或jspInitQJSPQ方法。例如,假如init或jspInitҎ从某个数据库或ResourceBundle查找产量。这U情况下Q在W一个客hh时装载servlet的缺省行为将对第一个客h产生较长旉的gq。因此,可利用servlet的load-on- startup元素规定服务器在W一ơ启动时装蝲servlet。下面是一个例子?br /><servlet><br /><servlet-name> …?lt;/servlet-name><br /><servlet-class> …?lt;/servlet-class> <!-- Or jsp-file --><br /><load-on-startup/><br /></servlet><br />可以为此元素体提供一个整数而不是用一个空的load-on-startup。想法是服务器应该在装蝲较大数目的servlet或JSP面之前装蝲较少数目的servlet或JSP面。例如,下面的servlet(攄在Web应用的WEB-INF目录下的web.xml文g中的web-app元素内)指C服务器首先装蝲和初始化SearchServletQ然后装载和初始化由位于Web应用的result目录中的index.jsp文g产生的 servlet?br /><servlet><br /><servlet-name>Search</servlet-name><br /><servlet-class>myPackage.SearchServlet</servlet-class> <!-- Or jsp-file --><br /><load-on-startup>1</load-on-startup><br /></servlet><br /><servlet><br /><servlet-name>Results</servlet-name><br /><servlet-class>/results/index.jsp</servlet-class> <!-- Or jsp-file --><br /><load-on-startup>2</load-on-startup><br /></servlet><br /><br />6 声明qo?br /><br />servlet版本2.3引入了过滤器的概c虽然所有支持servlet API版本2.3的服务器都支持过滤器Q但Z使用与过滤器有关的元素,必须在web.xml中用版?.3的DTD?br />qo器可截取和修改进入一个servlet或JSP面的请求或从一个servlet或JSP面发出的相应。在执行一个servlet或JSP面之前Q必L行第一个相关的qo器的doFilterҎ。在该过滤器对其FilterChain对象调用doFilterӞ执行链中的下一个过滤器。如果没有其他过滤器Qservlet或JSP面被执行。过滤器h对到来的ServletRequest对象的全部访问权Q因此,它们可以查看客户机名、查扑ֈ来的cookie{。ؓ了访问servlet或JSP面的输出,qo器可响应对象包裹在一个替w对象(stand-in objectQ中Q比方说把输出篏加到一个缓冲区。在调用FilterChain对象的doFilterҎ之后Q过滤器可检查缓冲区Q如有必要,对它进行修改,然后传送到客户机?br />例如Q程序清?-11帝国难以了一个简单的qo器,只要讉K相关的servlet或JSP面Q它截取请求ƈ在标准输Z打印一个报告(开发过E中在桌面系l上q行Ӟ大多数服务器都可以用这个过滤器Q?br /><br />E序清单5-11 ReportFilter.java<br />package moreservlets;<br /><br />import java.io.*;<br />import javax.servlet.*;<br />import javax.servlet.http.*;<br />import java.util.*;<br /><br />/** Simple filter that prints a report on the standard output <br />* whenever the associated servlet or JSP page is accessed.<br />* <P><br />* Taken from More Servlets and JavaServer Pages<br />* from Prentice Hall and Sun Microsystems Press,<br />* http://www.moreservlets.com/.<br />* © 2002 Marty Hall; may be freely used or adapted.<br />*/<br /><br />public class ReportFilter implements Filter {<br />public void doFilter(ServletRequest request,<br />ServletResponse response,<br />FilterChain chain)<br />throws ServletException, IOException {<br />HttpServletRequest req = (HttpServletRequest)request;<br />System.out.println(req.getRemoteHost() +<br />" tried to access " +<br />req.getRequestURL() +<br />" on " + new Date() + ".");<br />chain.doFilter(request,response);<br />}<br /><br />public void init(FilterConfig config)<br />throws ServletException {<br />}<br /><br />public void destroy() {}<br />}<br /><br />一旦徏立了一个过滤器Q可以在web.xml中利用filter元素以及filter-nameQQ意名Uͼ、file-classQ完全限定的cdQ和Q可选的Qinit-params子元素声明它。请注意Q元素在web.xml的web-app元素中出现的ơ序不是L的;允许服务器(但不是必需的)强制所需的次序,q且实际中有些服务器也是q样做的。但q里要注意,所有filter元素必须出现在Q意filter-mapping元素之前Q filter-mapping元素又必d现在所有servlet或servlet-mapping元素之前?br />例如Q给定上q的ReportFilterc,可在web.xml中作Z面的filter声明。它把名UReporter与实际的cReportFilterQ位于moreservletsE序包中Q相兌?br /><filter><br /><filter-name>Reporter</filter-name><br /><filter-class>moresevlets.ReportFilter</filter-class><br /></filter><br />一旦命名了一个过滤器Q可利用filter-mapping元素把它与一个或多个servlet或JSP面相关联。关于此工作有两种选择?br />首先Q可使用filter-name和servlet-name子元素把此过滤器与一个特定的servlet名(此servlet名必ȝ后在相同的 web.xml文g中用servlet元素声明Q关联。例如,下面的程序片断指C系l只要利用一个定制的URL讉K名ؓSomeServletName 的servlet或JSP面Q就q行名ؓReporter的过滤器?br /><filter-mapping><br /><filter-name>Reporter</filter-name><br /><servlet-name>SomeServletName</servlet-name><br /></filter-mapping><br />其次Q可利用filter-name和url-pattern子元素将qo器与一lservlet、JSP面或静态内容相兌。例如,盔R的程序片D|C系l只要访问Web应用中的LURLQ就q行名ؓReporter的过滤器?br /><filter-mapping><br /><filter-name>Reporter</filter-name><br /><url-pattern>/*</url-pattern><br /></filter-mapping><br />例如Q程序清?-12l出了将ReportFilterqo器与名ؓPageName的servlet相关联的web.xml文g的一部分。名字 PageName依次又与一个名为TestPage.jsp的JSP面以及以模式http: //host/webAppPrefix/UrlTest2/ 开头的URL相关联。TestPage.jsp的源代码已经JSP面命名的谈论在前面??分配名称和定制的URL"中给出。事实上Q程序清?- 12中的servlet和servlet-name从该节原封不动地拿q来的。给定这些web.xml,可看C面的标准输出形式的调试报告(换行是ؓ了容易阅读)?br />audit.irs.gov tried to access <br />http://mycompany.com/deployDemo/UrlTest2/business/tax-plan.html<br />on Tue Dec 25 13:12:29 EDT 2001.<br /><br />E序清单5-12 Web.xmlQ说明filter用法的摘录)<br /><?xml version="1.0" encoding="ISO-8859-1"?><br /><!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />"http://java.sun.com/dtd/web-app_2_3.dtd"><br /><br /><web-app><br /><filter><br /><filter-name>Reporter</filter-name><br /><filter-class>moresevlets.ReportFilter</filter-class><br /></filter><br /><!-- ... --><br /><filter-mapping><br /><filter-name>Reporter</filter-name><br /><servlet-name>PageName</servlet-name><br /></filter-mapping><br /><!-- ... --><br /><servlet><br /><servlet-name>PageName</servlet-name><br /><jsp-file>/RealPage.jsp</jsp-file><br /></servlet><br /><!-- ... --><br /><servlet-mapping><br /><servlet-name> PageName </servlet-name><br /><url-pattern>/UrlTest2/*</url-pattern><br /></servlet-mapping><br /><!-- ... --><br /></web-app><br /><br /><br />7 指定Ƣ迎?br /><br />假如用户提供了一个像http: //host/webAppPrefix/directoryName/ q样的包含一个目录名但没有包含文件名的URLQ会发生什么事情呢Q用戯得到一个目录表Q一个错误?q是标准文g的内容?如果得到标准文g内容Q是 index.html、index.jsp、default.html、default.htm或别的什么东西呢Q?br />Welcome-file-list 元素及其辅助的welcome-file元素解决了这个模p的问题。例如,下面的web.xmlҎ出,如果一个URLl出一个目录名但未l出文g名,服务器应该首先试用index.jspQ然后再试用index.html。如果两者都没有扑ֈQ则l果有赖于所用的服务器(如一个目录列表)?br /><welcome-file-list><br /><welcome-file>index.jsp</welcome-file><br /><welcome-file>index.html</welcome-file><br /></welcome-file-list><br />虽然许多服务器缺省遵循这U行为,但不一定必这栗因此,明确C用welcom-file-list保证可移植性是一U良好的习惯?br /><br />8 指定处理错误的页?br /><br />现在我了解到Q你在开发servlet和JSP面时从不会犯错误,而且你的所有页面是那样的清晎ͼ一般的E序员都不会被它们的搞糊涂。但是,是hM犯错误的Q用户可能会提供不合规定的参敎ͼ使用不正的URL或者不能提供必需的表单字D倹{除此之外,其它开发h员可能不那么l心Q他们应该有些工h克服自己的不?br />error-page元素是用来克服q些问题的。它有两个可能的子元素,分别是:error-code和exception- type。第一个子元素error-code指出在给定的HTTP错误代码出现时用的URL。第二个子元素excpetion-type指出在出现某个给定的Java异常但未捕捉到时使用的URL。error-code和exception-type都利用location元素指出相应的URL。此 URL必须?开始。location所指出的位|处的页面可通过查找HttpServletRequest对象的两个专门的属性来讉K关于错误的信息,q两个属性分别是Qjavax.servlet.error.status_code和javax.servlet.error.message?br />可回忆一下,在web.xml内以正确的次序声明web-app的子元素很重要。这里只要记住,error-page出现在web.xml文g的末Nq,servlet、servlet-name和welcome-file-list之后卛_?br /><br />8.1 error-code元素<br />Z更好C解error-code元素的|可考虑一下如果不正确地输入文件名Q大多数站点会作Z么反映。这样做一般会出现一?04错误信息Q它表示不能扑ֈ该文Ӟ但几乎没提供更多有用的信息。另一斚wQ可以试一下在www.microsoft.com、www.ibm.com 处或者特别是在www.bea.com 处输出未知的文g名。这是会得出有用的消息,q些消息提供可选择的位|,以便查找感兴的面。提供这h用的错误面对于Web应用来说是很有h值得。事实上rm-error-page子元素)。由form-login-pagel出的HTML表单必须h一个j_security_check的 ACTION属性、一个名为j_username的用户名文本字段以及一个名为j_password的口令字Dc?br />例如Q程序清?-19指示服务器用基于表单的验证。Web应用的顶层目录中的一个名为login.jsp的页面将攉用户名和口oQƈ且失败的登陆由相同目录中名为login-error.jsp的页面报告?br /><br />E序清单5-19 web.xmlQ说明login-config的摘录)<br /><?xml version="1.0" encoding="ISO-8859-1"?><br /><!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />"http://java.sun.com/dtd/web-app_2_3.dtd"><br /><br /><web-app><br /><!-- ... --><br /><security-constraint> ... </security-constraint><br /><login-config><br /><auth-method> FORM </auth-method><br /><form-login-config><br /><form-login-page>/login.jsp</form-login-page><br /><form-error-page>/login-error.jsp</form-error-page><br /></form-login-config><br /></login-config><br /><!-- ... --><br /></web-app><br /><br /><br />9.2 限制对Web资源的访?br />现在Q可以指C服务器使用何种验证Ҏ了?了不P"你说道,"除非我能指定一个来收到保护的 URLQ否则没有多大用处?没错。指些URLq说明他们应该得CU保护正是security-constriaint元素的用途。此元素在 web.xml中应该出现在login-config的紧前面。它包含是个可能的子元素Q分别是Qweb-resource-collection、 auth-constraint、user-data-constraint和display-name。下面各节对它们进行介l?br />l web-resource-collection<br />此元素确定应该保护的资源。所有security-constraint元素都必d含至一个web-resource-collectionV此元素׃个给ZQ意标识名U的web-resource-name元素、一个确定应该保护的URL的url-pattern元素、一个指出此保护所适用的 HTTP命oQGET、POST{,~省为所有方法)的http-method元素和一个提供资料的可选description元素l成。例如,下面的 Web-resource-collection(在security-constratint元素内)指出Web应用的proprietary目录中所有文应该受C护?br /><security-constraint><br /><web-resource-coolection><br /><web-resource-name>Proprietary</web-resource-name><br /><url-pattern>/propritary/*</url-pattern><br /></web-resource-coolection><br /><!-- ... --><br /></security-constraint><br />重要的是应该注意刎ͼurl-pattern仅适用于直接访问这些资源的客户机。特别是Q它不适合于通过MVC体系l构利用 RequestDispatcher来访问的面Q或者不适合于利用类似jsp:forward的手D|讉K的页面。这U不匀U如果利用得当的话很有好处。例如,servlet可利用MVC体系l构查找数据Q把它放到bean中,发送请求到从bean中提取数据的JSP面q显C它。我们希望保证决不直接访问受保护的JSP面Q而只是通过建立该页面将使用的bean的servlet来访问它。url-pattern和auth-contraint元素可通过声明不允怓Q何用L接访问JSP面来提供这U保证。但是,q种不匀U的行ؓ可能让开发h员放松警惕,使他们偶然对应受保护的资源提供不受限制的讉K。?br />l auth-constraint<br />管web-resource-collention元素质出了哪些URL应该受到保护Q但是auth-constraint元素却指出哪些用户应该具有受保护资源的访问权。此元素应该包含一个或多个标识h讉K权限的用L别role- name元素Q以及包含(可选)一个描q角色的description元素。例如,下面web.xml中的security-constraint元素部门规定只有指定为Administrator或Big KahunaQ或两者)的用户具有指定资源的讉K权?br /><security-constraint><br /><web-resource-coolection> ... </web-resource-coolection><br /><auth-constraint><br /><role-name>administrator</role-name><br /><role-name>kahuna</role-name><br /></auth-constraint><br /></security-constraint><br />重要的是认识刎ͼ到此为止Q这个过E的可移植部分结束了。服务器怎样定哪些用户处于M角色以及它怎样存放用户的口令,完全有赖于具体的pȝ?br />例如QTomcat使用install_dir/conf/tomcat-users.xml用户名与角色名和口令相兌Q正如下面例子中所C,它指出用户joeQ口令bigshotQ和janeQ口令enajQ属于administrator和kahuna角色?br /><tomcat-users><br /><user name="joe" password="bigshot" roles="administrator,kahuna" /><br /><user name="jane" password="enaj" roles="kahuna" /><br /></tomcat-users><br />l user-data-constraint<br />q个可选的元素指出在访问相兌源时使用M传输层保护。它必须包含一个transport-guarantee子元素(合法gؓNONE、 INTEGRAL或CONFIDENTIALQ,q且可选地包含一个description元素。transport-guarantee为NONE值将Ҏ用的通讯协议不加限制。INTEGRALDC数据必M一U防止截取它的h阅读它的方式传送。虽然原理上Qƈ且在未来的HTTP版本中)Q在 INTEGRAL和CONFIDENTIAL之间可能会有差别Q但在当前实践中Q他们都只是单地要求用SSL。例如,下面指示服务器只允许对相兌源做 HTTPSq接Q?br /><security-constraint><br /><!-- ... --><br /><user-data-constraint><br /><transport-guarantee>CONFIDENTIAL</transport-guarantee><br /></user-data-constraint><br /></security-constraint><br />l display-name<br />security-constraint的这个很用的子元素给予可能由GUI工具使用的安全约束项一个名U?br />9.3 分配角色?br />q今为止Q讨论已l集中到完全由容器(服务器)处理的安全问题之上了。但servlet以及JSP面也能够处理它们自q安全问题?br />例如Q容器可能允许用户从bigwig或bigcheese角色讉K一个显CZh员额外紧贴的面Q但只允许bigwig用户修改此页面的参数。完成这U更l致的控制的一U常见方法是调用HttpServletRequset的isUserInRoleҎQƈ据此修改讉K?br />Servlet的 security-role-ref子元素提供出现在服务器专用口令文件中的安全角色名的一个别名。例如,假如~写了一个调用 request.isUserInRoleQ?boss"Q的servletQ但后来该servlet被用在了一个其口o文g调用角色manager而不是boss的服务器中。下面的E序D该servlet能够使用q两个名UC的Q何一个?br /><servlet><br /><!-- ... --><br /><security-role-ref><br /><role-name>boss</role-name> <!-- New alias --><br /><role-link>manager</role-link> <!-- Real name --><br /></security-role-ref><br /></servlet><br />也可以在web-app内利用security-role元素提供出现在role-name元素中的所有安全角色的一个全局列表。分别地生命角色佉KUIDEҎ处理安全信息?br /><br />10 控制会话时<br /><br />如果某个会话在一定的旉内未被访问,服务器可把它扔掉以节U内存。可利用HttpSession的setMaxInactiveIntervalҎ直接讄个别会话对象的超时倹{如果不采用q种ҎQ则~省的超时值由具体的服务器军_。但可利用session-config和session- timeout元素来给Z个适用于所有服务器的明的时倹{超时值的单位为分钟,因此Q下面的例子讄~省会话时gؓ三个时Q?80分钟Q?br /><session-config><br /><session-timeout>180</session-timeout><br /></session-config><br /><br />11 Web应用的文档化<br /><br />来多的开发环境开始提供servlet和JSP的直接支持。例子有Borland Jbuilder Enterprise Edition、Macromedia UltraDev、Allaire JRun StudioQ写此文Ӟ已被Macromedia收购Q以及IBM VisuaAge for Java{?br />大量的web.xml元素不仅是ؓ服务器设计的Q而且q是为可视开发环境设计的。它们包括icon、display-name和discription{?br />可回忆一下,在web.xml内以适当地次序声明web-app子元素很重要。不q,q里只要Cicon、display-name和description是web.xml的web-app元素内的前三个合法元素即可?br />l icon<br />icon元素指出GUI工具可用来代表Web应用的一个和两个囑փ文g。可利用small-icon元素指定一q?6 x 16的GIF或JPEG囑փQ用large-icon元素指定一q?2 x 32的图像。下面D一个例子: <br /><icon><br /><small-icon>/images/small-book.gif</small-icon><br /><large-icon>/images/tome.jpg</large-icon><br /></icon><br />l display-name<br />display-name元素提供GUI工具可能会用来标记此Web应用的一个名U。下面是个例子?br /><display-name>Rare Books</display-name><br />l description<br />description元素提供解释性文本,如下所C:<br /><description><br />This Web application represents the store developed for<br />rare-books.com, an online bookstore specializing in rare<br />and limited-edition books.<br /></description><br /><br />12 兌文g与MIMEcd<br /><br />服务器一般都h一U让Web站点理员将文g扩展名与媒体相关联的Ҏ。例如,会自动l予名ؓmom.jpg的文件一个image/jpeg的MIME cd。但是,假如你的Web应用h几个不寻常的文gQ你希望保证它们在发送到客户机时分配为某UMIMEcd。mime-mapping元素Q具有 extension和mime-type子元素)可提供这U保证。例如,下面的代码指C服务器application/x-fubar的MIMEcd分配l所有以.fool尾的文件?br /><mime-mapping><br /><extension>foo</extension><br /><mime-type>application/x-fubar</mime-type><br /></mime-mapping><br />或许Q你的Web应用希望重蝲QoverrideQ标准的映射。例如,下面的代码将告诉服务器在发送到客户机时指定.ps文g作ؓU文本(text/plainQ而不是作为PostScriptQapplication/postscriptQ?br /><mime-mapping><br /><extension>ps</extension><br /><mime-type>application/postscript</mime-type><br /></mime-mapping><br /><br /><br />13 定位TLD<br /><br />JSP taglib元素h一个必要的uri属性,它给Z个TLDQTag Library DescriptorQ文件相对于Web应用的根的位|。TLD文g的实际名U在发布新的标签库版本时可能会改变,但我们希望避免更Ҏ有现有JSP面。此外,可能q希望用保持taglib元素的简l性的一个简短的uri。这是部v描述W文件的taglib元素z场的所在了。Taglib包含两个子元素:taglib-uri和taglib-location。taglib-uri元素应该与用于JSP taglib元素的uri属性的东西相匹配。Taglib-location元素l出TLD文g的实际位|。例如,假如你将文gchart-tags- 1.3beta.tld攑֜WebApp/WEB-INF/tlds中。现在,假如web.xml在web-app元素内包含下列内宏V?br /><taglib><br /><taglib-uri>/charts.tld</taglib-uri><br /><taglib-location><br />/WEB-INF/tlds/chart-tags-1.3beta.tld<br /></taglib-location><br /></taglib><br />l出q个说明后,JSP面可通过下面的简化Ş式用标{ֺ?br /><%@ taglib uri="/charts.tld" prefix="somePrefix" %><br /><br />14 指定应用事g监听E序<br /><br />应用事g监听器程序是建立或修改servlet环境或会话对象时通知的类。它们是servlet规范的版?.3中的新内宏V这里只单地说明用来向Web应用注册一个监听程序的web.xml的用法?br />注册一个监听程序涉及在web.xml的web-app元素内放|一个listener元素。在listener元素内,listener-class元素列出监听E序的完整的限定cdQ如下所C:<br /><listener><br /><listener-class>package.ListenerClass</listener-class><br /></listener><br />虽然listener元素的结构很单,但请不要忘记Q必L地l出web-app元素内的子元素的ơ序。listener元素位于所有的servlet 元素之前以及所有filter-mapping元素之后。此外,因ؓ应用生存期监听程序是serlvet规范?.3版本中的新内容,所以必M用 web.xml DTD?.3版本Q而不?.2版本?br />例如Q程序清?-20l出一个名为ContextReporter的简单的监听E序Q只要Web应用的Servlet-Context建立Q如装蝲Web应用Q或消除Q如服务器关闭)Ӟ它就在标准输Z昄一条消息。程序清?-21l出此监听程序注册所需要的web.xml文g的一部分?br /><br />E序清单5-20 ContextReporterjava<br />package moreservlets;<br /><br />import javax.servlet.*;<br />import java.util.*;<br /><br />/** Simple listener that prints a report on the standard output <br />* when the ServletContext is created or destroyed.<br />* <P><br />* Taken from More Servlets and JavaServer Pages<br />* from Prentice Hall and Sun Microsystems Press,<br />* http://www.moreservlets.com/.<br />* © 2002 Marty Hall; may be freely used or adapted.<br />*/<br /><br />public class ContextReporter implements ServletContextListener {<br />public void contextInitialized(ServletContextEvent event) {<br />System.out.println("Context created on " +<br />new Date() + ".");<br />}<br /><br />public void contextDestroyed(ServletContextEvent event) {<br />System.out.println("Context destroyed on " +<br />new Date() + ".");<br />}<br />}<br /><br /><br />E序清单5-21 web.xmlQ声明一个监听程序的摘录Q?br /><?xml version="1.0" encoding="ISO-8859-1"?><br /><!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />"http://java.sun.com/dtd/web-app_2_3.dtd"><br /><br /><web-app><br /><!-- ... --><br /><filter-mapping> …?lt;/filter-mapping><br /><listener><br /><listener-class>package.ListenerClass</listener-class><br /></listener><br /><servlet> ... </servlet><br /><!-- ... --><br /></web-app><br /><br /><br />15 J2EE元素<br /><br />本节描述用作J2EE环境l成部分的Web应用的web.xml元素。这里将提供一个简明的介绍Q详l内容可以参阅http://java.sun.com/j2ee/j2ee-1_3-fr-spec.pdf的Java 2 Plantform Enterprise Edition版本1.3规范的第5章?br />l distributable<br />distributable 元素指出QWeb应用是以q样的方式编E的Q即Q支持集的服务器可安全地在多个服务器上分布Web应用。例如,一个可分布的应用必d使用 Serializable对象作ؓ其HttpSession对象的属性,而且必须避免用实例变量(字段Q来实现持箋性。distributable元素直接出现在discription元素之后Qƈ且不包含子元素或数据Q它只是一个如下的标志?br /><distributable /><br />l resource-env-ref<br />resource -env-ref元素声明一个与某个资源有关的管理对象。此元素׃个可选的description元素、一个resource-env-ref- name元素Q一个相对于java:comp/env环境的JNDI名)以及一个resource-env-type元素Q指定资源类型的完全限定的类Q,如下所C:<br /><resource-env-ref><br /><resource-env-ref-name><br />jms/StockQueue<br /></resource-env-ref-name><br /><resource-env-ref-type><br />javax.jms.Queue<br /></resource-env-ref-type><br /></resource-env-ref><br />l env-entry<br />env -entry元素声明Web应用的环境项。它׃个可选的description元素、一个env-entry-name元素Q一个相对于java: comp/env环境JNDI名)、一个env-entry-value元素Q项|以及一个env-entry-type元素Qjava.langE序包中一个类型的完全限定cdQjava.lang.Boolean、java.lang.String{)l成。下面是一个例子:<br /><env-entry><br /><env-entry-name>minAmout</env-entry-name><br /><env-entry-value>100.00</env-entry-value><br /><env-entry-type>minAmout</env-entry-type><br /></env-entry><br />l ejb-ref<br />ejb -ref元素声明对一个EJB的主目录的应用。它׃个可选的description元素、一个ejb-ref-name元素Q相对于java: comp/env的EJB应用Q、一个ejb-ref-type元素Qbean的类型,Entity或SessionQ、一个home元素Qbean的主目录接口的完全限定名Q、一个remote元素Qbean的远E接口的完全限定名)以及一个可选的ejb-link元素Q当前bean链接的另一个 bean的名Uͼl成?br />l ejb-local-ref<br />ejb-local-ref元素声明一个EJB的本C目录的引用。除了用local-home代替home外,此元素具有与ejb-ref元素相同的属性ƈ以相同的方式使用 </font> <br /> <img src ="http://m.tkk7.com/jelver/aggbug/40920.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jelver/" target="_blank">都市淘沙?/a> 2006-04-13 15:58 <a href="http://m.tkk7.com/jelver/articles/40920.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>js+xml实现三联动菜单http://m.tkk7.com/jelver/articles/31987.html都市淘沙?/dc:creator>都市淘沙?/author>Wed, 22 Feb 2006 09:28:00 GMThttp://m.tkk7.com/jelver/articles/31987.htmlhttp://m.tkk7.com/jelver/comments/31987.htmlhttp://m.tkk7.com/jelver/articles/31987.html#Feedback3http://m.tkk7.com/jelver/comments/commentRss/31987.htmlhttp://m.tkk7.com/jelver/services/trackbacks/31987.html

    mselect.xml
    <?xml version="1.0" encoding="GB2312" ?>
    <Troot>
        <Item id="1" pid="0" c="1">大学</Item>
        <Item id="2" pid="0" c="3">中学</Item>
        <Item id="3" pid="0" c="3">学</Item>
        <Item id="4" pid="2" c="2">高中</Item>
        <Item id="5" pid="2" c="5">初中</Item>
        <Item id="6" pid="15" c="3">清华大学</Item>
        <Item id="7" pid="15" c="4">北京大学</Item>
        <Item id="8" pid="5" c="3">天|铁三?lt;/Item>
        <Item id="9" pid="4" c="3">天|市二?lt;/Item>
        <Item id="10" pid="16" c="2">天|音乐学院</Item>
        <Item id="11" pid="15" c="5">天|商学?lt;/Item>
        <Item id="12" pid="4" c="3">耀华中?lt;/Item>
        <Item id="13" pid="3" c="6">昆纬路小?lt;/Item>
        <Item id="14" pid="2" c="6">七中</Item>
        <Item id="15" pid="1" c="1">l合c院?lt;/Item>
        <Item id="16" pid="1" c="1">艺术c院?lt;/Item>
        <Item id="17" pid="15" c="4">ȝ大学</Item>
        <Item id="18" pid="15" c="4">天|师范大学</Item>
        <Item id="19" pid="15" c="23">天|大学</Item>
        <Item id="20" pid="15" c="7">南开大学</Item>
        <Item id="21" pid="4" c="23">天|铁一?lt;/Item>
        <Item id="22" pid="5" c="5">天|铁一?lt;/Item>
        <Item id="23" pid="3" c="3">天|市铁路职工子弟第三小?lt;/Item>
        <Item id="24" pid="3" c="3">天|市铁路职工子弟第一学</Item>
        <Item id="25" pid="16" c="3">术学院</Item>
        <Item id="26" pid="16" c="3">体育学院</Item>
    </Troot>

    test.html
    <HTML>
    <HEAD>
    <TITLE>XML版本的多U联?lt;/TITLE>
    <SCRIPT LANGUAGE=javascript>
    <!--
    /***********************************************
    //
    // 用DOM实现Q基于XML的动态NU联?BR>//
    //**********************************************/

    // 最l版权归 DSclubQQ兀Q拥有,您可以在未授权的情况下用,但请保留此信?BR>//
    //   EMailQ?A href="mailto:dsclub@hotmail.com">dsclub@hotmail.com
    //   QQQ?967030
    //   Nick Name: DSclub(兀儿-q部)
    //   姓名QQ兀

    // 多联动的Select集合
    var objSelects = new Array();

    // 创徏应有的Select对象
    function funCreateSelectEl(passPid)
    {
    // 创徏DOMDocument对象
    var xmlSrc = new ActiveXObject("MicroSoft.XMLDOM");
    xmlSrc = xmlSource.XMLDocument;

    // root为文对象的根节?BR>var root = xmlSrc.documentElement;
    // 得到所传父ID的所有节?BR>var currentItems = root.selectNodes("http://Troot/Item[@pid = " + passPid + "]");
    var iItems = currentItems.length;

        if(iItems > 0)
        {
            // 创徏Selectq把OnChange事g写好
            var newChild = document.createElement("<SELECT onchange='eventSltChange()' id='slt" + objSelects.length + "'>");
            // 向集合中d新徏的Select对象
            objSelects[objSelects.length] = newChild;
           
            // 向Select对向d所有的Option
            var i;
            for(i = 0; i < iItems; i++)
            {
                var oOption = document.createElement("OPTION");
                oOption.text = currentItems[i].text;
                oOption.value = currentItems[i].attributes[0].text;
                newChild.options.add(oOption);
            }

            // 新建的Select攑ֈ目标?BR>        oDIV.appendChild(newChild);
           
            // 先置一个空白空?BR>        newChild.value = "";
        }
    }

    // Select的OnChange事g响应函数
    function eventSltChange()
    {
        // 删除全部本层下的孩子
        var i;
        for(i = objSelects.length - 1; i > parseInt(event.srcElement.id.replace("slt",""), 10); i--)
        {
            oDIV.removeChild(objSelects[i]);
            objSelects.pop();
        }
       
        // 响应新的选择
        funCreateSelectEl(event.srcElement.value);
       
        // 联动的选择l果
        var resultArray = new Array();
        for(i = 0; i < objSelects.length; i++)
        {
            resultArray[i] = objSelects[i].value;
        }

        // 输出选定
        OUTPUT.innerText = resultArray.join("-");
    }
    //-->
    </SCRIPT>


    </HEAD>
    <BODY onload="funCreateSelectEl(0)">
    <DIV ID="oDIV"></DIV>
    <XML ID="xmlSource" src="mselect.xml"/>
    <BR/>
    选定l果Q?lt;SPAN ID="OUTPUT"></SPAN>
    </BODY>
    </HTML>



    ]]>
    վ֩ģ壺 ɫ߹ۿ| ߿hƬ| ŮӰԺҪ| 182tvѹۿƵ| 㽶­| þøݾƷԴվ| av볱߹ۿ| þþƷ뾫Ʒר| ƵĻ| 999ƵƷѲŹۿ| Ʒ˿ྫƷþ| ůůѸձһ| ɫɫwww| ҹϼӰԺ| þþƷվ| ޹Ʒ߹ۿ | ߹ۿվ| AVպAVɫ| ձһ| þþƷѹƬС| A߹ۿ| ɫվַ| ɫƵ| ޹AV| jyzzjyzz鶹| ޹Ʒվ߲ | ȫ߹ۿѹۿȫ | ޾Ʒŷ޾Ʒ| ʵƵѹۿ| jizzѲ| ޾ƷĻӰԺ| ëƬֻ߿| Ļ˳й| ޾ƷƵ߹ۿƵ| ts߹ۿƵ| Ļȫ| ձһ| йŮ69ٸ| þþþѿAƬAPP | ޵һ߹ۿ| ʵŹ|