您的当前位置:首页正文

Java for Web学习笔记(七):Servlet(5)初始化参数

2024-11-09 来源:个人技术集锦

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的顺序。


相关链接:

显示全文