表单提交方式由POST改为GET出现乱码的解决

组合查询功能,原先使用<html:form>缺省是以POST方式提交的,增加了分页功能后,由于要在URL里记住用户提交的查询内容,例如:

http://localhost:8080/aims/client/filter.do?name=%E5%BC%A0&address=%E5%8C%97%E4%BA%AC&title=&duty=&departmentCode=10000001&categoryCode=10000002&fieldCode=10000006&genderCode=&identityCode](http://localhost:8080/aims/client/filter.do?name=%E5%BC%A0&address=%E5%8C%97%E4%BA%AC&title=&duty=&departmentCode=10000001&categoryCode=10000002&fieldCode=10000006&genderCode=&identityCode)=

所以表单的提交方式要改为GET。

只是简单的改为method="GET",但这样一改却让action无法得到正确的输入值,例如用户在姓名条件里输入,在action里用theForm.getName()会得到形如%A4的乱码,不仅查询结果是错误的,而且在重新显示的查询表单的姓名栏里也显示出乱码。

我试了很多种转码也没转成原来的值,问了很多朋友,最后的解决方式还是通过转换编码,是把ISO8859-1转为UTF-8,即:

String name=new String(theForm.getName().getBytes("ISO8859-1"),"UTF-8");

注意我的应用程序里已使用了encoding为UTF-8的Filter。

虽然要加手工转码的代码很不爽,但只在这一处而已,也不碍大事。只是我现在的环境是Tomcat+Mysql,不知道换到其他服务器上会不会重新出现乱码问题,好在这个项目不需要考虑这个问题。

据说Tomcat处理POST和GET的请求时处理编码的方式不太一样,我还看到有篇帖子说要在server.xml<Connector>里加URIEncoding="GBK"属性,但我试了不起丝毫作用。

搬家前链接:https://www.cnblogs.com/bjzhanghao/archive/2004/12/14/77129.html

关于Servlet/JSP里”/”的用法

我们都知道,"/"表示根目录,但在Servlet和JSP里同样是"/"却指向不同的位置。现在假设我的应用程序名为myapp,在myapp目录下有a.jsp和b.jsp这两个文件。要在servlet里转向(forward)到a.jsp,只要这样写:

RequestDispatcher dispatcher = request.getRequestDispatcher("/a.jsp");
dispatcher.forward(request,response);

这样是可以正常转向的,也就是说,servlet里的"/"是从myapp下开始的。而如果想在a.jsp里用一个链接用绝对路径指向b.jsp,下面的写法是不行的:

<a href="/b.jsp">b</a>

这样点链接后myapp的前缀就没有了,说明这个"/"是从服务器的root开始的。要解决这个问题除使用相对路径外,可以通过自己加前缀的方式,如下:

<a href="<%=request.getContextPath()%>/b.jsp">b</a>

代码会变得比较难看了。还有一种情况,就是在jsp头部使用静态include的时候,"/"是包含myapp的,例如在a.jsp里这样写是可以找到b.jsp的:

<%@include file="/b.jsp"%>

之所以会有这些不同,相信是由于jsp在转为servlet后部分或全部脱离了应用程序的context,也就是说,jsp生成的servlet是作为系统的一部分了。(这是我猜测的,不承担责任哦)

我自己对这些情况经常搞混,而且以上也只是在tomcat里实验的,其他服务器也许会有不同结果,所以写在这里方便查看。还有一些情况没写下来,例如在servlet里sendRedirect,以及在<jsp:include>里使用绝对路径会是什么结果,用到的时候会补上。

总之,很希望能找到一种最通用的解决方法,如果你有什么心得,欢迎发表意见哦。

搬家前链接:https://www.cnblogs.com/bjzhanghao/archive/2004/09/02/38816.html