Struts2をやってみる (15) - struts.patternMatcher

2013-10-02T00:00:00+00:00 Java Struts2

何やら色々見ているとWildcard Mappingsにおいて、struts.patternMatcherを設定する事で、*によるマッチングでは無く、{id}のようなパターンマッチ方式も使えるとの事で

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <constant name="struts.enable.SlashesInActionNames" value="true" />
    <constant name="struts.patternMatcher" value="regex" />
    <constant name="struts.mapper.alwaysSelectFullNamespace" value="false" />

    <package name="sample" extends="struts-default">
        <action name="top/page/{page}" class="sample.controllers.sample.TopAction" method="top">
        </action>
    </package>
</struts>

まぁ要件は前回とほぼ同じでURLにページナンバーを含めたURLを処理して、アクションで利用できる方式っていうだけ

TopAction.java

package sample.controllers.sample;

import java.io.PrintWriter;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import sample.service.SampleService;

public class TopAction extends ActionSupport {

    private static final long serialVersionUID = 1L;
    private static final Logger logger = LoggerFactory.getLogger(TopAction.class);
    private SampleService sampleService;
    private int page = 1;

    public String top() throws Exception {
        PrintWriter out = ServletActionContext.getResponse().getWriter();
        out.print(sampleService.say());
        out.flush();
        out.close();

        return NONE;
    }

    public void setSampleService(SampleService service) {
        this.sampleService = service;
    }

    public void setPage(String page) {
        try {
            int pageNum = Integer.parseInt(page);

            if (pageNum > 0) {
                this.page = pageNum;
            }
        } catch (NumberFormatException e) {
            logger.error("ERROR", e);
        }
    }

    public int getPage() {
        return page;
    }
}

まぁセッターメソッド用意しとけば良いよ的な

TopActionTestCase.java

package sample.actions;

import com.opensymphony.xwork2.ActionProxy;
import org.apache.struts2.StrutsSpringTestCase;
import org.junit.Test;

import sample.controllers.sample.TopAction;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import static com.opensymphony.xwork2.Action.NONE;

public class TopActionTestCase extends StrutsSpringTestCase {

    @Test
    public void test_execute() throws Exception {
        testPage("/sample/top/page/2", 2);
        testPage("/sample/top/page/-1", 1);

        // ページナンバーに該当する部分が数値じゃない場合
        testPage("/sample/top/page/a", 1);
    }

    private void testPage(String url, int page) throws Exception {
        ActionProxy proxy = getActionProxy(url);
        assertThat(proxy.execute(), is(NONE));
        assertThat(response.getStatus(), is(200));

        TopAction action = (TopAction)proxy.getAction();
        assertThat(action, notNullValue());
        assertThat(action.getPage(), is(page));
    }
}

っていうような感じで*によるマッチングじゃない方式でもパターンマッチさせることは可能だという事が判明したので(ry

jquery.fullPageを使ってみた Struts2をやってみる (14) - TypeConverter -