解決JSP&Servlet亂碼問題

中文亂碼


發生中文亂碼的情況主要有三種:

1.表單form
(1)post
(2)get
2.超鏈接
< a href=”http://baidu.com?name=百度”>測試< /a>
3.sendRedirect()發生亂碼
response.sendRedirect(“servlet地址?username=”君莫笑”“);

值得注意的是:亂碼分爲接收方和傳送方。服務器(Tomcat)先接受,然後傳送給瀏覽器

通過實例來解決:

簡單的用戶登錄系統來完成。

先建一張表單,有用戶名和密碼。登陸後會把出現登陸成功字樣,而且會顯示登錄名。
table.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>用戶登錄</h1>
<form action='/UserLoginOne/LoginClServlet' method='post'>
用戶名:<input type='text' name='username'/> <br/>
密   碼:<input type='password' name='password'/> <br/>
<input type='submit' value='登錄'/> <br/>
</form>
</body>
</html>

密碼驗證:LoginClServlet.java

public class LoginClServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html");


    PrintWriter out = response.getWriter();
    request.setCharacterEncoding("utf-8");
    //接受用戶提交的用戶名和密碼
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    //檢驗
    if("123".equals(password)){ 
        response.sendRedirect("/UserLoginOne/MainFrame?uname="+username);
    }else{
        response.sendRedirect("/UserLoginOne/table.html");
    }   
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    this.doGet(request, response);
}
}

顯示頁面:MainFrame.java

public class MainFrame extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html");
    request.setCharacterEncoding("utf-8");
    String name =request.getParameter("uname");
    PrintWriter out = response.getWriter();
    out.println("<h1>登錄成功Welcome</h1>\n\n\n\n");
    out.println("username = "+name);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    this.doGet(request, response);
}

}

試驗:

呵呵。。。不爭氣的東西登錄二字就亂碼了。。。不要慌

response.setContentType("text/html");

原因主要是沒有在這上面申明字符編碼,先改爲:

response.setContentType("text/html;charset=utf-8");
//把eclipse的編碼改爲utf-8,默認是GBK

成功了。。
重點:不要把;寫成。本人就因爲這個找了一晚上加一早上的錯誤。。。重新敲了一遍才發現。。*
不過用戶名是中文時就亂碼了。。。

1.表單——post

先不使用sendRedirect()方法,接收到數據後直接從服務器和瀏覽器打印
LoginClServlet.java

public class LoginClServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html");


    PrintWriter out = response.getWriter();

    //接受用戶提交的用戶名和密碼
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    //檢驗
    if("123".equals(password)){ 
        System.out.println("username = "+username);
        out.println("username = "+username);
        //response.sendRedirect("/UserLoginOne/MainFrame?uname="+username);
    }else{
        response.sendRedirect("/UserLoginOne/table.html");
    }   
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    this.doGet(request, response);
}
}

結果
LoginClServlet.java 改爲:

public class LoginClServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=utf-8");

    PrintWriter out = response.getWriter();
    request.setCharacterEncoding("utf-8");
    //接受用戶提交的用戶名和密碼
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    //檢驗
    if("123".equals(password)){ 
        System.out.println("username = "+username);
        out.println("username = "+username);
        //response.sendRedirect("/UserLoginOne/MainFrame?uname="+username);
    }else{
        response.sendRedirect("/UserLoginOne/table.html");
    }   
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    this.doGet(request, response);
}
}

這樣服務器和瀏覽器都默認以utf-8編碼顯示,結果:

2.表單——get

把table 改爲
直接運行的話肯定還是亂碼的

LoginClServlet.java

public class LoginClServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=utf-8");

    PrintWriter out = response.getWriter();
    //接受用戶提交的用戶名和密碼
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    //檢驗
    if("123".equals(password)){ 
    //服務器默認編碼是"iso-8859-1",這樣就是把編碼改爲utf-8
        String uname = new String(username.getBytes("iso-8859-1"),"utf-8");
        System.out.println("username = "+uname);
        out.println("username = "+uname);
        //response.sendRedirect("/UserLoginOne/MainFrame?uname="+username);
    }else{
        response.sendRedirect("/UserLoginOne/table.html");
    }   
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    this.doGet(request, response);
}
}

結果
當然自己乾脆寫個工具類
MyTools.java

package Tools;

public class MyTools {

public static String GetNewString(String str){
    String newstring ="";
    try{
        newstring = new String(str.getBytes("iso-8859-1"),"utf-8");

    }catch(Exception e){
        e.printStackTrace();
    }

    return newstring;

}
}

LoginClServlet.java

import Tools.MyTools;

public class LoginClServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=utf-8");

    PrintWriter out = response.getWriter();
    //接受用戶提交的用戶名和密碼
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    //檢驗
    if("123".equals(password)){ 
        String uname = MyTools.GetNewString(username);
        System.out.println("username = "+uname);
        out.println("username = "+uname);
        //response.sendRedirect("/UserLoginOne/MainFrame?uname="+username);
    }else{
        response.sendRedirect("/UserLoginOne/table.html");
    }   
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    this.doGet(request, response);
}
}

3.超鏈接

和get原理一樣,直接用工具類就行了

4.sendRedirect()方法

根據table.html的傳送方式看;我的是get.
LoginClServlet.java

public class LoginClServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=utf-8");

    PrintWriter out = response.getWriter();
    //接受用戶提交的用戶名和密碼
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    //檢驗
    if("123".equals(password)){ 
        response.sendRedirect("/UserLoginOne/MainFrame?uname="+username);
    }else{
        response.sendRedirect("/UserLoginOne/table.html");
    }   
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    this.doGet(request, response);
}
}

MainFrame.java

public class MainFrame extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=utf-8");

    PrintWriter out = response.getWriter();
    out.println("<h1>登錄成功Welcome</h1>\n\n\n\n");
    String name =MyTools.GetNewString(request.getParameter("uname"));
    System.out.println("username 2= "+name);
    out.println("uname 1 = "+name);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    this.doGet(request, response);
}

結果:

亂碼情況基本就這幾種。

*補充:*
下載文件時,提示框可能是亂碼:
解決方案:

String temp = java.net.URLEncoder.encode("***(文件名)","utf-8");
response.setHeader("Content-Disposition","attachment;filename"+temp);   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章