1,Servlet请求响应中文乱码问题

 package com.demo.servlet;
import java.io.PrintWriter;
import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Demo5Servlet extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
* 关于重定向,Servlet封装了sendRedirect方法 则sendRedirect方法的底层其实是两步
* 第一步是设置响应状态码为302
* 第二步是设置响应头的location属性值为需要跳转到的url
*/
resp.setStatus(302);
resp.setHeader("location", "/ServletDemo/demo2");
// 以上两步的效果与以下方法相同
resp.sendRedirect("/ServletDemo/demo2");
// 设置页面自动过5秒种跳转到另一个地址
resp.setHeader("refresh", "5;url=/ServletDemo/demo2");
/*
* Servlet响应中文乱码的问题,主要分两步
* 第一步是当response把中文写入到Tomcat引擎之前,是先把内容写入到response缓冲区的,
* 此时需要告诉response需要以什么样的编码形式写入到缓冲区,即设置setCharacterEncoding();
* 第二步是告诉浏览器以什么样的编码方式读取response响应的信息,即设置setHeader
* 其实第一步不设置,只设置第二步便可起到同样的效果
*/
//告诉response缓冲区将以什么样的编码方式写入
resp.setCharacterEncoding("utf-8");
//行文浏览器以什么样的编码方式解决response响应的内容
resp.setHeader("Content-type", "text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.write("hello");
writer.write("<br/>");
writer.write("你好"); } @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp);
} }

Servlet响应中文乱码

2,Servlet手动实现下载

 <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function click() {
var href = '/ServletDemo/down?filename=张三.jpg';
href = encodeURI(href);
console.info(href);
location.href = href;
}
</script>
</head>
<body>
<a href="/ServletDemo/down?filename=a.jpg">jpg</a>
<br />
<a href="/ServletDemo/down?filename=a.mp3">mp3</a>
<br />
<a href="/ServletDemo/down?filename=a.flv">flv</a>
<br />
<a href="/ServletDemo/down?filename=a.mp4">mp4</a>
<br />
<a href="/ServletDemo/down?filename=a.txt">txt</a>
<br />
<a href="/ServletDemo/down?filename=a.zip">zip</a>
<br />
<a href="javascript:click()">张三</a> </body>
</html>

Servlet手动下载前端

 package com.demo.servlet;

 import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder; import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import sun.misc.BASE64Encoder; public class DownServlet extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String filename = req.getParameter("filename");// 获取所需要下载的文件名
String oldFileName = filename;// 之所以声明一个oldFileName是为了服务器需要根据这个文件名字找到相对应的文件
System.out.println(filename);
String agent = req.getHeader("User-Agent");// 获取客户端浏览器版本
//根据浏览器版本对所要下载的文件名称进行编码,以便在下载的时候正确显示文件名称
if (agent.contains("MSIE")) {
// IE浏览器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
String path = this.getServletContext().getRealPath("download/" + oldFileName);// 获取所下载的资源的绝对路径
// 设置要下载的文件类型,通过文件名获取文件的MIME类型
resp.setContentType(this.getServletContext().getMimeType(filename));
// 告诉浏览器别直接打开文件,而是以下载的形式保存文件
resp.setHeader("Content-Disposition", "attachment;filename=" + filename);
InputStream input = new FileInputStream(path);// 将文件封装输入流
ServletOutputStream output = resp.getOutputStream();// 获取response的输入流对象
int len = 0;// 读取到的字节长度
byte[] buffer = new byte[1024];// 读取到的缓冲区
while ((len = input.read(buffer)) > 0) {
output.write(buffer, 0, len);// 读取缓冲区的字节到输出流
}
input.close();
output.close(); } @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp);
} }

Servlet手动下载后端

Java中关于Servlet中请求中文乱码及文件下载的更多相关文章

  1. 尚硅谷面试第一季-09SpringMVC中如何解决POST请求中文乱码问题GET的又如何处理呢

    目录结构: 关键代码: web.xml <filter> <filter-name>CharacterEncodingFilter</filter-name> &l ...

  2. Spring MVC中如何解决POST请求中文乱码问题,GET的又如何处理呢

    在web.xml中配置过滤器 GET请求乱码解决: 在Tomcat中service.xml中

  3. 关于java代码提交HTTP POST请求中文乱码的解决方法

    首先说明下这些只是根据我工作常用经验的总结,可能不一定完全对,也不一定全面,但却是最通用的. JAVA里HTTP提交方式 httpurlconnection:jdk里自带的 httpclient:ap ...

  4. Java -- 通过 URLConnection 进行http请求中文乱码

    对writer和reader指定字符集 out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "utf-8 ...

  5. Java Web之Servlet中response、request乱码问题解决

    Java Web之Servlet中response.request乱码问题解决   一.request请求参数出现的乱码问题 get请求: get请求的参数是在url后面提交过来的,也就是在请求行中, ...

  6. 解决ubuntu中zip解压的中文乱码问题

    转自解决ubuntu中zip解压的中文乱码问题 在我的ubuntu12.10中,发现显示中文基本都是正常的,只有在解压windows传过来的zip文件时,才会出现乱码.所以,我用另一个方法解决中文乱码 ...

  7. python基础系列教程——Python中的编码问题,中文乱码问题

    python基础系列教程——Python中的编码问题,中文乱码问题 如果不声明编码,则中文会报错,即使是注释也会报错. # -*- coding: UTF-8 -*- 或者 #coding=utf-8 ...

  8. 一句python,一句R︱python中的字符串操作、中文乱码、NaN情况

    一句python,一句R︱python中的字符串操作.中文乱码.NaN情况 先学了R,最近刚刚上手Python,所以想着将python和R结合起来互相对比来更好理解python.最好就是一句pytho ...

  9. JSP/ Servlet常见的中文乱码原因

    在开发中,我们经常遇到中文乱码的问题,比方: &浏览器中看到的 Jsp/Servlet 页面中的汉字成了 '?' ?  &浏览器中看到的 Servlet 页面中的汉字都成了乱码  &a ...

随机推荐

  1. java停止一个线程

    Thread类中有start(), stop()方法,不过stop方法已经被废弃掉. 平时其实也有用过,共享一个变量,相当于标志,不断检查标志,判断是否退出线程 如果有阻塞,需要使用Thread的in ...

  2. android toast使用方法

    1.默认展示 // 第一个参数:当前的上下文环境.可用getApplicationContext()或this // 第二个参数:要显示的字符串.也可是R.string中字符串ID // 第三个参数: ...

  3. Android 图片缩略图显示

    //通过openRawResource获取一个inputStream对象 InputStream inputStream = getResources().openRawResource(R.draw ...

  4. CountDownTimer的用法及原理

    1.主线程中使用 值得注意的是,CountDownTimer可以在主线程中直接使用.验证一下回调的执行线程.在主线程中执行如下代码 CountDownTimer countDownTimer = , ...

  5. JS 根据子网掩码,网关计算出所有的IP范围

    // 验证IP的正则 var ip_reg = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0- ...

  6. RequestMapping 支持的方法

    基于版本:Spring Framework 4.3.5.RELEASE 1.支持指定多个方法 @RequestMapping(value = "/index", method = ...

  7. 在centos6.x上安装teamviewer

    首先下载公钥: # wget http://www.teamviewer.com/link/?url=354858 # rpm --import TeamViewer_Linux_PubKey.asc ...

  8. Scala编程实战

    项目概述 需求 目前大多数的分布式架构底层通信都是通过RPC实现的,RPC框架非常多,比如前我们学过的Hadoop项目的RPC通信框架,但是Hadoop在设计之初就是为了运行长达数小时的批量而设计的, ...

  9. SRAM(静态)存储器芯片的读/写周期

    一. 要保证正确地读/写,必须注意CPU时序与存储器读/写周期的配合.一般存储器芯片手册都会给出芯片读/写周期的时序图. Intel 2114芯片的读.写周期时序如图所示. 二. 读周期 读操作时,必 ...

  10. Linq使用技巧及查询示例(一)

    Linq的使用大体分为两种:语句表达式   和  方法 首先,我们要在控制器中定义好context private ApplicationDbContext db = new ApplicationD ...