servlet.one.url=/firstServlet.do
servlet.one.className=com.rt.netty.tomcat.servlet.FirstServlet
servlet.two.url=/secondServlet.do
servlet.two.className=com.rt.netty.tomcat.servlet.SecondServlet
private Map<String, RTServlet> servletMapping = new HashMap<String, RTServlet>();
private Properties webxml = new Properties();
private void init(){
try{
String WEB_INF = this.getClass().getResource("/").getPath();
FileInputStream fis = new FileInputStream(WEB_INF + "web.properties");
webxml.load(fis);
for (Object k : webxml.keySet()) {
String key = k.toString();
if(key.endsWith(".url")){
String servletName = key.replaceAll("\\.url$", "");
String url = webxml.getProperty(key);
String className = webxml.getProperty(servletName + ".className");
RTServlet obj = (RTServlet)Class.forName(className).newInstance();
servletMapping.put(url, obj);
}
}
}catch(Exception e){
e.printStackTrace();
}
}
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap server = new ServerBootstrap();
server.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
protected void initChannel(SocketChannel client) throws Exception {
client.pipeline().addLast(new HttpResponseEncoder());
client.pipeline().addLast(new HttpRequestDecoder());
client.pipeline().addLast(new RTTomcatHandler());
}
})
.option(ChannelOption.SO_BACKLOG, 128)
.childOption(ChannelOption.SO_KEEPALIVE, true);
ChannelFuture f = server.bind(port).sync();
System.out.println("Tomcat 已启动,监听的端口是:" + port);
f.channel().closeFuture().sync();
}catch (Exception e){
e.printStackTrace();
}finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
public class RTTomcatHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
if (msg instanceof HttpRequest){
HttpRequest req = (HttpRequest) msg;
RTRequest request = new RTRequest(ctx,req);
RTResponse response = new RTResponse(ctx,req);
String url = request.getUrl();
if(servletMapping.containsKey(url)){
servletMapping.get(url).service(request, response);
}else{
response.write("404 - Not Found");
}
}
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
}
}
private ChannelHandlerContext ctx;
private HttpRequest req;
public RTRequest(ChannelHandlerContext ctx, HttpRequest r
this.ctx = ctx;
this.req = req;
}
public String getUrl() {
return req.uri();
}
public String getMethod() {
return req.method().name();
}
public class RTResponse {
private ChannelHandlerContext ctx;
private HttpRequest req;
public RTResponse(ChannelHandlerContext ctx, HttpRequest req) {
this.ctx = ctx;
this.req = req;
}
public void write(String out) throws Exception {
try {
if (out == null || out.length() == 0) {
return;
}
FullHttpResponse response = new DefaultFullHttpResponse(
HttpVersion.HTTP_1_1,
HttpResponseStatus.OK,
Unpooled.wrappedBuffer(out.getBytes("UTF-8")));
response.headers().set("Content-Type", "text/html;");
ctx.write(response);
} finally {
ctx.flush();
ctx.close();
}
}
}
public abstract class RTServlet {
public void service(RTRequest request, RTResponse response) throws Exception{
if("GET".equalsIgnoreCase(request.getMethod())){
doGet(request, response);
}else{
doPost(request, response);
}
}
public abstract void doGet(RTRequest request, RTResponse response) throws Exception;
public abstract void doPost(RTRequest request, RTResponse response) throws Exception;
}
public void doGet(RTRequest request, RTResponse response) throws Exception {
this.doPost(request, response);
}
public void doPost(RTRequest request, RTResponse response) throws Exception {
response.write("This is rt First Serlvet");
}
}
public class SecondServlet extends RTServlet {
public void doGet(RTRequest request, RTResponse response) throws Exception {
this.doPost(request, response);
}
public void doPost(RTRequest request, RTResponse response) throws Exception {
response.write("This is rt Second Serlvet");
}
}