Skip to content

Instantly share code, notes, and snippets.

@tokuhirom
Last active August 29, 2015 14:27
Show Gist options
  • Save tokuhirom/8d15c54a0cc71a5cf7d2 to your computer and use it in GitHub Desktop.
Save tokuhirom/8d15c54a0cc71a5cf7d2 to your computer and use it in GitHub Desktop.
avans2 の新設計

Controller

コントローラクラスは、得になにも継承する必要はない。が、各プロジェクトで親になるクラスを作っておいたほうが便利。

基本的な見た目は 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 なオブジェクトを保持することもままあるため、現実的ではないだろう。

ControllerInvoker

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);
      }
    }
  }
}

のようにして呼ぶ。

Package list

  • [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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment