1.读取web工程下的文件 : java项目可以直接用绝对路径读取, 但web项目是在服务器上;
主要问题就是文件路径问题
1.传统的java项项目的读取方法,相对路径是相对的Tomcat中bin路径
2. 在src下创建一个文件 ,然后在包下新建一个servlet
3.使用servletcontext来读取web项目下的文件
public Inputstream getresourceAsStream(); 根据提供的路径读取文件
public string getRealPath(); 返回一个路径的磁盘的绝对路径
1.获得servletcontext对象,然后调用getresourceAsStream("/WEB-INF/classes/文件名");
然后用Properties读取文件内容
2.获得servletcontext对象,然后调用getRealPath("/WEB-INF/classes/文件名");得到绝对
路径,然后用传统的的读取方法,路径就写绝对路径/
4.自定义工具类读取文件;是一个java类, 用类的加载器来加载class文件,将class文件加载内存
自定义工具类.class.getclassLoader().getresourceAsStream();
加载器的执行流程: 应用类加载器----->扩展类加载器----->系统类加载器
2.servletcontext的功能: servletcontext; 是一个域对象. 作用范围: 整个web工程;
1.创建: 服务器启动时候,Tomcat服务器为每个web项目创建一个单独的servletcontext对象;
2.销毁: 服务器关闭或项目移除时候,进行销毁;
3.作用:
1.获得全局的初始化参数, 全局参数的配置,任何一个servlet都可得到;
<context-param>
<param-name>username
<param-value>
然后读取用getInitparameter("username");或 getInitparameterNames();
2. 用来获得文件的MIME的类型,可以用来文件上传和下载的时候限制用户上传头像类型
getMimetype(文件名); 获得文件的类型
3. 作为域对象存储数据,用来读取web项目下的文件.
4.读取web工程下的文件
3.登陆成功后,完成文件的下载
1.Response 代表的响应对象, 从服务器向浏览器输出内容;
1.常用的API: 响应行: setstatus(int) 设置响应码,
响应头: addHeader();
addDateHeader(); addIntHeader(); 一个key对应多个value的响应头
setHeader(string name,string value);
setDateHeader(string name , long date),setIntHeader(); 一个key 对应一个value的响应头
响应体:getoutputstream(); getwriter();
2.文件下载方式:
1. 超链接下载,直接将文件的路径写到超链接的href中, ---前提:文件类型,浏览器不支持,如果
支持,直接就打开了;
2. 手写代码方式完成文件下载;
设置两个头和一个流:
content-type :文件的MIME的类型
content-disposition: 以下载中的方式打开文件
inputstream :文件输入流
3.在业务层重定向到一个登陆.jsp页面,然后在跳转到文件下载页面
4.文件下载:
1.超链接下载:<a href="/day10/文件路径">直接下载
2.编码下载: <a href="/day10/servlet ? filename=hello.zip">
3.在servlet中 设置两个头和一个流:
接收参数的时候要解码
第一个头: 告知浏览器文件的类型
//下载的文件名要解码;
第二个头: 浏览器已下载的方式打开
输入流的路径:this.getServletContext().getRealPath("/download/"+parameter);
type= getMimetype(文件名); 得到类型
response.setHeader("Content-Type",type);
处理中文问题;
response.setHeader("Content-Disposition","attachment;参数名="+参数值);
4. 服务器输入流,(getRealPath("/文件夹/文件名");)读取文件,
然后通过字节输出流下载;response.getoutputstream(); 关闭输入流
4.中文文件下载
1.request 接受参数是中文的时候: new String(参数.getBytes("ISO-8859-1"),"UTF-8");
2. 在设置头信息下载的时候,下载文件名会乱码
IE浏览器下载中文文件时,采用URL的编码
Firefox浏览器................Base64的编码;
获得头信息String agent = request.getHeader("User-Agent");
5.response输出响应内容的方法; print其实调用了writer方法然后获得值变为字符串;
response.getwriter().print();
response.getoutputstream().writer(byte);
以上两个输出方法只能用一个;
1.字节流getoutputstream().writer(中文.bytes("UTF-8"));
乱码的问题: 不一定;主要是你服务器编码要和浏览器编码相同
解决: 设置中文转出字节数组取出的时候的编码 , 设置浏览器默认打开的编码
.response.setHeader(“Content-Type”,”text/html;charset=UTF-8”);
.response.getoutputstream().writer(中文.bytes("UTF-8"));
2.字符流 getwriter().print();
乱码的问题: 一定会乱码; 因为字符流有缓存区 , response的字符流缓存区默认编码ISO-8859-1;
解决: 设置response的字符流的缓存区的编码; 在输出之前
设置浏览器默认打开的时候采用的编码; 和1相同;
response.setContentType(“text/html;charset=UTF-8”);
6.Request代表用户的请求:
功能一: 获得客户机相关信息
Request的API
1. 请求行:获得请求方式 : getMethod();
请求路径: getrequestURL() getRequsetURI();
获得客户机相关信息: getRemoteAddr() IP地址
获得工程名: getContextPath();
功能二: 获得参数的信息;
功能三: 作为域对象存储数据/ setAttribute() 有这些方法基本都是域对象
7. request的中文乱码问题:
1.get提交方式: 地址栏中会乱码,然后放在request缓存区;
1.修改Tomcat的字符集的编码;
2.使用URLEncoder和URLDecoder进行编码和解码的操作
3.使用String的构造方法:new String(参数.getBytes("ISO-8859-1"),"UTF-8");
2.post提交方式:post的参数实在请求体中,直接到达后台的servlet中的request中,request也有缓 存区request的缓存区也是ISO-8859-1编码
解决: request.setcharacterencoding("UTF-8");
8. Request作为域对象存取数据;
作用范围就是一次请求的范围,这样只能用转发了
创建:客户端向服务器发送了一次请求后,就会创建一个request对象
销毁: 当服务器对这次请求做出了响应之后;
setatrribute(); getattribute();
9. 重定向和转发: (redirect和forward是一样的)
1.重定向: response.sendRedirect("地址");
2.转发 : request.getRequestDispatcher().forword();
3.重定向的地址栏会发生变化,转发的地址栏不变.
4.重定向两次请求两次响应,转发一次请求一次响应.
5.重定向路径需要加工程名,转发的路径不需要加工程名.
6.重定向可以跳转到任意网站,转发只能在服务器内部进行转发. 这是因为路径问题