深入体验JavaWeb开发内幕——关于JEE中的response、resquest应答、请求头的编码问题的解决

本文详细介绍了在Web应用中如何解决请求和响应时出现的乱码问题,包括不同编码方式下浏览器与服务器间的交互处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当我们通过一个表单验证来连接数据库时,最关键的就是要确保浏览器的resquest端和服务器的response端能够统一编码,这样请求和返回的信息才能够正确,否则就会出现乱码问题。

        如:

        

        当编码不统一时返回信息:

      

统一编码后:

    

当然这样的问题还会出现在resquest端,当我们的resquest和response端编码不统一时就会出现如上的编码错误。

如:通过浏览器提交请求,通过resquest的相关方法获取到请求值之后输出结果如图。

在服务端输出:

统一编码后输出:

好了现在先来看关于response应答时的乱码问题的处理:

例如通过以不同的方式输出统一个”上海“ 字样时会有不同的结果,借此我们来解决所遇到的乱码问题。

问题一:

[java]  view plain copy
  1. MyServlet.java  

[java]  view plain copy
  1. package net.csdn.servlet;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.io.OutputStream;  
  8. import java.io.PrintWriter;  
  9.   
  10. import javax.servlet.ServletException;  
  11. import javax.servlet.ServletResponse;  
  12. import javax.servlet.http.HttpServlet;  
  13. import javax.servlet.http.HttpServletRequest;  
  14. import javax.servlet.http.HttpServletResponse;  
  15.   
  16. public class MyServlet extends HttpServlet {  
  17.   
  18.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  19.             throws ServletException, IOException {  
  20.         testEncoding1(response);  
  21.   
  22.     }  
方法一:

[java]  view plain copy
  1. public void testEncoding1(ServletResponse response) throws IOException{  
  2.     String content = "上海";  
  3.     OutputStream os = response.getOutputStream();  
  4.     //这里默认的写入到response相应头中的编码方式为GB2312这正好要与浏览器默认编码方式相同  
  5.     //所以可以正常解析  
  6.     os.write(content.getBytes());  
  7.    }  

如:

但我们如果指定response的输入编码集时:

方法二:

[java]  view plain copy
  1.  public void testEncoding2(ServletResponse response) throws IOException{  
  2.         String content = "上海";  
  3.         OutputStream os = response.getOutputStream();  
  4.         //这里由于指定了的写入到response相应头中的编码方式为utf-8而浏览器默认编码方却仍是GB2312  
  5.         //所以解析出现乱码  
  6.         os.write(content.getBytes("utf-8"));  
  7.  }  

解决方式:

[java]  view plain copy
  1. public void testEncoding3(ServletResponse response) throws IOException{  
  2.     String content = "上海";  
  3.       
  4.     OutputStream os = response.getOutputStream();  
  5.     //这里由于指定了的写入到response相应头中的编码方式为utf-8而浏览器默认编码方却仍是GB2312  
  6.     //所以解析出现乱码  
  7.     os.write(content.getBytes("utf-8"));  
  8.     //解决方法:为响应信息设置响应头告诉浏览器以utf-8的方式来解析编码或者在浏览器一端将编码方式  
  9.     //改为utf-8也可解决该问题  
  10.     response.setContentType("text/html;charset = utf-8");  
  11.   }  

方法三:

[java]  view plain copy
  1. public void testEncoding4(HttpServletResponse response) throws IOException{  
  2.         String content = "上海";  
  3. //      response.setContentType("text/html;charset = utf-8");  
  4.           
  5.         OutputStream os = response.getOutputStream();  
  6.         //这里由于指定了的写入到response相应头中的编码方式为utf-8而浏览器默认编码方却仍是GB2312  
  7.         //所以解析出现乱码  
  8.         os.write(content.getBytes("utf-8"));  
  9. }  

解决:

[java]  view plain copy
  1. public void testEncoding4(HttpServletResponse response) throws IOException{  
  2.         String content = "上海";  
  3.           
  4.         OutputStream os = response.getOutputStream();  
  5.         //这里由于指定了的写入到response相应头中的编码方式为utf-8而浏览器默认编码方却仍是GB2312  
  6.         //所以解析出现乱码  
  7.         os.write(content.getBytes("utf-8"));  
  8.         //解决方法:为响应信息设置响应头告诉浏览器以utf-8的方式来解析编码或者在浏览器一端将编码方式  
  9.         //改为utf-8也可解决该问题  
  10. //      response.setContentType("text/html;charset = utf-8");  
  11.         //以另一种方式设置响应头告知浏览器的解码方式  
  12.          response.setHeader("Content-Type""text/html;charset = utf-8");  
  13.     }  

可正确输出”上海“

方法四及解决:

[java]  view plain copy
  1.  public void testEncoding5(ServletResponse response) throws IOException{  
  2.         String content = "上海";  
  3.       
  4.         OutputStream os = response.getOutputStream();  
  5.       
  6.         os.write(content.getBytes("utf-8"));  
  7.         //不是发送响应头而是向浏览器输出一段<meta />标签来告知浏览器按照相应的utf-8来解析  
  8.         os.write("<meta http-equiv='content-type' content='text/html; charset=UTF-8'>".getBytes());  
  9.     }  


方法五及解决:

[java]  view plain copy
  1. public void testEncoding6(ServletResponse response) throws IOException{  
  2.         String content = "上海";  
  3.            
  4.         //使用的默认编码集是iso8859-1而浏览器的编码却是utf-8故出现乱码问题  
  5.           
  6.         PrintWriter pw = response.getWriter();  
  7.         pw.println(content);  
  8.          
  9.       
  10.     }  
同样会出现乱码


解决:

[java]  view plain copy
  1. public void testEncoding6(ServletResponse response) throws IOException{  
  2.         String content = "上海";  
  3.          //解决方式同上:  
  4.         //设置响应头的编码方式  
  5.         response.setCharacterEncoding("UTF-8");  
  6.         //通过响应头告诉浏览器正确的解码方式  
  7.         response.setContentType("text/html;charset = UTF-8");  
  8.   
  9.         //使用的默认编码集是iso8859-1而浏览器的编码却是utf-8故出现乱码问题  
  10.           
  11.         PrintWriter pw = response.getWriter();  
  12.         pw.println(content);  
  13.          
  14.       
  15.     }  

方法六及解决:

[java]  view plain copy
  1. public void testEncoding7(ServletResponse response) throws IOException{  
  2.     int content = 14;  
  3.       
  4.     //使用的默认编码集是iso8859-1而浏览器的编码却是utf-8故出现乱码问题  
  5.       
  6.     PrintWriter pw = response.getWriter();  
  7.     pw.write(content);  
  8.       
  9.    }  

如图:

解决:

[java]  view plain copy
  1.   public void testEncoding8(ServletResponse response) throws IOException{  
  2.         int content = 14;  
  3.         //解决方式同上:  
  4.         //设置响应头的编码方式  
  5.         response.setCharacterEncoding("UTF-8");  
  6.         //通过响应头告诉浏览器正确的解码方式  
  7.         response.setContentType("text/html;charset = UTF-8");  
  8.           
  9.         //使用的默认编码集是iso8859-1而浏览器的编码却是utf-8故出现乱码问题  
  10.         PrintWriter pw = response.getWriter();  
  11.         pw.println(content);  
  12.   
  13.           
  14.     }  

关于request:

问题:

[java]  view plain copy
  1. UserServlet.java  

[java]  view plain copy
  1. package com.user.servlet;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. import com.userbean.User;  
  11. import com.userdao.UserDao;  
  12. import com.userimpl.UserImpl;  
  13.   
  14. public class UserServlet extends HttpServlet {  
  15.   
  16.   
  17.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  18.             throws ServletException, IOException {  
  19.           
  20.         String username = request.getParameter("username");  
  21.         String password = request.getParameter("password");  
  22.         System.out.println(username);  
  23.         System.out.println(password);  
  24.         UserDao ud = new UserImpl();  
  25.         boolean b = ud.findUser(username, password);  
  26.         if(b == false){  
  27.             response.setContentType("text/html;charset=UTF-8 ");  
  28.             response.getWriter().write("用户名或密码有误,请重新确认输入!");  
  29.         }else{  
  30.             response.setContentType("text/html;charset=UTF-8 ");  
  31.             response.getWriter().write("登陆成功!");  
  32.         }  
  33.   
  34.           
  35.           
  36.     }  
  37.   
  38.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  39.             throws ServletException, IOException {  
  40.             doGet(request, response);  
  41.     }  
  42. }  
如图:

解决后:

[java]  view plain copy
  1. package com.user.servlet;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. import com.userbean.User;  
  11. import com.userdao.UserDao;  
  12. import com.userimpl.UserImpl;  
  13.   
  14. public class UserServlet extends HttpServlet {  
  15.   
  16.   
  17.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  18.             throws ServletException, IOException {  
  19.           //为request指定编码  
  20.              request.setCharacterEncoding("UTF-8");  
  21.         String username = request.getParameter("username");  
  22.         String password = request.getParameter("password");  
  23.         System.out.println(username);  
  24.         System.out.println(password);  
  25.         UserDao ud = new UserImpl();  
  26.         boolean b = ud.findUser(username, password);  
  27.         if(b == false){  
  28.             response.setContentType("text/html;charset=UTF-8 ");  
  29.             response.getWriter().write("用户名或密码有误,请重新确认输入!");  
  30.         }else{  
  31.             response.setContentType("text/html;charset=UTF-8 ");  
  32.             response.getWriter().write("登陆成功!");  
  33.         }  
  34.   
  35.           
  36.           
  37.     }  
  38.   
  39.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  40.             throws ServletException, IOException {  
  41.             doGet(request, response);  
  42.     }  
  43. }  

好了,现在你已经知道了如何去处理resquest和response的相关编码问题了,赶快自己试一试吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值