前面聊servlet的时有五个方法,但是聊了servlet的生命周期相关的方法,现在聊另一个方法:
@Override
public ServletConfig getServletConfig() {
return null;
}
但是如果查看默认的话,需要通过init方法:
// 因为这个参数直接在创建servlet的时候就会传递个init方法, public void init(ServletConfig servletConfig) throws ServletException
如果非要通过getServletConfig()得到,可以如下修改一下:
// 声明一个变量
ServletConfig servletConfig;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
this.servletConfig=servletConfig;
}
@Override
public ServletConfig getServletConfig() {
return this.servletConfig;
}
这个ServletConfig对象, 该对象包含此 servlet 的初始化和启动参数。
通俗的说就是ServletConfig类包含servlet程序的配置信息
其实无论Servlet还是ServletConfig两者的对象创建都是由Tomcat负责创建的, 而开发者直接使用。毕竟开发者没有通过new来创建这两个对象。
在聊servlet生命周期的时候没有说ServletConfig,其实在第一次访问servlet的时候就创建了ServletConfig。而每一个servlet创建的时候都创建了一个ServletConfig对象。
而这个ServletConfig类有什么用?先看官方文档。
通过上面四个方法可以看出ServletConfig类的三个作用。
- 可以获得servlet程序的别名(web.xml配置的名字)
- 获取初始化参数init-param
- 获取ServletContext对象。
前面说过web.xml和注释的区别的中说过,web.xml的配置信息会更多,而配置更多的消息可以通这个ServletContext得到。
下面只会添加一些配置信息,但是不是全部只是为了演示这ServletConfig作用,如果想要明白xml中配置信息有哪些,后面单独聊一篇,因为还会配置的过滤器等。
废话不多说还是老规矩进代码演示:
test1 com.xzd.test.test_servlet name xiaozhudi myslqurl jdbc:mysql://localhost:3306/test test1 /test
然后可以进入如下操作:
package com.xzd.test;
import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;
public class test_servlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("servlet.....");
String servletName=servletConfig.getServletName();
String name= servletConfig.getInitParameter("name");
Enumeration parameters=servletConfig.getInitParameterNames();
ServletContext ServletContext=servletConfig.getServletContext();
System.out.println("servletName: "+servletName);
System.out.println(name);
System.out.println("parameters: "+parameters);
while (parameters.hasMoreElements()){
System.out.println(parameters.nextElement());
}
System.out.println("ServletContext: "+servletName);
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
然后看一下后台的输出什么:
注意:
- 在web.xml中配置servlet,每一个servlet标签都配置一个servletname标签,所以在servlet中的servletConfig只能得到自己的配置信息,不能得到其它的servlet的信息。
上面聊ServletConfig的方法的中其实一个方法:
public ServletContext getServletContext()
需要单独说一下呢,因为这个是上下文信息看一下官网的解释:
其实如果了解安卓的话,就更具容易理解,因为安卓的很多信息交互以及配置信息,都是通过类似的一个中上下文对象进行交互的。
ServletContext 类的作用:
-
ServletContext 可以默认中一个项目中的公用对象都可以存储和读取数据。对于上下文ServletContext 存储数据,其实有点像是map的样式,类似key-value,只不过方法存储和得到的方法不同。
-
获取web.xml中配置的上下文参数context-param。
-
可以得到web工程路径,格式:/工程路径
-
获取工程部署后在服务器硬盘上的绝对路径。
注意:每个web项目都有一个上下文ServletContext ,同一个服务器下的多个项目,相互是独立的。
看官网:
上下文存取数据上下文对于数据操作可以有如下方法:
setAttribute(String key,String value); // 添加数据或修改数据 getAttribute(String key );// 得到数据 removeAttribute(String key);//删除数据
现在做一个实验创建两个servlet:
- test1
package com.xzd.test;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/test1")
public class test1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("111111111111");
ServletContext servletContext= getServletConfig().getServletContext();//也可以直接用getServletContext()
servletContext.setAttribute("name","张三");
}
}
- test2
package com.xzd.test;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/test2")
public class test2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("22222");
ServletContext servletContext= getServletConfig().getServletContext();//也可以直接用getServletContext()
String name= (String) servletContext.getAttribute("name");
System.out.println("222222-----"+name);
}
}
因为创建的servlet如下:
而在GenericServlet定义了一个 getServletContext()方法,所以其子类可以直接调用getServletContext得到ServletContext对象。
因为浏览器默认是get请求,所以直接用访问:
第一次请求:http://localhost:8080/javaweb/test1 第二次请求:http://localhost:8080/javaweb/test2获取web.xml中的参数
首先在web.xml如此添加数据:
name
李四
然后创建的servlet类:
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/test1")
public class test1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext= getServletContext();
String name=servletContext.getInitParameter("name");
System.out.println("web.xml "+name);
}
}
得到路径
创建一个servlet:
public class test1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext= getServletContext();
System.out.println("当前工程路径 == "+servletContext.getContextPath());
System.out.println("工程部署的路径 == "+servletContext.getRealPath("/"));
}
}
看结果:
当然还有别的方法,其它的方法也是看需要的时候具体用了,就是简单的聊了一下常用的方法。
补充任何语言中对路径有两种分类:相对路径和绝对路径。
-
绝对路径: 就是完整的路径地址,比如:http://ip:port/工程路径/路径
-
相对路径:指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。使用相对路径可以为我们带来非常多的便利。其中有常用的字符:
-
. : 表示当前目录
-
… : 表示上一级目录
-
/ :在web中以/开始的话
如果浏览器解析的话是:http://ip:port/
斜杠尝试
如果在服务解析的话是:http://ip:port/工程路径。
第一:xml中/test1 第二: servletContext.getRealPath("/")但是在服务器中的也有不同,不过写在服务器但是是有浏览器解析的。
response.sendRedirect("/"); //所以其是http://ip:port/
-



