然后在網頁" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Action 1 理解Struts

系統 1854 0

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

我的記性實在不是很好 但是我知道自己擅長的是歸納和總結 加上我是完美主義者 所以到現在很多問題我都從根源上理解和解決了 所以in action 的學習方法是最適合我的

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

超鏈可以這樣

< forward name ="welcome"
path
="pages/index.jsp" />
然后在網頁里
<% @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 >

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

定位和實例化ActionForm

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

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

看例子

< 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的表單交出以后 根據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

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

< logic:redirectforward = " welcome " />

直接轉向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 里面是個邏輯引用 定義在web.xml中

這里還用了present和notPresent 用來判別制定對象是否存在來決定是否處理內容

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

現在來看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 >

先是給一個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

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有個基本效驗方法

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

可以重寫這個方法 定制 主要用來檢驗域是否都輸入了數據

驗證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));

}

}

這里引用了另一個定制的一個驗證數據的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)
返回讀取指定資源的輸入流。

最后返回的是一個InpuStream

java.util
類 Properties

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

      public class 
      
        Properties
      
    
extends Hashtable < Object , Object >
  

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文件中讀取 鍵值 并和傳值進行比較

Action 1 理解Struts


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 色福利网 | 午夜精品久久久久久久2023 | 97精品视频在线 | 色综合在 | 四虎最新紧急入口4hu | 91精品国产高清久久久久 | 免费观看四虎精品国产永久 | 午夜国产精品福利在线观看 | 不卡影院网| 老司机午夜在线视频免费 | 国产成人免费在线视频 | 特级毛片在线观看 | 色偷偷女人的天堂a在线 | 好吊色青青草 | 国产成人精品三级91在线影院 | 国产精品品福利视频 | 波多野结衣绝顶大高潮 | 国产一区二区在线观看免费 | 婷婷色在线观看 | 在线观看 一区二区 麻豆 | 久久福利青草精品免费 | 99v视频国产在线观看免费 | 国产成人精品免费午夜 | 九九精品久久 | 爱色aⅴ| 久久婷婷人人澡人人爱91 | 视频黄色在线 | 国产日韩精品一区在线观看播放 | 亚洲精品乱码久久久久久蜜桃欧美 | 亚洲爱爱久久精品 | 婷婷五 在线播放 | 国产激情 | 亚洲特级毛片 | 欧美成人免费观看国产 | 欧美日本一道高清免费3区 欧美日本一道免费一区三区 | 亚洲人jizz | 动漫精品一区二区3d | 欧美级毛片 | 久re这里只有精品最新地址 | 国产1区2区三区不卡 | 欧美成人免费在线视频 |