电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

netty 實現tomcat的示例代碼

瀏覽:225日期:2023-03-19 16:52:00
目錄
  • netty 實現tomcat
    • 自定義基礎類
    • netty 服務端
    • 使用測試

netty 實現tomcat

自定義基礎類

TomcatServlet

public abstract class TomcatServlet {     public void service(ServletRequest request, ServletResponse response){if ("GET".equalsIgnoreCase(request.getMethod())){    doGet(request, response);}else if ("POST".equalsIgnoreCase(request.getMethod())){    doPost(request, response);}else {    doResponse(response, "暫不支持其它請求方法");}    }     public abstract void doGet(ServletRequest request, ServletResponse response);    public abstract void doPost(ServletRequest request, ServletResponse response);     public void doResponse(ServletResponse response, String message){response.write(message);    }}  

ServletRequest

@Datapublic class ServletRequest {     private ChannelHandlerContext context;    private HttpRequest httpRequest;     public ServletRequest(){     }     public ServletRequest(ChannelHandlerContext context, HttpRequest httpRequest){this.context = context;this.httpRequest = httpRequest;    }     public String getMethod(){return httpRequest.method().name();    }     public HttpHeaders getHeaders(){return httpRequest.headers();    }     public Map<String, List<String>> getParameters(){QueryStringDecoder decoder = new QueryStringDecoder(httpRequest.uri());return decoder.parameters();    }     public Map<String,String> getPostFormParameters(){Map<String,String> params = new HashMap<>(); HttpPostRequestDecoder decoder = new HttpPostRequestDecoder(httpRequest);decoder.getBodyHttpDatas().forEach(item -> {    if (item.getHttpDataType() == InterfaceHttpData.HttpDataType.Attribute){Attribute attribute = (Attribute) item; try {    String key = attribute.getName();    String value = attribute.getValue();     params.put(key, value);}catch (Exception e){    e.printStackTrace();}    }}); return params;    }     public Map<String, Object> getPostBody(){ByteBuf content = ((FullHttpRequest)httpRequest).content();byte[] bytes = new byte[content.readableBytes()];content.readBytes(bytes); return JSON.parseObject(new String(bytes)).getInnerMap();    }}

ServletResponse

@Datapublic class ServletResponse {     private ChannelHandlerContext context;    private HttpRequest httpRequest;     public ServletResponse(){     }     public ServletResponse(ChannelHandlerContext context, HttpRequest httpRequest){this.context = context;this.httpRequest = httpRequest;    }     public void write(String message){FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK);response.headers().set("Content-Type","application/json;charset=utf-8");response.content().writeCharSequence(message, StandardCharsets.UTF_8); context.channel().writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);    }}

CustomServlet

ublic class CustomServlet extends TomcatServlet{     @Override    public void doGet(ServletRequest request, ServletResponse response) {System.out.println("處理GET請求");System.out.println("請求參數為:");request.getParameters().forEach((key,value) -> System.out.println(key + " ==> "+value)); doResponse(response, "GET success");    }     @Override    public void doPost(ServletRequest request, ServletResponse response) {if (request.getHeaders().get("Content-Type").contains("x-www-form-urlencoded")){    System.out.println("處理POST Form請求");    System.out.println("請求參數為:");    request.getPostFormParameters().forEach((key,value) -> System.out.println(key + " ==> " + value));     doResponse(response, "POST Form success");}else if (request.getHeaders().get("Content-Type").contains("application/json")){    System.out.println("處理POST json請求");    System.out.println("請求參數為:");    request.getPostBody().forEach((key,value) -> System.out.println(key + " ==> " + value));     doResponse(response, "POST json success");}else {    doResponse(response, "error:暫不支持其它post請求方式");}    }}

ServletMapping:url與對應的TomcatServlet映射

public class ServletMapping {     private static final Map<String,TomcatServlet> urlServletMapping = new HashMap<>();     public static Map<String, TomcatServlet> getUrlServletMapping(){return urlServletMapping;    }}

web.properties:使用properties存儲url與對應的TomcatServet

servlet.url=/helloservlet.className=com.example.demo.tomcat.servlet.CustomServlet

netty 服務端

CustomServerHandler

public class CustomServerHandler extends SimpleChannelInboundHandler<FullHttpRequest> {     @Override    protected void channelRead0(ChannelHandlerContext channelHandlerContext, FullHttpRequest request) throws Exception {String uri = request.uri();String path = uri;if (uri.contains("?")){    path = uri.substring(0,uri.indexOf("?"));} if (ServletMapping.getUrlServletMapping().containsKey(path)){    ServletRequest servletRequest = new ServletRequest(channelHandlerContext, request);    ServletResponse servletResponse = new ServletResponse(channelHandlerContext, request);     ServletMapping.getUrlServletMapping().get(path).service(servletRequest, servletResponse);}else {    FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK);    response.content().writeCharSequence("404 NOT FOUND:"+path+"不存在", StandardCharsets.UTF_8);     channelHandlerContext.channel().writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);}    }}

NettyServer

public class NettyServer {     private static final Properties webProperties = new Properties();     public static void init(){try {    InputStream inputStream = new FileInputStream("./web.properties");    webProperties.load(inputStream);     for (Object item : webProperties.keySet()){String key = (String)item;if (key.endsWith(".url")){    String servletKey = key.replaceAll("\\.url","\\.className");    String servletName = webProperties.getProperty(servletKey);     TomcatServlet servlet = (TomcatServlet) Class.forName(servletName).newInstance();    ServletMapping.getUrlServletMapping().put(webProperties.getProperty(key),servlet);}    }}catch (Exception e){    e.printStackTrace();}    }     public static void startServer(int port){init(); EventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup(); try {    ServerBootstrap serverBootstrap = new ServerBootstrap();    serverBootstrap.group(bossGroup, workerGroup)    .channel(NioServerSocketChannel.class)    .option(ChannelOption.SO_BACKLOG, 128)    .childOption(ChannelOption.SO_KEEPALIVE, true)    .childHandler(new ChannelInitializer<SocketChannel>() { @Overrideprotected void initChannel(SocketChannel socketChannel) throws Exception {    ChannelPipeline channelPipeline = socketChannel.pipeline();    channelPipeline.addLast(new HttpRequestDecoder());    channelPipeline.addLast(new HttpResponseEncoder());    channelPipeline.addLast(new HttpObjectAggregator(65535));    channelPipeline.addLast(new CustomServerHandler());}    });     ChannelFuture channelFuture = serverBootstrap.bind(port).sync();    channelFuture.channel().closeFuture().sync();}catch (Exception e){    e.printStackTrace();}finally {    bossGroup.shutdownGracefully();    workerGroup.shutdownGracefully();}    }     public static void main(String[] args) {startServer(8000);    }}

使用測試

get請求:localhost:8000/hello?name=瓜田李下&age=20

處理GET請求
請求參數為:
name ==> [瓜田李下]
age ==> [20]

get請求:localhost:8000/hello2?name=瓜田李下&age=20

/hello2路徑沒有對應的TomcatServlet處理

Post form請求:x-www-form-urlencoded

處理POST Form請求
請求參數為:
name ==> 瓜田李下
age ==> 20

Post json請求

處理POST json請求
請求參數為:
name ==> 瓜田李下
age ==> 20

Post form-data請求

目前只支持x-www-form-urlencoded、post json請求,不支持其它請求方式

Put:localhost:8000/hello?name=瓜田李下&age=20

目前只支持GET、POST請求方法,不支持其它方法

到此這篇關于netty 實現tomcat的文章就介紹到這了,更多相關netty 實現tomcat內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: Tomcat
主站蜘蛛池模板: 便携式谷丙转氨酶检测仪|华图生物科技百科 | 陶瓷加热器,履带式加热器-吴江市兴达电热设备厂 | 选宝石船-陆地水上开采「精选」色选机械设备-青州冠诚重工机械有限公司 | 不锈钢水箱生产厂家_消防水箱生产厂家-河南联固供水设备有限公司 | 螺杆真空泵_耐腐蚀螺杆真空泵_水环真空泵_真空机组_烟台真空泵-烟台斯凯威真空 | 生物颗粒燃烧机-生物质燃烧机-热风炉-生物颗粒蒸汽发生器-丽水市久凯能源设备有限公司 | 北京西风东韵品牌与包装设计公司,创造视觉销售力! | SDI车窗夹力测试仪-KEMKRAFT方向盘测试仪-上海爱泽工业设备有限公司 | 玻璃钢罐_玻璃钢储罐_盐酸罐厂家-河北华盛节能设备有限公司 | 砂磨机_立式纳米砂磨机_实验室砂磨机-广州儒佳化工设备厂家 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 中央空调温控器_风机盘管温控器_智能_液晶_三速开关面板-中央空调温控器厂家 | ?水马注水围挡_塑料注水围挡_防撞桶-常州瑞轩水马注水围挡有限公司 | 渣土车电机,太阳能跟踪器电机,蜗轮蜗杆减速电机厂家-淄博传强电机 | 泥浆在线密度计厂家-防爆数字压力表-膜盒-远传压力表厂家-江苏大亚自控设备有限公司 | 绿萝净除甲醛|深圳除甲醛公司|测甲醛怎么收费|培训机构|电影院|办公室|车内|室内除甲醛案例|原理|方法|价格立马咨询 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 无菌水质袋-NASCO食品无菌袋-Whirl-Pak无菌采样袋-深圳市慧普德贸易有限公司 | 团建-拓展-拓展培训-拓展训练-户外拓展训练基地[无锡劲途] | 精密模具加工制造 - 富东懿 | 干洗加盟网-洗衣店品牌排行-干洗设备价格-干洗连锁加盟指南 | 志高装潢官网-苏州老房旧房装修改造-二手房装修翻新 | 精益专家 - 设备管理软件|HSE管理系统|设备管理系统|EHS安全管理系统 | CE认证_产品欧盟ROHS-REACH检测机构-商通检测 | 杜康白酒加盟_杜康酒代理_杜康酒招商加盟官网_杜康酒厂加盟总代理—杜康酒神全国运营中心 | 郑州外墙清洗_郑州玻璃幕墙清洗_郑州开荒保洁-河南三恒清洗服务有限公司 | 暴风影音 | 合肥仿石砖_合肥pc砖厂家_合肥PC仿石砖_安徽旭坤建材有限公司 | 对辊式破碎机-对辊制砂机-双辊-双齿辊破碎机-巩义市裕顺机械制造有限公司 | 合肥活动房_安徽活动板房_集成打包箱房厂家-安徽玉强钢结构集成房屋有限公司 | 气力输送_输送机械_自动化配料系统_负压吸送_制造主力军江苏高达智能装备有限公司! | 塑料熔指仪-塑料熔融指数仪-熔体流动速率试验机-广东宏拓仪器科技有限公司 | 木材烘干机,木炭烘干机,纸管/佛香烘干设备-河南蓝天机械制造有限公司 | POS机办理_个人POS机免费领取 - 银联POS机申请首页 | 菏泽商标注册_菏泽版权登记_商标申请代理_菏泽商标注册去哪里 | 实体店商新零售|微赢|波后|波后合作|微赢集团 | 济南网站建设|济南建网站|济南网站建设公司【济南腾飞网络】【荐】 | 阿米巴企业经营-阿米巴咨询管理-阿米巴企业培训-广东键锋企业管理咨询有限公司 | 山东信蓝建设有限公司官网| 微型实验室真空泵-无油干式真空泵-微型涡旋耐腐蚀压缩机-思科涡旋科技(杭州)有限公司 | 小型玉石雕刻机_家用玉雕机_小型万能雕刻机_凡刻雕刻机官网 |