学习JavaWeb之Servlet的路径映射问题
在前面的一个小节中开始了Servlet的学习之路,并且编写了一个简单的Servlet,不过关于Servlet的很多东西还没有开始研究,接下来我们就来学习关于Servlet中的路径映射问题,也就是前面的web.xml文件中关于Servlet配置的相关问题。
在前面中,我们编写了下面这样的代码,接下来具体讲解一下各个部分的含义以及作用。
<servlet>
<servlet-name>Servlet_Request</servlet-name>
<servlet-class>cn.xuhuanfeng.servlet.Servlet_Request</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet_Request</servlet-name>
<url-pattern>/Servlet_Request</url-pattern>
</servlet-mapping>
正如上面所看到的,我们需要在web.xml中声明Servlet( 用于在服务器加载时将对应的Servlet加载,如果没有在web.xml中声明的Servlet是不能够正常进行访问的)
<servlet></servlet>正是起到这样的作用。其中的<servlet-name>servlet_Request</servlet-name>看上去好像是Servlet的名称 ,实际上只是Servlet的一个内部映射名称,<servlet-class>cn.xuhuanfeng.servlet_Requset</servlet-class>是Servlet类的真实路径( 包名+类名 ),
为什么要这样呢?原因是非常显然的,当我们直接将类名+包名交给用户访问的时候,由于名称相对比较长,就比较容易出错,而且由于是直接写包名+类名,就会很容易将具体的访问路径暴露出来,安全性来讲就比较差;相反,正是由于有了一个内部映射这样的机制,当我们修改内部的代码,改变类的路径的时候,只要保证映射的名称正常,那么就不会对用户的使用造成困惑。
下面的<serlvet-mapping><servlet-mapping>正是基于这样的原因而产生,其中的<servlet-name></servlet-name>必须跟<servlet></servlet>中的<servlet-name></servlet-name>保持一致,<url-pattern>/Servelt_Request</url-pattern>中的/Servlet_Requset才是用户真正访问的路径,也就是浏览器通过该名称找到Servlet真正的路径。
整一个的解析过程如下:
当用户在浏览器输入一个url,如 http://localhost:8080/Servlet_Requset时,服务器将其提交到Tomcat,Tomcat根据用户提交的url在web.xml中进行查找,首先是在<servlet-mapping>中查找,当找到<url-pattern>中有跟用户输入的url匹配时,获取mapping中的<servlet-name>中的值,这里是Servlet-Request,并且根据获取得到的值在<Servlet>中查找一个<servlet-name>与其匹配的值,然后获取<servlet-class>中的确切的类,然后通过反射加载(这里我还没有学习到,将在以后学习之后补充),生成Servlet对象,然后进行访问。
关于访问的细节将在下一节,关于Servlet的生命周期中进行介绍。
