目录
一、获取ServletConfig对象
1.在直接实现Servlet接口的类中,可通过init方法的参数获得(也可使用2.中的方法)
2.在继承HttpServlet类的类中可通过对象调用getServletConfig()方法获取
二、本文使用的web.xml
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">
<context-param>
<param-name>user</param-name>
<param-value>admin</param-value>
</context-param>
<context-param>
<param-name>passwd</param-name>
<param-value>admin123</param-value>
</context-param>
<servlet>
<servlet-name>MyHttpServlet</servlet-name>
<servlet-class>com.my.servlet.MyHttpServlet</servlet-class>
<init-param>
<param-name>user</param-name>
<param-value>Jay Chou</param-value>
</init-param>
<init-param>
<param-name>passwd</param-name>
<param-value>qilixiang</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>MyHttpServlet</servlet-name>
<url-pattern>/mhs</url-pattern>
</servlet-mapping>
</web-app>
三、ServletConfig的作用与代码实现
ServletConfig的主要作用:
- 获取servlet别名(web.xml中的名字)
- 获取初始化参数(web.xml中servlet的init-param标签)
- 获取ServletContext对象
代码实现上述功能:
package com.my.servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doGet(req, resp);
System.out.println("start to do Get");
// 获取ServletConfig对象
ServletConfig servletConfig = this.getServletConfig();
System.out.println(servletConfig);
//获取本servlet对象的一个init-param
String initParameter = servletConfig.getInitParameter("user");
System.out.println(initParameter);
//获取本servlet对象的所有init-param的名字
while (initParameterNames.hasMoreElements()){
String name = initParameterNames.nextElement();
String value = servletConfig.getInitParameter(name);
System.out.println(name+"----"+value);
};
//获取servlet的name
String servletName = servletConfig.getServletName();
System.out.println(servletName);
// 获取servletContext对象
ServletContext servletContext = servletConfig.getServletContext();
System.out.println(servletContext);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doPost(req, resp);
System.out.println("doPosting");
}
}
输出:
start to do Get
org.apache.catalina.core.StandardWrapperFacade@2809ff8a
Jay Chou
passwd----qilixiang
user----Jay Chou
MyHttpServlet
org.apache.catalina.core.ApplicationContextFacade@26ce04fb
四、ServletContext对象详解
ServletContext是一个接口,表示的是servlet上下文,一个web工程只有一个ServletContext对象,它是一个域对象。
1.获取ServletContext对象
1)通过ServletConfig对象的getServletContext()方法获取
2)继承HttpServlet类的类可通过servlet对象直接调用getServletContext()方法获取
2、ServletContext对象的作用与代码实现
- 获取web.xml中的context-param标签内容
- 获取当前的工程路径(URL)
- 根据相对路径获取当前工程部署在机器上的绝对路经
- 像Map一样存储数据
- 获取一些其他信息
1)代码实现ServletContext对象获取工程信息
package com.my.servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doGet(req, resp);
System.out.println("start to do Get");
// 获取ServletConfig对象
ServletContext servletContext = this.getServletConfig().getServletContext();
System.out.println(servletContext);
// 获取web.xml中context-param中的值
String name = servletContext.getInitParameter("user");
String passwd = servletContext.getInitParameter("passwd");
System.out.println(name+"--"+passwd);
// 获取默认的url路径,即http://ip:port/工程路径/中的[/工程路径]
String contextPath = servletContext.getContextPath();
System.out.println(contextPath);
// 获取部署后的项目在机器上的真实路径,参数为绝对路经,即web
String realPath = servletContext.getRealPath("/");
System.out.println(realPath);
realPath = servletContext.getRealPath("/index.jsp");
System.out.println(realPath);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doPost(req, resp);
System.out.println("doPosting");
}
}
输出:
start to do Get
org.apache.catalina.core.ApplicationContextFacade@254d63f9
admin--admin123
/default
C:\Users\Administrator\IdeaProjects\myApp\out\artifacts\myApp_war_exploded\
C:\Users\Administrator\IdeaProjects\myApp\out\artifacts\myApp_war_exploded\index.jsp
2)ServletContext对象存取数据
在一个Servlet中存取,在同工程下其他Servlet中都可以查到,限单次部署(重启tomcat或者重新部署失效)
代码实现:
package com.my.servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
// 获取默认有的值:一些sevlet相关的属性信息
Enumeration<String> attributeNames = servletContext.getAttributeNames();
while (attributeNames.hasMoreElements()){
String element = attributeNames.nextElement();
Object attribute = servletContext.getAttribute(element);
System.out.println(element+"==="+attribute);
}
System.out.println("--------------------------------------------");
servletContext.setAttribute("myAttribute","myValue");
Object myAttribute = servletContext.getAttribute("myAttribute");
System.out.println(myAttribute);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doPost(req, resp);
System.out.println("doPosting");
}
}
输出:
[2021-06-25 11:34:30,548] Artifact myApp:war exploded: Artifact is deployed successfully
[2021-06-25 11:34:30,548] Artifact myApp:war exploded: Deploy took 627 milliseconds
javax.servlet.context.tempdir===C:\Users\Administrator\.IntelliJIdea2019.3\system\tomcat\Tomcat_8_5_65_myApp\work\Catalina\localhost\default
org.apache.catalina.resources===org.apache.catalina.webresources.StandardRoot@1740abc4
org.apache.catalina.webappVersion===
org.apache.tomcat.InstanceManager===org.apache.catalina.core.DefaultInstanceManager@1987575c
org.apache.catalina.jsp_classpath===/D:/apache-tomcat-8.5.65-windows-x64/lib/…………/C:/Program Files/Java/jdk1.8.0_291/jre/lib/ext/zipfs.jar
javax.websocket.server.ServerContainer===org.apache.tomcat.websocket.server.WsServerContainer@1db8c0b4
org.apache.jasper.compiler.TldCache===org.apache.jasper.compiler.TldCache@58ba5d67
org.apache.tomcat.JarScanner===org.apache.tomcat.util.scan.StandardJarScanner@4ab6d33f
--------------------------------------------
myValue