Servlet系列文章(一)
现在越来越多的框架让人眼花缭乱,但本质上还是对servlet的一系列封装和扩张,所有在深入学习其他框架的时候,我个人选择了回顾servlet的使用,中间可能会有源码级别的探寻,也有多个版本之间的对比。希望能够记录下来,沉淀成自己的高贵财富。
Servlet入口:在早期版本(通指低于3.0以前的版本)的时候的Servlet就是一个web.xml. 里面可以写些什么呢?
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
metadata-complete="true" version="3.0">
<servlet>
<servlet-name>servlet</servlet-name>
<servlet-class>com.test.servlet.Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet</servlet-name>
<url-pattern>/servlet</url-pattern>
</servlet-mapping>
</web-app>
对于:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
什么是XML Schema: Structures specifies the XML Schema definition language。来自(https://www.w3.org/TR/xmlschema-1/#no-xsi)
说明 web.xml是遵 循 http://www.w3.org/2001/XMLSchema-instance 的标签规范。
xmlns="http://java.sun.com/xml/ns/javaee" 是web.xml 的命名空间。
后面一部分是书写规范。
《!-- 主要是申明 --!》
<servlet>
<servlet-name>servlet</servlet-name>
<servlet-class>com.test.servlet.Servlet</servlet-class>
</servlet>
servlet就像一个Struts2里面的action ,SpingMVC 里面的Controller。
<servlet-mapping>
<servlet-name>servlet</servlet-name>
<url-pattern>/servlet</url-pattern>
</servlet-mapping>
这个就是定义路由的规则。
那么问题来了,tomcat是如何解析这个文件的呢?
//这个是tomcat test文件的里面对读取web.xml 文件内容读取的测试。
public class TestSchemaValidation {
@Test
public void testWebapp() throws Exception {
XmlErrorHandler handler = new XmlErrorHandler();
Digester digester = DigesterFactory.newDigester(
true, true, new WebRuleSet(false), true);
digester.setErrorHandler(handler);
digester.push(new WebXml());
WebXml desc = (WebXml) digester.parse(
new File("test/webapp/WEB-INF/web.xml"));
Assert.assertEquals("3.1", desc.getVersion());
Assert.assertEquals(0, handler.getErrors().size());
Assert.assertEquals(0, handler.getWarnings().size());
}
感觉功力不够,不能把入口这一点完全剖析出来(状态好的时候再试试)。