Struts2をやってみる (15) - struts.patternMatcher
何やら色々見ていると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