servlet乱码问题
servlet亂碼問題 ?
出現(xiàn)亂碼無非與頁面的編碼格式,servlet的編碼格式,數(shù)據(jù)庫編碼格式和是用doGet方法還是doPost方法有關(guān)。
頁面出現(xiàn)亂碼:
?? ?修改<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>中的編碼格式。
?? ?
?? ?在servlet中出現(xiàn)亂碼, 解決辦法:確保頁面,servlet,數(shù)據(jù)庫的編碼格式一致,servlet的編碼格式最好用過濾器轉(zhuǎn)換,可減少代碼冗余。
?? ?確保頁面,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>
?? ?
這樣就實(shí)現(xiàn)了頁面和servlet的編碼格式一致。數(shù)據(jù)庫的格式可在數(shù)據(jù)庫的配置文件中設(shè)置,詳細(xì)請大家上網(wǎng)查閱。
如果大家用的是doPost方法那么亂碼問題到這里已經(jīng)解決了。
而用doGet方法請看下面內(nèi)容:
在做servlet的時(shí)候遇到這樣一個(gè)問題:用doPost獲得的參數(shù)只要加上“request.setCharacterEncoding("utf-8")”這樣一行,則顯示中文不會亂碼,
但是用doGet獲得的參數(shù)加上“request.setCharacterEncoding("utf-8")”這一行后卻依然亂碼,解決方法如下:
??? 在你的Tomcat服務(wù)器根目錄下找到conf/server.xml文件,在文件中找到這樣一行,將其中的URIEncoding=""雙引號內(nèi)改為utf-8,即紅色字體處。
??? 如下:
?? ??? ?<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8"/>
struts框架出現(xiàn)的問題同樣可以如此解決。
?
?
---------------
-------------------------------------------------------------${param.text}的問題
param不是JSP的內(nèi)置對象, 是EL中的
${param.name}等價(jià)于request.getParameter("name"),{param[name]}也是一樣的
${params.name}等價(jià)于request.getParameterValues("name")
${id} 意思是取出某一范圍中名稱為id的變量。
它的取值范圍Page,Request,Session,Application。
${param.id} 與輸入有關(guān),相對于 request.getParameter("id")。意思是獲得輸入的參數(shù)id。
因?yàn)閍.jsp提交到b.jsp過程中,id不屬于Page,Request,Session,Application任何范圍中的一個(gè),所以取不到。
而id是a.jsp傳給b.jsp的一個(gè)參數(shù),所以${param.id}取到值。
Request的范圍是指一個(gè)jsp頁面發(fā)送請求到另一個(gè)jsp頁面之間。
在a.jsp里<%request.setAttribute("key","Test")%>
當(dāng)a.jsp轉(zhuǎn)向b.jsp時(shí),b.jsp可以得到a.jsp的變量key的值,而別的jsp頁面是得不到值的。
這里面的關(guān)鍵是a.jsp要轉(zhuǎn)向b.jsp,在a.jsp加上<jsp:forward page="b.jsp"/>表示要轉(zhuǎn)向b.jsp.否則b.jsp得不到a.jsp設(shè)置的key的值。
兩個(gè)jsp頁面之間如何傳遞一個(gè)對象?比如一個(gè)List或者HashMap?
答:
用request.setAttribute("name",Object),request.getAttribute("name");
或者session.setAttribute("name",Object),session.getAttribute("name");
注意問題:
??? 如果用request,要注意request的范圍僅限于同一個(gè)request對象;如果使用了form的"action"或者response.sendRedirect("xxx.jsp")等轉(zhuǎn)發(fā),
??? 則不再是同一個(gè)request對象,即用request.getAttribute("name")將取不到值。
??? 換成request.getRequestDispatcher("xxx.jsp").forward(request,response);
??? 才能共享request中數(shù)據(jù)
??? 如果用session,程序太慢,存在效率問題。
http://www.blogjava.net/flysky19/articles/93421.html
轉(zhuǎn)載于:https://www.cnblogs.com/andy-wcl/p/3372040.html
總結(jié)
以上是生活随笔為你收集整理的servlet乱码问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用JavaScript实现本地缓存
- 下一篇: GeoServer地图开发解决方案(三)