javaweb中的乱码问题大集合

来源:互联网 发布:sql查看字符长度 编辑:程序博客网 时间:2024/05/16 09:31
package com.itheima.response;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 ResponseDemo1 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {test2(response);}//服务器端 UTF-8private void test2(HttpServletResponse response) throws IOException {String data = "您吃了吗";byte [] b = data.getBytes("UTF-8");//服务器端 UTF-8//通知浏览器,查UTF-8码表,下面 三句话等效,写任意一句都对。//response.getOutputStream().write("<meta http-equiv='Content-Type' content='text/html;charset=UTF-8'>".getBytes());//response.setHeader("Content-Type", "text/html;charset=UTF-8");response.setContentType("text/html;charset=UTF-8");response.getOutputStream().write(b);}//服务器端和客户端都使用本地默认的编码GBK:没有乱码private void test1(HttpServletResponse response) throws IOException {String data = "您吃了吗";byte [] b = data.getBytes();//查GBK(本地默认的)response.getOutputStream().write(b);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}


 

2.用字符流输出中文,1是字节流输出中文

package com.itheima.response;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//用字符流输出中文public class ResponseDemo2 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String data = "还没有吃吃吃吃吃吃";//response.setCharacterEncoding("UTF-8");//该字符流默认的编码为UTF-8//response.setContentType("text/html;charset=UTF-8");//通知浏览器使用UTF-8//下面一句相当于上面的两句response.setContentType("text/html;charset=UTF-8");//不仅能通知浏览器使用UTF-8,而且还会改字符流的编码为UTF-8PrintWriter pw = response.getWriter();//在Servlet中,协议规定使用ISO-8859-1pw.write(data);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

上面两个程序都是输出数据,以下是从表单(区别get和post两种方式,post方式处理起来比较简单)中获取中文数据,如何防止乱码呢?请看下面。。。


3.常用表单输入域的值获取

package com.itheima.request;import java.io.IOException;import java.lang.reflect.InvocationTargetException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.beanutils.BeanUtils;import com.itheima.domain.Student;//常用表单输入域的值获取public class RequestDemo5 extends HttpServlet {//GET请求方式的参数编码public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String name = request.getParameter("name");//码编错了//取到你传给我的字节序列byte b[] = name.getBytes("ISO-8859-1");//重新编码System.out.println(new String(b,"UTF-8"));}//POST请求方式的数据编码:建议使用public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("UTF-8");//只对POST请求方式有效Student s = new Student();try {BeanUtils.populate(s, request.getParameterMap());//发生类型的自动转换,但仅限基本数据类型} catch (Exception e) {e.printStackTrace();}System.out.println(s);}}

 

private void testDemo1(HttpServletRequest request)throws UnsupportedEncodingException {request.setCharacterEncoding("UTF-8");//response.setContentType("text/html;charset=UTF-8");//把得到的数据给浏览器的话,就要加上这句。如果是在控制台输出,就不需要加这句。String username = request.getParameter("username");System.out.println(username);//response.getWriter().write(username);}


 

 

4,分清请求编码和响应输出的编码,两者并没有关系

package com.itheima.request;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 RequestDemo6 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//接收数据:请求request.setCharacterEncoding("UTF-8");String name = request.getParameter("name");//----------------------------------------------------//响应数据:响应response.setContentType("text/html;charset=GBK");response.getWriter().write(name);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}


5.把表单中的数据封装到JavaBean,输入中文,也不报错。请看下面。。。

package com.itheima.request;import java.io.IOException;import java.lang.reflect.InvocationTargetException;import java.util.Map;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.beanutils.BeanUtils;import com.itheima.domain.User2;public class RequestDemo0 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {User2 user = new User2();request.setCharacterEncoding("UTF-8");System.out.println("封装前"+user.toString());Map<String, String[]> map = request.getParameterMap();response.setContentType("text/html;charset=UTF-8");try {BeanUtils.populate(user, map);} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("封装后"+user.toString());response.getWriter().write(user.toString());}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

 

JavaBean:

package com.itheima.domain;import java.util.Arrays;public class User2 {private String username;private String[] password;private String code;@Overridepublic String toString() {return "User2 [username=" + username + ", password="+ Arrays.toString(password) + ", code=" + code + "]";}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String[] getPassword() {return password;}public void setPassword(String[] password) {this.password = password;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}}


 

0 0