response和ServletContext和乱码问题
服务器端以/开始就代表当前项目名
客户端必须以 /项目名/资源 才能定位到资源
软件与软件之间,以字符为标准传递,传递字节,接收端自己按原来的编码集编码之后再按照自己的编码集解码编码(如果没有对应字符,将会丢失数据)
软件与文件或者浏览器之间,以字节为标准传递,传递字节,接收端直接将字节按照自己的编码集进行编码(不会丢失数据)
数据丢失发生在解码的时候
servlet一定要初始化之后才能对里面的对象赋值,否则对象为null
加载----初始化----执行----消亡
如何实现数据共享
方案1(了解):静态变量(耗费内存,特别是服务器端)
方案2(ServletContext):
A、服务器为我们提供了一个内置的 ServletContext 对象
this.getServletContext();
B、这个对象可以实现不同Servlet 之间的数据共享
C、设置数据的API: setAttribute("键","值");
获取数据的API: getAttribute("键");
删除数据的API:removeAttribute("键");
such as:浏览量统计(每一个客服端请求时的servlet得到的都是用的同一个ServletContext)
response
作用:服务器通过这个对象向浏览器发送数据
servlet向tomcat传递消息:
response.setCharacterEncoding("UTF-8"); //告诉Tomcat用UTF-8进行编码
response设置响应行:
A:设置状态码:(默认是又tomcat管理)
setStatus(int i); //响应行出现的状态码
setError(int i,String s); //响应行出现的错误提示的状态码,后面是错误提示的信息
response设置响应头:
A:设置的响应头最好是HTTP协议规定的,不然没有具体用处
B:setHeader("键","值")
多次设置,键重复时,会覆盖
C:addHeader("键","值")
多次设置,追加
such as: 键:refresh
值:秒数;url=路径 ---- 以项目名开始(值中出现多个属性时用分号)
键:content-type //简化版:response.setContentType("text/html;charset=utf-8");
值:text/html;charset=utf-8
response 设置响应体
getWriter() ---- 获取字符流
getOutputStream() ---- 获取字节流
注意:
1、二者不能同时开启
2、流可以不关,因为是 Tomcat 管理的(自己创建的流需要关闭)
文件的下载操作:
提交到服务器的时候:在url后面直接用get方式的形式跟上要下载的文件名
<a href="/day3504/DownLoad?name=hello.txt">hello.txt</a>
在Servlet中解析请求行:
String fileName = request.getParameter("name");
byte[] buffer = fileName.getBytes("ISO-8859-1");
fileName = new String(buffer,"UTF-8");
System.out.println(fileName);
设置响应头,文件的类型
response.setHeader("Content-Type", this.getServletContext().getMimeType("/" + fileName));
设置响应头,告诉浏览器使用正确的打开方式,不要直接显示,而是执行下载操作
response.setHeader("Content-Disposition", "attachment; filename =" + fileName);
向浏览器传送文件名时的编码乱码问题:(文件名需要单独编码解码)
eclipse:GBK
Tomcat:unicode
浏览器:GBK
eclipse和tomcat之间,以字符为标准
Tomcat与浏览器之间,以字节为标准
1:byte[] buffer = fileName.getBytes("GBK");
String newName = new String(buffer,"ISO-8859-1");
response.setHeader("Content-Disposition", "attachment; filename =" + newName);
2:调用DownLoadUtils
String agent = request.getHeader("user-agent");
String downName = DownLoadUtils.getName(agent, fileName);
response.setHeader("Content-Disposition", "attachment; filename =" + downName);
项目中的文件读写操作:
获取读取当前文件的流:(获取到相对路径中文件的读取流)
InputStream in = this.getServletContext().getResourceAsStream("/" + fileName);("/"定位到当前webapps目录)
获取字节输出流
ServletOutputStream out = response.getOutputStream();
读的同时写
byte[] buffer2 = new byte[1024];
int length;
while((length = in.read(buffer2)) != -1){
out.write(buffer2, 0, length);
}
in.close();
读取绝对路径中的文件
String s = this.getServletContext().getRealPath("文件"); //得到的是Tomcat服务器下的文件路径,而不是eclipse下的文件路径
FileInputStream in = new FileInputStream("s");
获取文件读取流时的三种方法:
1:获取绝对路径的文件读取流
FileInputStream in = new FileInputStream("绝对路径");
2:获取WebContent中文件的读取流
InputStream in = this.getServletContext().getResourceAsStream("webContent下的绝对路径")
3:获取src目录下的文件读取流(常用于读取配置文件)
类名.class.getClassLoader().getResourceAsStream("src目录下的文件名");
验证码中点击一次验证码更换一次图片:(原理,点击一次图片由servlet重新动态发送一次图片)
图片是通过服务器穿过来的
<script type="text/javascript">
$(function(){
$("#show").click(function(){
$(this).prop("src","/day3505/Code?test=" + new Date()); //new Date():让每一次访问时提交的数据变化,不读取本地缓存
});
});
</script>
response和ServletContext和乱码问题的更多相关文章
- Response ServletContext 中文乱码 Request 编码 请求行 共享数据 转发重定向
Day35 Response 1.1.1 ServletContext概念 u 项目的管理者(上下文对象),服务器启动时,会为每一个项目创建一个对应的ServletContext对象. 1.1.2 ...
- Response与ServletContext对象
HTTP协议: 请求消息:客户端发送给服务器端的数据 数据格式: 请求行: 格式: 请求方式 请求url 请求协议/版本 请求头:告诉服务器,当前访问的浏览器自身的一些信息 格式: 请求头名称: 请求 ...
- PrintWriter out = response.getWriter() 输出中文乱码问题
HttpServletResponse response = ServletActionContext.getResponse(); response.setCharacterEncod ...
- response.getWriter().write()产生乱码
Struts1中通过action, return到页面的时候,如果代码中使用到response.getWriter().write(),那么有可能jsp页面中汉字会变成乱码.百度上有人说改为respo ...
- 解决response.setHeader("Content-disposition" 中文乱码问题
Content-Disposition中文乱码 Response.setHeader(”Content-Disposition”, “attachment; filename=” + fileName ...
- Response attachment filename 中文乱码
Response.setHeader("Content-Disposition", "attachment; filename=" + fileName+&qu ...
- response.getWriter().write("中文");乱码问题
起初遇到这个问题,网上几乎所有的建议都是: response.setHeader("Content-type", "text/html;charset=UTF-8&quo ...
- 关于使用response.addHeader下载中文名乱码问题
介绍下我项目中遇到的问题:在数据库导出Excel文件的过程中,导出文件中文名始终异常,最终结果发现需要在response.addHeader 中的 filename = "xxxx" ...
- 解决response在controller返回乱码的解决方式
乱码的代码 @RequestMapping(value = "/readbook", method = RequestMethod.GET) 加入 produces = " ...
随机推荐
- HP Server BIOS实验报告
原文链接http://www.hpiss.com/3924.html 注意:红色字体为HP手册中查找到的资源,及个人感觉应该注意的一些信息,个人翻译的也为红字体,网络中自行查找到的资源,以及询问各位师 ...
- 安装graphviz
环境win10 1. 下载安装包首先进入官网下载msi文件 安装,一路next,不需要注意什么 2.设置环境变量 安装完毕之后,我们需要手动配置环境变量. 找到刚才我们安装地址,进入graphviz, ...
- UVA1595_Symmetry
给出平面上n个点,问你能不能找到一个竖线让他们对称 这道题后面发现真的不难,又不止一种方法 我当时写的很挫,死脑筋的就找一个点的对称点存不存在,用结构体存点信息,在排序用find找,,然后不知道一堆w ...
- [BJWC2018]上学路线
Description 小B 所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M). 小B 家住在西南角,学校在东北角.现在有T 个路口进行施工,小B 不能通过这些路口.小B ...
- bootstrap学习(五)代码
内联代码: <code>public static</code>void main 用户输入: to edit setting,press <kbd><kbd ...
- vue--先决篇
一.vue介绍: vue是一个渐进式Javascript框架. 渐进式:即有一个核心库,在需要的时候,在逐渐添加插件的一种概念. (1)MVVM和MVC模式: MVVM是Model-View-View ...
- Jmeter的安装与环境配置
1.首先从jmeter的官网http://jmeter.apache.org/download_jmeter.cgi下载jmeter,目前最新版本为5.1,支持的JDK为1.8.. 然后进行解压. 2 ...
- asp.net core Mvc 增删改查
1.创建项目 创建Data文件夹 创建实体类Students/cs public class Students { public Guid Id { get; set; } public string ...
- 数据结构(c语言版,严蔚敏)第3章栈和队列
第3章栈和队列
- 特种设备TSG 认证流程
特种设备许可,也叫安全注册(原为AZ安全注册认可),现为TS.国家为了防止和减少事故,保障人民群众生命和财产安全,促进经济发展而强制实施的安全监察.它的作用相当于欧盟的“CE”认证,但比“CE”认证更 ...