在摸索中漸漸找到了屬于自己的學習方式 learn ** in action 而且喜歡上了in action 系列的書
我的記性實在不是很好 但是我知道自己擅長的是歸納和總結 加上我是完美主義者 所以到現在很多問題我都從根源上理解和解決了 所以in action 的學習方法是最適合我的
Struts的核心是MVC的控制層 它將模式和視圖連接起來 可以用來定義超鏈 表單和用戶動作組件
超鏈可以這樣






也可以














通過實現的ActionForm來處理表單數據和完成驗證的工作
定位和實例化ActionForm



在html表單中的action 指向一個Action 用這個Action來處理數據 Struts會 自動把其看作form來處理
看例子






























html的表單交出以后 根據action屬性轉向一個url來處理 在這里就是LogonSubmit 它通過LogonAction來處理數據
強制把其數據作為了Form的字段數據 就像Hibernate持久化了一個POJO一樣 然后通過一定的邏輯來進行驗證from和想要的數據是否符合 從而實現了驗證
例子
文件目錄樹
webtest
| |-- index.jsp
|
| |-- META-INF
| | |-- MANIFEST.MF
| |
| |-- pages
| | |-- logon.jsp
| | |-- struts-power.gif
| | |-- velocity-power.gif
| | |-- welcome.jsp
| |
| |-- WEB-INF
| | |-- struts-bean.tld
| | |-- struts-config.xml
| | |-- struts-html.tld
| | |-- struts-logic.tld
| | |-- struts-nested.tld
| | |-- struts-tiles.tld
| | |-- tiles-defs.xml
| | |-- validation.xml
| | |-- validator-rules.xml
| | |-- web.xml
| |
| | |classes
| | |
| | | |-- ergal
| | | | |-- Constants.class
| | | | |-- LogoffAction.class
| | | | |-- LogonAction.class
| | | | |-- LogonForm.class
| | | | |-- UserDirectory.class
| | | | |-- UserDirectoryException.class
| | | |
| | | |-- resources
| | | | |-- application.properties
| | | | |-- users.properties
| | |-- lib
......
| | |
| | |--src
| | | |-- build.xml
| | |
| | | |-- java
| | | |
| | | | |-- ergal
| | | | | |-- Constants.java
| | | | | |-- LogoffAction.java
| | | | | |-- LogonAction.java
| | | | | |-- LogonForm.java
| | | | | |-- UserDirectory.java
| | | | | |-- UserDirectoryException.java
| | | | |
| | | |-- resources
| | | | |-- application.properties
| | | | |-- users.properties
核心部分
index.jsp




直接轉向welcome.jsp
welcome.jsp






























這里用了taglib 里面是個邏輯引用 定義在web.xml中
這里還用了present和notPresent 用來判別制定對象是否存在來決定是否處理內容
logon.jsp



























這里的action指向了logonSumit
現在來看struts-config.xml


































































先是給一個ActionForm命名 并制定類 然后定義全局可用的forwards 都賦予一個邏輯地址
然后action-mapping
<action
path="/logonSubmit"
type="ergal.LogonAction"
name="logonForm"
scope="request"
validate="true"
input="/pages/logon.jsp">
<forward
name="success"
path="/pages/welcome.jsp"/>
</action>
制定了actionForm和來源地址
Form很簡單 就像一個POJO
LogonForm.java



















































ActionForm有個基本效驗方法
ActionErrors
|
validate
(
ActionMapping
mapping, javax.servlet.ServletRequestrequest)
|
可以重寫這個方法 定制 主要用來檢驗域是否都輸入了數據
驗證Action
LogonAction.java






































































這里引用了另一個定制的一個驗證數據的UserDirectory
UserDirectory.java







































































































































這里用了class的getClassLoder()方法 和ClassLoader的getResourceAsStream()方法
ClassLoader
|
getClassLoader
()
返回該類的類加載器。 |
InputStream
|
getResourceAsStream
(
String
name)
返回讀取指定資源的輸入流。 |
最后返回的是一個InpuStream
java.util
類 Properties
java.lang.Objectjava.util.Dictionary <K,V>
java.util.Hashtable < Object , Object >
java.util.Properties
public class Properties
Properties
類表示了一個持久的屬性集。
Properties
可保存在流中或從流中加載。屬性列表中每個鍵及其對應值都是一個字符串。
一個屬性列表可包含另一個屬性列表作為它的“默認值”;如果未能在原有的屬性列表中搜索到屬性鍵,則搜索第二個屬性列表。
因為
Properties
繼承于
Hashtable
,所以可對
Properties
對象應用
put
和
putAll
方法。但強烈反對使用這兩個方法,因為它們允許調用方插入其鍵或值不是
Strings
的項。相反,應該使用
setProperty
方法。如果在“有危險”的
Properties
對象(即包含非
String
的鍵或值)上調用
store
或
save
方法,則該調用將失敗。
load
和
store
方法按下面所指定的、簡單的面向行的格式加載和存儲屬性。此格式使用 ISO 8859-1 字符編碼。可以使用
Unicode 轉義符
來編寫此編碼中無法直接表示的字符;轉義序列中只允許單個 'u' 字符。可使用 native2ascii 工具對屬性文件和其他字符編碼進行相互轉換。
loadFromXML(InputStream)
和
storeToXML(OutputStream, String, String)
方法按簡單的 XML 格式加載和存儲屬性。默認使用 UTF-8 字符編碼,但如果需要,可以指定某種特定的編碼。XML 屬性文檔具有以下 DOCTYPE 聲明:
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
注意,導入或導出屬性時 不 訪問系統 URI (http://java.sun.com/dtd/properties.dtd);該系統 URI 僅作為一個惟一標識 DTD 的字符串:
<?xml version="1.0" encoding="UTF-8"?> <!-- DTD for properties --> <!ELEMENT properties ( comment?, entry* ) > <!ATTLIST properties version CDATA #FIXED "1.0"> <!ELEMENT comment (#PCDATA) > <!ELEMENT entry (#PCDATA) > <!ATTLIST entry key CDATA #REQUIRED> 重要的方法
String
|
getProperty
(
String
key)
用指定的鍵在此屬性列表中搜索屬性。 |
String
|
getProperty
(
String
key,
String
defaultValue)
用指定的鍵在屬性列表中搜索屬性。 |
void
|
load
(
InputStream
inStream)
從輸入流中讀取屬性列表(鍵和元素對)。 |
void
|
store
(
OutputStream
out,
String
comments)
以適合使用
load
方法加載到
Properties
表中的格式,將此
Properties
表中的屬性列表(鍵和元素對)寫入輸出流。
|
Enumeration
<?>
|
propertyNames
()
返回屬性列表中所有鍵的枚舉,如果在主屬性列表中未找到同名的鍵,則包括默認屬性列表中不同的鍵。 |
這里用到了load方法從InputStream中加載流 然后用getProperty()方法
該類展示了如何從property文件中讀取 鍵值 并和傳值進行比較
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
