注册Controller
<h4>一、注解:</h4>
<p>@Controller [import nafos.core.annotation.controller.Controller]
@Handle</p>
<p>说明:在应用启动的时候,nafos会扫描所有被@Controller注解的类,然后注册@Handle注解的方法,在请求到来时,会根据注册时候的信息找到对应执行方法。
<br></p>
<h4>二、Handle说明</h4>
<pre><code class="language-java">public @interface Handle {
String uri() default ""; //http的请求uri
int code() default 0; //socket消息的code码
String method() default "POST"; //HTTP使用的请求方式。默认POST
String type() default "PROTO"; //消息协议编解码,默认protobuf,可选JSON
boolean printLog() default false; //是否对此次请求打印运行时间等相关信息
boolean runOnWorkGroup() default false; //是否在netty的work线程上执行
}</code></pre>
<p>1.同一个应用内,controller方法支持JSON和protobuf两个编解码格式。用户可自由选择。
2.如果方法中无IO操作,用户可以设置runOnWorkGroup为true,减少上下文切换。
3.测试某个方法性能的时候,可以设置printLog来监控方法运行情况。
4.socket和http的路由controller都是有@handle和@Controller注册。
5.如果类上有@handle注解,那么uri注册时候将是类上的uri+方法上的uri哦。
<br></p>
<h4>三、HTTP使用案例</h4>
<pre><code class="language-java">@Controller
@Handle(uri = "/login")
public class LoginController {
//登录
@Handle(uri = "/login", method = "POST")
public Object login(User user) throws Exception {
return user;
}
//登出
@Handle(uri = "/logout", method = "GET",runOnWorkGroup = true)
public Object logout() {
String sessionId = ThreadLocalHelper.getRequest().getNafosCookieId();
userService.logout(sessionId);
return null;
}
@Handle(uri = "/getNotice", method = "POST",runOnWorkGroup = true,type = "JSON")
public Object getNotice(Map map) {
return new HomeView().setSysNoticeList(GameInitCache.sysNotices);
}
@Handle(uri = "/testJson1", method = "GET",runOnWorkGroup = true,type = "JSON")
public Object testJson1(User user) {
return new HomeView().setSysNoticeList(GameInitCache.sysNotices);
}</code></pre>
<p>更多用法就不全写出来了~除了protobuf GET方式无法接收参数外,其他随意猜测
<br></p>
<h4>四、socket使用案例</h4>
<pre><code class="language-java">@Controller
public class LoginController {
@Handle(code = 1000,runOnWorkGroup = true)
public void tokenlogin(Channel channel,Curren curren,byte[] id) throws Exception {
String sessionId = AESUtil.decrypt(curren.getStringParam());
// 验证token
if (ObjectUtil.isNull(sessionId) || sessionId.length()!=18||!SecurityUtil.isLogin(sessionId)) {
return;
}
ChannelConnectInitialize.initChannel(channel,sessionId,"message",SecurityUtil.getLoginUser(sessionId,User.class));
ChannelConnectManager.safe(channel);
}
}</code></pre>