引言
在上一篇博客中给大家介绍了一些servlet中的学习收获,在这篇博客中接着给大家分享servlet中图片的下载和属性文件的读取。
先看一下整个demo的目录结构;
1、图片的下载
package com.itheima.sc; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; 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 ServletContextDemo6 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //文件在哪儿?以不变应万变 ServletContext sc = getServletContext(); String realPath = sc.getRealPath("/WEB-INF/classes/美女.jpg");// 文件存放的真实绝对路径 // System.out.println(realPath); //构建文件的输入流 InputStream in = new FileInputStream(realPath); //告知客户端以下载的方式打开:Content-Disposition=attachment;filename=27.jpg //获取要下载的文件名 String filename = realPath.substring(realPath.lastIndexOf(File.separator)+1); response.setHeader("Content-Type", "application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));//中文属于不安全的字符,需要进行URL编码 //用response的字节流进行输出 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(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
上面的demo就是在browser中以下载的方式获取图片,仅仅是供学习和研究用,在实际的项目中一般是不会用这个原生的servlet来实现文件的下载和上传的。
2、servlet读取属性文件
在这给大家提供三种读取属性文件的方式,代码如下:
public class servletContextDemo07 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { test10(request, response); } // 请不要把Tomcat等服务器装在有空格的目录中 // 类加载器读取:只能读取classes或者类路径中的任意资源。但是不适合读取特别大的资源。b c private void test31(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ClassLoader cl = servletContextDemo07.class.getClassLoader();// 得到类加载器 URL url = cl.getResource("com/itheima/resources/c.properties"); String path = url.getPath(); InputStream in = new FileInputStream(path); Properties props = new Properties(); props.load(in); System.out.println(props.getProperty("hello")); } // 类加载器读取:只能读取classes或者类路径中的任意资源。但是不适合读取特别大的资源。b c private void test30(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ClassLoader cl = servletContextDemo07.class.getClassLoader();// 得到类加载器 // InputStream in = cl.getResourceAsStream("b.properties"); InputStream in = cl.getResourceAsStream("com/itheima/resources/c.properties"); Properties props = new Properties(); props.load(in); System.out.println(props.getProperty("hello")); } // 利用ResourceBundle读取:b c ,不能读a,只能读取properties的文件 private void test20(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // ResourceBundle rb = ResourceBundle.getBundle("b"); ResourceBundle rb = ResourceBundle.getBundle("com.itheima.resources.c"); System.out.println(rb.getString("hello")); } // 利用ServletContext读取:a b c // 可以读取应用中任何位置上的资源。使用限制:只能在web应用中用 private void test10(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // String path = getServletContext().getRealPath("/a.properties"); // String path = // getServletContext().getRealPath("/WEB-INF/classes/b.properties"); String path = getServletContext().getRealPath("/WEB-INF/classes/com/itheima/resources/c.properties"); InputStream in = new FileInputStream(path); Properties props = new Properties(); props.load(in); System.out.println(props.getProperty("hello")); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
遇到的错误
解决方案;
右击项目——》properties——》java Build path ——》右侧选择Libraries——》选择JRE System Libray
然后点击 edit 将jdk换成1.6版本
在项目中读取properties文件还是比较常见的,一些基本配置信息都是配置在这个属性文件中,上面提供了三种读取方式供大家参考,读取方式还有很多中,大家可以去网上查询,然后对比一下根据自己的需求选择读取方式。
小结
上面是在学习servlet中的一些常用功能的总结,通过这两篇博客对servlet又进行了一次总结,这次比第一次接触servlet的时候更多了了解了一些内部的原理机制,这样看一些封装的东西会容易一些。