servlet乱码问题
servlet乱码问题
出现乱码无非与页面的编码格式,servlet的编码格式,数据库编码格式和是用doGet方法还是doPost方法有关。
页面出现乱码:
修改<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>中的编码格式。
在servlet中出现乱码, 解决办法:确保页面,servlet,数据库的编码格式一致,servlet的编码格式最好用过滤器转换,可减少代码冗余。
确保页面,servlet编码格式一致具体如下:
页面:
<%@ page language="java" contentType="text/html; charset=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>
<style>
body,input,textarea {
font-size: 12px;
}
textarea {
width: 400px;
height: 50px;
}
</style>
</head>
<body>
<pre>
<b>您输入了</b>:
${ param.text }
</pre>
<!--<form action="" method="post">-->
<form action="${ param.request.requestURL }" method="post">
<textarea name="text">${ param.text }</textarea> <br />
<textarea name="text2">222222</textarea> <br />
<input type="submit">
</form>
</body>
</html>
过滤器:
package com.wcl.servlet.filter;
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 CharacterEncodingFilter implements Filter {
private String characterEncoding;
private boolean enabled;
@Override
public void init(FilterConfig config) throws ServletException {
// TODO Auto-generated method stub
characterEncoding = config.getInitParameter("characterEncoding");
enabled = "true".equalsIgnoreCase(characterEncoding.trim());
}
@Override
public void destroy() {
// TODO Auto-generated method stub
characterEncoding = null;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
if(enabled || characterEncoding != null){
request.setCharacterEncoding(characterEncoding);
response.setCharacterEncoding(characterEncoding);
}
chain.doFilter(request, response);
}
}
在web.xml 中配置
<!--encoding过滤器-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>com.wcl.servlet.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>characterEncoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>enable</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这样就实现了页面和servlet的编码格式一致。数据库的格式可在数据库的配置文件中设置,详细请大家上网查阅。
如果大家用的是doPost方法那么乱码问题到这里已经解决了。
而用doGet方法请看下面内容:
在做servlet的时候遇到这样一个问题:用doPost获得的参数只要加上“request.setCharacterEncoding("utf-8")”这样一行,则显示中文不会乱码,
但是用doGet获得的参数加上“request.setCharacterEncoding("utf-8")”这一行后却依然乱码,解决方法如下:
在你的Tomcat服务器根目录下找到conf/server.xml文件,在文件中找到这样一行,将其中的URIEncoding=""双引号内改为utf-8,即红色字体处。
如下:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8"/>
struts框架出现的问题同样可以如此解决。
---------------
- response.sendRedirect("add_news.do?msg=中文");//用这个方法时,用request.getParameter("msg");可能就是乱码。
- String msg = "中文";
- response.sendRedirect("add_news.do?msg="+java.net.URLEncoder.encode(msg));//用这个方法时,用request.getParameter("msg");可能就OK了。
-------------------------------------------------------------${param.text}的问题
param不是JSP的内置对象, 是EL中的
${param.name}等价于request.getParameter("name"),{param[name]}也是一样的
${params.name}等价于request.getParameterValues("name")
${id} 意思是取出某一范围中名称为id的变量。
它的取值范围Page,Request,Session,Application。
${param.id} 与输入有关,相对于 request.getParameter("id")。意思是获得输入的参数id。
因为a.jsp提交到b.jsp过程中,id不属于Page,Request,Session,Application任何范围中的一个,所以取不到。
而id是a.jsp传给b.jsp的一个参数,所以${param.id}取到值。
Request的范围是指一个jsp页面发送请求到另一个jsp页面之间。
在a.jsp里<%request.setAttribute("key","Test")%>
当a.jsp转向b.jsp时,b.jsp可以得到a.jsp的变量key的值,而别的jsp页面是得不到值的。
这里面的关键是a.jsp要转向b.jsp,在a.jsp加上<jsp:forward page="b.jsp"/>表示要转向b.jsp.否则b.jsp得不到a.jsp设置的key的值。
两个jsp页面之间如何传递一个对象?比如一个List或者HashMap?
答:
用request.setAttribute("name",Object),request.getAttribute("name");
或者session.setAttribute("name",Object),session.getAttribute("name");
注意问题:
如果用request,要注意request的范围仅限于同一个request对象;如果使用了form的"action"或者response.sendRedirect("xxx.jsp")等转发,
则不再是同一个request对象,即用request.getAttribute("name")将取不到值。
换成request.getRequestDispatcher("xxx.jsp").forward(request,response);
才能共享request中数据
如果用session,程序太慢,存在效率问题。
http://www.blogjava.net/flysky19/articles/93421.html