1. 程式人生 > >【Spring】Spring在JavaWeb工程中整合log4j

【Spring】Spring在JavaWeb工程中整合log4j

在《【Spring】Spring3.0.5的下載、配置與Helloworld》(點選開啟連結)一文各位已經可能看到了。如果Spring不整合log4j直接啟動,則會出現如下關於Spring整合log4j的警告。這個挺煩人的,一方面自己提倡高內聚,低耦合,另一方面,自己沒有整合log4j就提出警告。我們程式猿寫出來的程式就叫做“耦合”,它Spring就叫做“整合”。好吧!你只能同時搞明白,log4j是個什麼鬼東西,Spring怎麼整合log4j,兩個問題:

log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader). 
log4j:WARN Please initialize the log4j system properly.
由於此前介紹的都是Spring在Java工程中簡單示例,log4j必須在JavaWeb工程中執行才有意義,你同時還要搞明白Spring怎麼在JavaWeb工程上面執行,Spring怎麼在JavaWeb工程中整合log4j。

一、Spring與Log4j的下載

1、你首先要有這兩個JavaWeb元件的jar包吧?不然怎麼搞出來?Spring在《【Spring】Spring3.0.5的下載、配置與Helloworld》(點選開啟連結)一文中已經講過怎麼下載了。Log4j則開啟Apache的官網(點選開啟連結)如下圖,選擇log4j-1.2.17.zip(Windows)或者log4j-1.2.17.tar.gz(Linux)。同樣是Apache的東西,在一些高版本的Tomcat中還整合了這個東西,當然,你最好還是在WEB-INF\lib目錄下補上這個包,以致於你的工程在所有Tomcat都能跑。


2、在Eclipse for JavaEE中新建一個名為SpringLog4j的Dynamic Web Project,還在解壓之後,把spring-framework-3.0.5.RELEASE-dependencies的所有東西與spring-framework-3.0.5.RELEASE\dist中的所有Jar包,不包括那個LIBD檔案,apache-log4j-1.2.17下的log4j-1.2.17.jar,拷貝到WEB\lib資料夾。


3、之後你的Eclipse for JavaEE如下所示。WEB-INF目錄下的Web.xml、applicationContext.xml、log4j.properties與根目錄下的Log4j.jsp是一會兒我們要寫的東西。


二、Spring與Log4j的配置

1、Web.xml

首先是這個關於JavaWeb的工程的總配置位置。我們要在裡面宣告要使用Spring與Log4j。值得注意的Log4j的配置必須在Spring配置之前,否則如果先啟動Spring,那個必須整合Log4j才不吐警告的Spring,由於Log4j還沒有啟動,找不到Spring,又會在任性地吐警告。當然,你設定那些什麼優先順序也行,不過,先啟動的直接放前面,這個檔案不是更好看嗎?

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	version="3.0">
	<!-- Log4j配置 -->
	<listener>
		<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
	</listener>
	<!-- 指定Log4j的配置檔案所在目錄。預設配置在WEB-INF目錄下 -->
	<context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>/WEB-INF/log4j.properties</param-value>
	</context-param>
	
	<!-- Spring配置 -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- 指定Spring Bean的配置檔案所在目錄。預設配置在WEB-INF目錄下 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/applicationContext.xml</param-value>
	</context-param>
	
</web-app>  
2、log4j.properties

這傢伙的字尾名是這麼長,你有什麼辦法?必須照打,都是Linux那邊帶過來的主,你看看人家Windows的配置檔案的字尾名僅僅就是ini3個字母!

#log4j.rootLogger = [ level ] , appenderName, appenderName, ...
log4j.rootLogger = all, console, R

#Console
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n

#File
log4j.appender.R = org.apache.log4j.RollingFileAppender
log4j.appender.R.File = c:/log.txt
log4j.appender.R.MaxFileSize = 500KB
log4j.appender.R.MaxBackupIndex = 1
log4j.appender.R.layout = org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] - %m%n
這東西還加不了中文註釋,給大家一行一行地講。#後面還僅能寫英文的東西,把我大天朝的程式猿放哪裡?我就加個中文註釋都不讓!

首先第一部分是log4j的總配置部分,all代表debug,info,error,fatal四種類型的資訊都會輸出。一般不設定為all,這裡只是為了讓大家看到效果。因為那些debug,info資訊對我們半點意義沒有,還因為有很多系統內部的檔案執行都會輸出debug與info資訊刷屏、刷版。關鍵是輸出到磁碟的日誌檔案會極速遞增,浪費磁碟空間。玩SQL Server的時候大家又不知道那個.ldb是多麼恐怖?

因此第一部分,一般寫成:

log4j.rootLogger = ERROR, console, R
代表僅輸出error與fatal錯誤。

之後的console,R分別代表在控制檯與檔案輸出。同時在之後的程式碼必須配置好這個兩輸出。

第二部分控制檯#Console
首先要使用log4j特定的包,這個沒有什麼好說,最後一句指明輸出格式。一會兒大招對照輸出結果就明白怎麼回事了。

第三部分檔案#File

log4j.appender.R.File=c:/log.txt是指這個Web工程錯誤日誌皆輸出到c:/log.txt。不要像網上那些大神輸出一個什麼.log字尾,關鍵是能夠直接開啟。

之後log4j.appender.R.MaxFileSize = 500KB指明這個log.txt檔案大小最多為500KB,如果超過這個大小,自動開一個新檔案,而log4j.appender.R.MaxBackupIndex=1指明此工程頂多只能有1個這個的日誌檔案。多了的話,新內容覆蓋舊內容,就像那些閉路電視攝像頭一樣。

Log4j到這裡就搞完了。

3、applicationContext.xml

之後是Spring的部分,由於這次根本就沒有用Spring做任何東西,因此,這個applicationContext.xml這樣寫就行了:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://www.springframework.org/schema/beans"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
</beans>
能刪的我都刪了。

4、Log4j.jsp

最後是在WebContent根目錄下的Log4j.jsp。在裡面寫入如下程式碼,整個程式的入口就是這個地方。

Servlet我都不搞了,就是為了讓大家直接看清楚問題的關鍵所在。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="org.apache.log4j.Logger"%>
<%
Logger.getLogger(this.getClass()).fatal("致命錯誤!");
Logger.getLogger(this.getClass()).error("出錯資訊!");
Logger.getLogger(this.getClass()).info("普通訊息!");
Logger.getLogger(this.getClass()).debug("除錯資訊!");
%>

三、執行結果

把SpringLog4j這個JavaWeb工程掛到Tomcat裡面,執行,之後在任意瀏覽器輸入http://localhost:8080/SpringLog4j/Log4j.jsp,待網頁成功載入之後,直接回到Eclipse則得到如下的執行結果,你輸入一次網址重新整理一次,則輸出一次以下結果:


同時,你的C盤,則多出一個log.txt,裡面的內容如下,可以看到,在程式執行的時候,Spring的執行會吐出很多無意義的DEBUG、INFO、TRACE的資訊,對於我們來說,真正有用的最後面的四句話。因此,可以理解,為何在上面的log4j.properties(這個字尾名又難記,又長,再次鄙視之!)的第一部分一般不寫all,只寫ERROR,這就只輸出ERROR以上等級的錯誤,也就是ERROR與FATAL。或者寫成TRACE,輸出TRACE、ERROR與FATAL資訊。

2015-05-10 09:54:34 [org.springframework.web.context.ContextLoader]-[INFO] - Root WebApplicationContext: initialization started
2015-05-10 09:54:34 [org.springframework.web.context.support.XmlWebApplicationContext]-[INFO] - Refreshing Root WebApplicationContext: startup date [Sun May 10 09:54:34 CST 2015]; root of context hierarchy
2015-05-10 09:54:34 [org.springframework.beans.factory.xml.XmlBeanDefinitionReader]-[INFO] - Loading XML bean definitions from ServletContext resource [/WEB-INF/applicationContext.xml]
2015-05-10 09:54:34 [org.springframework.beans.factory.xml.DefaultDocumentLoader]-[DEBUG] - Using JAXP provider [com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl]
2015-05-10 09:54:34 [org.springframework.beans.factory.xml.PluggableSchemaResolver]-[TRACE] - Trying to resolve XML entity with public id [null] and system id [http://www.springframework.org/schema/beans/spring-beans-3.0.xsd]
2015-05-10 09:54:34 [org.springframework.beans.factory.xml.PluggableSchemaResolver]-[DEBUG] - Loading schema mappings from [META-INF/spring.schemas]
2015-05-10 09:54:34 [org.springframework.beans.factory.xml.PluggableSchemaResolver]-[DEBUG] - Loaded schema mappings: {http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd=org/springframework/oxm/config/spring-oxm-3.0.xsd, http://www.springframework.org/schema/util/spring-util.xsd=org/springframework/beans/factory/xml/spring-util-3.0.xsd, http://www.springframework.org/schema/jms/spring-jms-3.0.xsd=org/springframework/jms/config/spring-jms-3.0.xsd, http://www.springframework.org/schema/task/spring-task.xsd=org/springframework/scheduling/config/spring-task-3.0.xsd, http://www.springframework.org/schema/aop/spring-aop-3.0.xsd=org/springframework/aop/config/spring-aop-3.0.xsd, http://www.springframework.org/schema/aop/spring-aop-2.0.xsd=org/springframework/aop/config/spring-aop-2.0.xsd, http://www.springframework.org/schema/oxm/spring-oxm.xsd=org/springframework/oxm/config/spring-oxm-3.0.xsd, http://www.springframework.org/schema/tool/spring-tool-2.5.xsd=org/springframework/beans/factory/xml/spring-tool-2.5.xsd, http://www.springframework.org/schema/beans/spring-beans.xsd=org/springframework/beans/factory/xml/spring-beans-3.0.xsd, http://www.springframework.org/schema/jee/spring-jee-2.5.xsd=org/springframework/ejb/config/spring-jee-2.5.xsd, http://www.springframework.org/schema/aop/spring-aop.xsd=org/springframework/aop/config/spring-aop-3.0.xsd, http://www.springframework.org/schema/beans/spring-beans-2.0.xsd=org/springframework/beans/factory/xml/spring-beans-2.0.xsd, http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd=org/springframework/web/servlet/config/spring-mvc-3.0.xsd, http://www.springframework.org/schema/beans/spring-beans-3.0.xsd=org/springframework/beans/factory/xml/spring-beans-3.0.xsd, http://www.springframework.org/schema/task/spring-task-3.0.xsd=org/springframework/scheduling/config/spring-task-3.0.xsd, http://www.springframework.org/schema/tx/spring-tx-2.5.xsd=org/springframework/transaction/config/spring-tx-2.5.xsd, http://www.springframework.org/schema/context/spring-context-2.5.xsd=org/springframework/context/config/spring-context-2.5.xsd, http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd=org/springframework/jdbc/config/spring-jdbc-3.0.xsd, http://www.springframework.org/schema/tool/spring-tool-3.0.xsd=org/springframework/beans/factory/xml/spring-tool-3.0.xsd, http://www.springframework.org/schema/tx/spring-tx.xsd=org/springframework/transaction/config/spring-tx-3.0.xsd, http://www.springframework.org/schema/tool/spring-tool-2.0.xsd=org/springframework/beans/factory/xml/spring-tool-2.0.xsd, http://www.springframework.org/schema/util/spring-util-2.5.xsd=org/springframework/beans/factory/xml/spring-util-2.5.xsd, http://www.springframework.org/schema/lang/spring-lang.xsd=org/springframework/scripting/config/spring-lang-3.0.xsd, http://www.springframework.org/schema/lang/spring-lang-2.5.xsd=org/springframework/scripting/config/spring-lang-2.5.xsd, http://www.springframework.org/schema/jee/spring-jee-3.0.xsd=org/springframework/ejb/config/spring-jee-3.0.xsd, http://www.springframework.org/schema/jee/spring-jee-2.0.xsd=org/springframework/ejb/config/spring-jee-2.0.xsd, http://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-3.0.xsd, http://www.springframework.org/schema/jee/spring-jee.xsd=org/springframework/ejb/config/spring-jee-3.0.xsd, http://www.springframework.org/schema/jms/spring-jms-2.5.xsd=org/springframework/jms/config/spring-jms-2.5.xsd, http://www.springframework.org/schema/jms/spring-jms.xsd=org/springframework/jms/config/spring-jms-3.0.xsd, http://www.springframework.org/schema/aop/spring-aop-2.5.xsd=org/springframework/aop/config/spring-aop-2.5.xsd, http://www.springframework.org/schema/mvc/spring-mvc.xsd=org/springframework/web/servlet/config/spring-mvc-3.0.xsd, http://www.springframework.org/schema/jdbc/spring-jdbc.xsd=org/springframework/jdbc/config/spring-jdbc-3.0.xsd, http://www.springframework.org/schema/tx/spring-tx-2.0.xsd=org/springframework/transaction/config/spring-tx-2.0.xsd, http://www.springframework.org/schema/tx/spring-tx-3.0.xsd=org/springframework/transaction/config/spring-tx-3.0.xsd, http://www.springframework.org/schema/context/spring-context-3.0.xsd=org/springframework/context/config/spring-context-3.0.xsd, http://www.springframework.org/schema/tool/spring-tool.xsd=org/springframework/beans/factory/xml/spring-tool-3.0.xsd, http://www.springframework.org/schema/util/spring-util-3.0.xsd=org/springframework/beans/factory/xml/spring-util-3.0.xsd, http://www.springframework.org/schema/lang/spring-lang-3.0.xsd=org/springframework/scripting/config/spring-lang-3.0.xsd, http://www.springframework.org/schema/util/spring-util-2.0.xsd=org/springframework/beans/factory/xml/spring-util-2.0.xsd, http://www.springframework.org/schema/lang/spring-lang-2.0.xsd=org/springframework/scripting/config/spring-lang-2.0.xsd, http://www.springframework.org/schema/beans/spring-beans-2.5.xsd=org/springframework/beans/factory/xml/spring-beans-2.5.xsd}
2015-05-10 09:54:34 [org.springframework.beans.factory.xml.PluggableSchemaResolver]-[DEBUG] - Found XML schema [http://www.springframework.org/schema/beans/spring-beans-3.0.xsd] in classpath: org/springframework/beans/factory/xml/spring-beans-3.0.xsd
2015-05-10 09:54:34 [org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader]-[DEBUG] - Loading bean definitions
2015-05-10 09:54:34 [org.springframework.beans.factory.xml.XmlBeanDefinitionReader]-[DEBUG] - Loaded 0 bean definitions from location pattern [/WEB-INF/applicationContext.xml]
2015-05-10 09:54:34 [org.springframework.web.context.support.XmlWebApplicationContext]-[DEBUG] - Bean factory for Root WebApplicationContext: org.s[email protected]5eedf162: defining beans []; root of factory hierarchy
2015-05-10 09:54:34 [org.springframework.web.context.support.XmlWebApplicationContext]-[DEBUG] - Unable to locate MessageSource with name 'messageSource': using default [[email protected]0824]
2015-05-10 09:54:34 [org.springframework.web.context.support.XmlWebApplicationContext]-[DEBUG] - Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using default [org.[email protected]708a538f]
2015-05-10 09:54:34 [org.springframework.ui.context.support.UiApplicationContextUtils]-[DEBUG] - Unable to locate ThemeSource with name 'themeSource': using default [o[email protected]1fce66ba]
2015-05-10 09:54:34 [org.springframework.beans.factory.support.DefaultListableBeanFactory]-[INFO] - Pre-instantiating singletons in org.s[email protected]5eedf162: defining beans []; root of factory hierarchy
2015-05-10 09:54:34 [org.springframework.web.context.support.XmlWebApplicationContext]-[DEBUG] - Unable to locate LifecycleProcessor with name 'lifecycleProcessor': using default [[email protected]bc2c83]
2015-05-10 09:54:34 [org.springframework.beans.factory.support.DefaultListableBeanFactory]-[DEBUG] - Returning cached instance of singleton bean 'lifecycleProcessor'
2015-05-10 09:54:34 [org.springframework.web.context.support.XmlWebApplicationContext]-[TRACE] - Publishing event in Root WebApplicationContext: org.springframework.context.event.ContextRefreshedEvent[source=Root WebApplicationContext: startup date [Sun May 10 09:54:34 CST 2015]; root of context hierarchy]
2015-05-10 09:54:34 [org.springframework.web.context.ContextLoader]-[DEBUG] - Published root WebApplicationContext as ServletContext attribute with name [org.springframework.web.context.WebApplicationContext.ROOT]
2015-05-10 09:54:34 [org.springframework.web.context.ContextLoader]-[INFO] - Root WebApplicationContext: initialization completed in 230 ms
2015-05-10 09:54:48 [org.apache.jsp.Log4j_jsp]-[FATAL] - 致命錯誤!
2015-05-10 09:54:48 [org.apache.jsp.Log4j_jsp]-[ERROR] - 出錯資訊!
2015-05-10 09:54:48 [org.apache.jsp.Log4j_jsp]-[INFO] - 普通訊息!
2015-05-10 09:54:48 [org.apache.jsp.Log4j_jsp]-[DEBUG] - 除錯資訊!

四、總結

Log4j一般不會像這樣直接寫在log4j.jsp中。一般處於那些try-catch異常結構中的catch裡面,或許一些操作檔案、資料庫的關鍵資料之間,直接給程式設計師看的。程式猿有空看看那個在log.txt,也就像保安有空看看閉路電視,來確定你的WEB工程到底正不正常。可以成為系統運維的一部分。

相關推薦

SpringSpring在JavaWeb工程整合log4j

在《【Spring】Spring3.0.5的下載、配置與Helloworld》(點選開啟連結)一文各位已經可能看到了。如果Spring不整合log4j直接啟動,則會出現如下關於Spring整合log4j的警告。這個挺煩人的,一方面自己提倡高內聚,低耦合,另一方面,自己沒有整

springspirng的常用工具類

ren handle file 監控 拷貝 trac convert cas har 一、概述   很多時候,很多工具類其實spring中就已經提供,常用的工具類有:     參考:https://www.cnblogs.com/langtianya/p/3875103

springspring mvcspring boot獲取spring cloud項目所有spring mvc的請求資源

sea ams other figure upd ring false 調用 tom 實現的方法: 1.在父級項目中 或者 每個微服務都引用的項目中添加實體類Resource 2.在父級項目中 或者 每個為服務都引用的項目中寫一個工具類,作用是用來獲取請求資源 3.在每一個

Spring 整合log4j日誌框架

構建專案,加入log4j日誌框架 在pom.xml加入以下依賴: <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId>

maven排除mavenjar包依賴的解決過程 例子:spring cloud啟動zipkin,報錯maven依賴jar包衝突 Class path contains multiple SLF4J bindings.

一直對於maven中解決jar包依賴問題的解決方法糾結不清: 下面這個例子可以說明一個很簡單的解決方法:     專案啟動報錯: Connected to the target VM, address: '127.0.0.1:59412', transport: 'sock

菜雞筆記001工程執行多個原始檔

首先建一個空工程; 選擇選項卡中工程選項(啊嘞,這個畫的好像有點醜); 新建一個頭檔案; 使用“#include “stdio.h””格式,不能用<stdio.h>哦,如果下面有函式的話,在這裡需要函式宣告,宣告方式和在單個檔案寫程式中的宣告相同;

Log4J學習十三Properties檔案能夠定義的配置項的格式和示例二

3,配置Logger:     當配置完成Appender和其對應的Layout之後,就需要把Appender繫結在Logger之上了。Logger的配置主要分兩類,一類是對RootLogger的配置,一類是對自定義Logger的配置。先來看看rootLogger的配置格式:log4j.rootLogger=

unity拓展在unity3d整合SVN命令(非cmd方式而是開啟svn介面方式)

先看看最終效果: 原理是unity通過呼叫命令列工具執行命令,執行時傳遞對應引數,文章後面會列出常用的svn命令~~~~~ 首先,先在unity封裝好呼叫命令列工具的函式,傳命令和引數即可進行呼叫。 public static void ProcessCommand

Spring- springmvc自定義Log4j配置

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

Spring使用Spring和AMQP發送接收消息(上)

com load 設定 支持 消息發送 結果 alt 來看 接下來 講AMQP之前,先講下傳統的JMS的消息模型,JMS中主要有三個參與者:消息的生產者、消費者、傳遞消息的通道(隊列或者主題),兩種消息模型如下:通道是隊列: 通道是隊列: 通道是主題: 在JMS中,雖然

Netapp在模擬器使用disk removeowner報錯

disk removeowner報錯信息如下:Cluster2::storage disk*> removeowner NET-1.43 Error: command failed: Disk NET-1.43 is not conne

SpringSpring MVC原理及配置詳解

進行 return sub sca scrip uil 線程安全 松耦合 必須 1.Spring MVC概述: Spring MVC是Spring提供的一個強大而靈活的web框架。借助於註解,Spring MVC提供了幾乎是POJO的開發模式,使得控制器的開發和測試更加簡

Oracle淺析Oracle的事務

ase count 他會 session get 允許 update 查看 操作 1. 什麽是事務 在數據庫中事務是工作的邏輯單元,一個事務是由一個或多個完成一組的相關行為的SQL語句組成,通過事務機制確保這一組SQL語句所作的操作要麽都成功執行,完成整個工作單元操作,要

LoadRunner使用遇到的問題

點擊 adr 原因 登錄 ecif logs pass div vusers 1.問題:loadrunner 報錯:在存取 output.txt 時發生共享違例 產生原因:是錄制的腳本回放時產生的問題或是載入腳本時報錯 解決辦法:打開任務管理器,將使用output.tx

SpringSpringMVC之異常處理

存儲 targe 存在 cnblogs del file 處理機制 href click java中的異常分為兩類,一種是運行時異常,一種是非運行時異常。在JavaSE中,運行時異常都是通過try{}catch{}捕獲的,這種只能捕獲顯示的異常,通常項目上拋出的異常都是不可

SpringSpringMVC之攔截器

https javax request orm bin 支持 exceptio 賬號 intern Spring的HandlerMapping處理器支持攔截器應用。當需要為某些請求提供特殊功能時,例如實現對用戶進行身份認證、登錄檢查等功能。 攔截器必須實現HandlerI

SpringSpringMVC之REST編程風格

data springmvc 4.0 gen rip servle truct -name insert REST架構是一個抽象的概念,目前主要是基於HTTP協議實現,其目的是為了提高系統的可伸縮性、降低應用之間的耦合度、便於架構分布式處理程序。 在URL中設置使用

Spring16、註解事務 @Transactional

引用 相關 連接池 每次 one 作用 事務性 簡單 這一 概述 事務管理對於企業應用來說是至關重要的,即使出現異常情況,它也可以保證數據的一致性。Spring Framework對事務管理提供了一致的抽象,其特點如下: 為不同的事務API提供一致的編程模型,

JAVA關於java 類.class.getResource("/").getPath()獲取路徑有空格的問題

() 獲取路徑 return url fig net java.net nbsp 相關信息 寫了一個web工程,在本地測試正確,但是部署到服務器上就出現錯誤。原因是讀取不到配置文件。 後來從打印出來的文件路徑中發現是用Java的class.getResource("/").

Hibernate解析hibernate的緩存

list gre mit details temp odin ica 所有 roo Hibernate中的緩存一共有三種,一級緩存、二級緩存、查詢緩存。緩存除了使用Hibernate自帶的緩存,還可以使用redis進行緩存,或是MongoDB進行緩存。 所使用的Demo: