Servlet学习笔记-下篇


前言

本篇文章记录了获取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也没这么麻烦了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值