用JSP寫出猜數字的遊戲,詳解!

常能見到一款經典的益智遊戲——猜數字。假定C爲遊戲主持者,M爲玩家,過程是這樣的:
  1. C任意選取4個不重複的數字(0-9),並以任意次序組成一個串;
  2. M開始猜想這4個數字,一樣給出不重複且有次序地4個數字;
  3. C拿M的猜想與事先選取好的4個數字相比較,並給出結果:計數字和位置都正確的個數爲m;而數字出現過但位置不對的個數爲n,結果以mAnB的形式給出。
  4. 若是結果是4A0B,則遊戲結束,不然M繼續猜,重複2。
好比某次遊戲過程是這樣的:
  1. C選取5816
  2. M猜8754,C回答 0A2B
  3. M猜4138,C回答 0A2B
  4. M猜7081,C回答 0A2B
  5. M猜5410,C回答 2A0B
  6. M猜5816,C回答 4A0B,遊戲結束
上面此次遊戲用了5個回合完成遊戲。人在玩這個遊戲的時候,都是根據邏輯推理來進行,在沒有前提條件沒法進行推理的時候,則隨意猜想。好比第一次猜8754的結果是0A2B,則說明這四個數字中有兩個在結果中出現過,但位置不對,那下一次猜想時則保留上次中的兩個,調整一下位置,而後猜想4138,這樣逐步逼近結果。

大一C語言課的一道大做業題,就是編成完成猜想的過程。我一開始是按照人遊戲時的邏輯進行,根據回答進行分類判斷,進行推理,致使程序異常複雜,是我所難以完成的。後來跟chaoslawful等討論,他的解法則徹底不是這個思路:他會根據猜想的結果把全部可能的數字過濾一遍,保留全部多是結果的那些數字排列,並從中任選一個去猜,若是回答是4A0B或者僅剩下一個,則獲得結果。當時聽到這個方法時,讓我很是震驚,以至如今都還記得。

雖然只是一個猜數字問題,但卻反映了一個重要的事實:計算機的思惟方式是跟人不同的,不能以人的思惟方式去讓計算機幹活。人的記憶能力和處理速度(狹義),遠不如如今的計算機,但邏輯推理等方面異常強大,在處理複雜問題時表現出強大的智能。而計算機的優點在於能夠高度的重複完成簡單任務,經過這些簡單任務的組合,能夠解決不少複雜問題,實現「智能」。

好比這個猜數字遊戲,計算機經過窮舉和搜索完成了人必須用複雜的邏輯推理才能作到的事,能夠說在這方面與人具備了一樣的智能。相似的例子還有不少,好比深藍打敗卡斯帕羅夫,搜索引擎幫咱們找到所須要的資料,都是以與人的思惟過程徹底不一樣的方式,達到甚至超越了人的智能所能達到的效果。能夠說在這一方面,它們經過了圖靈測試,能夠說具備了智能。

有人會說計算機的這種能力不能稱爲智能,理由是它如今還不能完成許多複雜任務,好比圖像內容識別。但是回想一下,如今的人類大腦,是通過了幾十億年(從高分子有機物開始)的漫長演化,而計算機從出現到如今,纔有不到兩百年(包括早年的機械計算器),可見它的前途是不可限量的。二十年前,識別汽車牌號可能還只在科幻片中出現,可如今已經開始在生活中普遍應用。

也有人會說計算機不具備創新能力,只能按照它的創造者人所指定的軌跡行事。所謂創新,實際上是一個相對的概念,回想一下人所作的創新,不少時候是把原先已經存在的東西作了從未有過的組合,那種從無到有的創造,估計只有上帝才能完成。計算機是能夠完成這種組合的,甚至窮舉全部組合。當這種組合是人從未想到過的時,就是創新。

在電影《I, Robot》中,過於複雜的中央控制系統,經過不斷演化最終具備了自我意識,能夠給咱們一點啓示:當一個系統複雜到人沒法想象的程度時,它所作的一些常規的事情也會讓人沒法理解,就能夠說它具備了智能或者獨立意識。好比2003年我參加的智能體大賽,「決不貪吃」所具備的能力已經超過的大多數人類玩家,在不懂得編成的人看來,「決不貪吃」的某些舉動實在沒法理解,它太聰明瞭,甚至可以創新。可對咱們這些參賽者來講,全部這些舉動都是根據咱們事先指定的規則來的,不存在所謂創新。但有時候,仍難免被那些事先未預料到的場面所震驚,只有經過過後的仔細分析,才發現出現這種結果是「理所固然」的。

再看看咱們的大腦,不也是一些原子構成的麼?再往上看,無非是一些腦皮層細胞而已。只是它太複雜了,幾十億個腦細胞以更加複雜的方式耦合在一塊兒,其複雜程度是如今人所沒法想象的。假如拿幾十億個CPU組成一個超複雜網絡,那將會是什麼樣的一個系統?再看看如今的internet,接入的計算機數量已近達到了億的量級,只是計算機之間的鏈接還相對簡單。但若是從一個旁觀者的角度看,互聯網的行爲已是很是詭異了。隨着P2P和Web 2.0 的發展,互聯網將更加複雜,說不定哪天它就可以思考,有了「自我意識」。
  ligm2008 發佈於 2006-04-23 13:37:21 | 瀏覽[166] | 評論[0]
2006-04-23 [評論] [寫信問候]
111個知名Java項目集錦(包括url和描述)  

項目名稱   項目描述轉載自http://andyluo.blogjava.net
ASM Java bytecode manipulation framework
AspectWerkz AspectWerkz - Dynamic AOP for Java
Axis Axis - an implementation of the SOAP (Simple Object Access Protocol) submission to W3C
Batik Batik SVG Toolkit - Toolkit using images in the Scalable Vector Graphics (SVG) format
BCEL Byte Code Engineering Library - Analyze, create and manipulate Java class files
BeanUtils BeanUtils - Utilities for working with JavaBeans
Catalina Catalina - Servlet and JSP based web server
Cayenne Professional Object Relational Mapping
CGLIB CGLIB - Dynamic byte code generator轉載自http://andyluo.blogjava.net
Chain Chain - Implementation of the GoF "Chain of Responsibility" pattern
Checkstyle Checkstyle - Development tool to help writing Java code that adheres to a coding standard
CLI Command Line Library - Simple API for working with the command line arguments and options
Codec Commons Codec - Encoders and decoders like Base64, Hex, phonetic encodings and URLs
Collections Collections - Filling the holes left in Sun's Collections API
Configuration Commons Configuration - Generic API enabling configuration from a variety of sources
DBCP DBCP - Connection pooling implementations
DBUtils DbUtils - Set of classes designed to make working with JDBC easier
Digester Struts Digester - Configure an XML/Java mapping with actions when patterns are recognized
Discovery Discovery - Discovering, or finding, implementations for pluggable interfaces
DNSJava DNS in Java - Supporting common record types, queries, zone transfers and dynamic updates
doclet JavaDoc Doclet - Custom output from the types methods and fields in a source tree.
Dom4j DOM4J - XML, XPath and XSLT library
DTDParser DTDParse DTD Library - You can use this library to parse a DTD
EL EL - The JSP 2.0 Expression Language Interpreter from Apache
fastutil FastUtil - Type-specific maps sets and lists with a small memory footprint and fast access
FileUpload HTTP File Upload Library - Add robust, fast file upload capability to your web applications
FreeMarker HTML Template Enginehttp://andyluo.blogjava.net
GJT Giant Java Tree - Java library consisting entirely of open source components
gnu-regex GNU Regular Expressions - Implementation of a traditional (non-POSIX) NFA regex engine
Groovy Groovy - Scripting Language
GlassFish an oo app server implements JavaEE 5
Hibernate Hibernate - Relational Persistence For Idiomatic Java
HiveMind HiveMind - A services and configuration microkernel
HSQLDB HSQLDB - The Java SQL relational database
HTMLParser HTML Parser - Java library used to parse HTML
HTTPClient HTTP Client - Fills holes left by the java.net package, including most recent HTTP standards
Informa Informa - News aggregation library --- LGPL協議
IO Commons-IO - Utility classes, stream implementations, file filters and endian classes for IO
iText iText - Generates PDF on the fly
J2EE Java 2 Platform, Enterprise Edition
J2SE Java2 Standard Edition v5http://www.blogjava.net/Andyluo/archive/2006/04/15/javaprojects.html
JAI Java Advanced Imaging - Network-enabled, scalable, platform-independent image processing
Jalopy Jalopy Source Formatter - Formats Java source code according to widely configurable rules
Jasper Jasper - Tomcat JSP enginehttp://andyluo.blogjava.net
JasperReports JasperReports - Free Java reporting library
Java3d Java3D - Object-oriented interfaces that support a simple, high-level programming mode
JavaComm Java Communications - API for technologies such as voice mail, fax and smartcards
JavaGroups JavaGroups - Reliable multicast communication enable processes to send messages to each other
Jaxen Jaxen XPath Processor - Object model walker; evaluate XPath expressions in dom4j and JDOM
JAXME JaxMe 2 - Open source implementation of JAXB
JClassLib JClassLib - Library for reading, modifing and writing Java class files and bytecode
JCommon JCommon - Collection of useful classes used by JFreeChart, JFreeReport and other projects
JCrontab JCronTab - Scheduler written in Java, provide a fully functional schedules for Java projects
JDIC JDIC - JDesktop Integration Components
JDNC JDNC - JDesktop Network Components
JDO Java Data Objects - Direct storage of Java domain model instances into a database
JDOM JDOM XML Library - For accessing, manipulating and outputting XML data from Java code.
JetSpeed JetSpeed - Java Portal Serverhttp://www.blogjava.net/Andyluo/archive/2006/04/15/javaprojects.html
JEXL Java Expression Language - is an embedable expression language engine
JFreeChart JFreeChart - Free library for generating charts, including pie, bar, line and areas charts
JGroups JGroups - Multicast communication toolkit
JMeter JMeter - Load testing applcation
JMF Java Media Framework - Library for audio, video and other time-based media
JMock JMock - Testing libraryhttp://www.blogjava.net/Andyluo/archive/2006/04/15/javaprojects.html
JSF JavaServer Faces - Web Framework
JSword JSword - Bible software in Java, compatible with the Sword project for C/C++
JTidy JTidy - HTML syntax checker
JUnit JUnit - Regression testing framework used by the developer who implements unit tests in Java
JXPath JXPath Library - Simple interpreter of an expression language called XPath
Lang Lang - Utilities including Enums, String manipulation, reflection, serialization and more
Log4J Log4J - Fast logging API that lets you configure logging at runtime
Logging Commons Logging - Simple wrapper API around multiple logging APIs
Lucene Lucene - high-performance, full-featured text search engine written entirely in Java
Math Math - Library of lightweight, self-contained mathematics and statistics components
Net Network Library - Support for Finger, Whois, TFTP, Telnet, FTP, NNTP, etc developed by ORO
OJB OJB - O/R tool that allows transparent persistence
OpenJMS Open source JMS server
ORO ORO - Text processing library
OSCache OSCache - A high performance J2EE caching framework
PJA Pure Java AWT - Toolkit for drawing graphics without any native graphics resources
PMD PMD - Scans Java source code for potential problems
POI POI - Java OLE 2 Manipulator
Pool Commons Pooling - provides an generic, configurable Object-pooling API
Primitives Primitives - Collection of types and utilities optimized for working with Java primitives
Proxool Java connection pool
Quartz Quartz - J2EE open source job scheduler
Regexp Jakarta Regular Expressions - Java RegEx library under BSD style license
Rhino Mozilla JavaScript - open-source implementation of JavaScript written entirely in Java
Seraph Seraph - Atlassian Security Framework
SiteMesh A web-page layout and decoration framework
Slide Slide - Content repository, can serve as a basis for CMS
SOAP Apache Soap - implementation of the SOAP submission to W3C
Speedo OSS JDO implementation轉載自http://andyluo.blogjava.net
Spring Server Side alternative to J2EE APIs
Struts Jakarta Struts - open source framework for building web applications
Tapestry Tapestry - Web Framework
Turbine Turbine - Servlet based framework allowing developers to quickly build secure web applications
UDDI4J UDDI4J - Library that provides an API to interact with a UDDI registry
Validator Validtator - Validate data from user input
Velocity Velocity - Support for clean, quick MVC web development and support for the Struts framework
Village Village - API that sits on top of the JDBC to make it easier to interact with a JDBC
WebWork 2 Next generation of WebWork
Xalan Xalan - XSLT processor for transforming XML documents into HTML, text, or XML
XDoclet XDoclet - Code generation engine
Xerces Xerces2 - The next generation of high performance, XML parsers in the Apache Xerces family
XMLBeans XMLBeans - XML-Java binding tool轉載自http://andyluo.blogjava.net
XMLPull XMLPull - Defines a simple pull parsing API that does pull XML parsing from J2ME to J2EE
XMLRPC XML-RPC - Implementation of XML-RPC, using XML over HTTP to implement remote procedure calls
XNI Xerces Native Interface - Framework for streaming a document and constructing generic parsers
XOM XML Object Model - Tree-based API for processing XML that strives for correctness and simplicity.
XStream XML serialization
  ligm2008 發佈於 2006-04-23 13:21:08 | 瀏覽[163] | 評論[0]
2006-04-23 [評論] [寫信問候]
(轉載)[TOMCAT]用web.xml控制Web應用的行爲  

1 定義頭和根元素

部署描述符文件就像全部XML文件同樣,必須以一個XML頭開始。這個頭聲明能夠使用的XML版本並給出文件的字符編碼。
DOCYTPE聲明必須當即出如今此頭以後。這個聲明告訴服務器適用的servlet規範的版本(如2.2或2.3)並指定管理此文件其他部份內容的語法的DTD(Document Type Definition,文檔類型定義)。
全部部署描述符文件的頂層(根)元素爲web-app。請注意,XML元素不像HTML,他們是大小寫敏感的。所以,web-App和WEB-APP都是不合法的,web-app必須用小寫。

1 定義頭和根元素


XML 元素不只是大小寫敏感的,並且它們還對出如今其餘元素中的次序敏感。例如,XML頭必須是文件中的第一項,DOCTYPE聲明必須是第二項,而web- app元素必須是第三項。在web-app元素內,元素的次序也很重要。服務器不必定強制要求這種次序,但它們容許(實際上有些服務器就是這樣作的)徹底 拒絕執行含有次序不正確的元素的Web應用。這表示使用非標準元素次序的web.xml文件是不可移植的。
下面的列表給出了全部可直接出如今web-app元素內的合法元素所必需的次序。例如,此列表說明servlet元素必須出如今全部servlet-mapping元素以前。請注意,全部這些元素都是可選的。所以,能夠省略掉某一元素,但不能把它放於不正確的位置。
l icon icon元素指出IDE和GUI工具用來表示Web應用的一個和兩個圖像文件的位置。
l display-name display-name元素提供GUI工具可能會用來標記這個特定的Web應用的一個名稱。
l description description元素給出與此有關的說明性文本。
l context-param context-param元素聲明應用範圍內的初始化參數。
l filter 過濾器元素將一個名字與一個實現javax.servlet.Filter接口的類相關聯。
l filter-mapping 一旦命名了一個過濾器,就要利用filter-mapping元素把它與一個或多個servlet或JSP頁面相關聯。
l listener servlet API的版本2.3增長了對事件監聽程序的支持,事件監聽程序在創建、修改和刪除會話或servlet環境時獲得通知。Listener元素指出事件監聽程序類。
l servlet 在向servlet或JSP頁面制定初始化參數或定製URL時,必須首先命名servlet或JSP頁面。Servlet元素就是用來完成此項任務的。
l servlet-mapping 服務器通常爲servlet提供一個缺省的URL:
http://host/webAppPrefix/servlet/ServletName。可是,經常會更改這個URL,以便servlet能夠訪問初始化參數或更容易地處理相對URL。在更改缺省URL時,使用servlet-mapping元素。
l session-config 若是某個會話在必定時間內未被訪問,服務器能夠拋棄它以節省內存。可經過使用HttpSession的setMaxInactiveInterval方法 明確設置單個會話對象的超時值,或者可利用session-config元素制定缺省超時值。
l mime-mapping 若是Web應用具備想到特殊的文件,但願能保證給他們分配特定的MIME類型,則mime-mapping元素提供這種保證。
l welcom-file-list welcome-file-list元素指示服務器在收到引用一個目錄名而不是文件名的URL時,使用哪一個文件。
l error-page error-page元素使得在返回特定HTTP狀態代碼時,或者特定類型的異常被拋出時,可以制定將要顯示的頁面。
l taglib taglib元素對標記庫描述符文件(Tag Libraryu Descriptor file)指定別名。此功能使你可以更改TLD文件的位置,而不用編輯使用這些文件的JSP頁面。
l resource-env-ref resource-env-ref元素聲明與資源相關的一個管理對象。
l resource-ref resource-ref元素聲明一個資源工廠使用的外部資源。
l security-constraint security-constraint元素制定應該保護的URL。它與login-config元素聯合使用
l login-config 用login-config元素來指定服務器應該怎樣給試圖訪問受保護頁面的用戶受權。它與sercurity-constraint元素聯合使用。
l security-role security-role元素給出安全角色的一個列表,這些角色將出如今servlet元素內的security-role-ref元素的role-name子元素中。分別地聲明角色可以使高級IDE處理安全信息更爲容易。
l env-entry env-entry元素聲明Web應用的環境項。
l ejb-ref ejb-ref元素聲明一個EJB的主目錄的引用。
l ejb-local-ref ejb-local-ref元素聲明一個EJB的本地主目錄的應用。

3 分配名稱和定製的UL

在web.xml中完成的一個最多見的任務是對servlet或JSP頁面給出名稱和定製的URL。用servlet元素分配名稱,使用servlet-mapping元素將定製的URL與剛分配的名稱相關聯。
3.1 分配名稱
爲 了提供初始化參數,對servlet或JSP頁面定義一個定製URL或分配一個安全角色,必須首先給servlet或JSP頁面一個名稱。可經過 servlet元素分配一個名稱。最多見的格式包括servlet-name和servlet-class子元素(在web-app元素內),以下所示:
<servlet>
<servlet-name>Test</servlet-name>
<servlet-class>moreservlets.TestServlet</servlet-class>
</servlet>
這 表示位於WEB-INF/classes/moreservlets/TestServlet的servlet已經獲得了註冊名Test。給 servlet一個名稱具備兩個主要的含義。首先,初始化參數、定製的URL模式以及其餘定製經過此註冊名而不是類名引用此servlet。其次,可在 URL而不是類名中使用此名稱。所以,利用剛纔給出的定義,URL
http://host/webAppPrefix/servlet/Test 可用於 http://host/webAppPrefix/servlet/moreservlets.TestServlet 的場所。
請 記住:XML元素不只是大小寫敏感的,並且定義它們的次序也很重要。例如,web-app元素內全部servlet元素必須位於全部servlet- mapping元素(下一小節介紹)以前,並且還要位於5.6節和5.11節討論的與過濾器或文檔相關的元素(若是有的話)以前。相似地,servlet 的servlet-name子元素也必須出如今servlet-class以前。5.2節"部署描述符文件內的元素次序"將詳細介紹這種必需的次序。
例 如,程序清單5-1給出了一個名爲TestServlet的簡單servlet,它駐留在moreservlets程序包中。由於此servlet是紮根 在一個名爲deployDemo的目錄中的Web應用的組成部分,因此TestServlet.class放在deployDemo/WEB- INF/classes/moreservlets中。程序清單5-2給出將放置在deployDemo/WEB-INF/內的web.xml文件的一部 分。此web.xml文件使用servlet-name和servlet-class元素將名稱Test與TestServlet.class相關聯。圖 5-1和圖5-2分別顯示利用缺省URL和註冊名調用TestServlet時的結果。

程序清單5-1 TestServlet.java
package moreservlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/** Simple servlet used to illustrate servlet naming
* and custom URLs.
* <P>
* Taken from More Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
*
http://www.moreservlets.com/.
* © 2002 Marty Hall; may be freely used or adapted.
*/

public class TestServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String uri = request.getRequestURI();
out.println(ServletUtilities.headWithTitle("Test Servlet") +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H2>URI: " + uri + "</H2>\n" +
"</BODY></HTML>");
}
}


程序清單5-2 web.xml(說明servlet名稱的摘錄)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- … -->
<servlet>
<servlet-name>Test</servlet-name>
<servlet-class>moreservlets.TestServlet</servlet-class>
</servlet>
<!-- … -->
</web-app>

3.2 定義定製的URL
大多數服務器具備一個缺省的serlvet URL:
http://host/webAppPrefix/servlet/packageName.ServletName。 雖然在開發中使用這個URL很方便,可是咱們經常會但願另外一個URL用於部署。例如,可能會須要一個出如今Web應用頂層的URL(如,http: //host/webAppPrefix/Anyname),而且在此URL中沒有servlet項。位於頂層的URL簡化了相對URL的使用。此外,對 許多開發人員來講,頂層URL看上去比更長更麻煩的缺省URL更簡短。
事實上,有時須要使用定製的URL。好比,你可能想關閉缺省URL映射,以便更好地強制實施安全限制或防止用戶意外地訪問無初始化參數的servlet。若是你禁止了缺省的URL,那麼你怎樣訪問servlet呢?這時只有使用定製的URL了。
爲 了分配一個定製的URL,可以使用servlet-mapping元素及其servlet-name和url-pattern子元素。Servlet- name元素提供了一個任意名稱,可利用此名稱引用相應的servlet;url-pattern描述了相對於Web應用的根目錄的URL。url- pattern元素的值必須以斜槓(/)起始。
下面給出一個簡單的web.xml摘錄,它容許使用URL
http://host/webAppPrefix/UrlTest而不是http://host/webAppPrefix/servlet/Test
http: //host/webAppPrefix/servlet/moreservlets.TestServlet。請注意,仍然須要XML頭、 DOCTYPE聲明以及web-app封閉元素。此外,可回憶一下,XML元素出現地次序不是隨意的。特別是,須要把全部servlet元素放在全部 servlet-mapping元素以前。
<servlet>
<servlet-name>Test</servlet-name>
<servlet-class>moreservlets.TestServlet</servlet-class>
</servlet>
<!-- ... -->
<servlet-mapping>
<servlet-name>Test</servlet-name>
<url-pattern>/UrlTest</url-pattern>
</servlet-mapping>
URL模式還能夠包含通配符。例如,下面的小程序指示服務器發送全部以Web應用的URL前綴開始,以..asp結束的請求到名爲BashMS的servlet。
<servlet>
<servlet-name>BashMS</servlet-name>
<servlet-class>msUtils.ASPTranslator</servlet-class>
</servlet>
<!-- ... -->
<servlet-mapping>
<servlet-name>BashMS</servlet-name>
<url-pattern>/*.asp</url-pattern>
</servlet-mapping>
3.3 命名JSP頁面
因 爲JSP頁面要轉換成sevlet,天然但願就像命名servlet同樣命名JSP頁面。畢竟,JSP頁面可能會從初始化參數、安全設置或定製的URL中 受益,正如普通的serlvet那樣。雖然JSP頁面的後臺其實是servlet這句話是正確的,但存在一個關鍵的猜疑:即,你不知道JSP頁面的實際 類名(由於系統本身挑選這個名字)。所以,爲了命名JSP頁面,可將jsp-file元素替換爲servlet-calss元素,以下所示:
<servlet>
<servlet-name>Test</servlet-name>
<jsp-file>/TestPage.jsp</jsp-file>
</servlet>
命 名JSP頁面的緣由與命名servlet的緣由徹底相同:即爲了提供一個與定製設置(如,初始化參數和安全設置)一塊兒使用的名稱,而且,以便能更改激活 JSP頁面的URL(比方說,以便多個URL經過相同頁面得以處理,或者從URL中去掉.jsp擴展名)。可是,在設置初始化參數時,應該注意,JSP頁 面是利用jspInit方法,而不是init方法讀取初始化參數的。
例如,程序清單5-3給出一個名爲TestPage.jsp的簡單JSP頁面,它的工做只是打印出用來激活它的URL的本地部分。TestPage.jsp放置在deployDemo應用的頂層。程序清單5-4給出了用來分配一個註冊名PageName,而後將此註冊名與
http://host/webAppPrefix/UrlTest2/anything 形式的URL相關聯的web.xml文件(即,deployDemo/WEB-INF/web.xml)的一部分。

程序清單5-3 TestPage.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>
JSP Test Page
</TITLE>
</HEAD>
<BODY BGCOLOR="#FDF5E6">
<H2>URI: <%= request.getRequestURI() %></H2>
</BODY>
</HTML>


程序清單5-4 web.xml(說明JSP頁命名的摘錄)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- ... -->
<servlet>
<servlet-name>PageName</servlet-name>
<jsp-file>/TestPage.jsp</jsp-file>
</servlet>
<!-- ... -->
<servlet-mapping>
<servlet-name> PageName </servlet-name>
<url-pattern>/UrlTest2/*</url-pattern>
</servlet-mapping>
<!-- ... -->
</web-app>


4 禁止激活器servlet

對servlet 或JSP頁面創建定製URL的一個緣由是,這樣作能夠註冊從 init(servlet)或jspInit(JSP頁面)方法中讀取得初始化參數。可是,初始化參數只在是利用定製URL模式或註冊名訪問 servlet或JSP頁面時能夠使用,用缺省URL
http://host/webAppPrefix/servlet/ServletName 訪問時不能使用。所以,你可能會但願關閉缺省URL,這樣就不會有人意外地調用初始化servlet了。這個過程有時稱爲禁止激活器servlet,由於 多數服務器具備一個用缺省的servlet URL註冊的標準servlet,並激活缺省的URL應用的實際servlet。
有兩種禁止此缺省URL的主要方法:
l 在每一個Web應用中從新映射/servlet/模式。
l 全局關閉激活器servlet。
重 要的是應該注意到,雖然從新映射每一個Web應用中的/servlet/模式比完全禁止激活servlet所作的工做更多,但從新映射能夠用一種徹底可移植 的方式來完成。相反,全局禁止激活器servlet徹底是針對具體機器的,事實上有的服務器(如ServletExec)沒有這樣的選擇。下面的討論對每 個Web應用從新映射/servlet/ URL模式的策略。後面提供在Tomcat中全局禁止激活器servlet的詳細內容。
4.1 從新映射/servlet/URL模式
在一個特定的Web應用中禁止以
http://host/webAppPrefix/servlet/ 開始的URL的處理很是簡單。所需作的事情就是創建一個錯誤消息servlet,並使用前一節討論的url-pattern元素將全部匹配請求轉向該 servlet。只要簡單地使用:
<url-pattern>/servlet/*</url-pattern>
做爲servlet-mapping元素中的模式便可。
例如,程序清單5-5給出了將SorryServlet servlet(程序清單5-6)與全部以
http://host/webAppPrefix/servlet/ 開頭的URL相關聯的部署描述符文件的一部分。

程序清單5-5 web.xml(說明JSP頁命名的摘錄)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- ... -->
<servlet>
<servlet-name>Sorry</servlet-name>
<servlet-class>moreservlets.SorryServlet</servlet-class>
</servlet>
<!-- ... -->
<servlet-mapping>
<servlet-name> Sorry </servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
<!-- ... -->
</web-app>


程序清單5-6 SorryServlet.java
package moreservlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/** Simple servlet used to give error messages to
* users who try to access default servlet URLs
* (i.e.,
http://host/webAppPrefix/servlet/ServletName)
* in Web applications that have disabled this
* behavior.
* <P>
* Taken from More Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
*
http://www.moreservlets.com/.
* © 2002 Marty Hall; may be freely used or adapted.
*/

public class SorryServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Invoker Servlet Disabled.";
out.println(ServletUtilities.headWithTitle(title) +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H2>" + title + "</H2>\n" +
"Sorry, access to servlets by means of\n" +
"URLs that begin with\n" +
"
http://host/webAppPrefix/servlet/\n" +
"has been disabled.\n" +
"</BODY></HTML>");
}

public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}


4.2 全局禁止激活器:Tomcat
Tomcat 4中用來關閉缺省URL的方法與Tomcat 3中所用的很不相同。下面介紹這兩種方法:
1.禁止激活器: Tomcat 4
Tomcat 4用與前面相同的方法關閉激活器servlet,即利用web.xml中的url-mapping元素進行關閉。不一樣之處在於Tomcat使用了放在 install_dir/conf中的一個服務器專用的全局web.xml文件,而前面使用的是存放在每一個Web應用的WEB-INF目錄中的標準 web.xml文件。
所以,爲了在Tomcat 4中關閉激活器servlet,只需在install_dir/conf/web.xml中簡單地註釋出/servlet/* URL映射項便可,以下所示:
<!--
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
-->
再次提醒,應該注意這個項是位於存放在install_dir/conf的Tomcat專用的web.xml文件中的,此文件不是存放在每一個Web應用的WEB-INF目錄中的標準web.xml。
2.禁止激活器:Tomcat3
在Apache Tomcat的版本3中,經過在install_dir/conf/server.xml中註釋出InvokerInterceptor項全局禁止缺省 servlet URL。例如,下面是禁止使用缺省servlet URL的server.xml文件的一部分。
<!--
<RequsetInterceptor
className="org.apache.tomcat.request.InvokerInterceptor"
debug="0" prefix="/servlet/" />
-->

5 初始化和預裝載servlet與JSP頁面

這裏討論控制servlet和JSP頁面的啓動行爲的方法。特別是,說明了怎樣分配初始化參數以及怎樣更改服務器生存期中裝載servlet和JSP頁面的時刻。
5.1 分配servlet初始化參數
利 用init-param元素向servlet提供初始化參數,init-param元素具備param-name和param-value子元素。例如, 在下面的例子中,若是initServlet servlet是利用它的註冊名(InitTest)訪問的,它將可以從其方法中調用getServletConfig(). getInitParameter("param1")得到"Value 1",調用getServletConfig().getInitParameter("param2")得到"2"。
<servlet>
<servlet-name>InitTest</servlet-name>
<servlet-class>moreservlets.InitServlet</servlet-class>
<init-param>
<param-name>param1</param-name>
<param-value>value1</param-value>
</init-param>
<init-param>
<param-name>param2</param-name>
<param-value>2</param-value>
</init-param>
</servlet>
在涉及初始化參數時,有幾點須要注意:
l 返回值。GetInitParameter的返回值老是一個String。所以,在前一個例子中,可對param2使用Integer.parseInt得到一個int。
l JSP中的初始化。JSP頁面使用jspInit而不是init。JSP頁面還須要使用jsp-file元素代替servlet-class。
l 缺省URL。初始化參數只在經過它們的註冊名或與它們註冊名相關的定製URL模式訪問Servlet時能夠使用。所以,在這個例子中,param1和 param2初始化參數將可以在使用URL
http://host/webAppPrefix/servlet/InitTest 時可用,但在使用URL http://host/webAppPrefix/servlet/myPackage.InitServlet 時不能使用。
例如,程序清單5-7給出一個名爲InitServlet的簡單servlet,它使用init方法設置firstName和emailAddress字段。程序清單5-8給出分配名稱InitTest給servlet的web.xml文件。
程序清單5-7 InitServlet.java
package moreservlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/** Simple servlet used to illustrate servlet
* initialization parameters.
* <P>
* Taken from More Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
*
http://www.moreservlets.com/.
* © 2002 Marty Hall; may be freely used or adapted.
*/

public class InitServlet extends HttpServlet {
private String firstName, emailAddress;

public void init() {
ServletConfig config = getServletConfig();
firstName = config.getInitParameter("firstName");
emailAddress = config.getInitParameter("emailAddress");
}

public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String uri = request.getRequestURI();
out.println(ServletUtilities.headWithTitle("Init Servlet") +
"<BODY BGCOLOR=\"#FDF5E6\">\n" +
"<H2>Init Parameters:</H2>\n" +
"<UL>\n" +
"<LI>First name: " + firstName + "\n" +
"<LI>Email address: " + emailAddress + "\n" +
"</UL>\n" +
"</BODY></HTML>");
}
}


程序清單5-8 web.xml(說明初始化參數的摘錄)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- ... -->
<servlet>
<servlet-name>InitTest</servlet-name>
<servlet-class>moreservlets.InitServlet</servlet-class>
<init-param>
<param-name>firstName</param-name>
<param-value>Larry</param-value>
</init-param>
<init-param>
<param-name>emailAddress</param-name>
<param-value>
Ellison@Microsoft.com</param-value>
</init-param>
</servlet>
<!-- ... -->
</web-app>

5.2 分配JSP初始化參數
給JSP頁面提供初始化參數在三個方面不一樣於給servlet提供初始化參數。
1)使用jsp-file而不是servlet-class。所以,WEB-INF/web.xml文件的servlet元素以下所示:
<servlet>
<servlet-name>PageName</servlet-name>
<jsp-file>/RealPage.jsp</jsp-file>
<init-param>
<param-name>...</param-name>
<param-value>...</param-value>
</init-param>
...
</servlet>
2) 幾乎老是分配一個明確的URL模式。對servlet,通常相應地使用以
http://host/webAppPrefix/servlet/ 開始的缺省URL。只需記住,使用註冊名而不是原名稱便可。這對於JSP頁面在技術上也是合法的。例如,在上面給出的例子中,可用URL http://host/webAppPrefix/servlet/PageName 訪問RealPage.jsp的對初始化參數具備訪問權的版本。但在用於JSP頁面時,許多用戶彷佛不喜歡應用常規的servlet的URL。此外,若是 JSP頁面位於服務器爲其提供了目錄清單的目錄中(如,一個既沒有index.html也沒有index.jsp文件的目錄),則用戶可能會鏈接到此 JSP頁面,單擊它,從而意外地激活未初始化的頁面。所以,好的辦法是使用url-pattern(5.3節)將JSP頁面的原URL與註冊的 servlet名相關聯。這樣,客戶機可以使用JSP頁面的普通名稱,但仍然激活定製的版本。例如,給定來自項目1的servlet定義,可以使用下面的 servlet-mapping定義:
<servlet-mapping>
<servlet-name>PageName</servlet-name>
<url-pattern>/RealPage.jsp</url-pattern>
</servlet-mapping>
3)JSP頁使用jspInit而不是init。自動從JSP頁面創建的servlet或許已經使用了inti方法。所以,使用JSP聲明提供一個init方法是不合法的,必須制定jspInit方法。
爲了說明初始化JSP頁面的過程,程序清單5-9給出了一個名爲InitPage.jsp的JSP頁面,它包含一個jspInit方法且放置於 deployDemo Web應用層次結構的頂層。通常,
http://host/deployDemo/InitPage.jsp 形式的URL將激活此頁面的不具備初始化參數訪問權的版本,從而將對firstName和emailAddress變量顯示null。可是, web.xml文件(程序清單5-10)分配了一個註冊名,而後將該註冊名與URL模式/InitPage.jsp相關聯。

程序清單5-9 InitPage.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD><TITLE>JSP Init Test</TITLE></HEAD>
<BODY BGCOLOR="#FDF5E6">
<H2>Init Parameters:</H2>
<UL>
<LI>First name: <%= firstName %>
<LI>Email address: <%= emailAddress %>
</UL>
</BODY></HTML>
<%!
private String firstName, emailAddress;

public void jspInit() {
ServletConfig config = getServletConfig();
firstName = config.getInitParameter("firstName");
emailAddress = config.getInitParameter("emailAddress");
}
%>


程序清單5-10 web.xml(說明JSP頁面的init參數的摘錄)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- ... -->
<servlet>
<servlet-name>InitPage</servlet-name>
<jsp-file>/InitPage.jsp</jsp-file>
<init-param>
<param-name>firstName</param-name>
<param-value>Bill</param-value>
</init-param>
<init-param>
<param-name>emailAddress</param-name>
<param-value>
gates@oracle.com</param-value>
</init-param>
</servlet>
<!-- ... -->
<servlet-mapping>
<servlet-name> InitPage</servlet-name>
<url-pattern>/InitPage.jsp</url-pattern>
</servlet-mapping>
<!-- ... -->
</web-app>


5.3 提供應用範圍內的初始化參數
一 般,對單個地servlet或JSP頁面分配初始化參數。指定的servlet或JSP頁面利用ServletConfig的 getInitParameter方法讀取這些參數。可是,在某些情形下,但願提供可由任意servlet或JSP頁面藉助ServletContext 的getInitParameter方法讀取的系統範圍內的初始化參數。
可利用context-param元素聲明這些系統範圍內的初始化值。context-param元素應該包含param-name、param-value以及可選的description子元素,以下所示:
<context-param>
<param-name>support-email</param-name>
<param-value>
blackhole@mycompany.com</param-value>
</context-param>
可 回憶一下,爲了保證可移植性,web.xml內的元素必須以正確的次序聲明。但這裏應該注意,context-param元素必須出現任意與文檔有關的元 素(icon、display-name或description)以後及filter、filter-mapping、listener或 servlet元素以前。
5.4 在服務器啓動時裝載servlet
假如servlet或JSP頁面有一個要花很長時間執行的init (servlet)或jspInit(JSP)方法。例如,假如init或jspInit方法從某個數據庫或ResourceBundle查找產量。這種 狀況下,在第一個客戶機請求時裝載servlet的缺省行爲將對第一個客戶機產生較長時間的延遲。所以,可利用servlet的load-on- startup元素規定服務器在第一次啓動時裝載servlet。下面是一個例子。
<servlet>
<servlet-name> … </servlet-name>
<servlet-class> … </servlet-class> <!-- Or jsp-file -->
<load-on-startup/>
</servlet>
可 覺得此元素體提供一個整數而不是使用一個空的load-on-startup。想法是服務器應該在裝載較大數目的servlet或JSP頁面以前裝載較少 數目的servlet或JSP頁面。例如,下面的servlet項(放置在Web應用的WEB-INF目錄下的web.xml文件中的web-app元素 內)將指示服務器首先裝載和初始化SearchServlet,而後裝載和初始化由位於Web應用的result目錄中的index.jsp文件產生的 servlet。
<servlet>
<servlet-name>Search</servlet-name>
<servlet-class>myPackage.SearchServlet</servlet-class> <!-- Or jsp-file -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>Results</servlet-name>
<servlet-class>/results/index.jsp</servlet-class> <!-- Or jsp-file -->
<load-on-startup>2</load-on-startup>
</servlet>

6 聲明過濾器

servlet版本2.3引入了過濾器的概念。雖然全部支持servlet API版本2.3的服務器都支持過濾器,但爲了使用與過濾器有關的元素,必須在web.xml中使用版本2.3的DTD。
過 濾器可截取和修改進入一個servlet或JSP頁面的請求或從一個servlet或JSP頁面發出的相應。在執行一個servlet或JSP頁面以前, 必須執行第一個相關的過濾器的doFilter方法。在該過濾器對其FilterChain對象調用doFilter時,執行鏈中的下一個過濾器。若是沒 有其餘過濾器,servlet或JSP頁面被執行。過濾器具備對到來的ServletRequest對象的所有訪問權,所以,它們能夠查看客戶機名、查找 到來的cookie等。爲了訪問servlet或JSP頁面的輸出,過濾器可將響應對象包裹在一個替身對象(stand-in object)中,比方說把輸出累加到一個緩衝區。在調用FilterChain對象的doFilter方法以後,過濾器可檢查緩衝區,若有必要,就對它 進行修改,而後傳送到客戶機。
例如,程序清單5-11帝國難以了一個簡單的過濾器,只要訪問相關的servlet或JSP頁面,它就截取請求並在標準輸出上打印一個報告(開發過程當中在桌面系統上運行時,大多數服務器均可以使用這個過濾器)。

程序清單5-11 ReportFilter.java
package moreservlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

/** Simple filter that prints a report on the standard output
* whenever the associated servlet or JSP page is accessed.
* <P>
* Taken from More Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
*
http://www.moreservlets.com/.
* © 2002 Marty Hall; may be freely used or adapted.
*/

public class ReportFilter implements Filter {
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws ServletException, IOException {
HttpServletRequest req = (HttpServletRequest)request;
System.out.println(req.getRemoteHost() +
" tried to access " +
req.getRequestURL() +
" on " + new Date() + ".");
chain.doFilter(request,response);
}

public void init(FilterConfig config)
throws ServletException {
}

public void destroy() {}
}

一 旦創建了一個過濾器,能夠在web.xml中利用filter元素以及filter-name(任意名稱)、file-class(徹底限定的類名)和 (可選的)init-params子元素聲明它。請注意,元素在web.xml的web-app元素中出現的次序不是任意的;容許服務器(但不是必需的) 強制所需的次序,而且實際中有些服務器也是這樣作的。但這裏要注意,全部filter元素必須出如今任意filter-mapping元素以前, filter-mapping元素又必須出如今全部servlet或servlet-mapping元素以前。
例如,給定上述的ReportFilter類,可在web.xml中做出下面的filter聲明。它把名稱Reporter與實際的類ReportFilter(位於moreservlets程序包中)相關聯。
<filter>
<filter-name>Reporter</filter-name>
<filter-class>moresevlets.ReportFilter</filter-class>
</filter>
一旦命名了一個過濾器,可利用filter-mapping元素把它與一個或多個servlet或JSP頁面相關聯。關於此項工做有兩種選擇。
首 先,可以使用filter-name和servlet-name子元素把此過濾器與一個特定的servlet名(此servlet名必須稍後在相同的 web.xml文件中使用servlet元素聲明)關聯。例如,下面的程序片段指示系統只要利用一個定製的URL訪問名爲SomeServletName 的servlet或JSP頁面,就運行名爲Reporter的過濾器。
<filter-mapping>
<filter-name>Reporter</filter-name>
<servlet-name>SomeServletName</servlet-name>
</filter-mapping>
其次,可利用filter-name和url-pattern子元素將過濾器與一組servlet、JSP頁面或靜態內容相關聯。例如,相面的程序片斷指示系統只要訪問Web應用中的任意URL,就運行名爲Reporter的過濾器。
<filter-mapping>
<filter-name>Reporter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
例 如,程序清單5-12給出了將ReportFilter過濾器與名爲PageName的servlet相關聯的web.xml文件的一部分。名字 PageName依次又與一個名爲TestPage.jsp的JSP頁面以及以模式http: //host/webAppPrefix/UrlTest2/ 開頭的URL相關聯。TestPage.jsp的源代碼已經JSP頁面命名的談論在前面的3節"分配名稱和定製的URL"中給出。事實上,程序清單5- 12中的servlet和servlet-name項從該節原封不動地拿過來的。給定這些web.xml項,可看到下面的標準輸出形式的調試報告(換行是 爲了容易閱讀)。
audit.irs.gov tried to access
http://mycompany.com/deployDemo/UrlTest2/business/tax-plan.html
on Tue Dec 25 13:12:29 EDT 2001.

程序清單5-12 Web.xml(說明filter用法的摘錄)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<filter>
<filter-name>Reporter</filter-name>
<filter-class>moresevlets.ReportFilter</filter-class>
</filter>
<!-- ... -->
<filter-mapping>
<filter-name>Reporter</filter-name>
<servlet-name>PageName</servlet-name>
</filter-mapping>
<!-- ... -->
<servlet>
<servlet-name>PageName</servlet-name>
<jsp-file>/RealPage.jsp</jsp-file>
</servlet>
<!-- ... -->
<servlet-mapping>
<servlet-name> PageName </servlet-name>
<url-pattern>/UrlTest2/*</url-pattern>
</servlet-mapping>
<!-- ... -->
</web-app>


7 指定歡迎頁

假 如用戶提供了一個像http: //host/webAppPrefix/directoryName/ 這樣的包含一個目錄名但沒有包含文件名的URL,會發生什麼事情呢?用戶能獲得一個目錄表?一個錯誤?仍是標準文件的內容?若是獲得標準文件內容,是 index.html、index.jsp、default.html、default.htm或別的什麼東西呢?
Welcome-file-list 元素及其輔助的welcome-file元素解決了這個模糊的問題。例如,下面的web.xml項指出,若是一個URL給出一個目錄名但未給出文件名,服 務器應該首先試用index.jsp,而後再試用index.html。若是二者都沒有找到,則結果有賴於所用的服務器(如一個目錄列表)。
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
雖然許多服務器缺省遵循這種行爲,但不必定必須這樣。所以,明確地使用welcom-file-list保證可移植性是一種良好的習慣。

8 指定處理錯誤的頁面

現 在我瞭解到,你在開發servlet和JSP頁面時從不會犯錯誤,並且你的全部頁面是那樣的清晰,通常的程序員都不會被它們的搞糊塗。可是,是人總會犯錯 誤的,用戶可能會提供不合規定的參數,使用不正確的URL或者不能提供必需的表單字段值。除此以外,其它開發人員可能不那麼細心,他們應該有些工具來克服 本身的不足。
error-page元素就是用來克服這些問題的。它有兩個可能的子元素,分別是:error-code和exception- type。第一個子元素error-code指出在給定的HTTP錯誤代碼出現時使用的URL。第二個子元素excpetion-type指出在出現某個 給定的Java異常但未捕捉到時使用的URL。error-code和exception-type都利用location元素指出相應的URL。此 URL必須以/開始。location所指出的位置處的頁面可經過查找HttpServletRequest對象的兩個專門的屬性來訪問關於錯誤的信息, 這兩個屬性分別是:javax.servlet.error.status_code和javax.servlet.error.message。
可回憶一下,在web.xml內以正確的次序聲明web-app的子元素很重要。這裏只要記住,error-page出如今web.xml文件的末尾附近,servlet、servlet-name和welcome-file-list以後便可。

8.1 error-code元素
爲了更好地瞭解error-code元素的值,可考慮一下若是不正確地輸入文件名,大多數站點會做出什麼反映。這樣作通常會出現一個404錯誤信息,它表示不能找到該文件,但幾乎沒提供更多有用的信息。另外一方面,能夠試一下在
www.microsoft.comwww.ibm.com 處或者特別是在www.bea.com 處輸出未知的文件名。這是會得出有用的消息,這些消息提供可選擇的位置,以便查找感興趣的頁面。提供這樣有用的錯誤頁面對於Web應用來講是頗有價值得。 事實上rm-error-page子元素)。由form-login-page給出的HTML表單必須具備一個j_security_check的 ACTION屬性、一個名爲j_username的用戶名文本字段以及一個名爲j_password的口令字段。
例如,程序清單5-19指示服務器使用基於表單的驗證。Web應用的頂層目錄中的一個名爲login.jsp的頁面將收集用戶名和口令,而且失敗的登錄將由相同目錄中名爲login-error.jsp的頁面報告。

程序清單5-19 web.xml(說明login-config的摘錄)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- ... -->
<security-constraint> ... </security-constraint>
<login-config>
<auth-method> FORM </auth-method>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/login-error.jsp</form-error-page>
</form-login-config>
</login-config>
<!-- ... -->
</web-app>


9.2 限制對Web資源的訪問
現 在,能夠指示服務器使用何種驗證方法了。"了不得,"你說道,"除非我能指定一個來收到保護的 URL,不然沒有多大用處。"沒錯。指出這些URL並說明他們應該獲得何種保護正是security-constriaint元素的用途。此元素在 web.xml中應該出如今login-config的緊前面。它包含是個可能的子元素,分別是:web-resource-collection、 auth-constraint、user-data-constraint和display-name。下面各小節對它們進行介紹。
l web-resource-collection
此 元素肯定應該保護的資源。全部security-constraint元素都必須包含至少一個web-resource-collection項。此元素 由一個給出任意標識名稱的web-resource-name元素、一個肯定應該保護的URL的url-pattern元素、一個指出此保護所適用的 HTTP命令(GET、POST等,缺省爲全部方法)的http-method元素和一個提供資料的可選description元素組成。例如,下面的 Web-resource-collection項(在security-constratint元素內)指出Web應用的proprietary目錄中 全部文檔應該受到保護。
<security-constraint>
<web-resource-coolection>
<web-resource-name>Proprietary</web-resource-name>
<url-pattern>/propritary/*</url-pattern>
</web-resource-coolection>
<!-- ... -->
</security-constraint>
重 要的是應該注意到,url-pattern僅適用於直接訪問這些資源的客戶機。特別是,它不適合於經過MVC體系結構利用 RequestDispatcher來訪問的頁面,或者不適合於利用相似jsp:forward的手段來訪問的頁面。這種不勻稱若是利用得當的話頗有好 處。例如,servlet可利用MVC體系結構查找數據,把它放到bean中,發送請求到從bean中提取數據的JSP頁面並顯示它。咱們但願保證決不直 接訪問受保護的JSP頁面,而只是經過創建該頁面將使用的bean的servlet來訪問它。url-pattern和auth-contraint元素 可經過聲明不容許任何用戶直接訪問JSP頁面來提供這種保證。可是,這種不勻稱的行爲可能讓開發人員放鬆警戒,使他們偶然對應受保護的資源提供不受限制的 訪問。
l auth-constraint
儘管web-resource-collention元素質出了哪些URL應該受到保護, 可是auth-constraint元素卻指出哪些用戶應該具備受保護資源的訪問權。此元素應該包含一個或多個標識具備訪問權限的用戶類別role- name元素,以及包含(可選)一個描述角色的description元素。例如,下面web.xml中的security-constraint元素部 門規定只有指定爲Administrator或Big Kahuna(或二者)的用戶具備指定資源的訪問權。
<security-constraint>
<web-resource-coolection> ... </web-resource-coolection>
<auth-constraint>
<role-name>administrator</role-name>
<role-name>kahuna</role-name>
</auth-constraint>
</security-constraint>
重要的是認識到,到此爲止,這個過程的可移植部分結束了。服務器怎樣肯定哪些用戶處於任何角色以及它怎樣存放用戶的口令,徹底有賴於具體的系統。
例如,Tomcat使用install_dir/conf/tomcat-users.xml將用戶名與角色名和口令相關聯,正以下面例子中所示,它指出用戶joe(口令bigshot)和jane(口令enaj)屬於administrator和kahuna角色。
<tomcat-users>
<user name="joe" password="bigshot" roles="administrator,kahuna" />
<user name="jane" password="enaj" roles="kahuna" />
</tomcat-users>
l user-data-constraint
這 個可選的元素指出在訪問相關資源時使用任何傳輸層保護。它必須包含一個transport-guarantee子元素(合法值爲NONE、 INTEGRAL或CONFIDENTIAL),而且可選地包含一個description元素。transport-guarantee爲NONE值將 對所用的通信協議不加限制。INTEGRAL值表示數據必須以一種防止截取它的人閱讀它的方式傳送。雖然原理上(而且在將來的HTTP版本中),在 INTEGRAL和CONFIDENTIAL之間可能會有差異,但在當前實踐中,他們都只是簡單地要求用SSL。例如,下面指示服務器只容許對相關資源作 HTTPS鏈接:
<security-constraint>
<!-- ... -->
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
l display-name
security-constraint的這個不多使用的子元素給予可能由GUI工具使用的安全約束項一個名稱。
9.3 分配角色名
迄今爲止,討論已經集中到徹底由容器(服務器)處理的安全問題之上了。但servlet以及JSP頁面也可以處理它們本身的安全問題。
例 如,容器可能容許用戶從bigwig或bigcheese角色訪問一個顯示主管人員額外緊貼的頁面,但只容許bigwig用戶修改此頁面的參數。完成這種 更細緻的控制的一種常見方法是調用HttpServletRequset的isUserInRole方法,並據此修改訪問。
Servlet的 security-role-ref子元素提供出如今服務器專用口令文件中的安全角色名的一個別名。例如,假如編寫了一個調用 request.isUserInRole("boss")的servlet,但後來該servlet被用在了一個其口令文件調用角色manager而不 是boss的服務器中。下面的程序段使該servlet可以使用這兩個名稱中的任何一個。
<servlet>
<!-- ... -->
<security-role-ref>
<role-name>boss</role-name> <!-- New alias -->
<role-link>manager</role-link> <!-- Real name -->
</security-role-ref>
</servlet>
也能夠在web-app內利用security-role元素提供將出如今role-name元素中的全部安全角色的一個全局列表。分別地生命角色使高級IDE容易處理安全信息。

10 控制會話超時

如 果某個會話在必定的時間內未被訪問,服務器可把它扔掉以節約內存。可利用HttpSession的setMaxInactiveInterval方法直接 設置個別會話對象的超時值。若是不採用這種方法,則缺省的超時值由具體的服務器決定。但可利用session-config和session- timeout元素來給出一個適用於全部服務器的明確的超時值。超時值的單位爲分鐘,所以,下面的例子設置缺省會話超時值爲三個小時(180分鐘)。
<session-config>
<session-timeout>180</session-timeout>
</session-config>

11 Web應用的文檔化

越 來越多的開發環境開始提供servlet和JSP的直接支持。例子有Borland Jbuilder Enterprise Edition、Macromedia UltraDev、Allaire JRun Studio(寫此文時,已被Macromedia收購)以及IBM VisuaAge for Java等。
大量的web.xml元素不只是爲服務器設計的,並且仍是爲可視開發環境設計的。它們包括icon、display-name和discription等。
可回憶一下,在web.xml內以適當地次序聲明web-app子元素很重要。不過,這裏只要記住icon、display-name和description是web.xml的web-app元素內的前三個合法元素便可。
l icon
icon元素指出GUI工具可用來表明Web應用的一個和兩個圖像文件。可利用small-icon元素指定一幅16 x 16的GIF或JPEG圖像,用large-icon元素指定一幅32 x 32的圖像。下面舉一個例子:
<icon>
<small-icon>/images/small-book.gif</small-icon>
<large-icon>/images/tome.jpg</large-icon>
</icon>
l display-name
display-name元素提供GUI工具可能會用來標記此Web應用的一個名稱。下面是個例子。
<display-name>Rare Books</display-name>
l description
description元素提供解釋性文本,以下所示:
<description>
This Web application represents the store developed for
rare-books.com, an online bookstore specializing in rare
and limited-edition books.
</description>

12 關聯文件與MIME類型

服 務器通常都具備一種讓Web站點管理員將文件擴展名與媒體相關聯的方法。例如,將會自動給予名爲mom.jpg的文件一個image/jpeg的MIME 類型。可是,假如你的Web應用具備幾個不尋常的文件,你但願保證它們在發送到客戶機時分配爲某種MIME類型。mime-mapping元素(具備 extension和mime-type子元素)可提供這種保證。例如,下面的代碼指示服務器將application/x-fubar的MIME類型分 配給全部以.foo結尾的文件。
<mime-mapping>
<extension>foo</extension>
<mime-type>application/x-fubar</mime-type>
</mime-mapping>
或許,你的Web應用但願重載(override)標準的映射。例如,下面的代碼將告訴服務器在發送到客戶機時指定.ps文件做爲純文本(text/plain)而不是做爲PostScript(application/postscript)。
<mime-mapping>
<extension>ps</extension>
<mime-type>application/postscript</mime-type>
</mime-mapping>


13 定位TLD

JSP taglib元素具備一個必要的uri屬性,它給出一個TLD(Tag Library Descriptor)文件相對於Web應用的根的位置。TLD文件的實際名稱在發佈新的標籤庫版本時可能會改變,但咱們但願避免更改全部現有JSP頁 面。此外,可能還但願使用保持taglib元素的簡練性的一個簡短的uri。這就是部署描述符文件的taglib元素派用場的所在了。Taglib包含兩 個子元素:taglib-uri和taglib-location。taglib-uri元素應該與用於JSP taglib元素的uri屬性的東西相匹配。Taglib-location元素給出TLD文件的實際位置。例如,假如你將文件chart-tags- 1.3beta.tld放在WebApp/WEB-INF/tlds中。如今,假如web.xml在web-app元素內包含下列內容。
<taglib>
<taglib-uri>/charts.tld</taglib-uri>
<taglib-location>
/WEB-INF/tlds/chart-tags-1.3beta.tld
</taglib-location>
</taglib>
給出這個說明後,JSP頁面可經過下面的簡化形式使用標籤庫。
<%@ taglib uri="/charts.tld" prefix="somePrefix" %>

14 指定應用事件監聽程序

應用事件監聽器程序是創建或修改servlet環境或會話對象時通知的類。它們是servlet規範的版本2.3中的新內容。這裏只簡單地說明用來向Web應用註冊一個監聽程序的web.xml的用法。
註冊一個監聽程序涉及在web.xml的web-app元素內放置一個listener元素。在listener元素內,listener-class元素列出監聽程序的完整的限定類名,以下所示:
<listener>
<listener-class>package.ListenerClass</listener-class>
</listener>
雖 然listener元素的結構很簡單,但請不要忘記,必須正確地給出web-app元素內的子元素的次序。listener元素位於全部的servlet 元素以前以及全部filter-mapping元素以後。此外,由於應用生存期監聽程序是serlvet規範的2.3版本中的新內容,因此必須使用 web.xml DTD的2.3版本,而不是2.2版本。
例如,程序清單5-20給出一個名爲ContextReporter的簡單的監聽程序, 只要Web應用的Servlet-Context創建(如裝載Web應用)或消除(如服務器關閉)時,它就在標準輸出上顯示一條消息。程序清單5-21給 出此監聽程序註冊所須要的web.xml文件的一部分。

程序清單5-20 ContextReporterjava
package moreservlets;

import javax.servlet.*;
import java.util.*;

/** Simple listener that prints a report on the standard output
* when the ServletContext is created or destroyed.
* <P>
* Taken from More Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
*
http://www.moreservlets.com/.
* © 2002 Marty Hall; may be freely used or adapted.
*/

public class ContextReporter implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
System.out.println("Context created on " +
new Date() + ".");
}

public void contextDestroyed(ServletContextEvent event) {
System.out.println("Context destroyed on " +
new Date() + ".");
}
}


程序清單5-21 web.xml(聲明一個監聽程序的摘錄)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<!-- ... -->
<filter-mapping> … </filter-mapping>
<listener>
<listener-class>package.ListenerClass</listener-class>
</listener>
<servlet> ... </servlet>
<!-- ... -->
</web-app>


15 J2EE元素

本節描述用做J2EE環境組成部分的Web應用的web.xml元素。這裏將提供一個簡明的介紹,詳細內容能夠參閱
http://java.sun.com/j2ee/j2ee-1_3-fr-spec.pdf的Java 2 Plantform Enterprise Edition版本1.3規範的第5章。
l distributable
distributable 元素指出,Web應用是以這樣的方式編程的:即,支持集羣的服務器可安全地在多個服務器上分佈Web應用。例如,一個可分佈的應用必須只使用 Serializable對象做爲其HttpSession對象的屬性,並且必須避免用實例變量(字段)來實現持續性。distributable元素直 接出如今discription元素以後,而且不包含子元素或數據,它只是一個以下的標誌。
<distributable />
l resource-env-ref
resource -env-ref元素聲明一個與某個資源有關的管理對象。此元素由一個可選的description元素、一個resource-env-ref- name元素(一個相對於java:comp/env環境的JNDI名)以及一個resource-env-type元素(指定資源類型的徹底限定的 類),以下所示:
<resource-env-ref>
<resource-env-ref-name>
jms/StockQueue
</resource-env-ref-name>
<resource-env-ref-type>
javax.jms.Queue
</resource-env-ref-type>
</resource-env-ref>
l env-entry
env -entry元素聲明Web應用的環境項。它由一個可選的description元素、一個env-entry-name元素(一個相對於java: comp/env環境JNDI名)、一個env-entry-value元素(項值)以及一個env-entry-type元素(java.lang程序 包中一個類型的徹底限定類名,java.lang.Boolean、java.lang.String等)組成。下面是一個例子:
<env-entry>
<env-entry-name>minAmout</env-entry-name>
<env-entry-value>100.00</env-entry-value>
<env-entry-type>minAmout</env-entry-type>
</env-entry>
l ejb-ref
ejb -ref元素聲明對一個EJB的主目錄的應用。它由一個可選的description元素、一個ejb-ref-name元素(相對於java: comp/env的EJB應用)、一個ejb-ref-type元素(bean的類型,Entity或Session)、一個home元素(bean的主 目錄接口的徹底限定名)、一個remote元素(bean的遠程接口的徹底限定名)以及一個可選的ejb-link元素(當前bean連接的另外一個 bean的名稱)組成。
l ejb-local-ref
ejb-local-ref元素聲明一個EJB的本地主目錄的引用。除了用local-home代替home外,此元素具備與ejb-ref元素相同的屬性並以相同的方式使用。

給你的session加個監聽器

有人問我怎麼實如今網頁裏顯示在線用戶的名稱——他已經使用了session,可是沒法處理用戶離開的狀況,而後致使在線用戶列表的無限增大。跟他 說了本身在application中進行超時檢查,更新application的時候就比較當前全部列表中的session是否超過本身指定的時間間隔。 後來想了想,又給他提了使用給session加監聽器的方法。可是提的時候本身也沒有作過,因此只是說這種方式很複雜,建議他仍是本身進行超時檢查。剛纔 又看了看資料,發現實際上給session加監聽器的方式很簡單,不由以爲本身有點誤人子弟了,如今將方法寫在這,藉以告誡本身之後要嚴謹。
首先寫一個SessionBinder類,它實現了HttpSessionBindingListener接口的valueBound方法和valueUnbound方法,示例代碼以下:
public class SessionBinder implements HttpSessionBindingListener {
  public void valueBound(HttpSessionBindingEvent event){
    //you can do anything you want!this method will be called when this binder is bind with any session.
  }

  public void valueUnbound(HttpSessionBindingEvent event) {
    //you can do something while this session is invalidate
  }
}
如今寫好了SessionBinder,咱們如今選擇在一個servlet中向session中加入這個監聽器——在jsp中的代碼書寫與此相同
//省略前面的代碼,此操做可能發生在servlet的doGet方法中,也多是doPost方法中
  HttpSession session = req.getSession(true);//首先得到須要加入監聽器的session對象,req是HttpRequest對象
  SessionBinder sb = new SessionBinder();//創建一個監聽器對象
  session.putValue("BinderObject",sb);//將監聽器加入此session中,今後時開始執行sb的valueBound方法
//省略後面的代碼
隨後,若是整個session超時或者被用戶停止以後,sb的valueUnbound自動執行
呵呵,以上代碼以供參考

******************************************************************************************************************
還能夠參考:http://java.sun.com/dtd/web-app_2_3.dtd
符號說明:
1. <!ELEMENT 是元素的聲明,說明你要定義的是一個元素;

     <!ATTLIST  是屬性的聲明
2. #PCDATA包含字符或文本數據
3. "," 子元素使用逗號分隔排序; "|"表示或者;
<MYFILE (name,address?,email+,phone*)>
4.name 只能使用一次;
5.address? 使用一次或者不使用
6.email+ 使用至少一次或屢次
7.phone* 使用一次,屢次,或者根本不使用
<!-- The web-app element is the root of the deployment descriptor for a web application. --> <!ELEMENT web-app (icon?, display-name?, description?, distributable?, context-param*, filter*, filter-mapping*, listener*, servlet*, servlet-mapping*, session-config?, mime-mapping*, welcome-file-list?, error-page*, taglib*, resource-env-ref*, resource-ref*, security-constraint*, login-config?, security-role*, env-entry*, ejb-ref*, ejb-local-ref*)> <!-- The auth-constraint element indicates the user roles that should be permitted access to this resource collection. The role-name used here must either correspond to the role-name of one of the security-role elements defined for this web application, or be the specially reserved role-name "*" that is a compact syntax for indicating all roles in the web application. If both "*" and rolenames appear, the container interprets this as all roles. If no roles are defined, no user is allowed access to the portion of the web application described by the containing security-constraint. The container matches role names case sensitively when determining access. Used in: security-constraint --> <!ELEMENT auth-constraint (description?, role-name*)> <!-- The auth-method element is used to configure the authentication mechanism for the web application. As a prerequisite to gaining access to any web resources which are protected by an authorization constraint, a user must have authenticated using the configured mechanism. Legal values for this element are "BASIC", "DIGEST", "FORM", or "CLIENT-CERT". Used in: login-config --> <!ELEMENT auth-method (#PCDATA)> <!-- The context-param element contains the declaration of a web application's servlet context initialization parameters. Used in: web-app --> <!ELEMENT context-param (param-name, param-value, description?)> <!-- The description element is used to provide text describing the parent element. The description element should include any information that the web application war file producer wants to provide to the consumer of the web application war file (i.e., to the Deployer). Typically, the tools used by the web application war file consumer will display the description when processing the parent element that contains the description. Used in: auth-constraint, context-param, ejb-local-ref, ejb-ref, env-entry, filter, init-param, resource-env-ref, resource-ref, run-as, security-role, security-role-ref, servlet, user-data-constraint, web-app, web-resource-collection --> <!ELEMENT description (#PCDATA)> <!-- The display-name element contains a short name that is intended to be displayed by tools. The display name need not be unique. Used in: filter, security-constraint, servlet, web-app Example: <display-name>Employee Self Service</display-name> --> <!ELEMENT display-name (#PCDATA)> <!-- The distributable element, by its presence in a web application deployment descriptor, indicates that this web application is programmed appropriately to be deployed into a distributed servlet container Used in: web-app --> <!ELEMENT distributable EMPTY>    ligm2008 發佈於 2006-04-23 13:14:25 | 瀏覽[79] |評論[0]
2006-04-23 [評論] [寫信問候]
Java路在何方?  
「Java產生於網絡」,這是幾年前java程序員一直津津樂道的話題,伴隨着互聯網的蓬勃發展,Java也曾有一股氣吞山河,一統天下之勢。然而今天,咱們看到PHP佔領全球網站應用的大半市場,Microsoft的ASP及.net佔領了很大一部份市場(看看國內的各類網站、看看中國的黨政網),還有其它Web開發語言也佔據了一部份,最後剩下給Java可謂寥寥無幾。PHP正在以他深得人心的簡易開發優點快速擴張,現在又冒出個新貴Rails/Ruby在後面耀武揚威宣稱要替代Java、消滅Java。咱們不由感嘆:Java路在何方?

成也蕭何,敗也蕭何。咱們認爲,形成Java今天之局面的一個主要因素是Java技術的極度靈活,Java技術領域的「有組織、無紀律」。動不動JCP就給你搞一個Specification,管你怎麼去實現;Java開發社區TTS及sourceforge.net天天都有新的框架或開源產品發佈,最終這些技術及產品到其使用者(軟件企業及程序員)手裏時,他們根本不知道該如何選擇。你不跟潮流別人就會笑話你古董,並且最讓java程序員煩惱的莫過於昨天才辛辛苦苦掌握並引覺得豪的新技術、新框架,今天就被別人嘲笑你所學會的東西已經落伍、老掉牙。

另外,Java技術的「強大功能」及其「複雜性」也是形成Java應用步履蹣跚,舉步爲艱的一個不可忽視的因素。功能的強大是以技術的複雜做爲代價,一個功能強大的系統老是由衆多簡單的小系統堆積而成。咱們覺得:「簡易、實用纔是硬道理」!再強大的功能也要以實用爲基礎,脫離了實際應用即是空談烏托邦。若是實際應用中不可能用到,那咱們又何須花那麼多的精力煞費苦心地去搞那麼多的設計及構架,(又何須點燈熬油揮汗如雨地去建一個很難登上的空中樓閣呢?)縱觀今天java技術的應用,複雜得有點離普。一個簡單的Web應用動輒就要戴上N層高帽,Web使用Struts(JSF)、持久層用hibernate(JDO/Entity Bean)、還引入了Spring或EJB,要IOC、AOP、支持任意數據庫、支持任意存諸方式、支持組件對象關係任意配置、支持Web Service……如此琳琅滿目的技術,如此強大的功能,想不復雜?難啊!時至今日,又有誰能象當年IBM總裁郭士納同樣讓Java這個龐大,複雜的大象也能跳跳舞呢?

Java在國內不能獲得很好應用的一個主要緣由是國產Java技術落伍。在Java世界,開源、優秀的東西不少不少,但基本全是泊來之品。也只有那些技術牛人、大型軟件企業、外資企業,纔有實力研究並很好運用。當前還有衆多的中小型軟件企業停留在JSP+Java Bean的時代,不少中小企業甚至老牌軟件企業的CTO或者項目經理到如今還常義正詞嚴的說:"客戶不就是要求J2EE平臺嗎?咱們的JSP、Tomcat、JBoss不全是J2EE技術嗎?」是的,軟件嘛,能解決問題就行,好不容易花了兩三年搭建起來的技術體系,說換就換,哪有那麼容易啊!因而,軟件愈來愈難以維護,愈來愈難以擴充,更加沒法知足客戶的新需求。

再看國內不少比較知名的軟件企業提出的一些新開發構架、開發體系、中間件及工具等,其基礎核心仍然是國外引進的東東。好比不少軟件公司開發的快速開發工具,構件開發等,都是以Struts、Spring、Hibernate等爲基礎,也就是要用他們的工具,開發東西還得要學Struts、Hibernate等。對於國內不少的初級開發者來講,學習這些框架的難度曲線太大。技術本土化不只僅是把一門語言翻譯成另一門語言,更重要是思想的本土化、核心內容的本土化。

說到技術及框架,一個國外的先近技術框架,都是別人先嚐試用了N久證實了它的先進之後,咱們國內纔有一部份人拿進來開始慢慢學習,而後再宣傳普及,等咱們大部分人剛剛學會並以此爲榮,奔走相告的時候,人家又搞了一個更加先進的出來。汗顏啊,難道咱們只能疲於奔命地被人家牽着鼻子走嗎?

。。。。。。
(本文摘自《EasyJWeb簡易教程》,做者爲大峽、眸寬、stef等EasyJF開源團隊成員,轉載請保留做者聲明!)
  ligm2008 發佈於 2006-04-23 13:00:15 | 瀏覽[100] | 評論[0]
2006-04-23 [評論] [寫信問候]
SOA關鍵問題[zz]  
對於SOA,尤爲是像開發人員和CIO等仍有若干關鍵問題須要回答。Web 服務以及愈來愈多的面向服務架構(Service Oriented Architecture,SOA)已經在市場上投放了大量廣告。二者均可以給企業帶來普遍的短時間和長期利益。但對於SOA,尤爲是像開發人員和CIO等仍有若干關鍵問題須要回答。

問:SOA的前提是可以使應用程序像服務那樣工做。軟件如何像服務同樣工做呢?php

答:沒有SOA,軟件包是被編寫爲獨立的(self-contained)軟件,即在一個完整的軟件包中將許多應用程序功能整合在一塊兒。實現整合應用程序功能的代碼一般與功能自己的代碼混合在一塊兒。咱們將這種方式稱做軟件設計"單一應用程序"。與此密切相關的是,更改一部分代碼將對使用該代碼的代碼具備重大影響,這會形成系統的複雜性,並增長維護系統的成本。並且還使從新使用應用程序功能變得較困難,由於這些功能不是爲了從新使用而打的包。html

SOA旨在將單個應用程序功能彼此分開,以便這些功能能夠單獨用做單個的應用程序功能或"組件"。這些組件能夠用於在企業內部建立各類其餘的應用程序,或者若有須要,對外向合做夥伴公開,以便用於合做夥伴的應用程序。java

"服務"的概念是要使用與實施細節無關的標準化接口來構建這些"組件"。針對一套應用程序服務的Web服務描述語言文檔,描述須要做爲請求特殊服務(例如,"檢查庫存"功能可能須要零件數)輸入來傳輸的數據名稱和類型,並描述服務響應的細節(它可能返回表示庫存中零件數量的一個整數)。程序員

這些詳細信息看上去好像與 Java、C++、COBOL 等中實施的功能相同,所以,服務的請求程序無需知道使用的何種語言,並且能夠使用任何語言來編寫請求程序。這就使一個平臺上的服務能夠和爲另外一個平臺編寫的應用程序集成。互操做性的關鍵是請求和響應消息,例如,使用SOAP消息發送,其消息使用 XML 編寫代碼。web

問:請舉例說明 SOA 如何使企業受益。spring

答:關鍵的優點是互操做性,能夠使用任何平臺之間的功能,而與編程的語言、操做系統和計算機類型等等無關。在上述示例中,"檢查庫存"功能可能已經編寫爲一個應用程序要求的服務,例如,監控庫存並在須要時自動從新定購的服務,但咱們後來發現,一樣的服務無需修改便可用於支持由員工使用的基於 Web 的庫存監控工具。sql

就內部而言,應用程序的重複使用是一項關鍵優點,由於它能夠下降開發成本。服務的重複使用,其長期做用在於減小企業中冗餘的功能,簡化基礎架構,從而下降維護代碼的成本。經過按服務的使用者來組織應用程序,與傳統的編程技術相比,咱們得到一個要靈活敏捷得多的集成模型,使咱們能夠迅速修改業務流程模型。數據庫

就外部而言,爲服務交互而詳細定義的"合同"使業務合做夥伴之間的交互"自由聯合",提供集成所必需的穩定性,並提供更改基層軟件(underlying software)問題的一個解決方案。當保留了相同的消息格式時,支持該格式的軟件只要仍然支持消息合同,則能夠按需進行更改。只要它支持相同的消息格式,甚至能夠使用另外一種編程語言的實施來徹底替換系統,請求程序無需更改。當消息合同不斷髮展而必須更改時,與至關困難的任務,即支持多個版本的程序 API 和文件格式相比,它使用版本控制(versioning),更容易做爲過渡策略支持多個版本的應用程序。express

這些是部分關鍵益處,還有許多其餘益處。apache

問:SOA與Web服務以及SOA和網格計算之間是何關係。

答:SOA是一種面向業務應用程序系統的體系架構設計風格,但能夠應用於其餘系統,包括中間件技術,例如網格計算。

Web服務是能夠用於建立SOA的一套標準。儘管沒有Web服務標準也可能建立SOA(例如,在SOAP以前,人們已經在HTTP或JMS上使用XML來實現類似的結果),但運用Web服務標準倒是咱們目前針對與外部軟件交互的最佳方法。

網格計算是一種系統管理策略,其目標是最大限度地減小硬件資源的使用。例如,當忽然的需求溢出指定的服務器時,它可能臨時將一些請求轉向相對沒那麼繁忙的服務器。網格計算設計爲一種面向服務架構(用於調整網格計算的服務叫作網格服務)。

隨着咱們轉向SOA,咱們將看到該方法用於支持各類其餘新的系統功能。另一個示例是自主計算夥子管理系統。事實上,SOA是Web服務高級功能的基礎,例如WS-Trust和聯合身份識別管理規範。

問:由於尚未通用互操做性標準,SOA最大的問題不仍然是供應商中心性(vendor-centricity)嗎?

答:有一些基本標準正好適用於Web服務,它們能夠用於實施面向服務架構。XML和XML方案分別自1998年和2001年就已成爲標準。SOAP 1.2自2003年6月成爲標準。UDDI在2003年夏天標準化。WS-Security在2004年4月成爲標準。

除了著名標準機構(例如W3C和OASIS)支持的這些正式標準之外,許多"技術建議書規範"也被普遍接受,並做爲事實標準獲得充分支持。例如,直到 W3C完成WSDL 2.0爲止,要求在其產品中支持Web服務的大多數供應商都支持WSDL 1.1規範。

事實上,目前大部分軟件供應商對Web服務標準的支持,已致使使用Web服務來普遍實施SOA。

 

問:SOA如何影響SLA?而您如何讓SLA適合您的SOA?

答:當前企業之間的SOA實施一般側重於改善合做夥伴之間現有業務的效率。一樣,性能保證的概念並非像方便的互操做性和自由聯合集成那樣的問題,它們能夠藉助Web服務標準來實現。

當服務成爲企業付費的產品時,對特定水平的性能或可用性的保證,以及其它服務質量注意事項具備更爲重要的做用。咱們能夠想象這在未來會成爲一個常見要求,正在進行這方面的工做以支持該模型。

問:我如何着手構建 SOA?

答:最佳的方法時開始構建較小的SOA,側重於提升當前缺少效率的交互性。例如,假設使用一個系統上須要從新鍵入到另外一個系統的打印報告,將兩個計算機系統緊密聯繫在一塊兒,這會消耗時間、浪費成本,致使出錯,並且數據沒法保持罪行。能夠設計一個簡單的基於Web服務SOA項目,直接連接信息,將含更新的SOAP消息發送到合做夥伴系統,而不是打印報告。

開始簡單的SOA使企業能夠在做出大投資以前先衡量ROI,並在出現大的問題以前得到小改善的經驗。

CIO在購買軟件時應該詢問供應商關於對Web服務和SOA的支持,做爲一個重要的注意事項。應該檢查新應用程序的開發,以便考慮是否某些應用程序功能可能須要用於其餘目的,以及能夠嵌入對Web服務標準的支持以支持重複使用。

最終要完成大規模的企業轉型,可能須要經過創建企業服務總線(造成SOA的骨幹網或神經系統)來開始該工做。而後以企業合理的節奏,將服務提供商何服務請求程序逐漸添加到ESB。隨着IT的SOA的增加,ESB成爲在服務水平上鍊接應用程序,並調節消息流量以提升效率和可靠性的一種有力方式。

問:管理SOA須要哪些新的服務管理技能?

答:在運用Web服務以前,因缺少標準和自由聯合的策略,合做夥伴整合受到嚴重限制。隨着咱們開始使用Web服務和SOA來整合合做夥伴,咱們能夠發現,使用業務合做夥伴所提供的功能的IT系統已經開始依賴於這些功能的可用性。咱們從內部管理咱們本身服務的可用性轉向要求監視和管理(可能有許多)企業之間的可用性。這明顯大大增長了管理IT系統的複雜性,但它也帶來了巨大的價值,這就是爲何許多企業要轉到這個方向的緣由。

Web應用程序系統正在不斷髮展以支持Web服務標準。"Web服務分佈式管理"或WSDM標準正在由OASIS開發,對Web服務管理提供標準化的支持,經過使用Web服務來實現對不一樣平臺的管理,知足涉及獨立業務實體的大規模SOA對分佈式管理的要求。

  ligm2008 發佈於 2006-04-23 12:57:34 | 瀏覽[93] | 評論[0]
2006-04-02 [評論] [寫信問候]
如何成爲真正的oracle dba[zz]  
a. 首先,必須懂ORACLE(廢話),別告訴我在WINDOWS上裝過就算懂    差遠着呢 b. 其次,必須讓別人也知道你懂ORACLE,最好的方法是考個認證(OCP)    別說,還真有一大幫HR的人迷信這個 c. Oracle的好處是在N多平臺均可以運行,壞處呢,就是你必須明白如何讓它    在Solaris, HP-UX, WINDOWS, Linux, AIX, Tru64.......上跑起來    系統DOWN了找別人?那能夠你本身的DATABASE SERVER    有什麼辦法,下定決心當系統管理員吧 d. ORACLE是基於網絡的,因此在管理的時候,免不了用到N多網絡東東    總麻煩別人會遭白眼的,客戶也不幹,因此DBA最好也是網絡管理員    恩,拿個CCNA保底也不錯 e. 從8i以後,ORACLE全面轉向JAVA,因此爲了保住飯碗,弄懂JAVA是必需的    因此DBA也要是JAVA PROGRAMMER,向不會JAVA的同志們默哀,抓緊學吧 f. 除了管理以外,另外一方面也要協助開發人員作PROJECT,無論是B/S仍是C/S    那個S(server)總跑不了,因此DBA還要懂軟件工程,去學UML和ROSE吧, hoho g. 如今用ORACLE作網站的不少吧,OK,無論是APPLICATION SERVER用的是ASP,    JSP,ColdFusion仍是別的什麼,出了問題DBA也跑不了。說你無論這個?沒門    趁早學學那些東西,省得到時候弄不明白錯兒出在什麼地方
相關文章
相關標籤/搜索