servlet总结(二)

(一)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之间的数据共享
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环境下用
	//通过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();
}






猜你喜欢

转载自blog.csdn.net/xingqibaing/article/details/80716525