1.传统方式读取文件
@Test public void test() throws IOException { //创建输入流,关联文件 InputStream is = new FileInputStream("src/demo.properties"); Properties pro = new Properties(); //加载到对象 pro.load(is); //根据key拿到value String usernmae = pro.getProperty("username"); String password = pro.getProperty("passwrod"); }
2.使用getRequestAsStream
public class ServletContext1 extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //ServletContext对象 ServletContext context = this.getServletContext(); InputStream is = context.getResourceAsStream("/WEB-INF/classes/demo.properties"); Properties pro = new Properties(); pro.load(is); pro.getProperty("usernmae"); pro.getProperty("password"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
3.使用getRealPath读取文件
//获得ServletContext ServletContext context = this.getServletContext(); //获得文件的绝对磁盘路径 String realPath = context.getRealPath("/WEB-INF/classes/demo.properties");
4.ServletContext作为域对象保存数据
整个web目录,而且是全局对象
服务器启动的时候,服务器为每个web项目创建一个单独的ServletContext对象
服务器关闭的时候销毁
5.下载文件的小案例
分析:
超链接下载,直接将文件的路径写到超链接的href中,前提是文件类型浏览器不支持
手动编写代码的方式完成文件的下载
设置两个头和一个流:
Content-Type:文件的MIME类型
Content-Disposition:以下载的方式打开文件
InputStream:文件的输入流
代码:
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取在html中的href中传入过来一个filename String filename = request.getParameter("filename"); //设置下载方式 String type = this.getServletContext().getMimeType(filename); response.setHeader("Content-type", type); response.setHeader("Content-Disposition", "attachment;filename="+filename); //得到文件的绝对路径 String realPath = this.getServletContext().getRealPath("/download/"+filename); //设置流 InputStream is = new FileInputStream(realPath); //获得相应的输出流 OutputStream os = response.getOutputStream(); int len = 0; byte [] arr = new byte[1024]; while((len = is.read(arr)) != -1) { os.write(arr, 0, len); } is.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }
6.中文乱码解决问题
IE浏览器下载中文文件的时候采用的URL的编码
firefox浏览器下载中文文件的时候采用的是Base64的编码
1:根据浏览器的类型处理中文乱码问题:
String filename = request.getParameter("filename"); //获得浏览器类型 String agent = request.getHeader("User-Agent"); //如果是火狐 if(agent.contains("FireFox")) { filename = base64EncodeFileName(filename); }else { //其他浏览器 filename = URLEncoder.encode(filename,"utf-8"); } } public static String base64EncodeFileName(String fileName) { BASE64Encoder base64Encoder = new BASE64Encoder(); try { return "=?UTF-8?B?" + new String(base64Encoder.encode(fileName .getBytes("UTF-8"))) + "?="; } catch (UnsupportedEncodingException e) { e.printStackTrace(); throw new RuntimeException(e); }
2:post方式解决中文乱码问题:
Request.setCharacterEncoding(“UTF-8”);
3.get方式解决中文乱码问题
New String(“name”.getBytes(“IOS-8859-1”),”UTF-8)”;
4.接收的参数解决中文乱码问题:
New String(“name”.getBytes(“IOS-8859-1”),”UTF-8)”;
5.输出中文乱码问题
字节流
设置浏览器默认打开的编码:
resposne.setHeader(“Content-Type”,”text/html;charset=UTF-8”);
设置中文字节取出的时候的编码
luanma.getBytes("utf-8");
字符流
设置浏览器默认打开的编码:
resposne.setHeader(“Content-Type”,”text/html;charset=UTF-8”);
设置response的缓冲区编码:
response.setCharacterEncoding(“UTF-8”);
7.Request作为域对象存取数据
setAttribute和getAttribute
作用范围:
就是一次请求的范围
创建和销毁:
创建:客户端向服务器发送了一次请求以后,服务器就会创建一个request的对象
销毁:当服务器对这次请求作出了响应之后
8.转发和重定向的区别(redirect和forward)
1.重定向地址栏会发生改变
2.重定向两次请求两次响应,转发一次请求一次响应
3.重定向需要加工程名,转发路径不需要
4.重定向可以跳转的任意页面,转发只能在服务器内部