SSH框架之SSH前言
1 系統(tǒng)架構(gòu)
- 所謂系統(tǒng)架構(gòu)是指,整合應用系統(tǒng)程序的結(jié)構(gòu)。經(jīng)常提到的系統(tǒng)結(jié)構(gòu)有兩種:三層架構(gòu)與MVC。這兩種結(jié)構(gòu)既有區(qū)別,又有聯(lián)系。但是這兩種結(jié)構(gòu)的使用,均是為了降低系統(tǒng)耦合度。
1.1 三層架構(gòu)
- 三層架構(gòu)是指:視圖層View、服務層Service,和持久層Dao。它們分別完成不同的功能。
- View層:用于接收用戶提交請求的代碼在這里編寫。
- Service層:系統(tǒng)的業(yè)務邏輯主要在這里完成。
- Dao層:直接操作數(shù)據(jù)庫的代碼在這里編寫。
1.2 MVC架構(gòu)
- MVC,即Model模型、View視圖,以及Controller控制器。
- View:視圖,為用戶提供使用界面,與用戶直接進行交互。
- Model:模型,處理用戶提交請求,并計算出響應結(jié)果的模塊。
- Controller:控制器,用于將用戶請求轉(zhuǎn)發(fā)給相應的Model進行處理,并根據(jù)Model的計算結(jié)果向用戶提供相應響應。
1.3 MVC與三層架構(gòu)的關(guān)系
- MVC架構(gòu)和三層架構(gòu)可以綜合使用,如下圖所示。
- 三層架構(gòu)中,View層包含MVC架構(gòu)中的Controller控制器和View視圖;MVC架構(gòu)中,Model模型包括三層架構(gòu)中的Service層和Dao層。
1.4 SSH框架與三層架構(gòu)之間的關(guān)系
- SSH,即Struts2、Spring與Hibernate三個框架,它們在三層架構(gòu)中所處的位置是不同的,即它們在三層架構(gòu)中的功能各不相同,各司其職。
- Struts2:作為View層的實現(xiàn)者,完成用戶的請求接收功能。Struts2的Action作為整個應用的控制器,完成用戶請求的轉(zhuǎn)發(fā)及對用戶的響應。
- Hibernate:作為Dao層的實現(xiàn)者,完成對數(shù)據(jù)庫的增、刪、改、查功能。
- Spring:以整個應用大管家的身份出現(xiàn),整個應用中所有Bean的生命周期行為,均由Spring來管理,即整個應用中所有對象的創(chuàng)建、初始化、銷毀,以及對象間關(guān)聯(lián)關(guān)系的維護,均由Spring進行管理。
2 JUnit測試
- JUnit是一個Java編程語言編寫的單元測試框架,僅適合于純粹的單元測試。
2.1 Jar包的下載
- 使用Junit進行測試,需要導入Jar包,Junit的官網(wǎng)為:http://junit.org
- 我使用的jar包為:junit-4.9.jar
2.2 測試類的創(chuàng)建
- 對于測試類的創(chuàng)建有一些習慣:
1、在項目中新建一個source folder,并命名為test,將所有測試類均定義在在這個項目中。
2、對于測試類所在包,一般是被測試類所在包的包名后再加上一個test子包。
3、對于測試類類名,一般是被測類類名后加上test。2.2.1 測試類的創(chuàng)建
- 直接創(chuàng)建Junit Test Case。此時,會自動導入其需要的jar包。
- 在創(chuàng)建過程中,勾選上setUp()和tearDown()方法。
-
示例代碼如下:
package com.eason.dao.test;import static org.junit.Assert.*;import org.junit.After; import org.junit.Before; import org.junit.Test;public class StudentDaoImplTest {//測試方法執(zhí)行之前執(zhí)行,主要用于測試前的初始化,如連接數(shù)據(jù)庫等。@Beforepublic void setUp() throws Exception {}//測試方法執(zhí)行之后執(zhí)行,主要用于資源釋放,如關(guān)閉數(shù)據(jù)庫連接等。@Afterpublic void tearDown() throws Exception {}//對于測試方法的命名,一般是以小寫test開頭,該測試方法用于測試哪個方法,就將該方法名放于test之后,當然首字母大寫。@Testpublic void testInsertStudent() {System.out.println("testInsertStudent...");}}2.2.2 測試類中測試方法的運行
- 在測試方法的方法簽名上右擊,選擇 Run As/JUnit Test。
- 運行結(jié)果看到綠條,則說明運行成功;看到紅條,則說明運行出了問題。
3 Log4j
- 一個完整的軟件,日志是必不可少的。程序從開發(fā)、測試、維護、運行等環(huán)節(jié),都需要向控制臺或者文件等位置輸出大量信息。這些信息的輸出,在很多時候是使用System.out.println()無法完成的。
- 日志信息根據(jù)用途與記錄內(nèi)容的不同,分為調(diào)試日志,運行日志,異常日志等。
- 用于日志記錄的技術(shù)有很多,如jdk的logger技術(shù),apache的log4j、log4j2技術(shù)等。
- log4j的全稱為Log for java,即:專門用于java語言的日志記錄工具,其目前有兩個版本:Log4j和Log4j2。
3.1 Log4j和Log4j2的下載
- Log4j和Log4j2下載地址為:http://logging.apache.org/
3.2 日志級別
- 為了方便對于日志信息的輸出顯示,對日志內(nèi)容進行了分級管理,日志級別由高到低,共分為6個級別:fatal(致命的)、error、warn、info、debug、trace(堆棧)。
- 那為什么要對日志進行分級呢?
- 無論是將日志輸出到控制臺,還是文件,其輸出都會降低程序的運行效率。但由于調(diào)試、運行維護的需要,客戶的要求等原因,需要進行必要的日志輸出。這時就必須要在代碼中加入日志輸出語句。
- 這些輸出語句若在程序運行時全部執(zhí)行,則勢必會降低運行效率。例如,使用System.out.println()將信息輸出到控制臺,則所有的該輸出語句均將執(zhí)行。會大大降低程序的執(zhí)行效率。而要使其不輸出,唯一的辦法就是將這些輸出語句逐個全部刪除。這是個費時費力的過程。
- 將日志信息進行分級管理,便可方便地控制信息輸出內(nèi)容以及輸出位置:哪些信息需要輸出,哪些信息不需要輸出,只需在一個日志輸出控制文件中稍加修改即可。而代碼中的輸出語句不用做任何修改。
- 從這個角度來說,代碼中的日志編寫,其實就是寫大量的輸出語句。只不過,這些輸出語句比較特殊,它們具有級別,在程序運行期間不一定被執(zhí)行。它們的執(zhí)行是由另一個控制文件控制的。
3.3 日志輸出控制文件
- log4j的日志輸出控制文件,主要由三個部分構(gòu)成:
1、日志信息的輸出位置:控制日志信息將要輸出的位置,是控制臺還是文件等。
2、日志信息的輸出格式:控制日志信息的顯示格式,即以怎么樣的字符串形式顯示。
3、日志信息的輸出級別:控制日志信息的顯示內(nèi)容,即顯示哪些級別的日志信息。 -
有了日志輸出控制文件,代碼中只要設(shè)置好日志信息內(nèi)容以及級別即可,通過控制文件便可控制這些日志信息的輸出。
4 Log4j技術(shù)
4.1 在程序中的日志實現(xiàn)步驟
-
若要在自己的程序中寫入日志語句,則可以按照以下步驟進行:
##define an appender named consolelog4j.appender.console=org.apache.log4j.ConsoleAppender#The Target value is System.out or System.errlog4j.appender.console.Target=System.err#set the layout type of the apperderlog4j.appender.console.layout=org.apache.log4j.PatternLayout#set the layout format patternlog4j.appender.console.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH:mm:ss}] %c %L %m%n##define an appender named filelog4j.appender.file=org.apache.log4j.FileAppender#define the file path and namelog4j.appender.file.File=d:/logfile.txt#set the layout type of the apperderlog4j.appender.file.layout=org.apache.log4j.PatternLayout#set the layout format patternlog4j.appender.file.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH:mm:ss}] %c %L %m%n##define an appender named rollfilelog4j.appender.rollfile=org.apache.log4j.RollingFileAppender#define the file path and namelog4j.appender.rollfile.File=d:/logrollfile.txt#set the log's sizelog4j.appender.rollfile.MaxFileSize=10KB#set the layout type of the apperderlog4j.appender.rollfile.layout=org.apache.log4j.PatternLayout#set the layout format patternlog4j.appender.rollfile.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH:mm:ss}] %c %L %m%n##define a logger#log4j.rootLogger=debug,console,file,rollfilelog4j.rootLogger=INFO,console
1、導入Jar包:在項目中導入log4j需要的jar包。
2、放入日志輸出控制文件:將屬性文件log4j.properties直接放到項目的src下。
3、代碼中實現(xiàn)日志記錄:在要輸出日志的類中創(chuàng)建日志對象Logger,并通過Logger的方法在代碼中加入日志輸出語句。在Java代碼中進行日志輸出,需要用到Logger類的靜態(tài)方法getLogger()。
- 注意,Logger為org.apache.log4j包中的類。 package com.eason.log4j.test;
import org.apache.log4j.Logger;
public class MyTest {public static void main(String[] args) {//創(chuàng)建日志記錄對象LoggerLogger logger = Logger.getLogger(MyTest.class);logger.fatal("fatal msg");logger.error("error msg");logger.warn("warn msg");logger.info("info msg");logger.debug("debug msg");logger.trace("trace msg");}
}
- 將來這些日志輸出語句,會根據(jù)log4j.properties文件中日志級別的設(shè)置進行輸出。會輸出到指定位置,其輸出結(jié)果是:輸出指定級別以及更高級別的信息。如指定Info級別,則會輸出fatal、error、warn、info級別的信息。就本例而言,會執(zhí)行以下三句,而不會執(zhí)行debug()方法。 [FATAL][2018-01-01 10:23:33] com.eason.log4j.test.MyTest 9 fatal msg
[ERROR][2018-01-01 10:23:33] com.eason.log4j.test.MyTest 10 error msg
[WARN ][2018-01-01 10:23:33] com.eason.log4j.test.MyTest 11 warn msg
[INFO ][2018-01-01 10:23:33] com.eason.log4j.test.MyTest 12 info msg
4.2 日志輸出控制文件分析
- 將來這些日志輸出語句,會根據(jù)log4j.properties文件中日志級別的設(shè)置進行輸出。會輸出到指定位置,其輸出結(jié)果是:輸出指定級別以及更高級別的信息。如指定Info級別,則會輸出fatal、error、warn、info級別的信息。就本例而言,會執(zhí)行以下三句,而不會執(zhí)行debug()方法。 [FATAL][2018-01-01 10:23:33] com.eason.log4j.test.MyTest 9 fatal msg
[ERROR][2018-01-01 10:23:33] com.eason.log4j.test.MyTest 10 error msg
[WARN ][2018-01-01 10:23:33] com.eason.log4j.test.MyTest 11 warn msg
[INFO ][2018-01-01 10:23:33] com.eason.log4j.test.MyTest 12 info msg
- 日志屬性文件log4j.properties是專門用于控制日志輸出的,其主要進行三個方面控制:輸出位置:控制日志將要輸出的位置,是控制臺還是文件等;輸出布局:控制日志信息的顯示形式;輸出級別:控制要輸出的日志級別。
- 日志屬性文件由兩個對象組成:日志附加器和根日志。
- 根日志:即為Java代碼中的日志記錄器,其主要由兩個屬性構(gòu)成:日志輸出級別和日志附加器。
-
日志附加器:則由日志輸出位置定義,由其他很多屬性進行修飾,如輸出布局、文件位置、文件大小等。
1、定義日志附加器appender:
- 所謂日志附加器,就是為日志記錄器附加上很多其他設(shè)置信息。附加器的本質(zhì)是一個接口,其定義語法為:log4j.appender.appenderName = 輸出位置。(appenderName為自定義名稱)
-
輸出位置為log4j指定的類型,是定義好的一些appender接口的實現(xiàn)類。查看log4j框架解壓目錄下的站點目錄site的index.jsp中的JavaDoc,可看到log4j的API。
- 例如定義一個名稱為console的控制臺附加器: ##define an appender named console log4j.appender.console=org.apache.log4j.ConsoleAppender
- 常用的附加器實現(xiàn)類有四個,如下:
- org.apache.log4j.ConsoleAppender:日志輸出到控制臺;org.apache.log4j.FileAppender:日志輸出到文件。
-
org.apache.log4j.RollingFileAppender:當日志文件大小到達指定尺寸的時候?qū)a(chǎn)生一個新的日志文件;org.apache.log4j.DailyRollingFileAppender:每天產(chǎn)生一個日志文件。
2、修飾日志附加器
- 所謂修飾日志附加器,就為定義好的附加器添加一些屬性,以控制到指定位置的輸出。不同的附加器,其修飾屬性不同。
- 控制臺附加器: ##define an appender named console log4j.appender.console=org.apache.log4j.ConsoleAppender #The Target value is System.out or System.err log4j.appender.console.Target=System.err #set the layout type of the apperder log4j.appender.console.layout=org.apache.log4j.PatternLayout #set the layout format pattern log4j.appender.console.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH:mm:ss}] %c %L %m%n -
Target:即控制輸出到控制臺的使用目標。其值為System.out或者System.err。它們的區(qū)別是:System.out是以黑色字體顯示到控制臺,而System.err則是以紅色字體顯示。
- 文件附加器:
##define an appender named file log4j.appender.file=org.apache.log4j.FileAppender #define the file path and name log4j.appender.file.File=d:/logfile.txt #set the layout type of the apperder log4j.appender.file.layout=org.apache.log4j.PatternLayout #set the layout format pattern log4j.appender.file.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH:mm:ss}] %c %L %m%n - File:為日志要輸出的文件位置以及文件名稱。
- 滾動文件附加器
##define an appender named rollfilelog4j.appender.rollfile=org.apache.log4j.RollingFileAppender#define the file path and namelog4j.appender.rollfile.File=d:/logrollfile.txt#set the log's sizelog4j.appender.rollfile.MaxFileSize=10KB#set the layout type of the apperderlog4j.appender.rollfile.layout=org.apache.log4j.PatternLayout#set the layout format patternlog4j.appender.rollfile.layout.ConversionPattern=[%-5p][%d{yyyy-MM-dd HH:mm:ss}] %c %L %m%n- MaxFileSize:用于指定日志文件的最大值,若文件超過指定值,將自動產(chǎn)生另一個日志文件。
- Log4j常用布局類型:
- org.apache.log4j.HTMLLayout:網(wǎng)頁布局,以HTML表格形式布局。
- org.apache.log4j.SimpleLayout:簡單布局,包含日志信息的級別和信息字符串。
-
org.apache.log4j.PatternLayout:匹配器布局,可以靈活地指定布局模式。其主要是通過設(shè)置Pattern的ConversionPattern屬性值來控制具體輸出格式的。ConversionPattern的值中有很多控制字符。這些字符的意義如下圖所示:(ConversionPattern的取值說明)
3、配置根Logger
- 配置rootLogger,以便于代碼加載來控制日志的輸出,其語法為: log4j.rootLogger = [level], appenderName, ...
- 其中,level是日志記錄的優(yōu)先級,分為OFF,FATAL、ERROR、WARN、INFO、DEBUG、ALL。Log4j只使用四個級別,優(yōu)先級從高到低分別是:ERROR、WARN、INFO、DEBUG。OFF為關(guān)閉日志功能。
- 低級別的可以顯示高級別,但是高級別不能夠顯示低級別。所以,級別越高,將要顯示的信息就越少。
5 log4j2技術(shù)
- log4j2,是對log4j的升級,其在配置和使用上發(fā)生了較大變化。
5.1 在程序中的日志實現(xiàn)步驟
1、導入jar包:使用log4j2,需要導入其jar包,log4j框架解壓后的目錄中可以找到如下兩個jar包:
2、放入日志輸出控制文件:將文件log4j2.xml直接放到項目的src下。log4j2配置文件是XML文件,不再支持properties文件。默認的文件名為log4j2.xml。其存放的位置為classpath中。
<?xml version="1.0" encoding="UTF-8"?><configuration status="OFF"><appenders><Console name="myConsole" target="SYSTEM_OUT"><PatternLayout pattern="[%-5p][%d{yyyy-MM-dd HH:mm:ss}] [%c %L] %m%n" /></Console><File name="myLogFile" fileName="log/test.log" append="true"><PatternLayout pattern="[%-5p][%d{yyyy-MM-dd HH:mm:ss}] [%c %L] %m%n"/></File><RollingFile name="myRollingFile" fileName="logs/app.log"filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"><PatternLayout pattern="[%-5p][%d{yyyy-MM-dd HH:mm:ss}] [%c %L] %m%n"/><SizeBasedTriggeringPolicy size="2KB"/></RollingFile></appenders><loggers><!-- <logger name="全限定類名或接口名" level="info"><appender-ref ref="myConsole" /></logger>--><root level="trace"><appender-ref ref="myConsole" /><!-- <appender-ref ref="myLogFile" /> --><!-- <appender-ref ref="myRollingFile" /> --></root></loggers></configuration>3、代碼中實現(xiàn)日志記錄:
- 在要輸出日志的類中創(chuàng)建日志對象Logger,并通過Logger的方法在代碼中加入日志輸出語句。該日志對象是通過靜態(tài)類LogManager的getLogger()方法獲取的。
-
注意:Logger和LogManager均為org.apache.logging.log4j包中的類,并非org.apache.log4j包中的。
package com.eason.log4j2;import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;public class MyMain {public static void main(String[] args) {Logger logger = LogManager.getLogger(MyMain.class);logger.debug("this is info message");logger.info("this is debug message");logger.warn("this is warn message");logger.error("this is error message");}}5.2 日志輸出控制文件分析
- log4j2配置文件是XML文件,不再支持properties文件,默認的文件名為log4j2.xml。其存放的位置為classpath中。
- 若沒有設(shè)置log4j2.xml,則系統(tǒng)會使用默認的日志配置,只會輸出到控制臺error級別的信息。
- 配置文件說明如下圖所示:
轉(zhuǎn)載于:https://blog.51cto.com/12402717/2056400
總結(jié)
以上是生活随笔為你收集整理的SSH框架之SSH前言的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 轻量级ORM框架Dapper应用四:使用
- 下一篇: WF4.0实战(十一):邮件通知