当前位置: 首页 > news >正文

建设网站dns如何设置做网站i3够用吗

建设网站dns如何设置,做网站i3够用吗,宝安住房和建设局网站,wordpress的插件在哪创作缘由 平时使用 tomcat 等 web 服务器不可谓不多#xff0c;但是一直一知半解。 于是想着自己实现一个简单版本#xff0c;学习一下 tomcat 的精髓。 系列教程 从零手写实现 apache Tomcat-01-入门介绍 从零手写实现 apache Tomcat-02-web.xml 入门详细介绍 从零手写…创作缘由 平时使用 tomcat 等 web 服务器不可谓不多但是一直一知半解。 于是想着自己实现一个简单版本学习一下 tomcat 的精髓。 系列教程 从零手写实现 apache Tomcat-01-入门介绍 从零手写实现 apache Tomcat-02-web.xml 入门详细介绍 从零手写实现 tomcat-03-基本的 socket 实现 从零手写实现 tomcat-04-请求和响应的抽象 从零手写实现 tomcat-05-servlet 处理支持 从零手写实现 tomcat-06-servlet bio/thread/nio/netty 池化处理 从零手写实现 tomcat-07-war 如何解析处理三方的 war 包 从零手写实现 tomcat-08-tomcat 如何与 springboot 集成 从零手写实现 tomcat-09-servlet 处理类 从零手写实现 tomcat-10-static resource 静态资源文件 从零手写实现 tomcat-11-filter 过滤器 从零手写实现 tomcat-12-listener 监听器 整体思路 模拟实现 servlet 的逻辑处理而不是局限于上一节的静态文件资源。 整体流程 1定义 servlet 标准的 接口实现 2解析 web.xml 获取对应的 servlet 实例与 url 之间的映射关系。 3调用请求 1. servlet 实现 api 接口 servlet 接口我们直接引入 servlet-api 的标准。 dependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion${javax.servlet.version}/version /dependency 抽象 servlet 定义 package com.github.houbb.minicat.support.servlet;import com.github.houbb.minicat.constant.HttpMethodType;import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;public abstract class AbstractMiniCatHttpServlet extends HttpServlet {public abstract void doGet(HttpServletRequest request, HttpServletResponse response);public abstract void doPost(HttpServletRequest request, HttpServletResponse response);Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {HttpServletRequest httpServletRequest (HttpServletRequest) req;HttpServletResponse httpServletResponse (HttpServletResponse) res;if(HttpMethodType.GET.getCode().equalsIgnoreCase(httpServletRequest.getMethod())) {this.doGet(httpServletRequest, httpServletResponse);return;}this.doPost(httpServletRequest, httpServletResponse);}} 根据请求方式分别处理 简单的实现例子 下面是一个简单的处理实现 MyMiniCatHttpServlet.java package com.github.houbb.minicat.support.servlet;import com.github.houbb.log.integration.core.Log; import com.github.houbb.log.integration.core.LogFactory; import com.github.houbb.minicat.dto.MiniCatResponse; import com.github.houbb.minicat.util.InnerHttpUtil;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;/*** 仅用于测试** since 0.3.0*/ public class MyMiniCatHttpServlet extends AbstractMiniCatHttpServlet {private static final Log logger LogFactory.getLog(MyMiniCatHttpServlet.class);Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response) {String content MyMiniCatServlet-get;MiniCatResponse miniCatResponse (MiniCatResponse) response;miniCatResponse.write(InnerHttpUtil.http200Resp(content));}Overridepublic void doPost(HttpServletRequest request, HttpServletResponse response) {String content MyMiniCatServlet-post;MiniCatResponse miniCatResponse (MiniCatResponse) response;miniCatResponse.write(InnerHttpUtil.http200Resp(content));}} 2. web.xml 解析 说明 web.xml 需要解析处理。 比如这样的 ?xml version1.0 encodingUTF-8 ? web-appservletservlet-namemy/servlet-nameservlet-classcom.github.houbb.minicat.support.servlet.MyMiniCatHttpServlet/servlet-class/servletservlet-mappingservlet-namemy/servlet-nameurl-pattern/my/url-pattern/servlet-mapping/web-app 解析方式 接口定义 package com.github.houbb.minicat.support.servlet;import javax.servlet.Servlet; import javax.servlet.http.HttpServlet;/*** servlet 管理** since 0.3.0*/ public interface IServletManager {/*** 注册 servlet** param url url* param servlet servlet*/void register(String url, HttpServlet servlet);/*** 获取 servlet** param url url* return servlet*/HttpServlet getServlet(String url);} web.xml web.xml 的解析方式核心的处理方式: //1. 解析 web.xml//2. 读取对应的 servlet mapping//3. 保存对应的 url servlet 示例到 servletMapprivate void loadFromWebXml() {InputStream resourceAsStream this.getClass().getClassLoader().getResourceAsStream(web.xml);SAXReader saxReader new SAXReader();try {Document document saxReader.read(resourceAsStream);Element rootElement document.getRootElement();ListElement selectNodes rootElement.selectNodes(//servlet);//1, 找到所有的servlet标签找到servlet-name和servlet-class//2, 根据servlet-name找到servlet-mapping中与其匹配的url-patternfor (Element element : selectNodes) {/*** 1, 找到所有的servlet标签找到servlet-name和servlet-class*/Element servletNameElement (Element) element.selectSingleNode(servlet-name);String servletName servletNameElement.getStringValue();Element servletClassElement (Element) element.selectSingleNode(servlet-class);String servletClass servletClassElement.getStringValue();/*** 2, 根据servlet-name找到servlet-mapping中与其匹配的url-pattern*///Xpath表达式从/web-app/servlet-mapping下查询查询出servlet-nameservletName的元素Element servletMapping (Element) rootElement.selectSingleNode(/web-app/servlet-mapping[servlet-name servletName ]);String urlPattern servletMapping.selectSingleNode(url-pattern).getStringValue();HttpServlet httpServlet (HttpServlet) Class.forName(servletClass).newInstance();this.register(urlPattern, httpServlet);}} catch (Exception e) {logger.error([MiniCat] read web.xml failed, e);throw new MiniCatException(e);}} 解析之后的 HttpServlet 全部放在 servletMap 中。 然后在对应的 url 我们选取处理即可。 3. url 的处理 说明 根据 url 找到对应的 servlet 进行处理。 主要分为 3 大类 1url 不存在 2url 为 html 等静态资源 3) servlet 的处理逻辑 设计 我们把这部分抽象为接口 public void dispatch(RequestDispatcherContext context) {final MiniCatRequest request context.getRequest();final MiniCatResponse response context.getResponse();final IServletManager servletManager context.getServletManager();// 判断文件是否存在String requestUrl request.getUrl();if (StringUtil.isEmpty(requestUrl)) {emptyRequestDispatcher.dispatch(context);} else {// 静态资源if (requestUrl.endsWith(.html)) {staticHtmlRequestDispatcher.dispatch(context);} else {// servlet servletRequestDispatcher.dispatch(context);}} } servlet 例子 如果是 servlet 的话核心处理逻辑如下 // 直接和 servlet 映射 final String requestUrl request.getUrl(); HttpServlet httpServlet servletManager.getServlet(requestUrl); if(httpServlet null) {logger.warn([MiniCat] requestUrl{} mapping not found, requestUrl);response.write(InnerHttpUtil.http404Resp()); } else {// 正常的逻辑处理try {httpServlet.service(request, response);} catch (Exception e) {logger.error([MiniCat] http servlet handle meet ex, e);throw new MiniCatException(e);} } 4. 读取 request 的问题修复 问题 发现 request 读取输入流的时候有时候读取为空但是页面明明是正常请求的。 原始代码 private void readFromStream() {try {//从输入流中获取请求信息int count inputStream.available();byte[] bytes new byte[count];int readResult inputStream.read(bytes);String inputsStr new String(bytes);logger.info([MiniCat] readCount{}, input stream {}, readResult, inputsStr);if(readResult 0) {logger.info([MiniCat] readCount is empty, ignore handle.);return;}//获取第一行数据String firstLineStr inputsStr.split(\\n)[0]; //GET / HTTP/1.1String[] strings firstLineStr.split( );this.method strings[0];this.url strings[1];logger.info([MiniCat] method{}, url{}, method, url);} catch (IOException e) {logger.error([MiniCat] readFromStream meet ex, e);throw new RuntimeException(e);} } 问题分析 问题其实出在 inputStream.available() 中网络流如 Socket 流与文件流不同网络流的 available() 方法可能返回 0即使实际上有数据可读。这是因为网络通讯是间断性的数据可能分多个批次到达。 修正 由于 available() 方法在网络流中可能不准确您可以尝试不使用此方法来预分配字节数组。 相反您可以使用一个固定大小的缓冲区或者使用 read() 方法的循环来动态读取数据。 /*** 直接根据 available 有时候读取不到数据* since 0.3.0*/private void readFromStreamByBuffer() {byte[] buffer new byte[1024]; // 使用固定大小的缓冲区int bytesRead 0;try {while ((bytesRead inputStream.read(buffer)) ! -1) { // 循环读取数据直到EOFString inputStr new String(buffer, 0, bytesRead);// 检查是否读取到完整的HTTP请求行if (inputStr.contains(\n)) {// 获取第一行数据String firstLineStr inputStr.split(\\n)[0];String[] strings firstLineStr.split( );this.method strings[0];this.url strings[1];logger.info([MiniCat] method{}, url{}, method, url);break; // 退出循环因为我们已经读取到请求行}}if (.equals(method)) {logger.info([MiniCat] No HTTP request line found, ignoring.);// 可以选择抛出异常或者返回空请求对象}} catch (IOException e) {logger.error([MiniCat] readFromStream meet ex, e);throw new RuntimeException(e);}} 开源地址 /\_/\ ( o.o ) ^ mini-cat 是简易版本的 tomcat 实现。别称【嗅虎】(心有猛虎轻嗅蔷薇。) 开源地址https://github.com/houbb/minicat
http://www.zqtcl.cn/news/540939/

相关文章:

  • 天猫网站左侧菜单向右滑出的导航菜单阜阳h5网站建设公司
  • 凡科做网站的方法wordpress备份如何安装
  • 网站备案依据四川省广安建设局网站
  • 网站后台管理系统模板品牌营销和品牌推广
  • 网站建设的整个流程图wordpress标题去重
  • 网站手机版模板做拼货商城网站
  • wordpress建自己的网站吗c2c网站的特点
  • 建设网站的成本有哪些龙岩做网站哪家最好
  • wordpress 多站点 子目录安徽望江县城乡建设局官方网站
  • 电子政务网站建设的步骤一般为俱乐部logo免费设计在线生成
  • 网站建设尚品男生学计算机哪个专业最吃香
  • app制作网站收费吗重庆网站产品推广
  • 网站开发预算怎么算厦门建站比较好的公司
  • 涡阳网站优化建设工程公司企业文化
  • 曲靖市住房和城乡建设局网站罗湖区网站公司
  • 购物券网站怎么做wordpress+好用插件
  • 商务网站建设的一般流程是什么?南宁seo费用服务
  • 做企业网站需要什么seminar是什么意思
  • 如何把代码放在网站首页教程深圳建网站哪个公
  • 做的网站第二年续费多钱上传到服务器的网站打开是空白
  • 网站建设花多少钱怎样建移动网站
  • 关键词排名优化网站上海有几个区分别叫什么名字
  • php网站开发基础定制自己的软件
  • 私人装修接单网站wordpress热门文章插件
  • 湘潭网站外包公司宁波妇科医生推荐
  • 企业网站建设可以分为几个层次三亚网站定制
  • 手机网站可以做商城吗如何为公司建立网站
  • 淄博建设银行网站怎么做盗号网站手机
  • 网站建设推广的10种方法精美个人网站
  • 西安专业承接网站搭建模板网站聚合页