ServletContext对象
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象, 它代表了当前的web应用;
共享数据
我在这个Servlet中保存的数据,可以在另外一个servlet中拿到;
1.新建一个javaweb的maven项目:
2.新建两个servlet:
HelloServlet:
package com.allen.servlet; import javax.servlet.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 HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //this.getInitParameter(); 初始化参数 //this.getServletConfig(); servlet配置 //this.getServletContext(); servlet上下文 ServletContext servletContext = this.getServletContext(); servletContext.setAttribute("userName", "allen"); //将一个数据保存到servlet中,键为userName,值为allen } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
GetServlet:
package com.allen.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 GetServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext servletContext = this.getServletContext(); String userName = (String) servletContext.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 { this.doGet(req, resp); } }
web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0" metadata-complete="true"> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.allen.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <servlet> <servlet-name>getc</servlet-name> <servlet-class>com.allen.servlet.GetServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>getc</servlet-name> <url-pattern>/getc</url-pattern> </servlet-mapping> </web-app>
3.配置tomcat,启动测试:
第一次进入getc:
调用helloservlet之后:
结果:
获得初始化参数:
web.xml
<!-- 配置一些web应用的初始化参数 --> <context-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/mybatis</param-value> </context-param> <servlet> <servlet-name>ServletDemo03</servlet-name> <servlet-class>com.allen.servlet.ServletDemo03</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletDemo03</servlet-name> <url-pattern>/ServletDemo03</url-pattern> </servlet-mapping>
ServletDemo03
package com.allen.servlet; import javax.servlet.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 ServletDemo03 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext servletContext = this.getServletContext(); String url = servletContext.getInitParameter("url"); resp.getWriter().print(url); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
访问ServletDemo03测试:
请求转发:
web.xml
<servlet> <servlet-name>ServletDemo04</servlet-name> <servlet-class>com.allen.servlet.ServletDemo04</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletDemo04</servlet-name> <url-pattern>/ServletDemo04</url-pattern> </servlet-mapping>
ServletDemo04
package com.allen.servlet; import javax.servlet.RequestDispatcher; 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 ServletDemo04 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext servletContext = this.getServletContext(); //RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/ServletDemo03"); //转发的请求路径 //requestDispatcher.forward(req, resp); //调用forward实现转发 servletContext.getRequestDispatcher("/ServletDemo03").forward(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
访问ServletDemo04测试是否被转发到ServletDemo03:
读取资源文件:
Properties
在java目录下新建properties
●在resources目录下新建properties
发现:都被打包到了同一个路径下: classes, 我们俗称这个路径为classpath:
思路:需要一个文件流;
web.xml
<servlet> <servlet-name>ServletDemo05</servlet-name> <servlet-class>com.allen.servlet.ServletDemo05</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletDemo05</servlet-name> <url-pattern>/ServletDemo05</url-pattern> </servlet-mapping>
ServletDemo05
package com.allen.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 ServletDemo05 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties"); Properties properties = new Properties(); properties.load(in); String userName = properties.getProperty("userName"); String password = properties.getProperty("password"); resp.getWriter().print(userName + " " + password); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
测试: