Dolphin的博客


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

  • Sitemap

  • 搜索
close
Dolphin的博客

Tomcat 8.0 HTTP请求流程

发表于 2016-09-22 |

假设来自浏览器的请求为:http://localhost:8080/test/index.jsp

Connector获取请求

请求被发送到Apache Tomcat服务器端口8080,被在那里侦听的Coyote HTTP/1.1 Connector(org.apache.tomcat.util.net.NioEndpoint)获得。Tomcat源码中与connector相关的类位于org.apache.coyote包中,Connector分为以下几类:

  • Http Connector 基于HTTP协议,负责建立HTTP连接。它又分为BIO Http Connector与NIO Http Connector(org.apache.tomcat.util.net.NioEndpoint)两种。BIO(blocking I/O),顾名思义,即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包 及其子包)。一般而言,bio模式是三种运行模式中性能最低的一种。NIO为Network IO,后者提供非阻塞IO与长连接Comet支持。NIO(new I/O),是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。
阅读全文 »
Dolphin的博客

在Eclipse中启动和调试Tomcat(二)

发表于 2016-09-20 |

在Eclipse中启动和调试Tomcat(一)中,断点只能在自定义Servlet中命中,如果想观察详细的Tomcat运行过程,还需要从Tomcat的入口开始进行调试。详细步骤如下(未完全通过,暂勿参考):

引入Tomcat8.0.37jar包

由于Tomcat的入口类JIoEndPoint实现在tomcat-coyote.jar包中,入口org.apache.tomcat.util.net.JIoEndpoint,该类用来处理传递进来的TCP连接,它实现了一个简单的服务器模式:一个监听线程用来接收socket以及为每个进来的连接创建一个worker来处理。更加高级的功能会涉及到线程重用,如队列等。所以需要引入Tomcat8.0.37中的tomcat-coyote.jar包,在Tomcat8项目的lib目录中。

阅读全文 »
Dolphin的博客

在Eclipse中启动和调试Tomcat(一)

发表于 2016-09-20 |

在Eclipse中调试Tomcat可以分析HTTP请求从Tomcat捕获到Servlet的过程。这个是调试Tomcat的目的。调试的环境是:

  • IDE:Eclipse Java EE IDE for Web Developers.Version: Neon Release (4.6.0) Build id: 20160613-1800
  • Tomcat 8.0(8.0.37)
  • JDK 1.8

  • OS:Windows 7 Ultimate x64

阅读全文 »
Dolphin的博客

Java中String非空判断

发表于 2016-09-19 |

如果使用的Java运行时版本在Java SE 1.6之前,可以这样判断字符串非空:

1
if(str != null && str.length() != 0)

如果使用的Java运行时版本是Java SE 1.6及之后版本,可以这样判断字符串非空:

1
if(str != null && !str.isEmpty())

使用org.apache.commons.lang.StringUtilsApache commons-lang来完成:

1
2
3
4
5
import org.apache.commons.lang.StringUtils;

if (StringUtils.isNotBlank(str)) {

}

如下方式也可:

1
2
3
4
5
import com.google.common.base.Strings;

if (!Strings.isNullOrEmpty(myString)) {
return myString;
}

非空默认值

有时在值为null时,会给一个默认值,有如下方式。

1
2
3
4
5
6
7
String alarmType = vehicleMessageHandler.parseAlarm(kafkaRecievedLocationMessageBody.getAlarm());
//使用三元运算符
positional.setAlarm(StringUtils.isBlank(alarmType) ? "0" : alarmType);
//com.google.common.base
Objects.firstNonNull(alarmType, "0");
//java.util
Optional.ofNullable(alarmType).orElse("0");

源自:

  • Java, check whether a string is not null and not empty?
  • How to convert a possible null-value to a default value using Guava?
Dolphin的博客

Spring MVC源码调试

发表于 2016-09-17 |

这里调试Spring MVC的环境是:

  • Windows 7

  • Eclipse Java EE IDE for Web Developers,Version: Neon Release (4.6.0).Build id: 20160613-1800

  • JDK 1.8

  • Spring MVC 4.2.3

  • Apache Tomcat 8.0

想了解平时学习的理论知识在实际的代码实现中是什么情况,比较好的方式是阅读源码,如果能在阅读过程中根据疑问动手调试源码验证猜想和疑问,那就更加完美了。这里想看Spring MVC一个HTTP请求从开始到结束到底是怎么运行的,Spring MVC怎么处理,选取了4.2.3版本的源码进行调试。

阅读全文 »
<i class="fa fa-angle-left"></i>1…394041<i class="fa fa-angle-right"></i>
xiaoqiang jiang

xiaoqiang jiang

201 日志
18 分类
175 标签
Creative Commons
推荐博客
  • 阮一峰的个人网站
  • 陈皓(CoolShell)
  • 阿里中间件团队博客
  • 小土刀的博客
  • Lucida的博客
  • stormzhang的博客
  • 四火的唠叨
© 2020 xiaoqiang jiang
由 Hexo 强力驱动
主题 - NexT.Muse