java web中get方法乱码问题

Russellll 发布于 2013/05/17 21:58
阅读 2K+
收藏 1

TestLifeCycleServlet.java

import javax.servlet.*;
import javax.servlet.http.*;


import java.io.*;


public class TestLifeCycleServlet extends HttpServlet{


private static final long serialVersionUID = 1L;




protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=GBK");
//解决post方式提交内容的乱码
//一定要写在存取第一个参数之前
request.setCharacterEncoding("GBK");

//解决get方式乱码问题:-->URIEncoding="GBK"

PrintWriter out = response.getWriter();
out.println(request.getParameter("name"));
out.println("<br>");
out.println(request.getParameter("num"));
out.println("<br>");
out.println(request.getParameter("sex"));
out.println("<br>");

System.out.println("in doGet");
}



protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

System.out.println("in doPost");
doGet(request, response);
}
}
index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">    
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
  </head>
  
  <body>
<form action="/my/servlet/TestLifeCycleServlet" method="get">
  姓名<input type=text name="name"><br>
  学号<input type=text name="num"><br>
  性别<input type=text name="sex"><br>
  <input type=submit value="submit">
  </form>
  
  </body>
</html>


web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>TestLifeCycleServlet</servlet-name>
    <servlet-class>TestLifeCycleServlet</servlet-class>
  </servlet>


  <servlet-mapping>
    <servlet-name>TestLifeCycleServlet</servlet-name>
    <url-pattern>/servlet/TestLifeCycleServlet</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>


加载中
0
我已经报警了
我已经报警了
回复 @谈七七 : MyEclipse应该是直接用的tomcat本身的配置文件
我更觉得是你的jsp编码的问题,因为我刚才用MyEclipse测试了一下,只需要在server.xml下面加入URIEncoding=“UTF-8”。
然后jsp页面<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
就可以接收中文的get参数了
Russellll
Russellll
回复 @psaux : 谢谢哈,改完啦
我已经报警了
我已经报警了
@谈七七 是URI,不是URL
Russellll
Russellll
回复 @psaux : 启动tomcat时有警告信息[SetAllPropertiesRule]{Server/Service/Connector} Setting property 'URLEncoding' to 'UTF-8' did not find a matching property.
我已经报警了
我已经报警了
@谈七七 =.=真是痛苦
Russellll
Russellll
回复 @psaux : 那我按照你的改完了呀,为什么还是不行?桑心
下一页
0
开源中国董事会主席
开源中国董事会主席

Tomcat conf/server.xml 中

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="你的编码" />

0
Russellll
Russellll

引用来自“腾勇”的答案

Tomcat conf/server.xml 中

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="你的编码" />

早改过了,没用,不过还是谢谢你
0
我已经报警了
我已经报警了

tomcat 处理get参数编码的方式就是在server.xml中的connector里面加入URIEncoding=“UTF-8”这样的属性。

你改完没用可能是一下两个原因:

(1)因为改完没有重启tomcat。

(2)另外一种更可能的情况是,使用Eclipse来启动tomcat,这时候你修改tomcat本身的server.xml是没有的。因为Eclipse是用内置的一套配置文件来启动tomcat的。

所有会出现那种改完了却没有效果的情况出现。

Russellll
Russellll
在myeclipse里怎么配置啊?
0
我已经报警了
我已经报警了
在使用Eclipse启动tomcat时,如果想要修改配置文件,点击Eclipse的project那里的Server,就会出现内置的tomcat配置文件了,在里面修改即可。
Russellll
Russellll
哦,3q啊
0
猪大宝
猪大宝
写个过滤器吧
Russellll
Russellll
那是什么东西
0
无名developer
无名developer
servlet filter listener 三大件,必须掌握的,filter就是过滤器,可以在servlet之前对请求进行处理然后再交给servlet处理,一般乱码的问题可以在过滤器那里预先处理一下。
Russellll
Russellll
回复 @猪大宝 : ok 3q
猪大宝
猪大宝
一般都得写个过滤器,处理乱码问题,这个filter在调用servlet之前执行
0
无名developer
无名developer

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>
<body>
	<form action="${pageContext.request.contextPath}/index" method="get">
		<table align="center">
			<tr>
				<td>
					第一个值<input type="text" name="value1" />
				</td>
			</tr>
			<tr>
				<td>
					第二个值<input type="text" name="value2" />
				</td>
			</tr>
			<tr>
				<th>
					<input type="submit" value="提交" />
				</th>
			</tr>
		</table>
	</form>
</body>
</html>
servlet:

package com.java.web.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class index
 */
@WebServlet("/index")
public class index extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;charset=UTF-8");
		String value1 = request.getParameter("value1");
		String value2 = request.getParameter("value2");
		// 因为tomcat服务器默认会按ISO-8859-1来编码,所以要先换回ISO-8859-1
		byte[] bytes1 = value1.getBytes("ISO-8859-1");
		byte[] bytes2 = value2.getBytes("ISO-8859-1");
		// 再用UTF-8解一次
		value1 = new String(bytes1, "UTF-8");
		value2 = new String(bytes2, "UTF-8");
		System.out.println(value1 + "," + value2);

		PrintWriter out = response.getWriter();
		out.println(value1);
		out.println(value2);
	}
}
这么写没有问题,中文可以正常显示。

Russellll
Russellll
回复 @无名developer : 那用myeclipse怎么办
无名developer
无名developer
回复 @谈七七 : 我这里正常运行,用的是eclipse,不是myeclipse,用了注释,不用xml配置的
Russellll
Russellll
servlet有错误
0
l
liuaiyu
可以使用装饰模式对request的进行部分重写,结合过滤器,这种方式更好
无名developer
无名developer
回复 @谈七七 : 对的,他的说法应该是一般应用里面所采用的解决方案
Russellll
Russellll
不求了。 还是自己写吧
Russellll
Russellll
求代码
0
我是潮汐
我是潮汐

get方法由于是通过在url后加查询字符串的方式传递数据,而URL在传递数据时自动将数据用UTF-8编码,而tomcat的默认URI解码是用ISO8859-1,是不支持中文的, 所以,乱码了.

post就没事.

返回顶部
顶部