昔 作成
2003/8/8 更新
.doの変更
アクションへのマッピングを変更可能です。
これはweb.xmlの変更で行います。
.do(デフォルト)
hoge.do→hoge
<servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>.ctrl
<servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.ctrl</url-pattern> </servlet-mapping>/do/...
<servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>/do/*</url-pattern> </servlet-mapping>.doから.ctrlへの変更は単に気分の問題でしょう。 /do/への変更は、いろいろと利点があるようです (拡張子を.xlsにしといて、ブラウザにXLSと認識させるとか、 パスが見やすい?とか)。
page | Webアプリケーションのルートから指定できます。 |
href | a hrefで指定した場合と同じです。絶対URL(他のサイト)を指定したり、
<html:base/>と一緒に使い、同じディレクトリのJSPを指定します。 |
forward | Global Fowardに指定した値にマッピングさせます。 |
a href <a href="hoge.jsp">hoge.jsp</a>baseから相対 <a href="/hoge.jsp">/hoge.jsp</a>ルートから <a href="http://muimi.com">http://muimi.com</a>完全指定 link <html:link forward="menu">forward=menu</html:link>global action-forwardの名前 <html:link href="/hoge.jsp">href=/hoge.jsp</html:link>a hrefと同じ。ルート <html:link href="hoge.jsp">href=hoge.jsp</html:link>a hrefと同じ。相対 <html:link page="/hoge.jsp">page=/hoge.jsp</html:link>Webコンテキストルートから <html:link page="hoge.jsp">page=hoge.jsp</html:link>誤った用法html:linkタグを使えないような場面(JavaScriptで遷移先を指定したり)では、 <html:rewite>を使うことができます。 rewriteでも上の3つの遷移方法を指定できます。
public class FormDate { private String year; private String month; private String day; //セッタとゲッタは省略... }フォームのフィールドで他のStringフィールド同様にそれを使います。
public class HogeForm extends ActionForm{ private FormDate date1 = new FormDate(); private FormDate date2 = new FormDate(); //セッタとゲッタは省略... }指定するネストしたクラスのフィールドは必ず初期化しておく必要があります。 でないと、JSPコンパイル時にvalueがnullだよといったエラーが表示されます (これでちょっとハマった)。
<html:form action="hoge"> 配達希望日1 <html:text property="date1.year" size="6" maxlength="4"/>年 <html:text property="date1.month" size="4" maxlength="2"/>月 <html:text property="date1.day" size="4" maxlength="2"/>日 <br> 配達希望日2 <html:text property="date2.year" size="6" maxlength="4"/>年 <html:text property="date2.month" size="4" maxlength="2"/>月 <html:text property="date2.day" size="4" maxlength="2"/>日 <html:form>上の太字部分のproperty="date1.year"という書き方が面白いところです。
getData1().getYear(); //getData1().setYear(入力値);といった感じでフィールドが取得、設定されるようです(リフレクションで)。 この.(ドット)区切りでネストしたプロパティーを指定できるのが素敵だと思いました。
select、optionsCollectionタグの記述例
<% //アプリケーションスコープにListや配列で値を埋めます。 //本来、サーブレットやリスナーで実行します。 LabelValueBean[] data = new LabelValueBean[]{ new LabelValueBean("赤", "red"), new LabelValueBean("青", "blue"), new LabelValueBean("黄", "yellow"), }; application.setAttribute("data", data); %> <html:form action="/hoge"> <html:select property="hoge" size="1"> <html:optionsCollection name="data" /> </html:select> <html:submit/> </html:form>
上記を実行した際、表示されるHTMLのソース
<form name="hogeForm" method="post" action="/struts1/hoge.do"> <select name="hoge" size="1"> <option value="red" selected="selected">赤</option> <option value="blue">青</option> <option value="yellow">黄</option></select> <input type="submit" value="Submit"> </form>
参考
http://www.techscore.com/tech/Java/Struts/7.html
ファイルアップロード
Strutsではファイルのアップロードは、
<html:file>タグと
org.apache.struts.upload.FormFileクラスを使う
ことで、簡単に実現できます。
簡単な例が、Strutsのサンプルstruts-upload.warにシンプルな例が載っています。
ここでは、複数ファイルをUploadする例を示します。
まずActionFormクラスのフィールドにFormFileフィールドを定義します。
ここでは複数ファイルをUploadするために、配列で定義しています。
public class UploadForm extends ActionForm { private FormFile[] files = new FormFile[3]; //セッタとゲッタは省略... }JSPでは以下のようなフォームを作ります。
<html:form action="upload" enctype="multipart/form-data"> File1<html:file property="files[0]" /><br> File2<html:file property="files[1]" /><br> File3<html:file property="files[2]" /><br> <html:submit /> </html:form>submitするとActionクラスが呼ばれます。
public ActionForward perform( ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { UploadForm theForm = (UploadForm) form; FormFile[] files = theForm.getFiles(); for(int i=0; i<files.length; i++){ FormFile file = files[i]; System.out.println("file" + i + ":" + "name=" + file.getFileName() + ",size=" + file.getFileSize()); //... } //... }
補足
JSPにcharsetを指定していても日本語ファイル名は文字化けます。
取得したファイル名に対し、いつものやつgetBytes()...new String()...
すれば直ります。
次のページへ
(2002/9/12)