Serlvet 是基于 Java 技术的 Web 组件
ServletContext:
web 容器在启动时,它会为每个 web 程序都创建一个对应的 ServletContext 对象,代表当前的 web 应用
1.共享数据:
在一个 Servlet 中保存的数据,可以在另一个 Servlet 中拿到
this.getServletContext(),即 Servlet 上下文
通过 setAttribute() 方法设置属性节点,将数据保存在 ServletContext 中
package com.demo.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Set extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String username = "张三"; //数据
//将数据保存在ServletContext中,名字为username,值为username
servletContext.setAttribute("username",username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
创建另一个 java 文件
this.getServletContext();
通过 getAttribute() 方法获取值(数据),默认 Object 类型,修改成 String 类型要强制转换
package com.demo.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Get extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String attribute = (String) servletContext.getAttribute("username");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().println(attribute);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
注册 Servlet
web.xml 文件如下:
<servlet>
<servlet-name>get</servlet-name>
<servlet-class>com.demo.servlet.Get</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>get</servlet-name>
<url-pattern>/get</url-pattern>
</servlet-mapping>
运行,地址栏加后缀即可
2.获取初始化参数
设置初始值:
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
getInitParameter 获取初始化参数
package com.demo.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Param extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String initParameter = servletContext.getInitParameter("url");
resp.getWriter().println(initParameter);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
注册:
<servlet>
<servlet-name>param</servlet-name>
<servlet-class>com.demo.servlet.Param</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>param</servlet-name>
<url-pattern>/param</url-pattern>
</servlet-mapping>
运行即可,就能看到设置的初始值
3.请求转发
getRequestDispatcher 转发的请求路径
调用 forward 实现请求转发
package com.demo.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Req extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
//getRequestDispatcher转发的请求路径
//调用forward实现请求转发
servletContext.getRequestDispatcher("/param").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
比如路径设置了之前的 <url-pattern>,执行后添加其他后缀
( <servlet-class> 任然要写),依然显示之前路径下的页面
意思是 A 想拿到 C 的资源,但 A 无法直接调用 C,A 只能找到 B
所以 B 去找 C 拿,C 把东西返回给 B,B 再转发给 A
A 只面临了 B,没看到 C,路径没有变化,即转发的概念
4.读取资源文件
在 resources 目录下新建文件
在 Java 目录下新建类
getResourceAsStream 里放 resources 目录下的新建文件路径(路径前加 /),把资源变成一个流
new Properties();
load 拿到文件的流
getProperty 获取 resources 目录下新建文件的属性
package com.demo.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class Prop1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");//把资源变成一个流
Properties properties = new Properties();
properties.load(resourceAsStream); //拿到文件的流
String username = properties.getProperty("username"); //获取属性
String password = properties.getProperty("password");
resp.getWriter().println(username+password);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
pom.xml 文件:
<!-- 在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>
</resource>
</resources>
</build>
运行后被打包到同一个路径下,classes,称为类路径 classpath
resources 资源都是放在类路径下