Java Web学习Day02 ServletContext对象
Java Web学习Day02 ServletContext对象
1.ServletContext
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了我当前的web应用
1、共享数据
-
我在这个Servlet保存的应用,可以在另一个servlet中拿到:
//设置数据 public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // this.getInitParameter(); 初始化参数 // this.getServletConfig(); Servlet配置 // this.getServletContext(); Servlet上下文 ServletContext context = this.getServletContext(); String username = "蓝天"; context.setAttribute("username",username); //将一个数据保存在ServletContext中,名字为:username 值为username System.out.println("Hello!"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
//拿取数据 public class GetServlet extends HttpServlet { @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); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
<!--HelloServlet注册--> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.lantian.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <!--GetServlet注册--> <servlet> <servlet-name>getc</servlet-name> <servlet-class>com.lantian.servlet.GetServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>getc</servlet-name> <url-pattern>/getc</url-pattern> </servlet-mapping>
测试访问结果:直接访问getc会返回null 因为此时hello中setAttribute还会设置数据;访问hello后再此访问getc得到返回数据 名字蓝天
2、获取初始化参数
<!--配置一些web应用初始化参数-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
<!--ServletDemo03注册-->
<servlet>
<servlet-name>demo3</servlet-name>
<servlet-class>com.lantian.servlet.ServletDemo03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo3</servlet-name>
<url-pattern>/demo3</url-pattern>
</servlet-mapping>
public class ServletDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext(); //创建ServletContext对象
String url = context.getInitParameter("url"); //获取初始化参数
resp.getWriter().print(url);
}
}
3、请求转发

public class ServletDemo04 extends HelloServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
System.out.println("进入方法Demo04");
/* RequestDispatcher redis = context.getRequestDispatcher("/demo3"); //转发的请求路径
redis.forward(req,resp); //调用forward实现请求转发;
*/
context.getRequestDispatcher("/demo3").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
4、读取资源文件
Properties
- 在java目录下新建properties
- 在resources目录下新建properties
发现: 都被打包到同一路径下:classes, 称这个路径为 类路径
思路: 需要一个文件流
username=root
password=123456
public class ServletDemo05 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
InputStream is =this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties prop = new Properties();
prop.load(is);
String user = prop.getProperty("username");
String pwd = prop.getProperty("password");
resp.getWriter().print("用户名: "+user+"\n"+"密码:"+pwd);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
访问测试