|
web.xml配置的詳細說明1
1 定義頭和根元素
部署描述符文件就像所有XML文件一樣,必須以一個XML頭開始。這個頭聲明可以使用的XML版本并給出文件的字符編碼。
DOCYTPE聲明必須立即出現在此頭之后。這個聲明告訴服務器適用的servlet規范的版本(如2.2或2.3)并指定管理此文件其余部分內容的語法的DTD(Document Type Definition,文檔類型定義)。
所有部署描述符文件的頂層(根)元素為web-app。請注意,XML元素不像HTML,他們是大小寫敏感的。因此,web-App和WEB-APP都是不合法的,web-app必須用小寫。
2 部署描述符文件內的元素次序
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名稱的摘錄) <web-app> 3.2 定義定制的URL 程序清單5-3 TestPage.jsp 程序清單5-4 web.xml(說明JSP頁命名的摘錄) <web-app> web.xml的元素 1、 web.xml的頭和根元素 -------------------------------------------------------------------------------------------------------------------------- 雖然spring本身是可以直接使用jndi來進行獲取一些對象,但是在和weblogic集成的時候往往還是容易出 現問題(在web應用的時候出現問題的可能性不大,因為container已經做了很多事情了.)但是在ide或者其 他的應用環境下(不同的jvm的時候),通常找不到provider_url等屬性造成無法找到jndi. 修改配置文件如下: <!-- 通過jndi的方式來調用datasource,即使不一定是在j2ee環境中也可以正常使用默認情況下,如果 沒有指定,"java:comp/env/"將放在后面jndi名稱前面 --> <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>jdbc/myDatasource</value> </property> <!-- 如果你不想使用 'java:comp/env/'前綴的話請設置下面的值為true, 默認值為false --> <property name="resourceRef"> <value>false</value> </property> <property name="jndiEnvironment"> <props> Spring連接weblogic-DataSource錯誤 <!-- The value of Context.PROVIDER_URL --> <prop key="java.naming.provider.url">t3://localhost:7001</prop> <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory </prop> </props> </property> </bean> 注意在設置的時候由于不在同一個jvm里面,所以一定要設置provider.url和factory.initial的屬性值,否 則會出現NoInitialContextException的異常出現. 此外如果和其他的應用服務器集成的話可能不只是要設置上面的兩個屬性,還要設置相關的其他屬性。詳 細情況參考:javax.naming.Context類的說明文檔。 http://java.sun.com/j2se/1.4.2/docs/api/javax/naming/Context.html 其中設置的: <property name="jndiEnvironment"> <props> <!-- The value of Context.PROVIDER_URL --> <prop key="java.naming.provider.url">t3://localhost:7001</prop> <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory </prop> </props> </property> 實際上就是設置Context初始化的時候設置的Properties屬性。 http://java.mblogger.cn/layout/posts/11849.aspx ===================================================================== ===================================================================== websphere: java.naming.provider.url->iiop://websphere.machine.domain.com:900 java.naming.factory.initial ->com.ibm.websphere.naming.WsnInitialContextFactory java.naming.factory.url.pkgs ->com.ibm.ws.naming org.omg.CORBA.ORBClass->com.ibm.rmi.iiop.ORB org.omg.CORBA.ORBSingletonClass->com.ibm.rmi.corba.ORBSingleton javax.rmi.CORBA.UtilClass->com.ibm.rmi.javax.rmi.CORBA.Util javax.rmi.CORBA.StubClass->com.ibm.rmi.javax.rmi.CORBA.StubDelegateImpl javax.rmi.CORBA.PortableRemoteObjectClass->com.ibm.rmi.javax.rmi.PortableRemoteObject weblogic: java.naming.factory.initial -> weblogic.jndi.WLInitialContextFactory java.naming.provider.url -> t3://localhost:7001 jboss: ava.naming.factory.initial ->org.jnp.interfaces.NamingContextFactory java.naming.factory.url.pkgs->org.jboss.naming.client java.naming.provider.url ->jnp://10.0.0.18:1099 sunone IMQ ldap: java.naming.provider.url -> ldap://localhost:389/dc=yusong,dc=com java.naming.factory.initial -> com.sun.jndi.ldap.LdapCtxFactory sunone Application Server: java.naming.provider.url -> iiop://192.168.0.34:3700 java.naming.factory.initial -> com.sun.jndi.cosnaming.CNCtxFactory oracle oc4j: java.naming.factory.initial->com.evermind.server.ApplicationClientInitialContextFactory java.naming.provider.url->ormi://localhost/bmpapp 1.在weblogic目錄下的serverlib下添加mysql驅動
mysql-connector-java-3.1.11-bin.jar
2.在weblogic目錄下的commonbin下找到commEnv.cmd打開
找到set weblogic_classpath= 后邊加上mysql驅動的路徑
例:%WL_HOME%\server\lib\mysql-connector-java-3.1.11-bin.jar 3.創建domain
4.在開始菜單打開start AdminServer for weblogic Server domain
等到running狀態
5.打開console 輸入用戶名密碼。
6.點開Service->JDBC->Data Source
7.JDBC Data Source Properties 頁面
Name和JNDI Name可以一樣 我起名為MySQLJDBCDataSource
Database Type:選擇MySQL
Database Driver:選擇第一個com包下的驅動就可以 Next.
8.Transaction Options
選擇倒數第二個Emulate Two-Phase Commit Next.
9.Connection Properties
Database Name :自己的數據庫名 例如:test
Host Name :主機名 例如:localhost或192.168.1.117
Port :3306 (mysql默認)
Database User Name:數據庫用戶名
Password :數據庫密碼
Confirm Password :同上 Next
10.Test Database Connection
可以點擊Test Configuration 測試一下數據庫連接。Next
11.Select Targets
選擇發布到哪個AdminServer的JNDI樹上。Next
12.點擊左上的Activate Changes 如果沒有異常就OK了哦。
友情提示:
1) 如果你直接在weblogic下配連接池而不在weblogic下的domain下配置,可以跳過1,2步。
2) 如果配置成功后你可以在console下的Environment->Servers頁面點擊你的AdminServer(admin),然后View JNDI Tree中看到你剛配置的JNDI名。 Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1636515 1.將數據庫驅動程序的JAR文件放在Tomcat的 common/lib 中; substr 方法 stringvar.substr(start [, length ]) 參數 必選項。要提取子字符串的字符串文字或 String 對象。 start 必選項。所需的子字符串的起始位置。字符串中的第一個字符的索引為 0。 length 可選項。在返回的子字符串中應包括的字符個數。 說明 示例 function SubstrDemo(){ strVariable.substring(start, end) 參數 指明子字符串的起始位置,該索引從 0 開始起算。 end 指明子字符串的結束位置,該索引從 0 開始起算。 說明 substring 方法使用 start 和 end 兩者中的較小值作為子字符串的起始點。例如, strvar.substring(0, 3) 和 strvar.substring(3, 0) 將返回相同的子字符串。 如果 start 或 end 為 NaN 或者負數,那么將其替換為0。 子字符串的長度等于 start 和 end 之差的絕對值。例如,在 strvar.substring(0, 3) 和 strvar.substring(3, 0) 返回的子字符串的的長度是 3。 示例 function SubstringDemo(){ 第一句話是:優秀是一種習慣。 注解:要會“裝”,要持續的、不間斷的“裝”,裝久了就成了真的了,就成了習慣了,比如準時到會,每次都按時到會,你裝裝看,你裝30年看看,裝的時間長了就形成了習慣。:) 第二句話是:生命是一種過程。 注解:生命本身其實是沒有任何意義的,只是你自己賦予你的生命一種你希望實現的意義,因此享受生命的過程就是一種意義所在。 第三句話是:兩點之間最短的距離并不一定是直線。 在人與人的關系以及做事情的過程中,我們很難直截了當就把事情做好。我們有時需要等待,有時需要合作,有時需要技巧。我們做事情會碰到很多困難和障礙,有時候我們并不一定要硬挺、硬沖,我們可以選擇有困難繞過去,有障礙繞過去,也許這樣做事情更加順利。大家想一想,我們和別人說話還得想想哪句話更好聽呢。尤其在中國這個比較復雜的社會中,大家要學會想辦法諒解別人,要讓人覺得你這個人很成熟,很不錯,你才能把事情做成。 注解:如果你在考數學試題,一定要答兩點之間直線段最短,如果你在走路,從A到B,明明可以直接過去,但所有人都不走,你最好別走,因為有陷阱。在中國辦事情,直線性思維在很多地方要碰壁,這是中國特色的中國處事方式。 第四句話是:只有知道如何停止的人才知道如何加快速度。 我在滑雪的時候,最大的體會就是停不下來。我剛開始學滑雪時沒有請教練,看著別人滑雪,覺得很容易,不就是從山頂滑到山下嗎?于是我穿上滑雪板,哧溜一下就滑下去了,結果我從山頂滑到山下,實際上是滾到山下,摔了很多個跟斗。我發現根本就不知道怎么停止、怎么保持平衡。最后我反復練習怎么在雪地上、斜坡上停下來。練了一個星期,我終于學會了在任何坡上停止、滑行、再停止。這個時候我就發現自己會滑雪了,就敢從山頂高速地往山坡下沖。因為我知道只要我想停,一轉身就能停下來。只要你能停下來,你就不會撞上樹、撞上石頭、撞上人,你就不會被撞死。因此,只有知道如何停止的人,才知道如何高速前進。 注解:用汽車來比喻,寶馬可以上200公里,奇瑞卻只能上120公里,為什么?發動機估計不相上下,差距在剎車系統,上了200公里剎不了車,呵呵,我的天! 第五句話是:放棄是一種智慧,缺陷是一種恩惠。 當你擁有六個蘋果的時候,千萬不要把它們都吃掉,因為你把六個蘋果全都吃掉,你也只吃到了六個蘋果,只吃到了一種味道,那就是蘋果的味道。如果你把六個蘋果中的五個拿出來給別人吃,盡管表面上你丟了五個蘋果,但實際上你卻得到了其他五個人的友情和好感。以后你還能得到更多,當別人有了別的水果的時候,也一定會和你分享,你會從這個人手里得到一個橘子,那個人手里得到一個梨,最后你可能就得到了六種不同的水果,六種不同的味道,六種不同的顏色,六個人的友誼。人一定要學會用你擁有的東西去換取對你來說更加重要和豐富的東西。所以說,放棄是一種智慧。
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
<!-- … -->
<servlet>
<servlet-name>Test</servlet-name>
<servlet-class>moreservlets.TestServlet</servlet-class>
</servlet>
<!-- … -->
</web-app>
大多數服務器具有一個缺省的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)的一部分。
<!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>
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
<!-- ... -->
<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>
首先注意 xml是大小寫敏感的
必須以一個XML頭開始。這個頭聲明可以使用的XML版本并給出文件的字符編碼。
DOCYTPE聲明必須立即出現在此頭之后。這個聲明告訴服務器適用的servlet規范的版本(如2.2或2.3)并指定管理此文件其余部分內容的語法的DTD(Document Type Definition,文檔類型定義)。
所有部署描述符文件的頂層(根)元素為web-app。
例(紅色部分是可選項):
--------------------------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!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 id="WebApp">
</web-app>
--------------------------------------------------------------------------------------------------------------------------
2、元素
以下元素幾乎都是可選項,不過要注意它們是有順序的。雖然有些服務器要求寬松些,但某些服務器會拒絕執行順序不正確的web應用。所以還是按順序寫好
· icon icon元素指出IDE和GUI工具用來表示Web應用的一個和兩個圖像文件的位置。
· display-name display-name元素提供GUI工具可能會用來標記這個特定的Web應用的一個名稱。
· description description元素給出與此有關的說明性文本。
· context-param context-param元素聲明應用范圍內的初始化參數。
· filter 過濾器元素將一個名字與一個實現javax.servlet.Filter接口的類相關聯。
· filter-mapping 一旦命名了一個過濾器,就要利用filter-mapping元素把它與一個或多個servlet或JSP頁面相關聯。
· listener servlet API的版本2.3增加了對事件監聽程序的支持,事件監聽程序在建立、修改和刪除會話或servlet環境時得到通知。Listener元素指出事件監聽程序類。
· servlet 在向servlet或JSP頁面制定初始化參數或定制URL時,必須首先命名servlet或JSP頁面。Servlet元素就是用來完成此項任務的。
· servlet-mapping服務器一般為servlet提供一個缺省的URL:http://host/webAppPrefix/servlet/ServletName。但是,常常會更改這個URL,以便servlet可以訪問初始化參數或更容易地處理相對URL。在更改缺省URL時,使用servlet-mapping元素。
·session-config如果某個會話在一定時間內未被訪問,服務器可以拋棄它以節省內存。可通過使用HttpSession的setMaxInactiveInterval方法明確設置單個會話對象的超時值,或者可利用session-config元素制定缺省超時值。
· mime-mapping 如果Web應用具有想到特殊的文件,希望能保證給他們分配特定的MIME類型,則mime-mapping元素提供這種保證。
· welcom-file-list welcome-file-list元素指示服務器在收到引用一個目錄名而不是文件名的URL時,使用哪個文件。
· error-page error-page元素使得在返回特定HTTP狀態代碼時,或者特定類型的異常被拋出時,能夠制定將要顯示的頁面。
· taglib taglib元素對標記庫描述符文件(Tag Libraryu Descriptor file)指定別名。此功能使你能夠更改TLD文件的位置,而不用編輯使用這些文件的JSP頁面。
· resource-env-ref resource-env-ref元素聲明與資源相關的一個管理對象。
· resource-ref resource-ref元素聲明一個資源工廠使用的外部資源。
· security-constraint security-constraint元素制定應該保護的URL。它與login-config元素聯合使用
· login-config 用login-config元素來指定服務器應該怎樣給試圖訪問受保護頁面的用戶授權。它與sercurity-constraint元素聯合使用。
· security-role security-role元素給出安全角色的一個列表,這些角色將出現在servlet元素內的security-role-ref元素的role-name子元素中。分別地聲明角色可使高級IDE處理安全信息更為容易。
· env-entry env-entry元素聲明Web應用的環境項。
· ejb-ref ejb-ref元素聲明一個EJB的主目錄的引用。
· ejb-local-ref ejb-local-ref元素聲明一個EJB的本地主目錄的應用。
該文章的原文地址為:http://www.aygfsteel.com/fastzch/archive/2007/08/28/140607.htmlSpring與weblogic jndi集成
各種應用服務器的不同的properties集合:
配置WEB.XML ,讓SESSION在頁面中一直打開.
<!-- spring中對hibernate的一個session支持,直到頁面執行完后才能關閉 -->
<filter>
<filter-name>opensession</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<!-- 當遇到所有的.do文件都要按照此設置 -->
</filter>
<filter-mapping>
<filter-name>opensession</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
(@rem set up WebLogic Server's class path
set WEBLOGIC_CLASSPATH=%PATCH_CLASSPATH%;%JAVA_HOME%\lib\tools.jar;%WL_HOME%\server\lib\weblogic_sp.jar;%WL_HOME%\server\lib\weblogic.jar;%WL_HOME%\server\lib\webservices.jar;%WL_HOME%\server\lib\MySQL5.0 driver.zip)
初次使用Weblogic,需要對其進行域的配置。現在我就圖解說明怎樣配置Weblogic9.0
Java系統中內存泄漏測試方法的研究
筆者曾經參與開發的網管系統,系統規模龐大,涉及上百萬行代碼。系統主要采用Java語言開發,大體上分為客戶端、服務器和數據庫三個層次。在版本進入測試和試用的過程中,現場人員和測試部人員紛紛反映:系統的穩定性比較差,經常會出現服務器端運行一晝夜就死機的現象,客戶端跑死的現象也比較頻繁地發生。對于網管系統來講,經常性的服務器死機是個比較嚴重的問題,因為頻繁的死機不僅可能導致前后臺數據不一致,發生錯誤,更會引起用戶的不滿,降低客戶的信任度。因此,服務器端的穩定性問題必須盡快解決。
通過察看服務器端日志,發現死機前服務器端頻繁拋出OutOfMemoryException內存溢出錯誤,因此初步把死機的原因定位為內存泄漏引起內存不足,進而引起內存溢出錯誤。如何查找引起內存泄漏的原因呢?有兩種思路:第一種,安排有經驗的編程人員對代碼進行走查和分析,找出內存泄漏發生的位置;第二種,使用專門的內存泄漏測試工具Optimizeit進行測試。這兩種方法都是解決系統穩定性問題的有效手段,使用內存測試工具對于已經暴露出來的內存泄漏問題的定位和解決非常有效;但是軟件測試的理論也告訴我們,系統中永遠存在一些沒有暴露出來的問題,而且,系統的穩定性問題也不僅僅只是內存泄漏的問題,代碼走查是提高系統的整體代碼質量乃至解決潛在問題的有效手段。基于這樣的考慮,我們的內存穩定性工作決定采用代碼走查結合測試工具的使用,雙管齊下,爭取比較徹底地解決系統的穩定性問題。
在代碼走查的工作中,安排了對系統業務和開發語言工具比較熟悉的開發人員對應用的代碼進行了交叉走查,找出代碼中存在的數據庫連接聲明和結果集未關閉、代碼冗余和低效等故障若干,取得了良好的效果,文中主要講述結合工具的使用對已經出現的內存泄漏問題的定位方法。
在C++語言程序
void function(){
Int[] vec = new int[5];
}
在function()方法執行完畢后,vec數組已經是不可達對象,在C++語言中,這樣的對象永遠也得不到釋放,稱這種現象為內存泄漏。
而Java是通過垃圾收集器(Garbage Collection,GC)自動管理內存的回收,程序員不需要通過調用函數來釋放內存,但它只能回收無用并且不再被其它對象引用的那些對象所占用的空間。在下面的代碼中,循環申請Object對象,并將所申請的對象放入一個Vector中,如果僅僅釋放對象本身,但是因為Vector仍然引用該對象,所以這個對象對GC來說是不可回收的。因此,如果對象加入到Vector后,還必須從Vector中刪除,最簡單的方法就是將Vector對象設置為null。
Vector v = new Vector(10);
for (int i = 1; i < 100; i++)
{
Object o = new Object();
v.add(o);
o = null;
}//此時,所有的Object對象都沒有被釋放,因為變量v引用這些對象。
實際上無用,而還被引用的對象,GC就無能為力了(事實上GC認為它還有用),這一點是導致內存泄漏最重要的原因。
Java的內存回收機制可以形象地理解為在堆空間中引入了重力場,已經加載的類的靜態變量和處于活動線程的堆棧空間的變量是這個空間的牽引對象。這里牽引對象是指按照Java語言規范,即便沒有其它對象保持對它的引用也不能夠被回收的對象,即Java內存空間中的本原對象。當然類可能被去加載,活動線程的堆棧也是不斷變化的,牽引對象的集合也是不斷變化的。對于堆空間中的任何一個對象,如果存在一條或者多條從某個或者某幾個牽引對象到該對象的引用鏈,則就是可達對象,可以形象地理解為從牽引對象伸出的引用鏈將其拉住,避免掉到回收池中;而其它的不可達對象由于不存在牽引對象的拉力,在重力的作用下將掉入回收池。在圖1中,A、B、C、D、E、F六個對象都被牽引對象所直接或者間接地“牽引”,使得它們避免在重力的作用下掉入回收池。如果TR1-A鏈和TR2-D鏈斷開,則A、B、C三個對象由于失去牽引,在重力的作用下掉入回收池(被回收),D對象也是同樣的原因掉入回收池,而F對象仍然存在一個牽引鏈(TR3-E-F),所以不會被回收,如圖2、3所示。
圖1 初始狀態
圖2 TR1-A鏈和TR2-D鏈斷開,A、B、C、D掉入回收池
圖3 A、B、C、D四個對象被回收
通過前面的介紹可以看到,由于采用了垃圾回收機制,任何不可達對象都可以由垃圾收集線程回收。因此通常說的Java內存泄漏其實是指無意識的、非故意的對象引用,或者無意識的對象保持。無意識的對象引用是指代碼的開發人員本來已經對對象使用完畢,卻因為編碼的錯誤而意外地保存了對該對象的引用(這個引用的存在并不是編碼人員的主觀意愿),從而使得該對象一直無法被垃圾回收器回收掉,這種本來以為可以釋放掉的卻最終未能被釋放的空間可以認為是被“泄漏了”。
這里通過一個例子來演示Java的內存泄漏。假設有一個日志類Logger,其提供一個靜態的log(String msg)方法,任何其它類都可以調用Logger.Log(message)來將message的內容記錄到系統的日志文件中。Logger類有一個類型為HashMap的靜態變量temp,每次在執行log(message)方法的時候,都首先將message的值丟入temp中(以當前線程+當前時間為鍵),在方法退出之前再從temp中將以當前線程和當前時間為鍵的條目刪除。注意,這里當前時間是不斷變化的,所以log方法在退出之前執行刪除條目的操作并不能刪除方法執行之初丟入的條目。這樣,任何一個作為參數傳給log方法的字符串最終由于被Logger的靜態變量temp引用,而無法得到回收,這種違背實現者主觀意圖的無意識的對象保持就是我們所說的Java內存泄漏。
Optimizeit是Borland公司的產品,主要用于協助對軟件系統進行代碼優化和故障診斷,其功能眾多,使用方便,其中的OptimizeIt Profiler主要用于內存泄漏的分析。Profiler的堆視圖(如圖4)就是用來觀察系統運行使用的內存大小和各個類的實例分配的個數的,其界面如圖四所示,各列自左至右分別為類名稱、當前實例個數、自上個標記點開始增長的實例個數、占用的內存空間的大小、自上次標記點開始增長的內存的大小、被釋放的實例的個數信息、自上次標記點開始增長的內存的大小被釋放的實例的個數信息,表的最后一行是匯總數據,分別表示目前JVM中的對象實例總數、實例增長總數、內存使用總數、內存使用增長總數等。
在實踐中,可以分別在系統運行四個小時、八個小時、十二個小時和二十四個小時時間點記錄當時的內存狀態(即抓取當時的內存快照,是工具提供的功能,這個快照也是供下一步分析使用),找出實例個數增長的前十位的類,記錄下這十個類的名稱和當前實例的個數。在記錄完數據后,點擊Profiler中右上角的Mark按鈕,將該點的狀態作為下一次記錄數據時的比較點。
圖4 Profiler 堆視圖
系統運行二十四小時以后可以得到四個內存快照。對這四個內存快照進行綜合分析,如果每一次快照的內存使用都比上一次有增長,可以認定系統存在內存泄漏,找出在四個快照中實例個數都保持增長的類,這些類可以初步被認定為存在泄漏。
通過上面的數據收集和初步分析,可以得出初步結論:系統是否存在內存泄漏和哪些對象存在泄漏(被泄漏),如果結論是存在泄漏,就可以進入分析和定位階段了。
前面已經談到Java中的內存泄漏就是無意識的對象保持,簡單地講就是因為編碼的錯誤導致了一條本來不應該存在的引用鏈的存在(從而導致了被引用的對象無法釋放),因此內存泄漏分析的任務就是找出這條多余的引用鏈,并找到其形成的原因。前面還講到過牽引對象,包括已經加載的類的靜態變量和處于活動線程的堆棧空間的變量。由于活動線程的堆棧空間是迅速變化的,處于堆棧空間內的牽引對象集合是迅速變化的,而作為類的靜態變量的牽引對象的集合在系統運行期間是相對穩定的。
對每個被泄漏的實例對象,必然存在一條從某個牽引對象出發到達該對象的引用鏈。處于堆棧空間的牽引對象在被從棧中彈出后就失去其牽引的能力,變為非牽引對象,因此,在長時間的運行后,被泄露的對象基本上都是被作為類的靜態變量的牽引對象牽引。
Profiler的內存視圖除了堆視圖以外,還包括實例分配視圖(圖5)和實例引用圖(圖6)。
Profiler的實例引用圖為找出從牽引對象到泄漏對象的引用鏈提供了非常直接的方法,其界面的第二個欄目中顯示的就是從泄漏對象出發的逆向引用鏈。需要注意的是,當一個類的實例存在泄漏時,并非其所有的實例都是被泄漏的,往往只有一部分是被泄漏對象,其它則是正常使用的對象,要判斷哪些是正常的引用鏈,哪些是不正常的引用鏈(引起泄漏的引用鏈)。通過抽取多個實例進行引用圖的分析統計以后,可以找出一條或者多條從牽引對象出發的引用鏈,下面的任務就是找出這條引用鏈形成的原因。
實例分配圖提供的功能是對每個類的實例的分配位置進行統計,查看實例分配的統計結果對于分析引用鏈的形成具有一定的作用,因為找到分配鏈與引用鏈的交點往往就可以找到了引用鏈形成的原因,下面將具體介紹。
圖5 實例分配圖
圖6 實例引用圖
設想一個實例對象a在方法f中被分配,最終被實例對象b所引用,下面來分析從b到a的引用鏈可能的形成原因。方法f在創建對象a后,對它的使用分為四種情況:1、將a作為返回值返回;2、將a作為參數調用其它方法;3、在方法內部將a的引用傳遞給其它對象;4、其它情況。其中情況4不會造成由b到a的引用鏈的生成,不用考慮。下面考慮其它三種情況:對于1、2兩種情況,其造成的結果都是在另一個方法內部獲得了對象a的引用,它的分析與方法f的分析完全一樣(遞歸分析);考慮第3種情況:1、假設方法f直接將對象a的引用加入到對象b,則對象b到a的引用鏈就找到了,分析結束;2、假設方法f將對象a的引用加入到對象c,則接下來就需要跟蹤對象c的使用,對象c的分析比對象a的分析步驟更多一些,但大體原理都是一樣的,就是跟蹤對象從創建后被使用的歷程,最終找到其被牽引對象引用的原因。
現在將泄漏對象的引用鏈以及引用鏈形成的原因找到了,內存泄漏測試與分析的工作就到此結束,接下來的工作就是修改相應的設計
使用上述的測試和分析方法,在實踐中先后進行了三次測試,找出了好幾處內存泄漏錯誤。系統的穩定性得到很大程度的提高,最初運行1~2天就拋出內存溢出異常,修改完成后,系統從未出現過內存溢出異常。此方法適用于任何使用Java語言開發的、對穩定性有比較高要求的軟件系統。
2.在server.xml中設置數據源,以MySQL數據庫為例,如下:
在<GlobalNamingResources> </GlobalNamingResources>節點中加入,
<Resource
name="jdbc/DBPool"
type="javax.sql.DataSource"
password="root"
driverClassName="com.mysql.jdbc.Driver"
maxIdle="2"
maxWait="5000"
username="root"
url="jdbc:mysql://127.0.0.1:3306/test"
maxActive="4"/>
屬性說明:name,數據源名稱,通常取”jdbc/XXX”的格式;
type,”javax.sql.DataSource”;
password,數據庫用戶密碼;
driveClassName,數據庫驅動;
maxIdle,最大空閑數,數據庫連接的最大空閑時間。超過空閑時間,數據庫連
接將被標記為不可用,然后被釋放。設為0表示無限制。
MaxActive,連接池的最大數據庫連接數。設為0表示無限制。
maxWait ,最大建立連接等待時間。如果超過此時間將接到異常。設為-1表示
無限制。
3.在你的web應用程序的web.xml中設置數據源參考,如下:
在<web-app></web-app>節點中加入,
<resource-ref>
<description>MySQL DB Connection Pool</description>
<res-ref-name>jdbc/DBPool</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
子節點說明: description,描述信息;
res-ref-name,參考數據源名字,同上一步的屬性name;
res-type,資源類型,”javax.sql.DataSource”;
res-auth,”Container”;
res-sharing-scope,”Shareable”;
4.在web應用程序的context.xml中設置數據源鏈接,如下:
在<Context></Context>節點中加入,
<ResourceLink
name="jdbc/DBPool"
type="javax.sql.DataSource"
global="jdbc/DBPool"/>
屬性說明:name,同第2步和第3步的屬性name值,和子節點res-ref-name值;
type,同樣取”javax.sql.DataSource”;
global,同name值。
至此,設置完成,下面是如何使用數據庫連接池。
1.建立一個連接池類,DBPool.java,用來創建連接池,代碼如下:
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class DBPool {
private static DataSource pool;
static {
Context env = null;
try {
env = (Context) new InitialContext().lookup("java:comp/env");
pool = (DataSource)env.lookup("jdbc/DBPool");
if(pool==null)
System.err.println("'DBPool' is an unknown DataSource");
} catch(NamingException ne) {
ne.printStackTrace();
}
}
public static DataSource getPool() {
return pool;
}
}
2.在要用到數據庫操作的類或jsp頁面中,用DBPool.getPool().getConnection(),獲得一個Connection對象,就可以進行數據庫操作,最后別忘了對Connection對象調用close()方法,注意:這里不會關閉這個Connection,而是將這個Connection放回數據庫連接池。
返回一個從指定位置開始的指定長度的子字符串。
stringvar
如果 length 為 0 或負數,將返回一個空字符串。如果沒有指定該參數,則子字符串將延續到 stringvar 的最后。
下面的示例演示了substr 方法的用法。
var s, ss; // 聲明變量。
var s = "The rain in Spain falls mainly in the plain.";
ss = s.substr(12, 5); // 獲取子字符串。
return(ss); // 返回 "Spain"。
}
substring 方法
返回位于 String 對象中指定位置的子字符串。
"String Literal".substring(start, end)
start
substring 方法將返回一個包含從 start 到最后(不包含 end )的子字符串的字符串。
下面的示例演示了 substring 方法的用法。
var ss; // 聲明變量。
var s = "The rain in Spain falls mainly in the plain..";
ss = s.substring(12, 17); // 取子字符串。
return(ss); // 返回子字符串。
}
這句話是古希臘哲學家亞里士多德說的。如果說優秀是一種習慣,那么懶惰也是一種習慣。人出生的時候,除了脾氣會因為天性而有所不同,其他的東西基本都是后天形成的,是家庭影響和教育的結果。所以,我們的一言一行都是日積月累養成的習慣。我們有的人形成了很好的習慣,有的人形成了很壞的習慣。所以我們從現在起就要把優秀變成一種習慣,使我們的優秀行為習以為常,變成我們的第二天性。讓我們習慣性地去創造性思考,習慣性地去認真做事情,習慣性地對別人友好,習慣性地欣賞大自然。
事情的結果盡管重要,但是做事情的過程更加重要,因為結果好了我們會更加快樂,但過程使我們的生命充實。人的生命最后的結果一定是死亡,我們不能因此說我們的生命沒有意義。世界上很少有永恒。大學生談戀愛,每天都在信誓旦旦地說我會愛你一輩子,這實際上是不真實的。統計數據表明,大學生談戀愛的 100對里有 90對最后會分手,最后結婚了的還有一半會離婚。你說愛情能永恒嗎?所以最真實的說法是:“我今天,此時此刻正在真心地愛著你。”明天也許你會失戀,失戀后我們會體驗到失戀的痛苦。這種體驗也是豐富你生命的一個過程。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1967495