読者です 読者をやめる 読者になる 読者になる

いろんなJava Webフレームワークで同じ画面を作ってみる(Stripes編)

Java

いろんなJava Webフレームワークで同じ画面を作ってみる(Stripes編)です。
お題は、こちら

日本では、(海外でも?)マイナーなフレームワークな感じですが、結構好きな感じです。

web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
         version="2.4">
<filter>
  <display-name>Stripes Filter</display-name>
  <filter-name>StripesFilter</filter-name>
  <filter-class>net.sourceforge.stripes.controller.StripesFilter</filter-class>
  <init-param>
    <param-name>ActionResolver.Packages</param-name>
    <param-value>webapp.action</param-value>
  </init-param>
  <init-param>
    <param-name>LocalePicker.Locales</param-name>
    <param-value>en_US:UTF-8,ja:UTF-8</param-value>
  </init-param>
</filter>

省略

</web-app>

とりあえず、設定すべきところは、ActionResolver.Packages で、ベースとなるアクションパッケージを指定します。

AddActionBean

package webapp.action;

import net.sourceforge.stripes.action.ActionBean;
import net.sourceforge.stripes.action.ActionBeanContext;
import net.sourceforge.stripes.action.DefaultHandler;
import net.sourceforge.stripes.action.DontValidate;
import net.sourceforge.stripes.action.ForwardResolution;
import net.sourceforge.stripes.action.HandlesEvent;
import net.sourceforge.stripes.action.Resolution;
import net.sourceforge.stripes.validation.Validate;

public class AddActionBean implements ActionBean {

    @Validate(required = true)
    private Integer arg1;

    @Validate(required = true)
    private Integer arg2;

    private Integer result;

    private ActionBeanContext context;

    @DontValidate
    @DefaultHandler
    public Resolution init() {
        return new ForwardResolution("/WEB-INF/jsp/input.jsp");
    }

    @HandlesEvent("submit")
    public Resolution submit() {
        result = arg1 + arg2;
        return new ForwardResolution("/WEB-INF/jsp/result.jsp");
    }

    public Integer getArg1() {
        return arg1;
    }

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

    public Integer getArg2() {
        return arg2;
    }

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

    public Integer getResult() {
        return result;
    }

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

    public ActionBeanContext getContext() {
        return context;
    }

    public void setContext(ActionBeanContext context) {
        this.context = context;
    }
}

バリデーションもsetter,getterじゃなくフィールドに指定できるのでいい感じ。
@HandlesEventは、デフォルトでメソッド名を拾ってくれるとうれしいところですが。
綺麗な仕様だと思います。

input.jsp

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="stripes" uri="http://stripes.sourceforge.net/stripes.tld"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>input</title>
</head>
<body>
<stripes:errors/>
<stripes:form beanclass="webapp.action.AddActionBean">
arg1: <stripes:text name="arg1"/><stripes:errors field="arg1"/><br/>
+<br/>
arg2: <stripes:text name="arg2"/><stripes:errors field="arg2"/><br/>
<stripes:submit name="submit" value="Submit" />
</stripes:form>
</body>
</html>

result.jsp

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="stripes" uri="http://stripes.sourceforge.net/stripes.tld"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>result</title>
</head>
<body>
result: <c:out value="${actionBean.result}"/>
</body>
</html>

あとクラスパス上に、StripesResources.properties を配置。
JSTL使いたいので、jstl-1.1.2.jar, jakarta-taglibs-standard-1.1.2.jar を入れた。
WebWorksよりこいつがStrutsになるべきだった?

以上