今天学习了Servlet和Jsp的使用,发现Jsp界面很容易出现乱码。
第一种乱码情况:
<body>
login success! 我爱学习<br/>
body>
如此简单的代码在浏览器上为什么会乱码呢?百度一下发现是由于java世界默认使用ISO-8859-1编码(西方常见编码方式).
而这种编码方式为单字节码,只支持英文俄文葡萄牙文什么乱七八糟文,不支持中文。
解决方案如下:
在Jsp文件前面加上如下代码:
<%@ page contentType="text/html; charset=UTF-8"%>
这行代码的意思是将此JSP页面的编码方式设置为UTF-8,这样浏览器就能正常显示了。
接下来说一个要注意的小问题:
在使用MyEclipse自动生成Jsp文件的时候会在第一行自动生成这样一行代码:
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
这行代码的意思是本Jsp文件的编码格式为ISO-8859-1。于是当文件中输入输入了中文(如最上边那段代码)的时候,MyEclipse会提示你无法保存:
解决方案:应将这句改为
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
即可。
第二种乱码情况:
传递参数的时候发生乱码。
当在jsp页面表单中输入中文时,传递的参数会发生乱码.
jsp代码:
<body>
<form name="form0"
action="/myWebTest/UserControl?actionCode=add"
method="post">
<input type="text" name="id"/>
<input type="text" name="userName"/>
<input type="password" name="password"/>
<button type="submit">submitbutton>
form>
body>
servlet中的接收代码:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String s =(String) request.getParameter("actionCode");
//System.out.println(s);
IManager manager = new Manager();
if(s.equals("add"))
{
System.out.println(request.getParameter("userId"));
int id = Integer.decode(request.getParameter("id"));
String name = request.getParameter("userName");
//下面这句输出乱码
System.out.println(name);
String passWord = request.getParameter("password");
User user = new User(id, name, passWord);
//将构建好的User对象加到数据库中,当然加到数据库中的也是乱码
manager.addUser(user);
ArrayList userList = manager.selectAllUsers();
request.setAttribute("userList", userList);
request.getRequestDispatcher("/main.jsp").forward(request, response);
}
}
出现乱码的原因是传递参数是默认的编码方式是ISO-8859-1.
解决方案:
在String name = request.getParameter("userName");
后面加入:name = new String(name.getBytes("ISO-8859-1"), "UTF-8");
利用String类的构造器将字符串转码为UTF-8.
不过此方法显得很不实用:
当参数很多&工程很大的情况下,每个参数都要如此转码显得很不美观.有没有一个一劳永逸的方法呢?
当然有!下面隆重介绍:过滤器 Filter接口.
Filter可以帮助我们解决乱码问题,当然它能实现很多强大的功能,如ip过滤等.本文中只探讨将Filter用于解决乱码问题.
同样针对上述问题,我们创建一个class WebFilter implements Filter:
package com.hj.util;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class WebFilter implements Filter
{
@Override
public void destroy()
{
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException
{
request.setCharacterEncoding("utf-8");
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException
{
// TODO Auto-generated method stub
}
}
核心代码在doFilter方法中,doFilter中我们将拦截到的请求转码为UTF-8,从而避免了界面之间传参造成的乱码问题.
别忘了在web.xml文件中加入如下配置(和配置servlet的方法很像):
<filter>
<filter-name>WebFilterfilter-name>
<filter-class>com.hj.util.WebFilterfilter-class>
filter>
<filter-mapping>
<filter-name>WebFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
其中的filter-name 可以随便起,Filter-class 为要配置的filter实现类的类全名,url-pattern为要拦截的路径,此处写 /* 代表拦截所有请求.
这样,我们就不用为每一个参数痛苦的转码了,一个过滤器”滤掉”了所有的乱码.