Hatena::ブログ(Diary)

似非プログラマの覚え書き RSSフィード Twitter

2011-10-12 敢えて恥を晒します

Struts のサンプル

Javaフレームワークの代表格とも言える Struts を用いた簡単な Web アプリケーションを作ってみたので、恥晒しのつもりで晒します。

なお、開発環境は以下の通り。

1. struts-1.3.10-all.zip を入手する

http://struts.apache.org/ からダウンロード

2. 動的 Web プロジェクトを作成

eclipse 上で適当な名前(今回は ParseNum とする)の動的 Web プロジェクトを作成する。

3. Struts ライブラリの配置

作った動的 Web プロジェクトの WebContent/WEB-INF/lib 以下に、1. で入手した struts-1.3.10-all.zip を展開して出来た struts-1.3.10/lib 直下にある jar ファイルを全てコピーする。

4. web.xml の記述

WebContent/WEB-INF/web.xml を以下のように編集する。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="struts1a" version="3.0">

    <display-name>ParseNum</display-name>

    <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
        <init-param>
            <param-name>config</param-name>
            <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>

5. struts-config.xml の作成

WebContent/WEB-INF 直下に以下の内容で struts-config.xml を作成する。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE struts-config PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
  "http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>
    <form-beans>
        <form-bean name="parseform" type="sample.framework.ParseActionForm" />
    </form-beans>

    <action-mappings>
        <action path="/action" name="parseform" type="sample.framework.ParseAction" input="/parse.jsp" />
    </action-mappings>
</struts-config>

6. ダミーの index.jsp の作成

WebContent 直下に以下の内容で index.jsp を作成する。

<!doctype html>
<html>
    <head>
        <title>Index Page</title>
    </head>
    <body>
        <% response.sendRedirect("parse.jsp"); %>
    </body>
</html>

7. parse.jsp の作成

WebContent 直下に以下の内容で parse.jsp を作成する。

<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>

<!doctype html>
<html:html lang="true">
    <head>
        <title>進数変換</title>
        <link rel="stylesheet" href="parse.css" type="text/css">
    </head>
    <body>
        <html:form action="action.do" method="post">
            <fieldset>
                <legend>入力</legend>
                <html:text property="input" size="30" /><br>
                <html:radio property="inRadix" value="2">2 進</html:radio>
                <html:radio property="inRadix" value="8">8 進</html:radio>
                <html:radio property="inRadix" value="10">10 進</html:radio>
                <html:radio property="inRadix" value="16">16 進</html:radio>
            </fieldset>
            <p><html:submit value="変換" /></p>
            <fieldset>
                <legend>出力</legend>
                <html:text property="output" size="30" /><br>
                <html:radio property="outRadix" value="2">2 進</html:radio>
                <html:radio property="outRadix" value="8">8 進</html:radio>
                <html:radio property="outRadix" value="10">10 進</html:radio>
                <html:radio property="outRadix" value="16">16 進</html:radio>
            </fieldset>
        </html:form>
    </body>
</html:html>

8. (おまけ)parse.css の作成

WebContent 直下に以下の内容で parse.css を作成する(parse.jsp で呼び出すスタイルシート)。

fieldset { width : 20em }

9. Java クラスファイルの作成

作成した動的 Web プロジェクトの「Java Resources」の src 直下に sample.framework パッケージを作成し、以下のクラスファイルを作る。

package sample.framework;

import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

public class ParseActionForm extends ActionForm {
    private static final long serialVersionUID = 1L;

    private String input;
    private String output;
    private String inRadix;
    private String outRadix;

    public ParseActionForm() {
        inRadix = "10";
        outRadix = "10";
    }

    public String getInput() {
        return input;
    }
    public void setInput(String input) {
        this.input = input;
    }
    public String getOutput() {
        return output;
    }
    public void setOutput(String output) {
        this.output = output;
    }
    public String getInRadix() {
        return inRadix;
    }
    public void setInRadix(String inRadix) {
        this.inRadix = inRadix;
    }
    public String getOutRadix() {
        return outRadix;
    }
    public void setOutRadix(String outRadix) {
        this.outRadix = outRadix;
    }

    public void reset(ActionMapping mapping, HttpServletRequest request) {
        super.reset(mapping, request);
        try {
            request.setCharacterEncoding("utf-8");
        } catch(UnsupportedEncodingException ex) {
            ex.printStackTrace();
        }
    }
}
package sample.framework;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class ParseAction extends Action {
    public ActionForward execute(
        ActionMapping mapping,
        ActionForm form,
        HttpServletRequest request,
        HttpServletResponse response
    ) throws Exception {
        ParseActionForm parseform = (ParseActionForm)form;
        String input = parseform.getInput();
        String output;
        int inRadix = Integer.parseInt(parseform.getInRadix());
        int outRadix = Integer.parseInt(parseform.getOutRadix());

        try {
            int tmp = Integer.parseInt(input, inRadix);
            output = Integer.toString(tmp, outRadix).toUpperCase();
        } catch(NumberFormatException nfe) {
            output = "Error!";
        }

        parseform.setOutput(output);

        return mapping.getInputForward();
    }
}

プロジェクト自体はこれで完成。長くなったので説明はまたの機会に。

あまのあまの 2012/02/10 17:13 サンプル通りにやってみましたが、ブラウザ上でどうやって見ればいいのかがよくわかりません。
http://localhost:8080/ParseNum/index.jsp
と入力してもHTTPステータス 404のエラーが出ます。
eclipse3.7で開発しております。
どのようにすればよいのかご教授ください。

redcat_progredcat_prog 2012/02/10 20:34 1. eclipse にサーバを登録しましたか ?
2. 登録したサーバに動的 Web プロジェクトを追加しましたか ?

あまのあまの 2012/02/10 21:11 すばやい返信ありがとうございます。
1.サーバ登録、というのは「新規作成」でサーバを選択する、というのであればしております。パッケージエクスプローラーに「Servers」という項目?があります。

2はよくわかりません。登録したサーバに動的Webプロジェクトを追加する、というのはどのようにすればいいのでしょうか?

redcat_progredcat_prog 2012/02/10 21:21 「サーバー」ビューの中に「ローカル・ホストの Tomcat v7.0 サーバー」というのがあるはずです(Tomcat 7.0 系を使っていれば)。それを右クリックするとコンテキストメニューの中に「追加および除去」というメニューがありますのでそれをクリックすると、動的 Web プロジェクトを追加・除去する画面が出てきます。左側にある追加したいプロジェクトを選択して「追加」ボタンを押せばプロジェクトが右側に移動して追加されたことになります。この状態で eclipse から Tomcat サーバーを起動してからもう一度アクセスしてみてください。

あまのあまの 2012/02/10 21:31 連投失礼します。
パッケージ・エクスプローラーのParseNum上で右クリックして、「サーバーから実行」で、parse.jspが表示されました。
けれども、submitボタンなどのコントロールが全く表示されない状態です。
strutsタグが適用されていないように感じるのですが、
どのようにすればよろしいのでしょうか?

あまのあまの 2012/02/10 21:44 できました!
どうやら「サーバーから実行」で動的Webプロジェクトがサーバーに追加され、
サーバー開始→ブラウザでの動作確認(index.jspではなく、parse.jspを参照)で実行できた模様です。
ありがとうございました!

・・・ところで、index.jspは何のためにあるのですか?

redcat_progredcat_prog 2012/02/10 22:12 parse.jsp を直接参照して実行したら URL に ";jsessionid=〜" っていうのが出てきませんでしたか ? index.jsp はそれを防止するためにダミーとして用意したものです。試しに index.jsp を参照してみてください。web.xml で設定してあるので
http://localhost:8080/ParseNum/
で参照できると思います。

あまのあまの 2012/02/13 18:05 eclipseでのStrutsを利用したWebアプリケーション作成を勉強したいのですが、何かオススメの書籍等ございますか?
当方、eclipseの基本的な操作や、javaの記述に関してはある程度習熟しているつもりです。
eclipse Strutsでぐぐってもなかなかいい文章には辿りつけません。
どうか、よろしくお願いします。

redcat_progredcat_prog 2012/02/14 09:34 私は掌田津耶乃先生の著書「Eclipse ではじめる Java フレームワーク入門 第 3 版」で基礎を勉強しました。そこそこお勧めです。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/redcat_prog/20111012/1318403373