1. リクエスト/セッション/アプリケーション属性にアクセスまたは追加する
public Stringscope() が例外をスローする{
ActionContext ctx = ActionContext.getContext();
ctx.getApplication().put("app", "Applicationscope");//アプリをServletContextに入れる
ctx.getSession().put("ses", "session range");//sesをセッションに入れる
ctx.put("req", "リクエスト範囲");//リクエストにreqを入れる
「スコープ」を返します。
}
JSP:
<本文>
${applicationScope.app} <br>
${sessionScope.ses}<br>
${requestScope.req}<br>
</body>
2. HttpServletRequest / HttpSession / ServletContext / HttpServletResponse オブジェクトを取得します
方法 1、ServletActionContext クラスを通じて直接取得します。
public String rsa() が例外をスローする{
HttpServletRequest リクエスト = ServletActionContext.getRequest();
ServletContext servletContext = ServletActionContext.getServletContext();
request.getSession()
HttpServletResponse 応答 = ServletActionContext.getResponse();
「スコープ」を返します。
}
方法 2: 指定されたインターフェイスを実装し、Struts フレームワークの実行中にそれを注入します。
public class HelloWorldAction は、ServletRequestAware、ServletResponseAware、ServletContextAware を実装します{
プライベート HttpServletRequest リクエスト。
プライベート ServletContext サーブレットコンテキスト;
プライベート HttpServletResponse 応答。
public void setServletRequest(HttpServletRequest req) {
this.request=req;
}
public void setServletResponse(HttpServletResponse res) {
this.response=res;
}
public void setServletContext(ServletContext ser) {
this.servletContext=ser;
}
}
3. ファイルのアップロード
ステップ 1: commons-fileupload-1.2.1.jar と commons-io-1.3.2.jar を WEB-INF/lib に追加します。どちらのファイルも http://commons.apache.org/ からダウンロードできます。
ステップ 2: 次のように、フォーム テーブルの enctype を「multipart/form-data」に設定します。
<form enctype="multipart/form-data" action="${pageContext.request.contextPath}/xxx.action" method="post">
<input type="file" name="uploadImage">
</form>
ステップ 3: 次の属性を Action クラスに追加します。属性の赤い部分は、フォームのファイル フィールドの名前に対応します。
パブリック クラス HelloWorldAction{
private File UploadImage;//アップロードされたファイルを取得する
private String UploadImageContentType;//ファイルタイプを取得する
private String UploadImageFileName;//ファイル名を取得する
//プロパティのgetter/setterメソッドはここでは省略します。
public String Upload() が例外をスローする{
文字列 realpath = ServletActionContext.getServletContext().getRealPath("/images");
ファイル file = 新しいファイル (実パス);
if(!file.exists()) file.mkdirs();
FileUtils.copyFile(uploadImage, new File(file, UploadImageFileName));
「成功」を返します。
}
}
4. 複数ファイルのアップロード
ステップ 1: commons-fileupload-1.2.1.jar と commons-io-1.3.2.jar を WEB-INF/lib に追加します。どちらのファイルも http://commons.apache.org/ からダウンロードできます。
ステップ 2: 次のように、フォーム テーブルの enctype を「multipart/form-data」に設定します。
<form enctype="multipart/form-data" action="${pageContext.request.contextPath}/xxx.action" method="post">
<input type="file" name="uploadImages">
<input type="file" name="uploadImages">
</form>
ステップ 3: 次の属性を Action クラスに追加します。属性の赤い部分は、フォームのファイル フィールドの名前に対応します。
パブリック クラス HelloWorldAction{
private File[] UploadImages;//アップロードされたファイルを取得する
private String[] UploadImagesContentType;//ファイルの種類を取得します
private String[] UploadImagesFileName;//ファイル名を取得する
//プロパティのgetter/setterメソッドはここでは省略します。
public String Upload() が例外をスローする{
文字列 realpath = ServletActionContext.getServletContext().getRealPath("/images");
ファイル file = 新しいファイル (実パス);
if(!file.exists()) file.mkdirs();
for(int i=0 ;i<uploadImages.length; i++){ ファイルアップロードイメージ = アップロードイメージ[i];
FileUtils.copyFile(uploadImage, new File(file, UploadImagesFileName[i]));
}
「成功」を返します。
}}
5. カスタムインターセプター
インターセプターをカスタマイズするには、com.opensymphony.xwork2.interceptor.Interceptor インターフェイスを実装する必要があります。
public class PermissionInterceptor はインターセプターを実装します {
プライベート静的最終ロングシリアルバージョンUID = -5178310397732210602L;
public void destroy() {
}
public void init() {
}
public String intercept(ActionInvocation 呼び出し) が例外をスローする {
System.out.println("インターセプタを入力");
if(ユーザーがセッションに存在する){
文字列結果 = invocation.invoke();
}それ以外{
「ログオン」を返します。
}
//System.out.println("戻り値:"+結果);
// 結果を返します。
}
}
<package name="csdn" namespace="/test" extends="struts-default">
<インターセプター>
<インターセプタ名="許可" />
<interceptor-stack name="permissionStack">
<interceptor-ref name="defaultStack" />
<interceptor-ref name=" 許可 " />
</インターセプタースタック>
</インターセプター>
<アクション名="helloworld_*" メソッド="{1}">
<result name="success">/WEB-INF/page/hello.jsp</result>
<interceptor-ref name="permissionStack"/>
</アクション>
</パッケージ>
ファイルのアップロード、データ検証、アクションへのリクエスト パラメーターのカプセル化などの struts2 の機能はすべて、システムのデフォルトの defaultStack 内のインターセプターによって実装されるため、アプリケーションが struts2 を使用できるように、定義するインターセプターはシステムのデフォルトの defaultStack を参照する必要があります。フレームワークによって提供される機能。
パッケージ内のすべてのアクションでカスタム インターセプターを使用する場合は、<default-interceptor-ref name="permissionStack"/> を通じてインターセプターをデフォルト インターセプターとして定義できます。注: パッケージごとに指定できるデフォルト インターセプタは 1 つだけです。さらに、パッケージ内のアクションのインターセプターを明示的に指定すると、デフォルトのインターセプターは機能しなくなります。
6. 入力確認
struts2 では、すべてのアクション メソッドを検証することも、指定されたアクション メソッドを検証することもできます。
Struts2 は、入力検証のために 2 つの実装方法を提供します。
1. コードを手動で記述して実装します。
2. XML 構成に基づいて実装されます。
7. アクション内のすべてのメソッドの入力を検証するコードを手動で作成します。
validate() メソッドをオーバーライドすることにより、validate() メソッドは、execute メソッドと同じ署名を持つアクション内のすべてのメソッドを検証します。特定のデータ検証が失敗した場合は、addFieldError() メソッドを呼び出して、システムの fieldErrors に検証失敗情報を追加する必要があります (addFieldError() メソッドを使用するために、システムの fieldErrors に失敗情報が含まれている場合、アクションは ActionSupport を継承できます)。 struts2 は、リクエストを input という名前の結果に転送します。障害情報は、入力ビューの <s:fielderror/> を通じて表示できます。
validate() の使用例:
public void validate() {
if(this.mobile==null || "".equals(this.mobile.trim())){ this.addFieldError("ユーザー名", "携帯電話番号を空にすることはできません");
}else{ if(!Pattern.compile("^1[358]//d{9}").matcher(this.mobile.trim()).matches()){
this.addFieldError("mobile", "携帯電話番号の形式が正しくありません");
}
}
検証が失敗すると、リクエストは入力ビューに転送されます。
<result name="input">/WEB-INF/page/addUser.jsp</result>
addUser.jsp ページで <s:fielderror/> を使用して、失敗情報を表示します。
validateXxx() メソッドを通じて実装された validateXxx() は、アクション内の Xxx という名前のメソッドのみを検証します。 Xxx の最初の文字は大文字にする必要があります。特定のデータ検証が失敗した場合は、addFieldError() メソッドを呼び出して、システムの fieldErrors に検証失敗情報を追加する必要があります (addFieldError() メソッドを使用するために、システムの fieldErrors に失敗情報が含まれている場合、アクションは ActionSupport を継承できます)。 struts2 は、リクエストを input という名前の結果に転送します。障害情報は、入力ビューの <s:fielderror/> を通じて表示できます。
validateXxx() メソッドの使用例:
public String add() throws Exception{ return "success";}
public void validateAdd(){
if(username==null && "".equals(username.trim())) this.addFieldError("username", "Username を空にすることはできません");
}
検証が失敗すると、リクエストは入力ビューに転送されます。
<result name="input">/WEB-INF/page/addUser.jsp</result>
addUser.jsp ページで <s:fielderror/> を使用して、失敗情報を表示します。
8. 入力確認プロセス
1. 型コンバーターはリクエスト パラメーターに対して型変換を実行し、変換された値をアクション内の属性に割り当てます。
2. 型変換中に例外が発生した場合、システムは例外情報を ActionContext に保存し、conversionError インターセプターは例外情報を fieldErrors に追加します。型変換中に例外が発生したかどうかに関係なく、手順 3 に入ります。
3. システムは最初に、アクション内でリフレクション技術を通じて validateXxx() メソッドを呼び出します。ここで、Xxx はメソッド名です。
4. 次に、アクション内で validate() メソッドを呼び出します。
5. 上記の 4 つの手順の後、システムの fieldErrors にエラー情報がある場合 (つまり、エラー情報を格納するコレクションのサイズが 0 より大きい場合)、システムはリクエストを input という名前のビューに自動的に転送します。システムのフィールドErrorsにエラー情報がない場合、システムはアクション内の処理メソッドを実行します。
9. XML構成メソッドに基づいたすべてのアクションメソッドの入力検証を実装します
XML ベースの構成メソッドを使用して入力検証を実装する場合、アクションは ActionSupport を継承し、検証ファイルとアクション クラスを同じパッケージに配置する必要があります。ファイルの命名形式は、ActionClassName-validation です。 xml で、ActionClassName はアクションの単純なクラス名、-validation は固定の書き込みメソッドです。 Action クラスが cn.csdn.UserAction の場合、ファイルの名前は UserAction-validation.xml である必要があります。以下は検証ファイルのテンプレートです。
<?xml バージョン="1.0" エンコーディング="UTF-8"?>
<!DOCTYPE バリデータ PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
<バリデータ>
<フィールド名="ユーザー名">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>ユーザー名を空にすることはできません!</message>
</フィールドバリデータ>
</フィールド>
</バリデータ>
<field> はアクションで検証する属性を指定し、<field-validator> は上記で指定したバリデーターを指定します。システムは、これらの検証要件を満たすことができるバリデーターを提供します。 validator は、xwork-2.x.jar の com.opensymphony.xwork2.validator.validators の下のdefault.xml にあります。
<message> は、検証が失敗した後のプロンプト メッセージです。国際化が必要な場合は、メッセージの key 属性を指定できます。key の値は、リソース ファイル内のキーです。
この検証ファイルでは、アクション内の文字列タイプのユーザー名属性が検証されます。まず、trim() メソッドを呼び出してスペースを削除し、次にユーザー名が空かどうかを判断する必要があります。
検証ファイルの作成時にヘルプ メッセージが表示されない ActionClassName-validation.xml 検証ファイルの作成時にヘルプ メッセージが表示されない場合は、次の方法で問題を解決できます。
windowwos->設定->myeclipse->ファイルとエディタ->xml->xmlcatalog
「追加」をクリックし、表示された画面で「ファイルシステム」を選択し、xwork-2.1.2解凍ディレクトリのsrc/javaディレクトリにあるxwork-validator-1.0.3.dtdを選択して元に戻ります。設定ウィンドウ 急いでウィンドウを閉じないでください。ウィンドウ内のキーの種類を URI に変更してください。キーが http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd に変更されました