一.预准备工程
1.1 ServletContext的概念
ServletContext是用于存储信息的全局空间。它从服务器开始就存在,只有在服务器关闭后才释放。
ServletContext和Cookie、Session对比图如下:

2.1 创建新的Servlet项目
1.新建项目Servlet-02。
2.新建文件java,标记其为Sources Root。
3.新建接口为com.gowork.servlet
4.创建类helloservlet
5.继承HttpServlet
6.重写doGet和doPost方法
public class helloservlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Hello");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
7.注册hello,写映射
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.gowork.servlet.helloservlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
8.重新设置web容器路径—tomcat
C:\Users\24190\IdeaProjects\xiao\servlet-02\src\main\webapp

测试可以正常访问!
二.ServletContext对象
做好了上面的准备过程,我们先了解一下几个对象
this.getInitParameter() 初始化参数
this.getServletConfig() servlet配置
this.getServletContext() servlet上下文
当web容器启动时,它将为每个web应用程序创建一个对应的ServletContext对象,该对象表示当前的web应用程序
- 共享数据:我在这个servlet中保存的数据可以在另一个servlet中获得

2.1 新建类 GetServlet
1.继承HttpServlet。
2.重写doGet和doPost。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context =this.getServletContext();
String username = (String) context.getAttribute("username");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print("我的用户名为"+username);
}
注册getx,写映射:如下
<servlet>
<servlet-name>getx</servlet-name>
<servlet-class>com.gowork.servlet.getservlett</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getx</servlet-name>
<url-pattern>/getx</url-pattern>
</servlet-mapping>
启动应用,测试项目
直接访问
会爆我的用户名为null

这是因为,我们没有执行hello类,没有生成ServletContext对象,现在的ServletContext是空的,所以显示我的用户名为null。
那么,我们先访问hello,再来访问getx,如下图:


现在就出现了——我的用户名为上进小菜猪。
因为我们在第一次访问hello的时候,服务器端会执行helloservlet类,将ServletContext对象赋值。
我们再访问getx的时候,ServletContext就不为空了,而变成了上进小菜猪。
三.ServletContext应用
3.1 获取初始化函数
1.新建立一个类,类名为:servleDemo3。
2.继承HttpServlet。
3.重写doGet和doPost。
ServletContext comtext = this.getServletContext();
获取到之前访问得到的ServletContext对象值。
4.配置一下web应用初始化参数
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
5.前台输出url的值
String url = comtext.getInitParameter("url");
resp.getWriter().print(url);
6.去配置表里,注册,写对应的映射。
<servlet>
<servlet-name>url</servlet-name>
<servlet-class>com.gowork.servlet.servletDemo3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>url</servlet-name>
<url-pattern>/url</url-pattern>
</servlet-mapping>
7,启动项目,访问:

8.由上可以看出我们获取到了初始化函数。后期在这里链接我们的数据库。
jdbc:mysql://localhost:3306/mybatis
3.2 请求转发
1.首先先建立一个新的Demo方便我们操作,类名为servletDemo04。
2.配置好基础的步骤,与上面的配置步骤相同。
4.转发的请求路径
ServletContext context = this.getServletContext(); context.getRequestDispatcher("/url").forward(req,resp);
forward(req,resp);是实现了请求转发。
5.请求转发需要配置的注册表以及映射:
<servlet>
<servlet-name>goandgo</servlet-name>
<servlet-class>com.gowork.servlet.servletDemo04</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>goandgo</servlet-name>
<url-pattern>/goandgo</url-pattern>
</servlet-mapping>
6.重新启动项目访问goandgo路径,观察下列结果。

3.2.1 转发和重定向的区别
转发是服务器行为,重定向是客户端行为。
重定向是浏览器上的网址改变,转发是浏览器上的网址不变。

3.3 读取资源文件
1.在build中配置resources,来防止我们资源导出失败的问题
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>

2.新建类 类名为:servletDemo05。
3.继承类,重写doGet
4.在resour目录下新建db.properties
username=zhu
password=123456
5.路径指向当前项目生成路径:
InputStream is=this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties prop =new Properties();
prop.load(is);
String user = prop.getProperty("username");
String pas = prop.getProperty("password");
6.输出到页面
resp.getWriter().print(user+":"+pas);
7.写url注册与映射:
<servlet>
<servlet-name>sx5</servlet-name>
<servlet-class>com.gowork.servlet.servletDemo05</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sx5</servlet-name>
<url-pattern>/sx5</url-pattern>
</servlet-mapping>
8.访问localhost:8080/servlet-02/sx5
结果如下:

作者:上进小菜猪
链接:https://juejin.cn/post/7132469986966110245
网友评论