Context Init参数
在web.xml中可以基于整个上下文进行设置,在web app内各个Servlet都可以获取。
<context-param>
<param-name>settingOne</param-name>
<param-value>foo</param-value>
</context-param>
<context-param>
<param-name>settingTwo</param-name>
<param-value>bar</param-value>
</context-param>
我们可以在context中获取这些数值。例子如下:
@WebServlet(
name = "ContextparamTestServlet",
urlPatterns = {"/ContextParamTest"}
)
public class ContextparamTestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/* 应养成设置Content-Type这个Header的习惯 ,本例设置为Content-Type:“text/plain;charset=UTF-8”*/
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
ServletContext context = getServletContext(); //获取上下文
response.getWriter().append("settingOne = ").append(context.getInitParameter("settingOne"))
.append("\nsettingTwo = ").append(context.getInitParameter("settingTwo"));
}
}
Servlet Init参数
使用web.xml
基于不要同时使用web.xml和代码中的@WebServlet的原则,我们在代码中删除或者注释掉@WebServlet。在web.xml中加入以下定义:
<servlet>
<servlet-name>ServletParamTestServlet</servlet-name>
<servlet-class>cn.wei.flowingflying.chapter03.ServletParamTestServlet</servlet-class>
<init-param>
<param-name>databaseName</param-name>
<param-value>mydabase</param-value>
</init-param>
<init-param>
<param-name>databaseIp</param-name>
<param-value>192.168.1.101</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ServletParamTestServlet</servlet-name>
<url-pattern>/servletInitTest</url-pattern>
</servlet-mapping>
代码如下:
public class ServletParamTestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
ServletConfig c = this.getServletConfig();
PrintWriter writer = response.getWriter();
writer.append("databaseName = ").append(c.getInitParameter("databaseName"))
.append("\ndatabaseIp = ").append(c.getInitParameter("databaseIp"));
}
}
使用@WebServlet
使用@WebServlet的例子如下:
@WebServlet(
name = "servletParameTest2Servlet",
urlPatterns = {"/servletParameTest2"},
initParams = {
@WebInitParam(name = "databaseName", value = "TestDatabase"),
@WebInitParam(name = "databaseIp", value = "181.0.0.100")
})
代码内容同上一个例子,运行结果如下:
讨论:使用哪种方式
如果我们需要对Servlet的初始参数进行设定,一般使用web.xml。这些配置可以根据部署情况变化而进行修改,无需开发人员重新进行编译。当然,有一些参数可能是固定,那么这种情况,我们可以将此放置在一个类中。
使用@Config的方式(在javax.servlet.annotation中定义),可以简化web.xml内容,一般推荐使用,但是这种方式不适用于:
1、 为同一个servlet创建多个servlet实例;
2、 无需重新编译,修改初始化参数(通常和具体的配置有关)
3、 超过一个Filter。对于Filter,提供了@WebFilter的方式,如果有多个Filter,使用@Config方式无法设定Filter的顺序。