读取web工程下的文件
web项目下相对路径不好用
web项目是相对jvm的路径,但是jvm已经交给tomcat管理了,因此不使用相对路径(可以在comcat/bin路径中读取)
使用ServletContext读取web工程下的文件
getResourceAsStream(String path)返回一个字节输入流
getRealPath(String path);返回一个路径的磁盘绝对路径
path路径的写法:/WEB-INF/classes/文件名.文件后缀
String path=sc.getRealPath("WEB-INF/classes/hello.properties");
磁盘绝对路径 path=C:\JavaDevelopTools\apache-tomcat-7.0.69\webapps\day13\WEB-INF\classes\hello.properties
String getInitParameter(),获取 全局初始化参数
Enumeration getInitParameterNames(),
配置全局初始化参数,可以在其他Servlet中获取
在<display-name>标签下面添加
<context-param>
<param-name></param-name>
<param-value></param-value>
</context-param>
获取文件的MIME类型
每种文件都有对应的MIME类型
String getMimeType(String file),获取文件的mime类型
读取文件加强版
使用类加载器读取
使用类加载器加载class文件加载到内存
WEB-INF/classes
InputStream is = ReadFileUtils.class.getClassLoader().getResourceAsStream("hello.properties");
文件的下载
从服务器向浏览器写入流对象
Response 代表一个响应对象,从服务器向浏览器输出
Response的常用API
响应行:setStatus设置状态码
响应头:setHeader()覆盖 一个key对应一个value
addHeader()追加 一个key对应多个value
响应体:getOutputStream();
getWriter();
文件下载的方式:
1.超链接下载 链接放在href中
2.手动编写代码.
设置两个头和一个流
两个头:
Content-Type:文件的MIME类型
Content-Disposition:以下载的形式打开文件
InputStream 文件输入流
1//接收参数
String name=request.getParameter("filename");
2//设置文件MIME类型
ServletContext sc=this.getServletContext();
String type= sc.getMimeType(name);
response.setHeader("Content-Type", type);
response.setHeader("Content-Disposition", "attachment;filename="+name);
3//获得输入流
String realpath="E:\\音乐视频\\"+name;
//String realpath="E:\\音乐视频\\[4K高清MV]IU - YOU&I.mp4";
System.out.println(realpath);
InputStream is=new FileInputStream(realpath);
OutputStream os= response.getOutputStream();
int len=0;
byte[] bys=new byte[1024];
while((len=is.read(bys))!=-1){
os.write(bys, 0, len);
}
is.close();
中文文件下载:
// 接收参数
String filename = new String(request.getParameter("filename").getBytes("ISO-8859-1"), "UTF-8");
System.out.println(filename);
// 设置文件MIME类型
ServletContext sc = this.getServletContext();
String type = sc.getMimeType(filename);
response.setHeader("Content-Type", type);
// 获得输入流
String realpath = "E:\\音乐视频\\" + filename;
// String realpath="E:\\音乐视频\\[4K高清MV]IU - YOU&I.mp4";
System.out.println(realpath);
// 根据浏览器类型处理中文乱码,获得请求头
String agent = request.getHeader("User-Agent");
System.out.println(agent);
if (agent.contains("Firefox")) {
filename = base64EncodeFileName(filename);
} else {
filename = URLEncoder.encode(filename, "UTF-8");
}
response.setHeader("Content-Disposition", "attachment;filename=" + filename);
InputStream is = new FileInputStream(realpath);
OutputStream os = response.getOutputStream();
int len = 0;
byte[] bys = new byte[1024];
while ((len = is.read(bys)) != -1) {
os.write(bys, 0, len);
}
is.close();
response响应:
getOutputStream();
使用字节流输出中文不一定会乱码,看浏览器编码
解决乱码的方式
write("中文".getBytes("UTF-8"))
然后再浏览器中设置UTF-8
response.setHeader("Content-Type","text/html;charset=UTF-8")
getWriter();
一定会乱码, response使用的字符流有缓冲区(外国人习惯使用IOS-8859-1的编码,这个编码不支持中文)
解决办法:
设置response的字符流缓冲区的编码,然后这只浏览器默认打开采用的字符集的编码,一定要在所有输出之前
response.setCharacterEncoding("UTF-8");设置response的字符流缓冲区的编码
response.setHeader("Content-Type","text/html;charset=UTF-8");设置浏览器
response.setContentType("text/html;charset=UTF-8");与上面两句效果一致
既设置了缓冲区也设置了浏览器
getOutputStream();getWriter();这两个方法是互斥的,做出响应的时候只能用其中的一个流.
Request(请求)的功能:
获取客户机信息
getMethod()获得请求方式
getRequestURI()工程(/工程名)下开始的路径
getRequestURL()从http开始的
获得客户机相关的信息
getRemoteAddr()获取客户机的ip地址
getRemoteHost()主机名
getRemotePort()端口号
getContextPath()获取工程名
获取页面中提交的参数
getParameter()
getParameMap()
getParameterNames()
getParameterValue()
作为域对象存取数据
getAttribute()
setAttribute()
removeAttribute()
处理Request中文乱码问题
Post的解决方法:
post是把数据封装到servet的reuqest中,request中也有一个缓冲区
request缓冲区也是ISO-8859-1编码
设置request的缓冲区的编码
request.setCharacterEncoding("UTF-8");
一定要设置在接收参数之前(调用getParameter之前)
get的解决办法:
将提交的数据编码后放到了request的缓冲区里面,
先从request缓冲区(ISO-8859-1)中拿到这个数据
再对其进行解码
方法1:可以修改tomcate字符集的编码(不推荐)
方法2:使用URLEncoder和URLDecoder进行编码和解码
*方法3:new String(request.getParameter("filename").getBytes("ISO-8859-1"), "UTF-8");
Request作为域对象存取数据:
使用request对象存取数据
setAttribute(String name,String value);
getAttribute(String name);
request的作用范围就是一次请求的范围,客户端向服务器发送一次请求后,服务器就会创建一个request对象
销毁:当服务器对这次请求做出了响应之后就销毁.
重定向和转发的区别(redirect与forward的区别)
重定向:
1.地址栏路径变了
2.重定向执行过程请求Servlet1,等待Servlet1响应并接受状态码和重定向路径,
然后再请求新的路径等待新路径响应
3.两次请求,两次响应
4.重定向的是客户端的路径,需要加工程名
5.重定向可以跳转到任意网站
response.sendRedirect("/day13/register/success.html");
转发:
1.地址栏路径没有变
2.转发的执行过程:请求Servlet1,Servlet1直接跳转到Servlet2,Servlet2响应
3.一次请求一次响应
4.转发的是服务器的路径,不需要加工程名
5.只能在服务器内部进行转发
RequestDispatcher getRequestDispatcher(String path)
RequestDispatcher中有 void forward(ServletRequest request, ServletResponse response)
request.getRequestDispatcher(/xxxxx).forward(request,response);
|
|