java web 筆記(一)
Web.xml詳解
<?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>
<display-name>Sample Application</display-name>
<description>This is a sample application</description >
<filter>
<!–過濾器名,可以隨便取,當web應用中有多個過濾器時不允許重名.–>
<filter-name>SampleFilter</filter-name>
<!–具體的過濾器的類的完整的包名+類名。注意:不能寫錯了。否則容器不能正確的例項化過濾器–>
<filter-class>mypack.SampleFilter</filter-class>
<init-param>
<!– 引數名 –>
<param-name>initParam1</param-name >
<!– 引數值 –>
<param-value>2</param-value>
</init-param>
</filter>
<!– Define the SampleFilter Mapping –>
<filter-mapping>
<!–過濾器名,注意要和上面的<filter-name>裡的名字一樣。–>
<filter-name>SampleFilter</filter-name>
<!– 指定過濾器負責過濾的URL。這裡指定了*.jsp 表示在訪問任何一個jsp頁面時都會先使用mypack.SampleFilter過濾器進行過濾。如果寫成login.jsp.則只有在訪問login.jsp時才會呼叫該過濾器進行過濾。–>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<servlet>
<!– Servlet名字,可以隨便取,有多個Servlet時不允許重名–>
<servlet-name>SampleServlet</servlet-name>
<!–指定實現這個Servlet的類。完整的包名+類名–>
<servlet-class>mypack.SampleServlet</servlet-class>
<!–定義Servlet的初始化引數(包括引數名和引數值)一個<servlet>元素裡可以有多個<init-param>元素。在Servlet類中通過ServletConfig類的來訪問這些引數。
–>
<init-param>
<!– 引數名 –>
<param-name>initParam1</param-name>
<!– 引數值 –>
<param-value>2</param-value>
</init-param>
<!–指定當前Web應用啟動時裝載Servlet的次序。當這個數>=0時,容器會按數值從小到大依次載入。如果數值<0或沒有指定,容器將載Web客戶首次訪問這個Servlet時載入。–>
<load-on-startup>1</load-on-startup>
</servlet>
<!– Define the SampleServlet Mapping –>
<servlet-mapping>
<!–必須和<servlet>裡的<servlet-name>內容一樣–>
<servlet-name>SampleServlet</servlet-name>
<!–指定訪問這個Servlet的URL。這裡給出的是對於整個Web應用的相對URL路徑。–>
<url-pattern>/sample</url-pattern>
</servlet-mapping>
<session-config>
<!–設 定HttpSession的生命週期。這裡以分鐘計算。下面的設定指明Session在最長不活動時間為10分鐘。過了這個時間,Servlet容器將它 作為無效處理。注意這裡和程式裡指定的計數單位不同,程式裡是以秒為單位。<session-config>只有<session- timeout>這個元素–>
<session-timeout>10</session-timeout>
</session-config>
<!— 配置會話偵聽器,class表示一個HttpSessionListener或 HttpSessionActivationListener 或 HttpSessionAttributeListener或 HttpSessionBindingListener的實現類。該節點允許多個 –>
<listener>
<listener-class>com.cn.SessionListenerImpl</listener-class>
</listener>
<!– 在 使用者訪問Web應用時,如果僅給出Web應用的根訪問URL,沒有指定具體的檔名,容器會呼叫<weblcome-file- list> 元素裡指定的檔案清單。<welcome-file-list>裡允許有多個<welcome-file>元 素,每個元素代表一個檔案。容器會先找第一文檔案件是否存在,如果存在這把這個檔案返回個客戶,不再進行其他檔案的查詢。如果不存在則找第二個檔案,依次 類推。如果所有檔案都不存在,則跑出404錯誤–>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>
<!– 設定Web應用引用的自定義標籤庫。下面的程式碼定義了一個/mytaglib標籤庫,它對應的TLD檔案為/WEB-INF/mytaglib.tld –>
<taglib>
<taglib-uri>/mytaglib</taglib-uri>
<taglib-location>/WEB-INF/mytaglib.tld</taglib-location>
</taglib>
<!– 如果Web應用訪問了由Servlet容器管理的某個JNDI Resource必須在這裡宣告對JNDI Resource的引用 –>
<resource-ref>
<!– 對應用資源的說明 –>
<description>DB Connection</description>
<!– 指定所引用資源的JNDI名字 –>
<res-ref-name>jdbc/sampleDb</res-ref-name>
<!– 指定所引用資源的類名字 –>
<res-type>javax.sql.DataSource</res-type>
<!– 指定管理所引用資源的Manager, 它有兩個可選值:Container和Application.Container表示由容器來建立和管理Resource,Application表示由Web應用來管理和建立Resource –>
<res-auth>Container</res-auth>
</resource-ref>
<security-constraint>
<web-resource-collection>
<!– 這個名字是必須的,由工具使用,別的地方不使用 –>
<web-resource-name>my application</web-resource-name>
<!– 指定要受約束的資源,至少有一個。可以有多個. –>
<uri-pattern>/*</uri-pattern>
<!– 描 述了度可與URL模式指定的資源哪些方法是受約束的,如果沒有<http-method>元素,表示任何角色的人都無法訪問任何http的方 法 。這裡放置了GET方法,表示只有GET方法是受約束的。其他任何角色的人可以訪問POST和其他的方法。但不能訪問GET方法。–>
<http-method>GET</http-method>
</web-resource-collection>
<!– 如果沒有<auth-constraint>表示所有角色都能訪問GET方法,如果是<auth-constraint/>表示任何角色都不能訪問GET方法 –>
<auth-constraint>
<!– 可選的。表示哪些角色能夠在指定的資源上呼叫受約束的方法。這裡表示只有擁有Admin和Member角色的人能夠訪問GET方法
<security-role>>裡的<role-name>值一樣 –>
<role-name>Admin</role-name>
<role-name>Member</role-name>
</auth-constraint>
</security-constraint>
<!– 將指定的角色對映到web.xml裡 –>
<security-role>
<description>The role that is required to log into the my Application
</description>
<!– 以下的角色和tomcat-users.xml裡的<tomcat-users>裡的<role rolename=""/>裡的rolename屬性值對應 –>
<role-name>Guest</role-name>
<role-name>Admin</role-name>
<role-name>Member</role-name>
</security-role>
<!– 如果要想進行認證,必須有<login-config>–>
<login-config>
<!– 認證方式。有4種:BASIC:基本。 DIGEST:摘要。CLIENT-CERT:客戶證書(能提供最高強度的認證)。FORM:表單 –>
<auth-method>FORM</auth-method>
<realm-name>
Tomcat Servet Configuraton Form-Based Authentication Area
</realm-name>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/error.jsp</form-error-page>
</form-login-config>
</login-config>
</web-app>
MVC 模式
MVC 模式代表 Model-View-Controller(模型-檢視-控制器) 模式。這種模式用於應用程式的分層開發。
Model(模型) - 模型代表一個存取資料的物件或 JAVA POJO。它也可以帶有邏輯,在資料變化時更新控制器。
View(檢視) - 檢視代表模型包含的資料的視覺化。
Controller(控制器) - 控制器作用於模型和檢視上。它控制資料流向模型物件,並在資料變化時更新檢視。它使檢視與模型分離開。
實現
我們將建立一個作為模型的 Student 物件。StudentView 是一個把學生詳細資訊輸出到控制檯的檢視類,StudentController 是負責儲存資料到 Student 物件中的控制器類,並相應地更新檢視 StudentView。
MVCPatternDemo,我們的演示類使用 StudentController 來演示 MVC 模式的用法。
Spring bean註解配置(1)
Spring自帶的@Component註解及擴充套件@Repository、@Service、@Controller,如圖
@Component是用來標記任何被Spring管理的元件。
@Controller用來標記presentation層(比如web controller)。
@Repository用來標記persistence層(比如DAO)。
@Service用來標記service層。
在使用註解方式配置bean時,需要引進一個包:
Spring-aop.jar
使用方法:
1、為需要使用註解方式的類添加註解標記
@Component(“識別符號”)
POJO類
在類上使用@Component註解,表示該類定義為Spring管理Bean,使用預設value(可選)屬性表示Bean識別符號。如果不指定識別符號,預設為首字母小寫類名。例如類UserController的識別符號為userController
Spring 註解配置(2)——@Autowired
@Autowired 註釋,它可以對類成員變數、方法及建構函式進行標註,完成自動裝配的工作。 通過 @Autowired的使用來消除 set ,get方法。在使用@Autowired之前,我們對一個bean配置起屬性時,是這用用的
定義一個class XImpl implements X介面的實現類,並實現save方法,在這裡指定了該bean在IoC中識別符號名稱為X,這裡需要一個X型別的屬性,通過@Autowired自動裝配方式,從IoC容器中去查詢到,並返回給該屬性。
applicationContext.xml配置
在啟動spring IoC時,容器自動裝載了一個AutowiredAnnotationBeanPostProcessor後置處理器,當容器掃描到@Autowied、@Resource或@Inject時,就會在IoC容器自動查詢需要的bean,並裝配給該物件的屬性
在使用@Autowired時,首先在容器中查詢對應型別的bean
如果查詢結果剛好為一個,就將該bean裝配給@Autowired指定的資料
如果查詢的結果不止一個,那麼@Autowired會根據名稱來查詢。
如果查詢的結果為空,那麼會丟擲異常。解決方法時,使用required=false
Spring 註解配置(2)——@RequestMapping
在 Spring MVC 應用程式中,RequestDispatcher (在 Front Controller 之下) 這個 servlet 負責將進入的 HTTP 請求路由到控制器的處理方法。
@RequestMapping 註解可以在控制器類的級別和/或其中的方法的級別上使用。
在類的級別上的註解會將一個特定請求或者請求模式對映到一個控制器之上。之後你還可以另外新增方法級別的註解來進一步指定到處理方法的對映關係。
@RequestMapping 來處理多個 URI
將多個請求對映到一個方法上去,只需要新增一個帶有請求路徑值列表的 @RequestMapping 註解就行了。
帶有 @RequestParam 的 @RequestMapping
@RequestParam 註解配合 @RequestMapping 一起使用,可以將請求的引數同處理方法的引數繫結在一起。
@RequestParam 註解使用的時候可以有一個值,也可以沒有值。這個值指定了需要被對映到處理方法引數的請求引數
用 @RequestMapping 處理 HTTP 的各種方法
Spring MVC 的 @RequestMapping 註解能夠處理 HTTP 請求的方法, 比如 GET, PUT, POST, DELETE 以及 PATCH。
所有的請求預設都會是 HTTP GET 型別的。
為了能降一個請求對映到一個特定的 HTTP 方法,你需要在 @RequestMapping 中使用 method 來宣告 HTTP 請求所使用的方法型別
用 @RequestMapping 來處理生產和消費物件
可以使用 @RequestMapping 註解的 produces 和 consumes 這兩個元素來縮小請求對映型別的範圍。
為了能用請求的媒體型別來產生物件, 你要用到 @RequestMapping 的 produces 元素再結合著 @ResponseBody 註解。
使用 @RequestMapping 來處理請求引數
@RequestMapping 直接的 params 元素可以進一步幫助我們縮小請求對映的定位範圍。使用 params 元素,你可以讓多個處理方法處理到同一個URL 的請求, 而這些請求的引數是不一樣的。
使用 @RequestMapping 處理動態 URI
@RequestMapping 註解可以同 @PathVaraible 註解一起使用,用來處理動態的 URI,URI 的值可以作為控制器中處理方法的引數。你也可以使用正則表示式來只處理可以匹配到正則表示式的動態 URI。
@RequestMapping 預設的處理方法
在控制器類中,你可以有一個預設的處理方法,它可以在有一個向預設 URI 發起的請求時被執行。
@RequestMapping 快捷方式
Spring 4.3 引入了方法級註解的變體,也被叫做 @RequestMapping 的組合註解。組合註解可以更好的表達被註解方法的語義。它們所扮演的角色就是針對 @RequestMapping 的封裝,而且成了定義端點的標準方法。