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();
    }
}

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