一个Web应用程序的结构一般而言都如下图所示,
首先是公共资源部份,即用户可以通过URL访问到的静态资源,通常包括前四个文件目录,即css,html,js和images。在使用这些资源的时候,要记得根据资源的类型进行分类,会显得更有条理。
Web应用一般还会包括一个META-INF目录,存放了架构包的源信息,定义了包扩展属性,类的加载路径等,还可以定义一些自定义属性。
Web应用的核心部分是WEB-INF目录,它是web应用的专用区,并不提供给用户,也无法通过URL访问到。在这个目录下存放的主要是类文件以及类所依赖的库,它主要包括classes和lib这两个子目录,其中classes目录中存放的主要是编译后的类文件以及编写的代码,lib目录存放的主要是web应用依赖的架包,比如说第三方库等。Servlet的核心配置文件,web.xml文件也存放在这个目录下。
Web.xml
Web.xml也被称作部署描述符,采用xml语法,主要是用来描述一个web应用,设置web应用程序的组件部署信息。
而对于Servlet容器来说,需要支持部署描述符中的所有元素。
今天所记录的所有元素,都属于web.xml文件。
Servlet声明
Servlet的声明依靠两个元素,分别是<servlet>和<servlet-mapping>元素,它们的结构如下:
<servlet>
<servlet-name>名称</servlet-name>
<servlet-class>Servlet类的package路径</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>名称,要和上方的名字相同</servlet-name>
<url-pattern>对外映射的相对路径/url</url-pattern>
<url-pattern>映射路径可以有多个,指向同一个Servlet</url-pattern>
<url-pattern>路径支持模糊匹配,即/hello/*,所有的URL都会指向这个servlet</url-pattern>
</servlet-mapping>
servlet-mapping在进行路径匹配时,按照从高到低的优先级规则进行匹配,直到匹配到为止。如果没有匹配到,就会返回错误信息。
匹配规则:
1.精确路径匹配,完全匹配
2.最长路径匹配,最长前缀匹配
3.扩展名匹配(如/admin.jsp)
4.default servlet(/)或者放弃匹配
需要说明的是,如果servlet的url是/hello,而请求url为/hello.jsp,并不会转发给/hello的servlet,而是给*.jsp的servlet,/hello/a.jsp才会给/hello的servlet。
ServletConfig配置
ServletConfig配置主要是用来存放固定的配置信息,以Servlet为单位,无法共享,配置也在Servlet元素当中。
<servlet>
<init-param>
<param-name>配置名称key</param-name>
<param-value>配置值value</param-value>
</init-param>
</servlet>
存放在哪个<servlet>标签中,就属于哪个servlet。
ServletContext配置
ServletContext不依赖于Servlet,属于一个webapp,可以在多个Servlet之间共享。
<context-param>
<param-name>Context名</param-name>
<param-value>Context值</param-value>
</context-param>
由于ServletContext属于webapp,所以在层次上与<servlet>标签属于同一层。
启动
默认情况下,Servlet会在第一次被请求时,才会加载到Servlet容器中,执行init方法,如果我们想要在Servlet容器启动时进行操作的话,需要进行一些配置。
<servlet>
<load-on-startup>0</load-on-startup>
</servlet>
它支持改变servlet的默认初始化时间,当load-on-startup的值大于等于0的时候,就表示Servlet容器在启动时,加载对应的Servlet,没有设置或者为负数时,采用默认设置。
当多个Servlet都设置了加载时间时,会按照值的大小,从小到大依次加载。
自定义错误界面
<error-page>
<error-code>404</error-code>//HTTP错误状态码
<location>/404.html</location>//跳转指定页面位置,路径相对于webapp目录
</error-page>
更高级的做法可以添加exception-type元素来捕获一个JAVA异常类型。当系统中出现了对应的异常,就会跳转到对应的界面。
请求访问中不包含servlet
如果我们请求了一个不包含特定servlet的界面,会跳转到index.html页面,即欢迎页面。
<welcome-file-list>
<welcome-file>/index.html</welcome-file>
</welcome-file-list>
MIME类型影射
MIME(Multipurpose Internet Mail Extensions),即多用途互联网邮件拓展类型。最初是为了标记邮件附件类型,后来拓展为一个描述消息类型的互联网标准,即描述一个特定的扩展名文件用特定应用程序打开。当特定扩展名的文件被访问时,浏览器会自动调用对应的应用程序去打开。
<mime-mapping>//对应扩展名文件映射类型
<extension>扩展名</extension>
<mime-type>mime标准</mime-type>
</mime-mapping>