(一)Servlet的配置对象- ServletConfig
作用:代表了Servlet配置中的初始化参数信息,每个servlet都有一个ServletConfig对象,对象由容器来创建
比如在web.xml中的参数配置如下:
<servlet>
<servlet-name>ServletDemo2</servlet-name>
<servlet-class>cn.itcast.servlet.ServletDemo2</servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>PI</param-name>
<param-value>3.14</param-value>
</init-param>
</servlet>
如何在servlet中获取servletConfig对象呢?
(1)直接调用getServletConfig()方法获取ServletConfig对象,推荐使用该方法
(2)通过servlet的init方法获取
private ServletConfig config;
@Override
public void init(ServletConfig config) throws ServletException {
//获取ServletConfig对象方式一
this.config = config;
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取ServletConfig对象方式二
ServletConfig servletConfig = getServletConfig();
//获取单个参数
String encoding = servletConfig.getInitParameter("encoding");
//获取多个参数
Enumeration<String> parameters = servletConfig.getInitParameterNames();
while(parameters.hasMoreElements()) {
String name = parameters.nextElement();
System.out.println(name+" "+servletConfig.getInitParameter(name));
}
//获取对应的servletName
String servletName = servletConfig.getServletName();
System.out.println(servletName);
}
(二)servlet的上下文对象-ServletContext
1. 在应用被服务器加载时就创建ServletContext对象的实例。每一个JavaWeb应用都有唯一的一个ServletContext对象
它就代表着当前的应用。
2. 如何得到该对象
(1)通过ServletConfig对象,ServletConfig.getServletContext();
(2)通过HttpServletRequest对象,request.getServletContext();
(3)通过getServletContext()方法直接获取(推荐使用)
3.有什么用呢?
3.1ServletContext对象是一个域对象(域对象就是说其内部维护了一个Map<String,Object>)
Object getAttribute(String name):根据名称获取绑定的对象
Enumeration getAttributeNames() :获取ServletContext域中的所有名称
void removeAttribute(String name):根据名称移除对象
void setAttribute(String name,Object value):添加或修改对象。
3.2实现多个Servlet之间的数据共享
Object getAttribute(String name):根据名称获取绑定的对象
Enumeration getAttributeNames() :获取ServletContext域中的所有名称
void removeAttribute(String name):根据名称移除对象
void setAttribute(String name,Object value):添加或修改对象。
3.2实现多个Servlet之间的数据共享
public class ServletDemo02 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext servletContext = getServletContext();
//向ServletContext中设置参数
servletContext.setAttribute("country", "China");
servletContext.setAttribute("city", "Beijing");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
public class ServletDemo03 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取ServletContext中的数据
ServletContext context = getServletContext();
System.out.println("country:"+context.getAttribute("country"));
System.out.println("city:"+context.getAttribute("city"));
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
3.3获取WEB应用的初始化参数(应用的全局参数)
在web.xml的根元素下配置一下信息(这些参数就属于整个应用的全局参数,使用ServletContext来读取。):
<context-param>
<param-name>userName</param-name>
<param-value>admin</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</context-param>
读取应用的全局参数
public class ServletDemo04 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//读取应用的全局参数
ServletContext context = getServletContext();
Enumeration<String> parameters = context.getInitParameterNames();
while(parameters.hasMoreElements()) {
String name = parameters.nextElement();
System.out.println(name+" "+context.getInitParameter(name));
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
3.4读取资源文件的三种方式:
读取不同位置的配置文件
利用ServletContext.getRealPath(),可以将相对路径转为绝对路径:
特点:读取应用中任何文件。只能在Web环境下用
利用ServletContext.getRealPath(),可以将相对路径转为绝对路径:
特点:读取应用中任何文件。只能在Web环境下用
//通过Properties读取配置文件信息
private void read1() throws FileNotFoundException, IOException {
ServletContext sc = getServletContext();
//读取a1.properties
String path = sc.getRealPath("/WEB-INF/a1.properties");//相对路径转绝对路径
Properties prop = new Properties();
prop.load(new FileInputStream(path));//加载配置文件
//读取配置文件里面的数据
System.out.println("username:"+prop.getProperty("userName")+" password:"+prop.getProperty("password"));
System.out.println("================================================================");
//读取a2.properties
String path2 = sc.getRealPath("/WEB-INF/classes/a2.properties");
prop.load(new FileInputStream(path2));//加载配置文件
System.out.println("username:"+prop.getProperty("userName")+" password:"+prop.getProperty("password"));
System.out.println("================================================================");
//读取a3.properties
String path3 = sc.getRealPath("/WEB-INF/classes/com/zky/resources/a3.properties");
prop.load(new FileInputStream(path3));//加载配置文件
System.out.println("username:"+prop.getProperty("userName")+" password:"+prop.getProperty("password"));
System.out.println("================================================================");
}
利用ResourceBundle读取配置文件
特点:可以用在非web环境下。但是只能读取类路径中的properties文件
//通过ResourceBundle读取配置文件(可以读取非web环境下的配置文件,但是只能读取类路径中的properties文件)
public void read2() {
//读取a2.properties
ResourceBundle rb = ResourceBundle.getBundle("a2");//基名
System.out.println(rb.getString("userName")+" passWord:"+rb.getString("password"));
//读取a3.properties
ResourceBundle rb2 = ResourceBundle.getBundle("com.zky.resources.a3");//基名
System.out.println(rb2.getString("userName")+" passWord:"+rb2.getString("password"));
}
利用类加载器读取配置文件(专业)
特点:可以用在非web环境下。可以读取类路径下的任何文件。
//利用类加载器读取配置文件
public void read3() throws IOException {
ClassLoader loader = ReadPropertiesServlet.class.getClassLoader();
Properties prop = new Properties();
InputStream is = loader.getResourceAsStream("a2.properties");
prop.load(is);
System.out.println(prop.get("userName")+" password:"+prop.get("password"));
System.out.println("==============================================");
InputStream is2 = loader.getResourceAsStream("com/zky/resources/a3.properties");
prop.load(is2);
System.out.println(prop.get("userName")+" password:"+prop.get("password"));
}
Servlet规范核心类图
3.5 利用ServletContext相对路径转绝对路径,实现文件下载
//中文文件下载
private void test2(HttpServletResponse response)
throws FileNotFoundException, IOException {
//得到要下载的文件
ServletContext sc = getServletContext();
String path = sc.getRealPath("/美女.jpg");//得到文件的真实路径。路径必须以"/"开头,"/"就代表者当前应用
//截取文件名 C:\apache-tomcat-6.0.35\webapps\day06\美女.jpg
String filename = path.substring(path.lastIndexOf("\\")+1);
System.out.println(filename);
//构建输入流
InputStream in = new FileInputStream(path);
//通知客户端以下载的方式打开
response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));//中文文件名此处要进行URL编码
response.setHeader("Content-Type", "application/octet-stream");
//response.getOutputStream()得到输出流
OutputStream out = response.getOutputStream();
int len = -1;
byte b[] = new byte[1024];
while((len=in.read(b))!=-1){
out.write(b, 0, len);
}
in.close();
out.close();
}
//最简单的文件下载
private void test1(HttpServletResponse response)
throws FileNotFoundException, IOException {
//得到要下载的文件
ServletContext sc = getServletContext();
String path = sc.getRealPath("/f.jpg");//得到文件的真实路径。路径必须以"/"开头,"/"就代表者当前应用
System.out.println(path);
//构建输入流
InputStream in = new FileInputStream(path);
//通知客户端以下载的方式打开
response.setHeader("Content-Disposition", "attachment;filename=f.jpg");
response.setHeader("Content-Type", "application/octet-stream");
//response.getOutputStream()得到输出流
OutputStream out = response.getOutputStream();
int len = -1;
byte b[] = new byte[1024];
while((len=in.read(b))!=-1){
out.write(b, 0, len);
}
in.close();
out.close();
}