Seasarを使ってweb簡易電卓　掛け算のみ

#Seasarフレームワークを使って掛け算だけのweb簡易電卓を作成
フレームワークもJSPもよくわかっていないのですが、
とりあえず使える環境を提供して頂いたので、javaでweb上の簡易電卓を作りました。

##実現したいこと
![スクリーンショット 2017-10-04 1.05.10.png](https://qiita-image-store.s3.amazonaws.com/0/180727/e57986fe-7a44-19f2-b47e-4462c773f0de.png)

3つの数を入力して「サブミット」を押すと、『答え』と『計算』が動的に変わる。

##コード
ファイルは以下の5つです。
**・index.jsp**（ページ外観）
**・MultiAction.java**（ここからスタート。メインとなるクラス）
**・MultiForm.java**
**・Validate.java**（チェック）
**・Constant.java**（メッセージ）

★**入力された値を取るためには、JSPファイルのname属性とFormの変数名が同一である必要があります**

★『@Executeは、実行メソッドにつけるアノテーションです』 
ということなので、要するに、メソッド名を書いて呼び出しをしなくても実行されるんだという理解です。

★return "index.jsp";　と、文字列ではなくファイル名を返しているのが少し不思議。。。


**index.jsp**

```jsp

<%@page pageEncoding="UTF-8"%>

<html>
<head>
<title>Tutorial: Multi</title>
<link rel="stylesheet" type="text/css" href="${f:url('/css/sa.css')}" />
</head>

<body>

<h1>Tutorial: Multi</h1>
<bean:write name="message" />
<form action="submit" method="get">
	<input type="text" name="arg1"/>×
	<input type="text" name="arg2"/>×
	<input type="text" name="arg3">=<bean:write name="result" />
	<br/>
	<input type="submit" name="submit" value="サブミット"/>

</form>
</body>

</html>
```

**MultiActionクラス**
MultiFormのインスタンス化は、普通のnewで書いてしまうと、JSPのname属性とFormの変数名が連動されません。

```java
package tutorial.action;

import javax.annotation.Resource;

import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;

import tutorial.common.constant.Constant;
import tutorial.form.MultiForm;
import tutorial.util.Validate;

public class MultiAction {

    @ActionForm
    @Resource
   //インスタンス化している
    protected MultiForm multiForm;

    Validate validate = new Validate();

    @Execute(validator = false)
    public String index() {
        multiForm.setMessage("計算");
        multiForm.setResult("答え");
        return "index.jsp";
    }

    @Execute(input = "index.jsp")
    public String submit() {

        //Validateクラスで検証する
        String arg1 = multiForm.getArg1();
        String arg2 = multiForm.getArg2();
        String arg3 = multiForm.getArg3();

        String message = validate.check(arg1, arg2, arg3);

        multiForm.setMessage(message);
        multiForm.setResult("");

        if (message.equals(Constant.MESSAGE_SUCCESS)){
            String result = calculate(arg1,arg2,arg3);
            multiForm.setResult(result);

            if (multiForm.getResult().length() <= 10) {
                multiForm.setMessage("答えの桁数問題ありません");
            } else {
                multiForm.setMessage("答えの桁が11以上なので無効です");
            }
        }
        return "index.jsp";
    }

      public String calculate( String ar1, String ar2 , String ar3){
          long a1 = Long.parseLong(ar1);
          long a2 = Long.parseLong(ar2);
          long a3 = Long.parseLong(ar3);

          long b1 = a1 * a2 * a3;
          return String.valueOf(b1);
      }
}
```

**Validateクラス 入力チェック**

```java

package tutorial.util;

import org.seasar.framework.util.StringUtil;

import tutorial.common.constant.Constant;

public class Validate {

    //3つの引数
    public String check(String args1, String args2 ,String args3){

        //桁数をここで一元管理
        int maxLength = 5;

        //空文字またはnullをはじく。null判定の意味がなくなるので、ここより上にnullになる可能性のある処理を書いてはならない。
        if (StringUtil.isEmpty(args1) || StringUtil.isEmpty(args2) || StringUtil.isEmpty(args3)){
            return Constant.MESSAGE_NULL;

        //数字以外をはじく。「0から9までの数字の連続」に完全一致しないのであれば、という条件式。
        } else if ( !args1.matches(Constant.MATCH_0_9) || !args2.matches(Constant.MATCH_0_9) || !args3.matches(Constant.MATCH_0_9)) {
            return Constant.MESSAGE_NOT_NUMBER;

        //一定の桁数以上をはじく
        } else if ( args1.length() > maxLength || args2.length() > maxLength || args3.length() > maxLength){
            return String.format(Constant.MESSAGE_DEGITS, maxLength);

        } else {
            return (Constant.MESSAGE_SUCCESS);
        }
    }
}

```

**Constantクラス メッセージ用**

```java

package tutorial.common.constant;

public class Constant {
    public final static String MESSAGE_NULL = "空文字またはnullです";
    public final static String MESSAGE_NOT_NUMBER = "数字入力してください";
    public final static String MESSAGE_DEGITS = "桁数が %d を超えると計算できません";
    public final static String MATCH_0_9 = "[0-9]+";
    public final static String MESSAGE_SUCCESS = "正常に計算されました";

}
```

**MultiFormクラス**
setArg1,2,3は、Seasarが裏で使っているので、Actionで使われていないからといって削除するとダメ。

```java

package tutorial.form;

public class MultiForm {

    private String arg1;

    private String arg2;

    private String arg3;

    private String result;

    private String message;

    public String getArg1() {
        return arg1;
    }

    public void setArg1(String arg1) {
        this.arg1 = arg1;
    }

    public String getArg2() {
        return arg2;
    }

    public void setArg2(String arg2) {
        this.arg2 = arg2;
    }

    public String getArg3() {
        return arg3;
    }

    public void setArg3(String arg3) {
        this.arg3 = arg3;
    }

    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

}
```


Tomcat7を起動することで、現在操作しているコンピュータがアプリケーションサーバとなり、
ブラウザからのリクエストにこたえることが出来るようになる。

ブラウザでhttp://IPアドレス:8080/tutorial/multi/
あるいは
http://IPアドレス:8080/tutorial/multi/index
と叩くと、MultiActionのindexメソッドからスタートします。

入力動作テスト済みです。