文章目录
3.ServletConfig&&ServletContext总览
javaWeb学习笔记思维导图
参考狂神说javaweb教程笔记
参考尚硅谷javaWeb教程笔记
问题扩展与汇总:
4. ServletCofig类
4.1 何时创建
-
Servlet 程序默认是第一次访问的时候创建,
-
ServletConfig 是每个 Servlet 程序创建时, 就创建一个对应的 ServletConfig 对象。
4.2 一般完成的功能
-
1、 可以获取 Servlet 程序的别名 servlet-name 的值
-
2、 获取初始化参数 init-param
-
3、 获取 ServletContext 对象
web.xml配置文件
<servlet>
<!--servlet-name 标签 Servlet 程序起一个别名(一般是类名) -->
<servlet-name>HelloServlet1</servlet-name>
<!--servlet-class 是 Servlet 程序的全路径名-->
<servlet-class>com.sheng.HelloServlet1</servlet-class>
<init-param>
<!--是参数名-->
<param-name>username</param-name>
<!--是参数值-->
<param-value>sheng</param-value>
</init-param>
<!--init-param 是初始化参数-->
<init-param>
<!--是参数名-->
<param-name>url</param-name>
<!--是参数值-->
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</init-param>
</servlet>
Servlet 中的代码:
public class HelloServlet1 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2 init 初始化方法");
// 1、 可以获取 Servlet 程序的别名 servlet-name 的值
System.out.println("HelloServlet 程序的别名是:" + servletConfig.getServletName());
// 2、 获取初始化参数 init-param
System.out.println("初始化参数 username 的值是;" + servletConfig.getInitParameter("username"));
System.out.println("初始化参数 url 的值是;" + servletConfig.getInitParameter("url"));
// 3、 获取 ServletContext 对象
System.out.println(servletConfig.getServletContext());
}
4.3 注意:继承的是Servlet接口init方法中的参数
- 如果要是继承HttpSetvlet抽象类,重写Init方法时,要传入父接口的init方法中的ServletConfig对象
5. ServletContext类
1.是什么,何时创建
-
1、 ServletContext 是一个接口, 它表示 Servlet 上下文对象
-
2、 一个 web 工程, 只有一个 ServletContext 对象实例。
-
3、 ServletContext 对象是一个域对象。
-
4、 ServletContext 是在 web 工程部署启动的时候创建。 在 web 工程停止的时候销毁。
什么是域对象?
- 域对象, 是可以像 Map 一样存取数据的对象, 叫域对象。
- 这里的域指的是存取数据的操作范围, 整个 web 工程。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/caa0dcb6557ec83c33749a18443324d7.png)
2. 完成的功能:
2.1 共享数据 (像 Map 一样存取数据 )
- 我在这个Servlet中保存的数据,可以在另外一个servlet中拿到;
示例:(注意顺序不能错了,先访问Servlet2,往ServlentContext中放数据,再访问Servlet3,读数据)
- 在Servlet2中存数据
public class HelloServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 测试ServletContext
String username = "sheng"; // 数据
ServletContext servletContext = this.getServletContext();
servletContext.setAttribute("username", username); // 将数据以map形式保存在servletContext中
}
}
- 创建Servlet3,在Servlet3中读取
public class HelloServlet3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
// 测试ServletContext
ServletContext servletContext = this.getServletContext();
writer.print(servletContext.getAttribute("username"));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
- web.xml中注册,测试
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f61a0e3c993e07f7badcdd21322c657d.png)
2.2 获取初始化参数
与ServleConfig此功能的不同在于:
- config只能是当前类拿到当前类配置中的初始化信息,
- 而context配置的初始化信息不依赖于某个类,故,所有web下的类都能拿到初始化信息
示例:
- 初始化参数配置
<!-- 初始化配置信息-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</context-param>
- Servlet2,Servlet3分别获取
// 测试ServletContext获取初始化信息的功能
writer.print(servletContext.getInitParameter("url"));
- 测试结果:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5dace73bfc84fc9da47fac212f83a2e9.png)
2.3 请求转发
请求转发与重定向的区别:
- 请求转发是A通过中间B获取C的信息
- 重定向是三角关系,A请求B,B给了C的地址,让A去请求C
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/54a7d189d39d927b613faa9b7b9eaf4f.png)
示例:
// 测试ServletContext的请求转发功能
System.out.println("进入了Servlet4!");
ServletContext servletContext = getServletConfig().getServletContext();
//RequestDispatcher requestDispatcher = context.getRequestDispatcher("/hello3"); 转发的请求路径
//requestDispatcher.forward(req,resp); 调用forward实现请求转发;
servletContext.getRequestDispatcher("/hello3").forward(req, resp); // 转发/hello3路径网页的请求
- 测试结果:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e20fcae3c260050f4eb4727b379b0301.png)
2.4 读取资源文件
Properties
- 在java目录下新建properties
在resources目录下新建properties - 发现:都被打包到了同一个路径下:classes,我们俗称这个路径为classpath:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d3abe60d4c52183e54ba287690627894.png)
context可以获取路径:
示例:
// 测试ServletContext的读取配置文件功能
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/sheng/java.properties");
Properties prop = new Properties();
prop.load(is);
String user = prop.getProperty("username");
String pwd = prop.getProperty("password");
PrintWriter writer = resp.getWriter();
writer.write(user+":"+pwd);
// 测试ServletContext的获取路径的功能
writer.write("当前工程路径: " + getServletContext().getContextPath());
writer.write("工程部署的路径是: " + getServletContext().getRealPath("/"));
测试结果: