什么是web.xml
web.xml学名叫部署描述符文件,是在Servlet规范中定义的,是web应用的配置文件。
其中的xml元素不仅是大小写敏感的,而且它们还对出现在其他元素中的次序敏感。
servlet配置
由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>
元素和<servlet-mapping>
元素完成。
1.<servlet>
元素用于注册Servlet,它包含有两个主要的子元素:<servlet-name>
和<servlet-class>
,分别用于设置Servlet的注册名称和Servlet的完整类名。
2.<servlet-mapping>
元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:<servlet-name>和
`,分别用于指定Servlet的注册名称和Servlet的对外访问路径。
<servlet>
<servlet-name>ServletDemo1</servlet-name>
<servlet-class>com.servlet.Servlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo1</servlet-name>
<!--拦截匹配*.do的访问-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
一个<servlet>
可以对应多个<servlet-mapping>
<servlet>
<servlet-name>ServletDemo1</servlet-name>
<servlet-class>com.servlet.Servlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo1</servlet-name>
<!--拦截匹配*.do的访问-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ServletDemo1</servlet-name>
<!--拦截匹配*.action的访问-->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
URL使用通配符
URL可以使用通配符*,*可以匹配任意的字符,但有固定格式
1 *.扩展名
2 /…/*
如果有*.do访问servlet1,/a.do访问servlet2
则http://localhost:8080/Web/a.do
访问的是servlet2
匹配的原则是匹配最接近的
启动时加载Servlet
<servlet>
<servlet-name>ServletDemo1</servlet-name>
<servlet-class>com.servlet.Servlet1</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
配置 <load-on-startup>1</load-on-startup>
那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。
用途:为web应用写一个InitServlet,这个servlet配置为启动时装载,为整个web应用创建必要的数据库表和数据。
缺省Servlet
如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。
凡是在web.xml文件中找不到匹配的<servlet-mapping>
元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。
配置Servlet初始化参数并用ServletConfig获取
<servlet>
<servlet-name>ServletDemo1</servlet-name>
<servlet-class>com.servlet.Servlet1</servlet-class>
<init-param>
<param-name>charset</param-name>
<param-value>gbk</param-value>
</init-param>
</servlet>
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String charset = this.getServletConfig().getInitParameter("charset");
System.out.println(charset);
}
}
配置上下文参数并用ServletContext获取
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象(web.xml),它代表当前web应用。
ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。
由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。
<context-param>
<param-name>charset</param-name>
<param-value>utf-8</param-value>
</context-param>
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String charset2 = (String) this.getServletContext().getInitParameter("charset");
System.out.println(charset2);
}
}
ServletContext用于转发
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//转发
//ServletContext context = this.getServletContext();获取ServletContext对象
//RequestDispatcher rd = context.getRequestDispatcher("/index2.jsp");获取请求转发对象(RequestDispatcher)
this.getServletContext().getRequestDispatcher("/index2.jsp").forward(req, resp);
}
}
ServletContext读取资源文件
Tomcat下工程目录从WebRoot开始的
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//同包
InputStream is2 = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/servlet/properties2.properties");
//异包
InputStream is1 = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/resource/properties1.properties");
//src目录下
InputStream is3 = this.getServletContext().getResourceAsStream("/WEB-INF/classes/properties3.properties");
//WebRoot目录下
InputStream is4 = this.getServletContext().getResourceAsStream("/properties4.properties");
Properties prop = new Properties();
prop.load(is1);
System.out.println(prop.getProperty("path"));
prop.load(is2);
System.out.println(prop.getProperty("path"));
prop.load(is3);
System.out.println(prop.getProperty("path"));
prop.load(is4);
System.out.println(prop.getProperty("path"));
}