web.xml简单来说就是java web应用用来处理web请求的一个配置文件

一个简单的例子


<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
    <servlet>
        <!-- servlet-name只是一个servlet的标识符,随意 -->
        <servlet-name>sample</servlet-name>
        <!-- 用来处理sample这个sevlet的java类 -->
        <servlet-class>mysite.server.SampleServlet</servlet-class>
    </servlet>
    <!-- sample的sevlet映射 -->
    <servlet-mapping>
        <servlet-name>sample</servlet-name>
        <!-- 所有请求都映射到sample这个setvlet -->
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

以上配置将所有请求都映射到sample这个servlet,即交给mysite.server.SampleServlet处理

servlet标签的其他属性:

init-param

例:


<servlet>
    <servlet-name>redteam</servlet-name>
    <servlet-class>mysite.server.TeamServlet</servlet-class>
    <init-param>
        <param-name>teamColor</param-name>
        <param-value>red</param-value>
    </init-param>
    <init-param>
        <param-name>bgColor</param-name>
        <param-value>#CC0000</param-value>
    </init-param>
</servlet>

init-param设置的值可以通过以下语句获取
String teamColor = getServletConfig().getInitParameter("teamColor");

jsp-file

直接映射URL到jsp文件(servlet-class是映射到servlet类)
例:


<servlet>
    <servlet-name>register</servlet-name>
    <jsp-file>/register/start.jsp</jsp-file>
</servlet>

<servlet-mapping>
    <servlet-name>register</servlet-name>
    <url-pattern>/register/*</url-pattern>
</servlet-mapping>

load-on-startup

应用启动时该servlet的加载顺序,值越小加载顺序越靠前

访问/register/*直接转到/register/start.jsp处理

关于taglib

jsp2.0之后不需要显示声明taglib,它会自动搜寻,搜寻目录:

  • <appName>/WEB-INF及其子目录
  • jar包下的META-INF目录

context-param

顶层标签,和init-param类似,不过context-param作用域为整个web项目,而init-param只作用在它所在的servlet。
例:


<context-param> 
    <description>The email address of the administrator, used to send error reports.</description> 
    <param-name>webmaster</param-name> 
    <param-value>address@somedomain.com</param-value> 
</context-param> 

通过以下语句可以获取值:
String value = getServletContext().getInitParameter("webmaster");

env-entry

配置JNDI的访问资源,例:


<env-entry> 
    <env-entry-name>webmasterEmail</env-entry-name> 
    <env-entry-type>java.lang.String</env-entry-type> 
    <env-entry-value>admin@domain.com</env-entry-value> 
</env-entry>

取值:


 // 获取JNDI上下文
Context env = (Context)new InitialContext().lookup("java:comp/env");

// 获取配置文件的值
String webmasterEmail = (String)env.lookup("webmasterEmail");

filter

顶层标签, 简单来说serlvet中的filter就是一个中间件的作用,它不是用于处理请求和响应,而是用来过滤的,如果设置了filter,那么该请求和响应之前都要先通过filter。它的主要作用一般是权限控制、编码转换、请求响应头修改等。 例:


<filter>
  <filter-name>Set Character Encoding</filter-name>
  <filter-class>filters.SetCharacterEncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>EUC_JP</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>Set Character Encoding</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping> 

给每个页面加上编码处理,通过filters.SetCharacterEncodingFilter这个java类实现

listener

顶层标签,用于定义Listener,jsp的Listener主要用来监听各种特定事件,比如监听session的销毁和创建,例:


<listener>
  <listener-class>com.metawerx.listener.ContextListener</listener-class>
</listener>
<listener>
  <listener-class>com.metawerx.listener.SessionListener</listener-class>
</listener> 

安全管理

security-rolesecurity-constraintlogin-config标签,可以不通过编程限制某个资源的访问权限和强制SSL,

error-page

页面出错跳转页面, 例:


<!-- 页面404时跳转 -->
<error-page>
  <error-code>404</error-code>
  <location>/error404.jsp</location>
</error-page>

<!-- 根据错误类型跳转到不同页面,Throwable为所有错误 -->
<error-page>
  <exception-type>java.lang.Throwable</exception-type>
  <location>/errorThrowable.jsp</location>
</error-page> 

mime-mapping

资源扩展名和mine-type的映射关系,访问一个应用未知扩展名文件的时候,一般应用会默认使用纯文本(即text/plain)的方式打开,如果想要改成下载,就要改变mine-type映射关系,例:


<mime-mapping> 
    <extension>pqz</extension>
    <mime-type>application/octet-stream</mime-type> 
</mime-mapping>

mine-type对照表

welcome-file-list

访问目录根目录时默认访问的文件,比如访问http://localhost/自动到http://localhost/index.jsp,例:


<welcome-file-list>
  <welcome-file>index.html</welcome-file>
  <welcome-file>index.htm</welcome-file>
  <welcome-file>index.jsp</welcome-file>
</welcome-file-list> 

参考资料