文章目录
前言
本篇文章记录了获取servlet配置信息以及ServletContext的作用。
一、获取servlet配置信息
1. 使用初始化方法得到ServletConfig对象(此对象由服务器创建)
重写init()方法,如下:
public class GetCurConfig extends HttpServlet {
private ServletConfig config;
@Override
public void init(ServletConfig config) throws ServletException {
this.config=config;
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String value = config.getInitParameter("test_key"); //获取web.xml中参数名为xxx的值
System.out.println("当前servlet的配置参数为:"+ value);
}
}
web.xml的配置如下:
<servlet>
<servlet-name>getCurConfig</servlet-name>
<servlet-class>com.web.servlet.GetCurConfig</servlet-class>
<init-param>
<param-name>test_key</param-name>
<param-value>valueConfig</param-value>
</init-param>
</servlet>
2. 通过getServletConfig()得到config
public class GetCurConfig extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String value = this.getServletConfig().getInitParameter("test_key");
System.out.println("当前servlet的配置参数为:"+ value);
}
}
3. 直接调用getInitParameter()
这个方法在ServletConfig接口中定义,而我们所写的类继承了实现这个接口的类,所以可以直接调用。
public class GetCurConfig extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String value = super.getInitParameter("test_key");
System.out.println("当前servlet的配置参数为:"+ value);
}
}
小结:前两种方式都是通过先得到ServletConfig的对象,再调用getInitParameter()方法来获得配置信息,而后一种方式是直接调用getInitParameter(),因为继承的关系,我们自己所写的类也会继承这个方法,所以可以直接调用,在这里用super或者this都可以。
二、ServletContext的作用
ServletContext代表整个应用,一个应用只有一个ServletContext对象。
1. 作为域对象
原理图:
在Servlet1中设置属性的值,这个值会被保存在ServletContext对象中(以键值对的形式保存):
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
context.setAttribute("name","tom");
}
在Servlet2中根据键名获取属性的值
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object name = this.getServletContext().getAttribute("name");
System.out.println((String) name);
}
注:当去访问的时候,需要先访问Servlet1的链接,再去访问Servlet2的链接,这样才能拿到值;如果直接去访问Servlet2,得到的是一个null值,因为Servlet1没有被执行,这个属性值并没有被保存到ServletContext中去。
2. 获取全局配置信息
web.xml全局配置信息的方法如下:
<context-param>
<param-name>ContextKey</param-name>
<param-value>Contextvalue</param-value>
</context-param>
获取配置信息:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String value = this.getServletContext().getInitParameter("ContextKey");
System.out.println("ContextValue="+value);
}
3. 获取资源路径
可以得到当前应用任何位置的任何资源,因为是用maven创建的项目,根据maven的目录结构,我们一般把文件放在resources路径下,所以本文尝试了放在resources下和WEB-INF文件夹下的两种情况。
文件在项目结构的位置如下图所示:
(注意:这里的资源可以是其他格式的文件,本文以properties文件为例,读取配置信息)
- 读取WEB-INF文件夹下的a.properties,使用ServletContext对象的getRealPath()获取到全路径,然后再通过Properties对象处理文件内容。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String path = this.getServletContext().getRealPath("/WEB-INF/a.properties");
Properties prop = new Properties();
prop.load(new FileInputStream(path));
System.out.println(prop.getProperty("key"));
}
注:路径里只要写文件名就可以了,其他的路径会自动拼接上去。这里如果出现文件找不到也很好排查,网页去访问的时候,可以看见全路径地址,只要按照它给出的那个路径去排查就好了。
- 读取resources文件夹下的文件:
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String path = GetProp.class.getClassLoader().getResource("b.properties").getPath();
Properties prop = new Properties();
prop.load(new FileInputStream(path));
System.out.println(prop.getProperty("key"));
}
注:因为maven项目结构的缘故,代码执行之后,使用上面的getRealPath(),是拿不到resources下的内容的,可以去本地的目录下看一下,它自动拼接的路径是D://项目文件/src/main/webapp这种的,所以,是拿不到resources这个文件夹的,我们可以用xxx.class.getClassLoader().getResource这种方式去获取全路径。
4. 实现servlet转发
首先,我们先来了解下什么是转发,如下图所示,浏览器访问Servlet1,但是Servlet1无法处理浏览器请求的这个业务,但是Servlet2可以,那么,可以直接由Servlet1告诉Servlet2,这里有个业务要处理。
当Servlet2处理完成后,再返回给Servlet1,由Servlet1把结果返回浏览器。
具体的实现代码如下:
//这里是servlet1转发的代码
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext(); //获取到ServletContext对象
System.out.println("即将转发......我是转发的servlet~");
context.getRequestDispatcher("/demo8").forward(req,resp);
//调用getRequestDispatcher(),传入Servlet2的链接,目的是为了告诉servlet1去找哪个servlet处理业务
//forward()可以理解为真的去执行了,并且把请求和响应传过去
System.out.println("业务处理完成了,我是转发的servlet~");
}
Servlet2中的代码如下:
//这里就是实际业务处理的代码了,没有什么特别的
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("我是处理业务的servlet~");
}
总结
Servlet的学习就到这里啦,总结一下,感觉比较困难的就是环境的搭建,当然如果是收费版的IDEA也没这么麻烦了。