ServletConfig和ServletContext接口
ServletConfig
在web.xml文件中使用一个或多个init-param
元素进行配置后,Tomcat初始化Servlet时,都会将该Servlet的配置信息封装到一个ServletConfig对象中,通过调用init(ServletConfig config)
方法将ServletConfig对象传递给Servlet。
ServletConfig接口提供了如下四个方法:
方法 | 功能描述 |
---|---|
String getInitParameter(String name) | 根据初始化参数名返回对应的初始化参数值 |
Enumeration getInitParameterNames() | 包含了所有的初始化参数名 |
ServletContext getServletContext() | 获取ServletContext对象 |
String getServletName() | 返回web.xml中的servlet-name元素的值 |
在Servlet中实现public void init(ServletConfig config)
方法:
@Override
public void init(ServletConfig config) throws ServletException {
String servletName = config.getServletName();
System.out.println("调用init方法,将ServletConfig传递给Servlet " + servletName);
super.init(config);
}
客户端访问该Servlet之后,会调用init方法将ServletConfig对象传递给该Servlet:
现在,尝试在web.xml中使用init-param元素配置一个编码的初始化参数:
<servlet>
<servlet-name>first-servlet</servlet-name>
<servlet-class>week03.FirstServlet</servlet-class>
<init-param>
<!--初始化参数名-->
<param-name>encoding</param-name>
<!--初始化参数值-->
<param-value>UTF-8</param-value>
</init-param>
</servlet>
然后,在Servlet中实现doGet方法,通过getServletConfig()方法返回一个ServletConfig对象来获取初始化参数"encoding":
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
PrintWriter writer = res.getWriter();
// 1. 获取ServletConfig对象
ServletConfig servletConfig = this.getServletConfig();
// 2. 获取参数名为encoding的参数值
String encoding = servletConfig.getInitParameter("encoding");
writer.write(encoding);
}
输入虚拟映射路径对应的Servlet类,显示是否成功地获取到了初始化参数encoding的值:UTF-8
由于HttpServlet继承了GenericServlet抽象类,且实现了ServletConfig接口,所以只要是继承了HttpServlet的类,都可以通过this.*
调用上层的代码。ServletConfig servletConfig = this.getServletConfig();
代码片段即直接使用了ServletConfig上层类的函数。
ServletContext
当Servlet容器启动时,会为每个Web应用创建一个唯一的ServletContext对象代表当前Web应用,该对象不仅封装了当前Web应用的所有信息,而且实现了多个Servlet之间数据的共享。
方法 | 功能描述 |
---|---|
String getInitParameter(String name) | 获取context初始化参数的值 |
Enumeration getInitParameterNames() | 以String对象的Enumeration形式返回context的初始化参数名 |
在web.xml文件中使用context-param
元素配置Web应用程序的初始化参数:
<context-param>
<param-name>country</param-name>
<param-value>中国</param-value>
</context-param>
<context-param>
<param-name>flag</param-name>
<param-value>五星红旗</param-value>
</context-param>
<context-param>
<param-name>nationalAnthem</param-name>
<param-value>义勇军进行曲</param-value>
</context-param>
通过ServletContext获取所有的context初始化参数,并显示在前端:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
res.setContentType("text/html;charset=utf-8");
PrintWriter writer = res.getWriter();
// 获取ServletContext对象
ServletContext servletContext = this.getServletContext();
// 获取所有的context初始化参数
Enumeration<String> paramNames = servletContext.getInitParameterNames();
// 遍历context初始化参数,并打印给前端显示
while (paramNames.hasMoreElements()) {
String name = paramNames.nextElement();
String param = servletContext.getInitParameter(name);
writer.write(name + ": " + param + "<br />");
}
}
可以看到浏览器显示了所有的context初始化参数名以及值:
注意:多个Servlet对象可以共享一个ServletContext对象。
ServletContext接口中还定义了一些读取Web资源的方法,以下是一些相关的常用方法:
方法 | 功能描述 |
---|---|
Set getResourcePaths(String path) | 返回包含资源目录中子目录和文件的路径名称 |
String getRealPath(String path) | 返回资源文件在服务器文件系统上的真实路径 |
URL getResource(String path) | 返回映射到某个资源文件的URL对象 |
InputStream getResourceAsStream(String path) | 返回映射到某个资源文件的InputStream输入流对象 |
新建一个test.properties
文件
在里面添加如下内容:
country = China
flag = The Five-Starred Red Flag
注意:编译后的properties文件将会是这样的结果:
所以在填写路径时,要注意路径应该这样填/WEB-INF/classes/test.properties
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
res.setContentType("text/html;charset=utf-8");
res.setCharacterEncoding("utf-8");
res.setHeader("Content-Type", "text/html;charset=utf-8");
PrintWriter writer = res.getWriter();
ServletContext context = this.getServletContext();
InputStream inputStream = context.getResourceAsStream("/WEB-INF/classes/test.properties");
Properties properties = new Properties();
properties.load(inputStream);
writer.write("country = " + properties.getProperty("country") + "<br />");
writer.write("flag = " + properties.getProperty("flag"));
}
打开浏览器,最终呈现的结果如下:
上一个知识点:Servlet基础
下一个知识点:什么是请求转发和请求重定向?
最新文章
- 【HDU】4405 Aeroplane chess
- mui开发webapp(2)
- Codeforces Round #209 (Div. 2)C
- 01-08-05【Nhibernate (版本3.3.1.4000) 出入江湖】NHibernate二级缓存:第三方MemCache缓存
- for循环,如何结束多层for循环
- iOS开发-21UINavigationController导航控制器初始化 导航控制器栈的push和pop跳转理解
- shell解析命令行的过程以及eval命令
- element ui 1.4 升级到 2.0.11
- freetype 字形解析
- end to end testing
- POJ 2531-Network Saboteur(dfs)
- openresty的安装和使用
- CSS中clear属性的both、left和right浅析
- nginx 编译参数详解(运维必看)
- [POI2015]Pustynia
- Test Double
- .NET/C# 使用反射调用含 ref 或 out 参数的方法
- PostgreSQL参数学习:wal_keep_segments
- day21 git &; github + Celery 分布式任务队列
- poj 1113 Wall 凸包的应用
热门文章
- 行业动态 | 通过使用Apache Cassandra实现实时供应链管理
- 如何删除Image元素下面的空白行及为什么行内元素有底线
- 关于安装VMware以及Linux操作系统过程
- mysql索引设计的注意事项(大量示例,收藏再看)
- 【转载】Android的事件分发(dispatchTouchEvent),拦截(onInterceptTouchEvent)与处理(onTouchEvent)
- Apache配置 9.访问控制-Diretory\FileMatch
- slickgrid ( nsunleo-slickgrid ) 4 解决区域选择和列选择冲突
- 你想知道的 std::vector::push_back 和 std::vector::emplace_back
- P3369 【模板】普通平衡树 题解(Splay/FHQ)
- 面试现场:说说char 和 varchar的区别你了解多少?