在摸索中漸漸找到了屬于自己的學(xué)習(xí)方式 learn ** in action 而且喜歡上了in action 系列的書
我的記性實(shí)在不是很好 但是我知道自己擅長的是歸納和總結(jié) 加上我是完美主義者 所以到現(xiàn)在很多問題我都從根源上理解和解決了 所以in action 的學(xué)習(xí)方法是最適合我的
Struts的核心是MVC的控制層 它將模式和視圖連接起來 可以用來定義超鏈 表單和用戶動作組件
超鏈可以這樣
也可以
通過實(shí)現(xiàn)的ActionForm來處理表單數(shù)據(jù)和完成驗(yàn)證的工作
定位和實(shí)例化ActionForm
在html表單中的action 指向一個Action 用這個Action來處理數(shù)據(jù) Struts會 自動把其看作form來處理
看例子
html的表單交出以后 根據(jù)action屬性轉(zhuǎn)向一個url來處理 在這里就是LogonSubmit 它通過LogonAction來處理數(shù)據(jù)
強(qiáng)制把其數(shù)據(jù)作為了Form的字段數(shù)據(jù) 就像Hibernate持久化了一個POJO一樣 然后通過一定的邏輯來進(jìn)行驗(yàn)證from和想要的數(shù)據(jù)是否符合 從而實(shí)現(xiàn)了驗(yàn)證
例子
文件目錄樹
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
直接轉(zhuǎn)向welcome.jsp
welcome.jsp
這里用了taglib 里面是個邏輯引用 定義在web.xml中
這里還用了present和notPresent 用來判別制定對象是否存在來決定是否處理內(nèi)容
logon.jsp
這里的action指向了logonSumit
現(xiàn)在來看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有個基本效驗(yàn)方法
ActionErrors
|
validate
(
ActionMapping
mapping, javax.servlet.ServletRequestrequest)
|
可以重寫這個方法 定制 主要用來檢驗(yàn)域是否都輸入了數(shù)據(jù)
驗(yàn)證Action
LogonAction.java
這里引用了另一個定制的一個驗(yàn)證數(shù)據(jù)的UserDirectory
UserDirectory.java
這里用了class的getClassLoder()方法 和ClassLoader的getResourceAsStream()方法
ClassLoader
|
getClassLoader
()
返回該類的類加載器。 |
InputStream
|
getResourceAsStream
(
String
name)
返回讀取指定資源的輸入流。 |
最后返回的是一個InpuStream
java.util
類 Properties
java.lang.Object
java.util.Dictionary
<K,V>
java.util.Hashtable
<
Object
,
Object
>
java.util.Properties
public class
Properties
Properties
類表示了一個持久的屬性集。
Properties
可保存在流中或從流中加載。屬性列表中每個鍵及其對應(yīng)值都是一個字符串。
一個屬性列表可包含另一個屬性列表作為它的“默認(rèn)值”;如果未能在原有的屬性列表中搜索到屬性鍵,則搜索第二個屬性列表。
因?yàn)?
Properties
繼承于
Hashtable
,所以可對
Properties
對象應(yīng)用
put
和
putAll
方法。但強(qiáng)烈反對使用這兩個方法,因?yàn)樗鼈冊试S調(diào)用方插入其鍵或值不是
Strings
的項(xiàng)。相反,應(yīng)該使用
setProperty
方法。如果在“有危險(xiǎn)”的
Properties
對象(即包含非
String
的鍵或值)上調(diào)用
store
或
save
方法,則該調(diào)用將失敗。
load
和
store
方法按下面所指定的、簡單的面向行的格式加載和存儲屬性。此格式使用 ISO 8859-1 字符編碼。可以使用
Unicode 轉(zhuǎn)義符
來編寫此編碼中無法直接表示的字符;轉(zhuǎn)義序列中只允許單個 'u' 字符。可使用 native2ascii 工具對屬性文件和其他字符編碼進(jìn)行相互轉(zhuǎn)換。
loadFromXML(InputStream)
和
storeToXML(OutputStream, String, String)
方法按簡單的 XML 格式加載和存儲屬性。默認(rèn)使用 UTF-8 字符編碼,但如果需要,可以指定某種特定的編碼。XML 屬性文檔具有以下 DOCTYPE 聲明:
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
注意,導(dǎo)入或?qū)С鰧傩詴r 不 訪問系統(tǒng) URI (http://java.sun.com/dtd/properties.dtd);該系統(tǒng) URI 僅作為一個惟一標(biāo)識 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
()
返回屬性列表中所有鍵的枚舉,如果在主屬性列表中未找到同名的鍵,則包括默認(rèn)屬性列表中不同的鍵。 |
這里用到了load方法從InputStream中加載流 然后用getProperty()方法
該類展示了如何從property文件中讀取 鍵值 并和傳值進(jìn)行比較
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

