Java_Servlet项目在jetty服务器无问题,在tomcat服务器出现中文乱码
package cn.edu.mju.project1.controller;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
@WebServlet("/login")
public class LoginController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置解码方式
resp.setCharacterEncoding("utf-8");
//获取页面输出流
// PrintWriter out = resp.getWriter();//在jetty中文乱码
PrintStream out =new PrintStream(resp.getOutputStream());//在tomcat中文乱码
//输出HTML界面
out.println("<html>");
out.println("<head>");
out.println("<meta charset=\"utf-8\">");
out.println("<title>Servlet测试</title>");
out.println("</head>");
out.println("<body>");
out.println("<form action='/login' name='submit' method='post'>");
out.println("登陆名称:<input name=\"loginName\" type=\"text\"/><br>");
out.println("登陆密码:<input name=\"loginPwd\" type=\"password\"/><br>");
out.println("<input id=\"submit\" type=\"submit\" value=\"提交\"/>");
out.println("</form>");
out.println("</body>");
out.println("</html>");
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置解码方式
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charSet=utf-8");
//获取页面输出流
PrintWriter out = resp.getWriter();//在jetty中文乱码
// PrintStream out =new PrintStream(resp.getOutputStream());//在tomcat中文乱码
String loginName=req.getParameter("loginName");
String loginPwd=req.getParameter("loginPwd");
System.out.println(loginName+loginPwd);
//输出HTML界面
out.println("<html>");
out.println("<head>");
out.println("<meta charset=\"utf-8\">");
out.println("<title>Servlet登陆</title>");
out.println("</head>");
out.println("<body>");
//如果用户名是学号,密码是123,正确显示你好,如果错误,显示账号或密码错误
if("5197101145".equals(loginName) && "1234".equals(loginPwd)){
out.println("你好:"+loginName);
}else {
out.println("账号或密码错误");
}
out.println("</body>");
out.println("</html>");
out.close();
out.close();
}
}
最后发现出现问题的代码在
PrintWriter out = resp.getWriter();//在jetty中文乱码
PrintStream out =new PrintStream(resp.getOutputStream());//在tomcat中文乱码
PrintWriter:
JDK1.8源码里面的解释为:
- 将对象的格式表示打印到文本输出流。 这个类实现了全部在发现print种方法
PrintStream
。 它不包含用于编写原始字节的方法,程序应使用未编码的字节流。不像
PrintStream
类,如果启用自动刷新,它只会在调用的println,printf,或format方法来完成,而不是当一个换行符恰好是输出。 这些方法使用平台自己的行分隔符而不是换行符。这个类中的方法不会抛出I / O异常,尽管它的一些构造函数可能。 客户可以通过调用
checkError()
查询是否发生错误。
PrintStream:
JDK1.8源码里面的解释为:
- A
PrintStream
为另一个输出流添加了功能,即能够方便地打印各种数据值的表示。 还提供了另外两个功能。 与其他输出流不同,PrintStream
从不抛出IOException
; 相反,异常情况只是设置一个可以通过checkError
方法测试的内部标志。 可以选择一个PrintStream
,以便自动刷新; 这意味着flush
字节数组写入方法后自动调用,所述一个println
方法被调用时,或者一个新行字符或字节('\n'
)被写入。由印刷的所有字符
PrintStream
被转换成使用平台的默认字符编码字节。 在需要编写字符而不是字节的情况下,应使用
类。PrintWriter
其他乱码解决方案:https://blog.csdn.net/qq_36986510/article/details/105287962