web.xml 笔记(一)- on Google Engine
preface
- 本笔记内容来自 google cloud platform O(∩_∩)O~
About Deployment Descriptors
一个网络应用的部署描述文件包括对于该应用classes, resources and configuration的描述,以及web server应该如何将client的请求映射到处理方法中。
这个部署描述文件就是web.xml。其目录在WEB-INF/目录下。其根节点是。
以下是一个简单的web.xml的例子:
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
<servlet>
<servlet-name>comingsoon</servlet-name>
<servlet-class>mysite.server.ComingSoonServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>comingsoon</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
Note:如果使用了Modules,具体配置详见Modules Document
Servlets and URL Paths
web.xml中的映射使得web server可以将外部的请求指向某一个servlet,并使用其方法来处理该请求:
- 通过来声明一个servlet
- 通过来定义一个从URL到一个servlet的映射
声明了一个可以在该xml文件中让其他元素引用的名字、一个被用作servlet的类、以及初始化的参数。你可以用同一个类声明多个servlet(但是初始参数不能相同),每一个声明的servlet名字必须在部署描述文件中独一无二
<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>
<servlet>
<servlet-name>blueteam</servlet-name>
<servlet-class>mysite.server.TeamServlet</servlet-class>
<init-param>
<param-name>teamColor</param-name>
<param-value>blue</param-value>
</init-param>
<init-param>
<param-name>bgColor</param-name>
<param-value>#0000CC</param-value>
</init-param>
</servlet>
指定了一个URL pattern,以及一个声明了的servlet 名字,并将这两者映射。(“*”在这里的用法和在正则表达式中的相同)
<servlet-mapping>
<servlet-name>redteam</servlet-name>
<url-pattern>/red/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>blueteam</servlet-name>
<url-pattern>/blue/*</url-pattern>
</servlet-mapping>
例如:请求http://www.example.com/blue/teamProfile指向的是TeamServlet类,并且teamColor = blue, bgColor = #0000CC。servlet可以通过getPathInfo()来取得该URL中的值,如
String teamColor = getServletConfig().getInitParameter("teamColor");
但是关于静态文件,如对于.js文件的请求,需要通过appengine-web.xml来设置。
JSP
一个应用可以通过JavaServer pages(JSPs)来实现网页。
APP ENGINE允许jsp页面自动生成servlet类。而映射到这个jsp的URL就是从WAR根目录到这个文件的路径。如start.jsp在子目录register/下,App Engine可以将它映射到/register/start.jsp
如果想要对一个jsp文件的映射有详细的描述,可以使用一个来声明,如:
<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>
注意:如果jsp文件在WAR的根目录下,在中的值应当为”/”
另外,可以通过来install JSP tag libraries。不过TLD并不需要install,因为App engine已经提供了相关的服务,详见JavaServer Pages Standard Tag Library.
<taglib>
<taglib-uri>/escape</taglib-uri>
<taglib-location>/WEB-INF/escape-tags.tld</taglib-location>
</taglib>
Security and Authentication
因为之前使用的不是google engine,所以并没有涉及使用google account api 来验证的部分,请有需要的读者移步the Google Accounts API。
描述了对于符合某一pattern的URL的约束,如果用户在没有取得访问权限的情况下请求该URL,google app engine会将用户引导至google account sign-in页面,直到用户登陆或者注册,会自动跳转回之前访问的URL。
如:
<security-constraint>
<web-resource-collection>
<web-resource-name>profile</web-resource-name>
<url-pattern>/profile/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>*</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>admin</web-resource-name>
<url-pattern>/admin/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
PS:因为写者并没有使用该部分功能,所以暂时省略了部分。如有读者需要关于该部分的详细内容,请戳Security and Authentication。
other sources
For more information about the standard of web.xml, see the Metawerx web.xml reference wiki and the Servlet specification.
非google engine配置另见web.xml文件详解