然后在網(wǎng)頁(yè)" />

欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Action 1 理解Struts

系統(tǒng) 1923 0

在摸索中漸漸找到了屬于自己的學(xué)習(xí)方式 learn ** in action 而且喜歡上了in action 系列的書

我的記性實(shí)在不是很好 但是我知道自己擅長(zhǎng)的是歸納和總結(jié) 加上我是完美主義者 所以到現(xiàn)在很多問題我都從根源上理解和解決了 所以in action 的學(xué)習(xí)方法是最適合我的

Struts的核心是MVC的控制層 它將模式和視圖連接起來(lái) 可以用來(lái)定義超鏈 表單和用戶動(dòng)作組件

超鏈可以這樣

< forward name ="welcome"
path
="pages/index.jsp" />
然后在網(wǎng)頁(yè)里
<% @tagliburi = " /tags/struts-logic " prefix = " logic " %>

< logic:redirectforward = " welcome " />

也可以

< global-forwards >
....
< forward
name ="welcome"
path
="/welcome.do" />
</ global-forwards >

< action-mappings >
< action
path ="/welcome"
type
="org.apache.struts.actions.ForwardAction"
parameter
="/pages/welcome.jsp" />
......
</ action-mappings >

通過(guò)實(shí)現(xiàn)的ActionForm來(lái)處理表單數(shù)據(jù)和完成驗(yàn)證的工作

定位和實(shí)例化ActionForm

< form-beans >
< form-bean name ="logonForm" type ="ergal.LogonForm" />
</ form-beans >

在html表單中的action 指向一個(gè)Action 用這個(gè)Action來(lái)處理數(shù)據(jù) Struts會(huì) 自動(dòng)把其看作form來(lái)處理

看例子

< struts-config >

<!-- ========================================FormBeanDefinitions -->
< form-beans >
< form-bean name ="logonForm" type ="ergal.LogonForm" />
</ form-beans >


<!-- ===================================GlobalForwardDefinitions -->
......

<!-- ===================================ActionMappingDefinitions -->
< action-mappings >
......

< action
path ="/logonSubmit"
type
="ergal.LogonAction"
name
="logonForm"
scope
="request"
validate
="true"
input
="/pages/logon.jsp" >
< forward
name ="success"
path
="/pages/welcome.jsp" />
</ action >

</ action-mappings >

</ struts-config >

html的表單交出以后 根據(jù)action屬性轉(zhuǎn)向一個(gè)url來(lái)處理 在這里就是LogonSubmit 它通過(guò)LogonAction來(lái)處理數(shù)據(jù)

強(qiáng)制把其數(shù)據(jù)作為了Form的字段數(shù)據(jù) 就像Hibernate持久化了一個(gè)POJO一樣 然后通過(guò)一定的邏輯來(lái)進(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

<% @tagliburi = " /tags/struts-logic " prefix = " logic " %>

< logic:redirectforward = " welcome " />

直接轉(zhuǎn)向welcome.jsp

welcome.jsp

<% ... @tagliburi = " /tags/struts-bean " prefix = " bean " %>
<% ... @tagliburi = " /tags/struts-html " prefix = " html " %>
<% ... @tagliburi = " /tags/struts-logic " prefix = " logic " %>

< html >
< head >
< title > Welcome! </ title >
< html:base />
</ head >

< body >
< logic:present name ="user" >
< h3 > Welcome < bean:write name ="user" property ="username" /></ h3 >
</ logic:present >

< logic:notPresent scope ="session" name ="user" >
< h3 > Welcomeworld! </ h3 >
</ logic:notPresent >

< html:errors />

< UL >
< LI >< html:link forward ="logon" > Signin </ html:link ></ LI >
< logic:present name ="user" >
< LI >< html:link forward ="logoff" > Signout </ html:link ></ LI >
</ logic:present >
</ UL >
< img src ="struts-power.gif" alt ="Poweredbystruts" >
</ body >
</ html >

這里用了taglib 里面是個(gè)邏輯引用 定義在web.xml中

這里還用了present和notPresent 用來(lái)判別制定對(duì)象是否存在來(lái)決定是否處理內(nèi)容

logon.jsp

<% ... @tagliburi = " /tags/struts-html " prefix = " html " %>

< html >
< head >
< title > SigninPlease! </ title >
</ head >

< body >
< html:errors />
< html:form action ="logonSubmit" focus ="username" >
< table border ="0" width ="100%" >
< tr >
< th align ="right" > Username: </ th >
< td align ="left" >< html:text property ="username" /></ td >
</ tr >
< tr >
< th align ="right" > Password: </ th >
< td align ="left" >< html:password property ="password" /></ td >
</ tr >
< tr >
< td align ="right" >< html:submit /></ td >
< td align ="left" >< html:reset /></ td >
</ tr >
</ table >
</ html:form >
</ body >
</ html >

這里的action指向了logonSumit

現(xiàn)在來(lái)看struts-config.xml

<? xmlversion="1.0"encoding="ISO-8859-1" ?>

<! DOCTYPEstruts-configPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"
>



< struts-config >

<!-- ========================================FormBeanDefinitions -->
< form-beans >
< form-bean name ="logonForm" type ="ergal.LogonForm" />
</ form-beans >


<!-- ===================================GlobalForwardDefinitions -->
< global-forwards >
< forward
name ="logoff"
path
="/logoff.do" />
< forward
name ="logon"
path
="/logon.do" />
< forward
name ="welcome"
path
="/welcome.do" />
</ global-forwards >


<!-- ===================================ActionMappingDefinitions -->
< action-mappings >
< action
path ="/welcome"
type
="org.apache.struts.actions.ForwardAction"
parameter
="/pages/welcome.jsp" />

< action
path ="/logon"
type
="org.apache.struts.actions.ForwardAction"
parameter
="/pages/logon.jsp" />

< action
path ="/logonSubmit"
type
="ergal.LogonAction"
name
="logonForm"
scope
="request"
validate
="true"
input
="/pages/logon.jsp" >
< forward
name ="success"
path
="/pages/welcome.jsp" />
</ action >

< action
path ="/logoff"
type
="ergal.LogoffAction" >
< forward
name ="success"
path
="/pages/welcome.jsp" />
</ action >
</ action-mappings >

</ struts-config >

先是給一個(gè)ActionForm命名 并制定類 然后定義全局可用的forwards 都賦予一個(gè)邏輯地址

然后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和來(lái)源地址

Form很簡(jiǎn)單 就像一個(gè)POJO

LogonForm.java

package ergal;

import javax.servlet.http. * ;
import org.apache.struts.action. * ;

public class LogonForm extends ActionForm
... {
private Stringusername;
private Stringpassword;

public void setUsername(Stringusername)
... {
this .username = username;
}

public StringgetUsername()
... {
return this .username;
}


public void setPassword(Stringpassword)
... {
this .password = password;
}

public StringgetPassword()
... {
return this .password;
}


public void reset(ActionMappingmapping,HttpServletRequestrequest)
... {
setPassword(
null );
setUsername(
null );
}


public ActionErrorsvalidate(ActionMappingmapping,HttpServletRequestrequest)
... {

ActionErrorserrors
= new ActionErrors();

if ((username == null ) || (username.length() < 1 ))
errors.add(
" username " ,
new ActionError( " error.username.required " ));

if ((password == null ) || (password.length() < 1 ))
errors.add(
" password " ,
new ActionError( " error.password.required " ));

return errors;

}

}

ActionForm有個(gè)基本效驗(yàn)方法

ActionErrors validate ( ActionMapping mapping, javax.servlet.ServletRequestrequest)

可以重寫這個(gè)方法 定制 主要用來(lái)檢驗(yàn)域是否都輸入了數(shù)據(jù)

驗(yàn)證Action

LogonAction.java

package ergal;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionServlet;


public final class LogonAction extends Action
... {
public boolean isUserLogon(Stringusername,Stringpassword) throws UserDirectoryException
... {
return UserDirectory.getInstance().isValidPassword(username,password);
}


public ActionForwardexecute(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,
HttpServletResponseresponse)
throws IOException,ServletException
... {
Stringusername
= ((LogonForm)form).getUsername();
Stringpassword
= ((LogonForm)form).getPassword();

boolean validated = false ;
try
... {
validated
= isUserLogon(username,password);
}

catch (UserDirectoryExceptione)
... {
ActionMessageserrors
= new ActionMessages();
errors.add(ActionErrors.GLOBAL_ERROR,
new ActionError( " error.logon.invalid " ));
saveErrors(request,errors);
return mapping.getInputForward();
}


if ( ! validated)
... {
ActionMessageserrors
= new ActionMessages();
errors.add(ActionErrors.GLOBAL_ERROR,
new ActionError( " error.logon.invalid " ));
saveErrors(request,errors);
return mapping.getInputForward();
}


HttpSessionsession
= request.getSession();
session.setAttribute(Constants.USER_KEY,form);



StringBuffermessage
= new StringBuffer( " LogonAction:User' " );
message.append(username);
message.append(
" 'loggedoninsession " );
message.append(session.getId());
servlet.log(message.toString());


return (mapping.findForward(Constants.SUCCESS));

}

}

這里引用了另一個(gè)定制的一個(gè)驗(yàn)證數(shù)據(jù)的UserDirectory

UserDirectory.java

package ergal;

import java.io. * ;
import java.util. * ;

public class UserDirectory
... {
private static final StringUserDirectoryFile = " resources/users.properties " ;
private static final StringUserDirectoryHeader = " ${user}=${password} " ;

private static UserDirectoryuserDirectory = null ;

private static Propertiesp;

private UserDirectory() throws UserDirectoryException
... {

java.io.InputStreami
= null ;
p
= null ;
i
= this .getClass().getClassLoader().getResourceAsStream(UserDirectoryFile);


if ( null == i)
... {
throw new UserDirectoryException();
}


else
... {

try
... {
p
= new Properties();
p.load(i);
i.close();
}

catch (java.io.IOExceptione)
... {
p
= null ;
System.out.println(e.getMessage());
throw new UserDirectoryException();
}

finally
... {
i
= null ;
}

}

}


public static UserDirectorygetInstance() throws UserDirectoryException
... {

if ( null == userDirectory)
... {

userDirectory
= new UserDirectory();

}


return userDirectory;

}


public StringfixId(StringuserId)
... {
return userId.toUpperCase();
}


public boolean isValidPassword(StringuserId,Stringpassword)
... {

if ( null == password) return false ;

String_userId
= fixId(userId);

if ( ! isUserExist(_userId)) return false ;

return (password.equals(getPassword(_userId)));

}


public boolean isUserExist(StringuserId)
... {

if ( null == userId) return false ;


return ! ( null == p.getProperty(userId));

}




public StringgetPassword(StringuserId)
... {
return p.getProperty(userId);
}




public EnumerationgetUserIds()
... {
return p.propertyNames();
}




public void setUser(StringuserId,Stringpassword) throws UserDirectoryException
... {

// nonulls
if (( null == userId) || ( null == password))
... {
throw new UserDirectoryException();
}



try
... {

p.put(fixId(userId),password);
p.store(
new FileOutputStream(UserDirectoryFile),
UserDirectoryHeader);

}


catch (IOExceptione)
... {

throw new UserDirectoryException();

}

}


}

這里用了class的getClassLoder()方法 和ClassLoader的getResourceAsStream()方法

ClassLoader getClassLoader ()
返回該類的類加載器。
InputStream getResourceAsStream ( String name)
返回讀取指定資源的輸入流。

最后返回的是一個(gè)InpuStream

java.util
類 Properties

    
      java.lang.Object
    
    繼承者 
    
      java.util.Dictionary
    
    <K,V>
      
    繼承者 
    
      java.util.Hashtable
    
    <
    
      Object
    
    ,
    
      Object
    
    >
          
    繼承者 
    
      java.util.Properties
    
  
所有已實(shí)現(xiàn)的接口:
Serializable , Cloneable , Map < Object , Object >
直接已知子類:
Provider

      public class 
      
        Properties
      
    
extends Hashtable < Object , Object >
  

Properties 類表示了一個(gè)持久的屬性集。 Properties 可保存在流中或從流中加載。屬性列表中每個(gè)鍵及其對(duì)應(yīng)值都是一個(gè)字符串。

一個(gè)屬性列表可包含另一個(gè)屬性列表作為它的“默認(rèn)值”;如果未能在原有的屬性列表中搜索到屬性鍵,則搜索第二個(gè)屬性列表。

因?yàn)? Properties 繼承于 Hashtable ,所以可對(duì) Properties 對(duì)象應(yīng)用 put putAll 方法。但強(qiáng)烈反對(duì)使用這兩個(gè)方法,因?yàn)樗鼈冊(cè)试S調(diào)用方插入其鍵或值不是 Strings 的項(xiàng)。相反,應(yīng)該使用 setProperty 方法。如果在“有危險(xiǎn)”的 Properties 對(duì)象(即包含非 String 的鍵或值)上調(diào)用 store save 方法,則該調(diào)用將失敗。

load store 方法按下面所指定的、簡(jiǎn)單的面向行的格式加載和存儲(chǔ)屬性。此格式使用 ISO 8859-1 字符編碼。可以使用 Unicode 轉(zhuǎn)義符 來(lái)編寫此編碼中無(wú)法直接表示的字符;轉(zhuǎn)義序列中只允許單個(gè) 'u' 字符。可使用 native2ascii 工具對(duì)屬性文件和其他字符編碼進(jìn)行相互轉(zhuǎn)換。

loadFromXML(InputStream) storeToXML(OutputStream, String, String) 方法按簡(jiǎn)單的 XML 格式加載和存儲(chǔ)屬性。默認(rèn)使用 UTF-8 字符編碼,但如果需要,可以指定某種特定的編碼。XML 屬性文檔具有以下 DOCTYPE 聲明:

     <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
 
  

注意,導(dǎo)入或?qū)С鰧傩詴r(shí) 訪問系統(tǒng) URI (http://java.sun.com/dtd/properties.dtd);該系統(tǒng) URI 僅作為一個(gè)惟一標(biāo)識(shí) 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)
從輸入流中讀取屬性列表(鍵和元素對(duì))。
  
void store ( OutputStream out, String comments)
以適合使用 load 方法加載到 Properties 表中的格式,將此 Properties 表中的屬性列表(鍵和元素對(duì))寫入輸出流。

Enumeration <?> propertyNames ()
返回屬性列表中所有鍵的枚舉,如果在主屬性列表中未找到同名的鍵,則包括默認(rèn)屬性列表中不同的鍵。

這里用到了load方法從InputStream中加載流 然后用getProperty()方法

該類展示了如何從property文件中讀取 鍵值 并和傳值進(jìn)行比較

Action 1 理解Struts


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 欧美日韩一二区 | 国产酒店视频 | 国产成人激情视频 | 免费观看国产大片资源视频 | 欧美精品一二三区 | 黄色网址在线播放 | 国产三级在线精品男人的天堂 | 久久精品一级 | 波多野衣结在线精品二区 | 久久精品国产99国产精品澳门 | 日产精品卡二卡三卡四卡乱码视频 | 免费一级毛片在线播放欧美 | 天天干网| 婷婷久久综合九色综合九七 | 国产精品一区二区三区久久 | 欧美日在线 | 欧美日韩免费在线观看视频 | 亚洲精品美女久久久久 | 久草视频官网 | 欧美色呦呦 | 日韩在线观看视频免费 | 欧美一区二区黄色片 | 色噜噜狠狠网站 | 国产女主播在线 | 日韩综合区 | 机器人男友 | 欧美电影网站在线观看影片 | 亚洲高清一区二区三区 | 日韩一二三| 99在线精品视频 | 亚洲97| 夜夜夜精品视频 | www.ouchn.com| 无名者电影在线完整版免费 | 天堂资源地址在线 | 国产这里只有精品 | 精品在线视频一区 | 天天综合色天天综合 | 日韩免费一区二区三区 | 人人狠狠综合久久亚洲 | 国产日韩一区在线精品欧美玲 |