在表单中使用“method”这个属性来指定提交表单时使用的http请求方式。默认是get方式。
使用get方式,提交的参数放在请求的url后面,浏览器会对url进行转义。所以,在服务端要用以下代码取得正确的参数,“utf-8”是我使用的页面字符编码。
string str = new string(request.getparameter("str").getbytes("iso-8859-1"),"utf-8");
如果使用的是post方式,则提交的参数将放在请求的消息体中。这种情况下,只要指定字符串编码就可以了。
request.setcharacterencoding(encode);
好,下面说一下我使用过滤器解决传值乱码的例子。
首先,写个继承httpservletrequestwrapper的类,扩展一下servlet提供的request的功能。
public class request extends httpservletrequestwrapper { public request(httpservletrequest request) { super(request); } public string tochi(string para) { try { byte[] bytes = para.getbytes("iso8859-1"); return new string(bytes, encode); } catch (exception ex) { } return null; } private httpservletrequest gethttpservletrequest() { return (httpservletrequest) super.getrequest(); } public string getparameter(string name) { return tochi(gethttpservletrequest().getparameter(name)); } public string[] getparametervalues(string name) { string values[] = gethttpservletrequest().getparametervalues(name); if (values != null) { for (int i = 0; i < values.length; i++) { values[i] = tochi(values[i]); } } return values; } }
在上面的类中,我们其实就完成了一件事。在我们使用getparameter(),getparametervalues()取得参数前,先对参数进行了我们之前所说到的第一个动作。
接着,编写一个过滤器。
public class encodefilter implements filter{ private string encode; public void destroy() { } public void dofilter(servletrequest request, servletresponse response, filterchain chain) throws ioexception, servletexception { httpservletrequest httpreq = (httpservletrequest) request; if (httpreq.getmethod().equals("post")) { request.setcharacterencoding(encode); } else { request = new request(httpreq); } chain.dofilter(request, response); } public void init(filterconfig filterconfig) throws servletexception { encode = filterconfig.getinitparameter("encode"); }}
这里,我们使用过滤器完成了两个动作。首先,如果请求是post方式的,则request.setcharacterencoding(encode);如果请求是get方式的,则使用我们进行了扩展的request代替原来的request,这样就做到了对参数进行转码再取值。
接下来,在web.xml中要配置我们的这个过滤器。
<filter> <filter-name>encodefilter</filter-name> <filter-class>com.ieread.search.filter.encodefilter</filter-class> <init-param> <param-name>encode</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodefilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
在filter中有个encode参数,用来指定我们所使用的字符编码。
<div style="text-align: center">--------------------------------------------事情还有后续----------------------------------------