Web 前端学习 之servlet(二) servletConfig与ServletContext
ServletConfig类
作用
- **可以获取 Servlet 程序的别名 servlet-name 的值 **
- **获取初始化参数 init-param **
- 获取 ServletContext 对象
先看看init-param的配置,同样是在web.xml文件中
而每个servlet对象中都可以配置init-param
也就是说配置的位置如下
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.guigu.servlet.HelloServlet</servlet-class>
<init-param>
... ...
</init-param>
</servlet>
它是以键值对的形式进行配置的,可以输入我们自己想要的内容
我们可以配置多个init-param
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.guigu.servlet.HelloServlet</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>tty</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>zqq</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</init-param>
</servlet>
init方法测试
下面就通过之前的HelloServlet类来访问
通常写在init初始化方法中,如下
public void init(ServletConfig servletConfig) throws ServletException {
}
可以看到参数就是一个ServletConfig
对象
我们也可以看看它有什么方法
getInitParameter()方法用来通过键获取值,有点类似于python的字典,我们需要传入一个String类型的参数
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("HelloServlet的servlet-name是:" + servletConfig.getServletName());
System.out.println("初始化参数 username 的值是:"+servletConfig.getInitParameter("username"));
System.out.println("初始化参数 password 的值是:"+servletConfig.getInitParameter("password"));
System.out.println("初始化参数 url 的值是:"+servletConfig.getInitParameter("url"));
}
经过测试之后,成功输出结果
其他方法测试
这次我们用HelloServlet2类来测试
首先在HelloServlet2的配置中加上init-param
<servlet>
<servlet-name>HelloServlet2</servlet-name>
<servlet-class>com.guigu.servlet.HelloServlet2</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>tty2</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>zqq2</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/test2</param-value>
</init-param>
</servlet>
我们选择在doGet方法中输出而不是inti
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet被访问");
ServletConfig servletConfig = getServletConfig();
System.out.println("初始化参数 username 的值是:" + servletConfig.getInitParameter("username"));
System.out.println("初始化参数 password 的值是:" + servletConfig.getInitParameter("password"));
System.out.println("初始化参数 url 的值是:" + servletConfig.getInitParameter("url"));
}
可以看到也能成功访问
但是如果我们重写了init方法,必须加上super.init(config)
不然就会产生错误
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
也就是super那句话必须保留,不然在doGet中的调用会产生空指针异常
原因如下
我们一层层的来看下源码
getServletConfig();
先看它的源码如下,属于GenericServlet
再点进去
可以看到GenericServlet的初始方法保存了config
而我们自己重写了init方法的时候,如果没有调用父类的init,config就不会被保存,所以会产生错误
servletContext类
作用
- **获取 web.xml 中配置的上下文参数 context-param **
- 获取当前的工程路径,格式:/工程路径
- **获取工程部署后在服务器硬盘上的绝对路径 **
- 像 Map 一样存取数据
首先它在web.xml中配置的位置跟之前的不同,它属于整个web工程,所以要配置在外面,如下,配置的内容也是键值对的方式
获取参数
编写方法获取参数
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取web.xml中配置的上下文参数context-param
ServletContext context = getServletConfig().getServletContext();
String username = context.getInitParameter("username");
System.out.println("context-param 参数 username 的值是:" + username);
System.out.println("context-param 参数 password 的值是:" + context.getInitParameter("password"));
// 获取当前工程路径
System.out.println("当前工程路径:" + context.getContextPath());
// 获取工程部署在服务器硬盘上的绝对路径
System.out.println("工程部署的路径是:" + context.getRealPath("/"));
System.out.println("工程下 css 目录的绝对路径是:" + context.getRealPath("/css"));
System.out.println("工程下 imgs 目录 1.jpg 的绝对路径是:" + context.getRealPath("/imgs/1.jpg"));
}
存取数据
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 存取数据
ServletContext context = getServletContext();
System.out.println("保存之前Context1 获取key1 的值是:"+context.getAttribute("key1"));
// 保存
context.setAttribute("key1","value1");
System.out.println("保存之后Context1 获取key1 的值是:"+context.getAttribute("key1"));
}
结果如下
说明在存取前 获取不到,存取后可以获取到值
我们可以再新建一个文件试试,因为context是全局的,理论上来说也是可以获取到的
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext();
System.out.println("HelloServlet3获取的context key1的值:" + context.getAttribute("key1"));
}
可以看到只要在setAttribute之后,其他的文件也可以获取到key的值
我们可以把它理解为一个全局的变量,当工程部署的时候通过set函数被创建
ServletContext 是在web 工程部署启动的时候创建。在web 工程停止的时候销毁。