事了拂衣去,深藏功与名。
李白·《侠客行》
参数除了可以放置在Java代码中,也可以在部署描述文件中放置,而放置在部署描述文件中的参数又可以分为Servlet初始化参数(针对一个Servlet)和上下文初始化参数(针对整个Web应用)。
一、 Servlet初始化参数
Servlet初始化参数针对一个Servlet,尽可以在特定的Servlet中使用。
- 首先,需要在部署描述文件中放置参数:
<servlet>
<servlet-name>Servlet</servlet-name>
<servlet-class>com.example.web.MyServlet</servlet-class>
<init-param>
<param-name>rootCount</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>rootPassword</param-name>
<param-value>root</param-value>
</init-param>
</servlet>
- 然后,便可在Servlet中使用:
getServletConfig().getInitParameter("rootCount");
getServletConfig().getInitParameter("rootPassword");
- 容器初始化一个Servlet时,会为这个Servlet建一个唯一的ServletConfig,容器将DD中的参数读出并传入ServletConfig,然后将ServletConfig传递给Servlet的init方法(在Servlet初始化之前不能使用Servlet初始化参数,即Servlet的构造函数中不能使用Servlet初始化参数)
- Servlet初始化参数只有在容器初始化Servlet的时候才会读出一次,这也意味着在Servlet的生命周期中不能改变Servlet初始化参数
二、上下文初始化参数
上下文初始化参数针对一个Web应用,整个Web应用都可以访问。
- 放置参数
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<context-param>
<param-name>webName</param-name>
<param-value>noName</param-value>
</context-param>
</web-app>
- 使用参数
getServletContext().getInitParameter("webName")
得到ServeltContext的两种方法:
- myServlet.getServletConfig().getServletContext()
- myServlet.getServletContext()
注:
- 每个Servlet有一个ServletConfig,每个Web应用有一个ServletContex
- 初始化参数只能是String类型
三、监听器
3.1 8个监听者:
3.2 创建监听者类:
- 实现监听者接口
- 覆盖函数
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent arg0) {
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
}
}
3.3编写部署描述文件:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<listener>
<listener-class>com.example.MyServletContextListener</listener-class>
</listener>
</web-app>
四、请求分派
- 请求分派将当前Servlet处理的请求转至服务器上的其他Web组件,浏览器不会觉察到这种变化,浏览器地址栏不会有任何变化。要想实现请求分派需要借助RequestDispatcher。
- RequestDispatcher只有两个方法:forward()和include(),这两个方法都取请求和响应作为参数。forward()方法将任务发给别的Web组件,之后就不会再返回当前Servlet;include()方法会把当前Servlet处理的任务发给别的Web组件,当任务处理完毕后再返回当前Servlet。一般使用forward()方法较多,很少使用include()方法。
- 可以使用两种方法得到RequestDispatcher:从请求中得到、从上下文中得到。
RequestDispatcher view = request.getRequestDispatcher(“路径”);
RequestDispatcher view = getServletContext().getRequestDispatcher(“路径”);
- 在RequestDispatcher上调用forward():
view.forward(request,response);
|