コントローラクラスは、得になにも継承する必要はない。が、各プロジェクトで親になるクラスを作っておいたほうが便利。
基本的な見た目は 1 と変わらない。
public class EntryController {
@GET("/entry/detail")
public WebResponse index(@Param("id") long id) {
return this.freemarker("entry/detial.html.ftl")
.param("id", id)
.render();
}
}
avans2 では、各コントローラクラスは @Singleton としたい気もするが、結局のところ RequestScoped なオブジェクトを保持することもままあるため、現実的ではないだろう。
Controller method を invoke する。コントローラのメソッドを invoke する役割を負う。
@GET()
や @POST()
等の指定があるものを取り出す。
public class MyServlet extends HttpServlet {
public void init() {
this.invoker = createInvoker();
this.dispatcher = createDispatcher();
}
public Invoker createInvoker() {
Invoker invoker = new ControllerInvoker()
invoker.registerProcessor(int.class, IntProcessor.class)
DefaultInvokerProcessorSet.registerAll(invoker)
invoker.registerValidator(validator)
return invoker
}
public Dispatcher createDispatcher() {
def dispatcher = new Dispatcher()
dispatcher.setInvoker(invoker)
dispatcher.register(MyController.class)
return dispatcher;
}
public void service(HttpServletRequest request, HttpServletResponse response) {
def d = dispatcher.dispatch(servlet)
if (d.isMethodNotAllowed()) {
return this.renderMethodNotAllowed()
} else if (d.isNotFound()) {
return this.renderNotFound()
} else {
// @BeforeDispatch 相当の処理はこのへんでやるもよい.
parameters = invoker.prepare(method, servletRequest)
if (parameters.isValid()) {
return invoker.invoke(parameters);
} else {
return this.renderBadResponse(parameters.violations);
}
}
}
}
のようにして呼ぶ。
- [interface] me.geso.avans2.dispatcher.Dispatcher
- me.geso.avans2.dispatcher.DispatcherImpl
- me.geso.avans2.dispatcher.webrouter.WebRouterDispatcher
- me.geso.avans2.dispatcher.webrouter.WebRouterAction
- [interface] me.geso.avans2.invoker.Invoker
- me.geso.avans2.invoker.InvokerImpl
- me.geso.avans2.invoker.processor.IntProcessor
- [interface] me.geso.avans2.invoker.validator.ParameterValidator
- me.geso.avans2.invoker.validator.TinyValidatorParameterValidator