Jsp中及Servlet中出现的各种乱码问题方法汇集—-整整花了一天时间才将能出现的能想到的所有乱码问题解决
以下内容都经过验证,请放心大胆尝试,不好用的方法是不会放在网站中的,这是一种责任,总有一个问题和你的一样,当然,也有可能一模不一样,那请将你的问题解决,然后留言告诉我,感谢,我们只有发现问题,才会解决问题。
—-所以发现问题的人,比解决问题的人更伟大。
为何会出现乱码?
Java的内核和class文件是基于unicode的。
而Java和JSP源文件的保存方式是基于字节流的。
Java(包括JSP)源文件中很可能包含有中文,主要是参数中带有中文就容易出现问题。
Java和JSP编译成class文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码。
Java和JSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。
出现乱码的类型?
页面乱码、参数乱码、表单乱码、源文件乱码。
两种情况:在Jsp页面中出现的乱码和在Servlet中出现的乱码
先介绍Jsp页面中出现的乱码?
Jsp页面乱码两种情况:
1是未指定使用字符集编码
2是编码字符集设置不一致
一:未指定使用字符集编码?
1.出现乱码前的代码?
看代码为display.jsp页面
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
<title>JSP的中文处理</title>
</head>
<body>
<h2>Jsp页面乱码解决</h2>
<%out.print(“zchao博客之家解决–JSP的中文处理”);%>
</body>
</html>
出现乱码的页面:
为什么会出现这种乱码?
因为JSP页面中出现了中文字符,而默认的ISO-8859-1字符集中无中文字符
解决办法:
在jsp页面设置浏览器解码方式与jsp页面指编码方式相同即可
我这里设置jsp页面编码是utf-8;
<%@ page language=”java” contentType=”text/html; charset=utf-8″
pageEncoding=”utf-8″%>
浏览器编码也是utf-8;
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
当然编码方式还可以设置gbk或gb2312;
但是强调一下,由于各个页面之间的编码都不一定相同,所以会出现使用utf-8或gbk或gb2312
可能不一定是都能解决乱码问题,而且你所用的浏览器的默认编码也不同(meta中设置charset),可能需要相应改变,
或者你用的编程工具如eclipse,myEclipse等本身对页面的编码不同(这个下面有详细讲解)
所以需要你尝试,在这三个之间中选择适合你的编码并确定与你用的浏览器编码相同,
如果多次转码可能就会越转越乱,导致最后转不回来,所以且转且珍惜。
完美解决的代码?
<%@ page language=”java” contentType=”text/html; charset=utf-8″
pageEncoding=”utf-8″%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
<title>JSP的中文处理</title>
</head>
<body>
<h2>Jsp页面乱码解决</h2>
<%out.print(“zchao博客之家解决–JSP的中文处理”);%>
</body>
</html>
乱码解决的页面:
二.编码字符集设置不一致(与上面的基本是一个问题)
出现乱码前的代码?
<%@ page language=”java” contentType=”text/html; charset=ISO-8859-1″
pageEncoding=”utf-8″%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
<title>JSP的中文处理</title>
</head>
<body>
<h2>Jsp页面乱码解决</h2>
<%out.print(“zchao博客之家解决–JSP的中文处理”);%>
</body>
</html>
为什么会出现乱码,大家都一目了然
由于页面编码不一致导致的乱码,三处设置了字符集编码
第一处:contentType=”text/html; charset=ISO-8859-1″ 编码为解码格式
第二处:pageEncoding=”utf-8″的编码格式为jsp文件的存储格式
第三处:content=”text/html; charset=utf-8″编码为控制浏览器的解码方式
完整解决代码和上面的代码一模一样。
URL传递参数中文乱码?
一般情况下在使用get方法提交表单的时候传递的参数如果是中文的话很可能会出现乱码。
下面是一个示例程序(这个程序即使你改变了编码也有可能出现乱码)
<%@ page language=”java” import=”java.util.*” contentType=”text/html;charset=gb2312″
pageEncoding=”gb2312″%>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″>
<title>URL传递参数中文处理示例</title>
</head>
<%
String param = request.getParameter(“param”);
%>
<body>
<a href=”URLCharset.jsp?param=zchao博客之家”>请点击这个链接</a><br>
你提交的参数为:<%=param%>
</body>
</html>
为什么会出现乱码?
上面这个JSP程序的功能就是通过一个URL链接向自身传递一个参数,这个参数是中文字符串,
如果将编码格式都一致了还解决不了就需要修改Tomcat服务器的配置文件才能解决问题。
解决方法1:URIEncoding=”gb2312″ 或URIEncoding=”gbk” 或URIEncoding=”utf-8″
修改Tomcat的conf目录下的server.xml配置文件,具体改后的代码如下
<Connector port=”8080″ protocol=”HTTP/1.1″ URIEncoding=”gb2312″
connectionTimeout=”20000″
redirectPort=”8443″ />
解决方法2:
首先配置tomcat下server.xml的Connector节点增加useBodyEncodingForURI=”true”属性配置,
然后在JSP页面中加入<%request.setCharacterEncoding(“utf-8”);%>
所设置的编码格式进行编码。
Tomcat中server.xml配置如下:
<Connector port=”8080″ protocol=”HTTP/1.1″
connectionTimeout=”20000″
redirectPort=”8443″
useBodyEncodingForURI=”true”
/>
另外的情况(两个页面)
方法一:将接受的参数直接转换
test1.jsp页面
<%@ page language=”java” import=”java.util.*” contentType=”text/html;charset=utf-8″
pageEncoding=”utf-8″%>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
<title>URL传递参数中文处理示例</title>
</head>
<body>
<a href=”receive.jsp?param=zchao博客之家”>请点击这个链接</a><br>
</body>
</html>
test2.jsp负责接收
<%@ page language=”java” import=”java.util.*” contentType=”text/html; charset=utf-8″
pageEncoding=”utf-8″%>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
<title>Insert title here</title>
</head>
<body>
<%
String param = request.getParameter(“param”);
String result = new String(param.getBytes(“iso-8859-1”), “utf-8”);
out.println(result);
%>
<br><br>
<%=result %>
</body>
</html>
方法二:
利用编码与解码解决
test3.jsp
<%@ page language=”java” import=”java.util.*” contentType=”text/html;charset=utf-8″
pageEncoding=”utf-8″%>
<%@ page import=”java.net.*” %>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
<title>URL传递参数中文处理示例</title>
</head>
<body>
<a href=’test4.jsp?act=<%=URLEncoder.encode(“zchao博客值之家”)%>’>test</a>
</body>
</html>
test4.jsp页面接受参数
<%@ page language=”java” import=”java.util.*” contentType=”text/html;charset=utf-8″
pageEncoding=”utf-8″%>
<%@ page import=”java.net.*” %>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
<title>Insert title here</title>
</head>
<body>
<%
String tempVal = URLDecoder.decode(request.getParameter(“act”));
out.println(new String(tempVal.getBytes(“ISO-8859-1”), “utf-8”));
%>
</body>
</html>
表单提交中文时出现乱码?
get方式提交
submit.jsp页面
<%@ page language=”java” contentType=”text/html; charset=utf-8″
pageEncoding=”utf-8″%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
<title>Insert title here</title>
</head>
<body>
<form name=”form1″ method=”get” action=”process.jsp”>
<div align=”center”>
<input type=”text” name=”name”>
<input type=”submit” name=”Submit” value=”Submit”>
</div>
</form>
</body>
</html>
process.jsp页面
<%@ page language=”java” contentType=”text/html; charset=utf-8″
pageEncoding=”utf-8″%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
<title>Insert title here</title>
</head>
<body>
<%=request.getParameter(“name”)%>
</body>
</html>
post方式提交
两种解决办法:
A、 接受参数时进行编码转换
String s=new String(request.getParameter(“name”).getBytes(“ISO-8859-1″),”utf-8”) ;
B、通过request.seCharacterEncoding (“utf-8”)对请求进行统一编码,就实现了中文的正常显示。
A方法process.jsp页面代码:
<%@ page language=”java” contentType=”text/html; charset=utf-8″
pageEncoding=”utf-8″%>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
<title>Insert title here</title>
</head>
<body>
<%– <%=request.getParameter(“name”)%> 这样会是乱码,post方式本能直接接收–%>
<%
String s=new String(request.getParameter(“name”).getBytes(“ISO-8859-1″),”utf-8”) ;
out.print(s);
%>
</body>
</html>
B方法process.jsp页面代码:
<%@ page language=”java” contentType=”text/html; charset=utf-8″
pageEncoding=”utf-8″%>
<%request.setCharacterEncoding(“utf-8”);%>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
<title>Insert title here</title>
</head>
<body>
<%=request.getParameter(“name”)%>
</body>
</html>
如果eclipse或者myEclipse中的jsp文件出现乱码则可以对eclipse设置?
菜单栏–》Window–》Preferences–》Content Type(上面搜索即可)–》Text–》JSP
然后将*.jsp的默认编码(Default encoding)改为:UTF-8或GB2312即可
从HTML页面向Servlet页面中传递参数?
从url中传递参数用doGet处理
<a href=”ServletA?name=zchao博客之家”>点击</a>
index.html代码:
<!DOCTYPE html>
<html>
<head>
<meta charset=”utf-8″>
<title>Insert title here</title>
</head>
<body>
<a href=”ServletA?name=zchao博客之家”>点击</a>
</body>
</html>
ServletA.java部分主要代码
@WebServlet(“/ServletA”)
public class ServletA extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(“text/html;charset=utf-8”);
String name = request.getParameter(“name”);
System.out.println(name); //eclipse控制台输出
response.getWriter().write(name); //页面输出
}
}
用表单传递参数,分别用doGet和doPost处理
用doPost或doGet处理的代码如下(下面的代码都可以解决)
index.html代码
<!DOCTYPE html>
<html>
<head>
<meta charset=”utf-8″>
<title>Insert title here</title>
</head>
<body>
<form action=”ServletA” method=”post/get”>
用户名:<input type=”text” name=”userName” size=”10″/>
密 码:<input type=”password” name=”password” size=”10″/>
<input type=”submit” value=”提交”>
</form>
</body>
</html>
ServletA.java部分主要代码
@WebServlet(“/ServletA”)
public class ServletA extends HttpServlet {
protected void doPost/doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding(“utf-8”);
response.setCharacterEncoding(“utf-8”);
response.setContentType(“text/html;charset=utf-8”);
response.setHeader(“content-type”, “text/html;charset=utf-8”);
String userName = request.getParameter(“userName”);
String password = request.getParameter(“password”);
System.out.println(“表单输入userName的值:” + userName + “<br>”);
System.out.println(“表单输入password的值:” + password + “<br>”);
response.getWriter().write(userName);
response.getWriter().write(password);
}
}
页面如下:
表单代码:
页面显示代码:
控制台代码:
至此,目前在Jsp页面和Servlet中遇到的乱码问题完美解决,希望本文对你的学习路上有所帮助,帮助他人的同时就是帮助自己,真理。
从中也加深了我对乱码问题的理解。
遇到问题,记得贵在坚持,一旦你认真了,没有什么解决不了。
zchao博客之家—-既然不能伴你上半生,那么你的下半生,如果我们有幸,请让我们与你同行,风雨不惧—-forerer!
Latest posts by zchao (see all)
- Auraでアクションボタン作成して画面のチェックボックス項目一括処理 - 2021年4月12日
- デフォルト項目値を含むレコード作成実例説明(defaultFieldValues) - 2021年1月9日
- Salesforce のノーコード・ローコード開発 - 2020年12月31日