PetClinic剖析(一)web.xml

1、webAppRootKey

1.1 在web.xml配置
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>web.sample.root</param-value>
</context-param>
可以用System.getProperty("web.sample.root")来获取属性值。在Eclipse调试Web项目时,项目的路径是一个临时路径,不在真正的路径下,可以通过上述语句打印出属性值,来看看临时项目路径在哪里
1.2、Spring通过 org.springframework.web.util.WebAppRootListener 这个监听器来压入项目路径。但是如果在web.xml中已经配置了 org.springframework.web.util.Log4jConfigListener
这个监听器,则不需要配置WebAppRootListener了。因为Log4jConfigListener已经包含了WebAppRootListener的功能
1.3、部署在同一容器中的Web项目,要配置不同的<param-value>,不能重复
1.4、如果配置了
log4j.appender.file.File=${web.sample.root}/WEB-INF/logs/sample.log
log4j会自己自动建立logs目录, 不需要手工显式建立空的logs目录

petclinc例子中,由于在web.xml中没有加入WebAppRootListener和Log4jConfigListener,所以导致log文件没有保存在项目目录中

 

 

2、defaultservlet

<!--
    Defines the 'default' servlet (usually for service static resources).
    Uncomment this in containers (GlassFish) that do not declare this
    implicit definition out of the box, or change the name of the servlet mapping
    below to the appropriate one.

-->

   
<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<!--
- Map static resources to the default servlet
- examples:
-     http://localhost:8080/static/images/pets.png
-     http://localhost:8080/static/styles/petclinic.css
-->
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>

 

defaultservlet有两个用途,一个是用于处理静态资源,二个是用于目录列表,有系列参数可以控制defaultservlet的行为。

 

3、HiddenHttpMethodFilter

<filter>
    <filter-name>httpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>httpMethodFilter</filter-name>
    <servlet-name>petclinic</servlet-name>
</filter-mapping>

REST的核心之一就是提供统一接口,也就是说对所有的资源(URLs)都可以通过Http中定义的GET,POST,PUT,DELETE方法进行操作。但是html只支持GET和POST,可以采用以下方法解决这个问题:

  1. 使用Javascripts进行PUT和DELETE
  2. 使用REST-RPC方式,在url中指明方法; 比如发GET请求至/blogs/new,创建一个新的blog
  3. 通过重载post来提供real method。在post域中添加hidden fields来指明实际的方法。
在spring 3.0中提供了一个可以自动转换http method的filter- HiddenHttpMethodFilter。原理很简单,HiddenHttpMethodFilter拦截request,并且将hidden field中的real method设置到当前request的header中,在controller中按标准的RESTFul风格处理即可。很简单,自己实现一个这种 filter也不难。

你可能感兴趣的:(web.xml)