Struts 2ブロックまとめ
自動回転http://releasa.iteye.com/blog/653448
スクリーニングのクラスは特殊な配置ファイルに定義されています.このプロファイルの名前はstruts-default.xmlといいます.struts-defaultのデフォルトのパケット名を継承したらこれらのスクリーンセーバーを使用できます.そうでなければ、自分のカバンの中でブロックを定義してで定義しなければなりません. Struts 2の内蔵ブロックについて説明します. Interceptor Name Description Alias Interceptor aliasは、異なる要求の間でパラメータを異なる名前に変換し、要求内容を変更しません. Chining Interceptor chainは、前のアクションの属性を後のアクションにアクセスさせることができる. Checkbox Intercept or checkbox Adds atomatic check box handling code that detect an uncheckbox an d add it as a parameter with a default(usually'false)value.Uses a specially named hidden fidededencement. Cookie Interceptor cookieは構成のname、valueを使用してcookiesを設定します. Coversion Error Interceptr conversionErrorエラーをアクションの属性フィールドに追加します. Create Session Interceptor createSessionは、HttpSessionを自動的に作成し、HttpSessionを必要とするスクリーンセーバーサービスに使用されます. Debuggggg Interceptor debugggggingは異なるデバッグ用のページを提供して内部のデータ状況を展示します. Execute and Wait Interceptor execAndWaitは、バックグラウンドでアクションを実行し、ユーザーを中間の待ち受けページに連れて行く. Exception Interceptor exceptionは異常を一つのページに位置決めします. File Upload Interceptor fileUploadはファイルアップロード機能を提供します. I 18 n Interceptor i 18 nは、ユーザが選択したlocaleを記録する. ロガーInterceptor loggerからアクションの名前を出力します. Message Store Interceptor storeは、Validation Awareインターフェースを実現するアクションクラスで発生するメッセージ、エラー、フィールドエラーなどを格納またはアクセスする. Model Driven Interceptor model-driven一つのクラスがModelDrivenを実現すれば、get Modelで得られた結果をValueStockに置く. Scred Model Driven Intercept or scoped-model-driven ActionがScroped ModelDrivenを実現すれば、このスクリーンセーバーは対応するScopeからmodelを取り出し、Actionのset Modelメソッドを呼び出してアクションの内部に入れます. Parameeters Interceptor paramsは、要求中のパラメータをアクションに設定します. Prepare Interceptor prepareがActionがPreparableを実現すると、このブロッキングはActionクラスのprepare方法を呼び出す. Scope Intercept or scopeはアクション状態をSessionとAppleicationに保存する簡単な方法です. Servlet Config Interceptor servletConfigはHttpServletRequestとHttpServletResonseにアクセスする方法を提供します.Mapの方式でアクセスします. Static Parameters Interceptor static Paraamsはstruts.xmlファイルから<action>の<param>の下の内容を対応するアクションに設定します. Roles Interceptor rolesはユーザーがJAASが指定したRoleを持っているかどうかを確認します.さもなければ実行しません. Timer Interceptor timer出力アクション実行時間 Token Interceptor tokenはTokenによってダブルクリックを避ける. Token Session Interceptor token SessionはToken Interceptoryと同じですが、ダブルクリックすると要求したデータをSessionに格納します. Validation Interceptor validationは、actionn-validations.xmlファイルで定義された内容を使って、提出されたデータを検証します. Workflow Interceptor workflow Actのvalidateを呼び出す方法は、エラーが発生したらINPUTページに戻ります. パラメータリストから不要なパラメータを削除します. Profiling Interceptor profilingはパラメータによってprofileをアクティブにします. 各ブロックはパラメータを設定することができ、一つはブロックごとにパラメータを定義する2つの方法があり、もう一つはブロックスタックに対してすべてのパラメータを統一的に定義することである.
2標準ブロックを使用して、各アクションに必要なブロックスタックを構成する.例えば、
まず、授権スクリーニングクラスtutorial.AuthoriationInterceptorを作成します.コードは以下の通りです.マークに付します.コードは以下の通りです.
スクリーニングのクラスは特殊な配置ファイルに定義されています.このプロファイルの名前はstruts-default.xmlといいます.struts-defaultのデフォルトのパケット名を継承したらこれらのスクリーンセーバーを使用できます.そうでなければ、自分のカバンの中でブロックを定義して
<interceptor-ref name="validation">
<param name="excludeMethods">myValidationExcudeMethod</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">myWorkflowExcludeMethod
</param>
</interceptor-ref>
または<interceptor-ref name="defaultStack">
<param name="validation.excludeMethods">myValidationExcludeMethod
</param>
<param name="workflow.excludeMethods">myWorkflowExcludeMethod
</param>
</interceptor-ref>
各ブロックには二つのデフォルトのパラメータがあります. exclude Methods-ブロックを使わない方法と include Methods–スクリーンセーバーを使う方法. 説明が必要な何時ですか? 1ブロックで実行される順序は、例えば、定義された順序で実行される. <interceptor-stack name="xaStack">
<interceptor-ref name="thisWillRunFirstInterceptor"/>
<interceptor-ref name="thisWillRunNextInterceptor"/>
<interceptor-ref name="followedByThisInterceptor"/>
<interceptor-ref name="thisWillRunLastInterceptor"/>
</interceptor-stack>
の実行順序は以下の通りです. thisWillRun First Interceptor thisWillRun Next Interceptor followwidByThisInterceptor this WillRun LastInterceptor MyAction 1 MyAction 2 MyPressultListener MyResoult(result)thisWilloron LastInterceptor follawedBytion 2標準ブロックを使用して、各アクションに必要なブロックスタックを構成する.例えば、
<action name="login" class="tutorial.Login">
<interceptor-ref name="timer"/> <interceptor-ref name="logger"/>
<interceptor-ref name="default-stack"/>
<result name="input">login.jsp</result>
<result type="redirect-action">/secure/home</result>
</action>
次のように定義できます.<interceptors>
<interceptor-stack name="myStack"> <interceptor-ref name="timer"/>
<interceptor-ref name="logger"/> <interceptor-ref name="default-stack"/> </interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"/>
<action name="login" class="tutorial.Login">
<result name="input">login.jsp</result> <result type="redirect-action">/secure/home</result>
</action>
カスタムスクリーンショット 「フレームワーク」としては、拡張性が不可欠であり、世界には海がないので、すべてのものが許されています.Struts 2はこのような豊富なスクリーンセーバを提供してくれますが、これは私たちがユーザー定義のスクリーンセーバを作る能力を失ったということではなく、逆にStruts 2でスクリーンセーバをカスタマイズするのはかなり容易なことです. みんなは目的別のスクリーンショットの作成に着手する前に、下記の原則をしっかり覚えてください. ブロックは無状態である必要があります.APIで提供されるアクションインストラクター以外のものを使用しないでください. 要求ブロックが無状態である理由は、Struts 2が各要求またはactionのために一例を作成することを保証できないからである. Struts 2のすべてのブロックは直接または間接的にインターフェースcomphone.xwork 2.interceptor.Interceptorを実現します.それ以外に、みんなはクラスのcomp.opensymphone.xwork 2.interceptor.AbstractInterceptorを受け継ぐことが好きかもしれません. 次の例はAbstractInterceptorを継承することにより、ライセンスブロックを実現します. まず、授権スクリーニングクラスtutorial.AuthoriationInterceptorを作成します.コードは以下の通りです.
package tutorial;
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class AuthorizationInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation ai) throws Exception {
Map session = ai.getInvocationContext().getSession();
String role = (String) session.get( " ROLE " );
if ( null != role) {
Object o = ai.getAction();
if (o instanceof RoleAware) {
RoleAware action = (RoleAware) o;
action.setRole(role);
}
return ai.invoke();
} else {
return Action.LOGIN;
}
}
}
以上のコードはかなり簡単です.sessionにキーが「ROLE」という文字列があるかどうか確認して、ユーザーがログインしているかどうかを判断します.ユーザがログインした場合、アクションにキャラクターを置いて、アクションを呼び出します.さもなければ、ブロックは直接にアクション・LOGINフィールドに戻る.アクションにキャラクターを入れやすいようにインターフェースを定義しました.package tutorial;
public interface RoleAware {
void setRole(String role);
}
次に、アクションクラスtutorial.AuthorazatedAccessを作成し、RoleAwareを実現することでキャラクターを獲得し、ShowUser.jspに表示する役割を果たします.コードは以下の通りです.package tutorial;
import com.opensymphony.xwork2.ActionSupport;
public class AuthorizatedAccess extends ActionSupport implements RoleAware {
private String role;
public void setRole(String role) {
this .role = role;
}
public String getRole() {
return role;
}
@Override
public String execute() {
return SUCCESS;
}
}
以下はShowUser.jspのコードです.<% @ page contentType = " text/html; charset=UTF-8 " %>
<% @taglib prefix = " s " uri = " /struts-tags " %>
< html >
< head >
< title > Authorizated User </ title >
</ head >
< body >
< h1 > Your role is: < s:property value ="role" /></ h1 >
</ body >
</ html >
そして、チュートリアル.Roles初期化キャラクターリストを作成します.コードは以下の通りです. package tutorial;
import java.util.Hashtable;
import java.util.Map;
public class Roles {
public Map < String, String > getRoles() {
Map < String, String > roles = new Hashtable < String, String > ( 2 );
roles.put( " EMPLOYEE " , " Employee " );
roles.put( " MANAGER " , " Manager " );
return roles;
}
}
次に、Login.jspの実用化tutorial.Rolesを新設し、そのroles属性を<% @ page contentType = " text/html; charset=UTF-8 " %>
<% @taglib prefix = " s " uri = " /struts-tags " %>
< html >
< head >
< title > Login </ title >
</ head >
< body >
< h1 > Login </ h1 >
Please select a role below:
< s:bean id ="roles" name ="tutorial.Roles" />
< s:form action ="Login" >
< s:radio list ="#roles.roles" value ="'EMPLOYEE'" name ="role" label ="Role" />
< s:submit />
</ s:form >
</ body >
</ html >
アクションクラスtutorial.Loginを作成して、sessionにroleを入れて、アクションクラスtutorial.AuthoriatedAccessに移行します.コードは以下の通りです.package tutorial;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
public class Login extends ActionSupport implements SessionAware {
private String role;
private Map session;
public String getRole() {
return role;
}
public void setRole(String role) {
this .role = role;
}
public void setSession(Map session) {
this .session = session;
}
@Override
public String execute() {
session.put( " ROLE " , role);
return SUCCESS;
}
}
最後にstruts.xmlファイルを配置します.内容は以下の通りです.<! DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd" >
< struts >
< include file ="struts-default.xml" />
< package name ="InterceptorDemo" extends ="struts-default" >
< interceptors >
< interceptor name ="auth" class ="tutorial.AuthorizationInterceptor" />
</ interceptors >
< action name ="Timer" class ="tutorial.TimerInterceptorAction" >
< interceptor-ref name ="timer" />
< result > /Timer.jsp </ result >
</ action >
< action name ="Login" class ="tutorial.Login" >
< result type ="chain" > AuthorizatedAccess </ result >
</ action >
< action name ="AuthorizatedAccess" class ="tutorial.AuthorizatedAccess" >
< interceptor-ref name ="auth" />
< result name ="login" > /Login.jsp </ result >
< result name ="success" > /ShowRole.jsp </ result >
</ action >
</ package >
</ struts >