jsp提交表单数据乱码解决方案

 通过form表单给服务器提交数据的时候,如果提交的是中文数据,那么可能会出现乱码,如果表单的请求方式是post请求,那么可以使用如下方案解决乱码:

 在调用getParameter()之前,设置请求对象request的编码方式。

<% request.setCharacterEncoding("utf-8");%>

  002.如果是通过get方式提交的form,两种处理乱码方案:

 01.通过new String(str.getBytes(“iso-8859-1”),”utf-8”);

  这种方式的缺点,每获取到一个用户提交的数据就要进行一道转换

  02.通过conf下的server.xml文档的

              <Connector port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" URIEcoding=”utf-8”      />

不推荐使用第二种方式,但是要了解,因为真正的开发中,我们接触不到服务器。

                      jsp过滤器

Servlet和JSP中的过滤器都是Java类,它们存在的目的如下:

  • 在请求访问后端资源时拦截它
  • 管理从服务器返回给客户端的响应

下面列出了多种常用的过滤器类型:

  • 认证过滤器
  • 数据压缩过滤器
  • 加密过滤器
  • 触发资源访问事件的过滤器
  • 图像转换过滤器
  • 登录和验证过滤器
  • MIME类型链过滤器
  • 令牌过滤器
  • 转换XML内容的XSL/T过滤器

过滤器将会被插入进web.xml文件中,然后映射servlet、JSP文件的名字,或URL模式。部署描述文件web.xml可以在 <Tomcat-installation-directory>\conf 目录下找到。

当JSP容器启动网络应用程序时,它会创建每一个过滤器的实例,这些过滤器必须在部署描述文件web.xml中声明,并且按声明的顺序执行。

Servlet过滤器方法

一个过滤器就是一个Java类,它实现了javax.servlet.Filter 接口。javax.servlet.Filter接口定义了三个方法:

序号方法 &描述
1 public void doFilter (ServletRequest, ServletResponse, FilterChain)

 

每当 request/response要通过过滤链时容器会调用这个方法,因为客户端请求链尾的资源
2 public void init(FilterConfig filterConfig)

 

容器调用这个方法来表明一个过滤器被安置在服务中
3 public void destroy()

 

容器调用这个方法来表明一个过滤器正在从服务中移除

代码示例

 1 //  引入Java包
 2 import java.io.*;
 3 import javax.servlet.*;
 4 import javax.servlet.http.*;
 5 import java.util.*;
 6  
 7 // 实现 Filter 类
 8 public class LogFilter implements Filter  {
 9    public void  init(FilterConfig config) 
10                          throws ServletException{
11       // 获取初始化参数
12       String testParam = config.getInitParameter("test-param"); 
13  
14       //打印初始化参数
15       System.out.println("Test Param: " + testParam); 
16    }
17    public void  doFilter(ServletRequest request, 
18                  ServletResponse response,
19                  FilterChain chain) 
20                  throws java.io.IOException, ServletException {
21  
22       // 获取客户端ip地址  
23       String ipAddress = request.getRemoteAddr();
24  
25       // 输出ip地址及当前时间
26       System.out.println("IP "+ ipAddress + ", Time "
27                                        + new Date().toString());
28  
29       // 传递请求道过滤器链
30       chain.doFilter(request,response);
31    }
32    public void destroy( ){
33       /* 在Filter实例在服务器上被移除前调用。*/
34    }
35 }
View Code

web.xml文件中的JSP过滤器映射

过滤器被定义,然后映射成一个URL或JSP文件名,与servlet被定义然后映射的方式差不多。在部署描述文件web.xml中,使用<filter>标签来进行过滤器映射:

 1 <filter>
 2    <filter-name>LogFilter</filter-name>
 3    <filter-class>LogFilter</filter-class>
 4    <init-param>
 5       <param-name>test-param</param-name>
 6       <param-value>Initialization Paramter</param-value>
 7    </init-param>
 8 </filter>
 9 <filter-mapping>
10    <filter-name>LogFilter</filter-name>
11    <url-pattern>/*</url-pattern>
12 </filter-mapping>
View Code

上述过滤器将会应用在所有servlet和JSP程序中,因为我们在配置中指定了" /*"。您也可以指定一个servlet或JSP路径,如果您只想要将过滤器应用在少数几个servlet或JSP程序中的话。

 

现在,像平常一样访问servlet或JSP页面,您就会发现服务器日志中产生了关于此次访问的记录。您也可以使用Log4J记录器来把日志记录在其它文件中。

 

__________________________________________________________________________________________________________

使用多重过滤器

您的网络应用程序可以定义很多不同的过滤器。现在,您定义了两个过滤器,AuthenFilter和LogFilter,其它的步骤与前面讲的一样,除非要创建一个不同的映射,就像下面这样:

 1 <filter>
 2    <filter-name>LogFilter</filter-name>
 3    <filter-class>LogFilter</filter-class>
 4    <init-param>
 5       <param-name>test-param</param-name>
 6       <param-value>Initialization Paramter</param-value>
 7    </init-param>
 8 </filter>
 9  
10 <filter>
11    <filter-name>AuthenFilter</filter-name>
12    <filter-class>AuthenFilter</filter-class>
13    <init-param>
14       <param-name>test-param</param-name>
15       <param-value>Initialization Paramter</param-value>
16    </init-param>
17 </filter>
18  
19 <filter-mapping>
20    <filter-name>LogFilter</filter-name>
21    <url-pattern>/*</url-pattern>
22 </filter-mapping>
23  
24 <filter-mapping>
25    <filter-name>AuthenFilter</filter-name>
26    <url-pattern>/*</url-pattern>
27 </filter-mapping>
View Code

过滤器的应用顺序

在web.xml中<filter>元素的映射顺序决定了容器应用这些过滤器的顺序。要反转应用的顺序,您只需要反转web.xml中<filter>元素的定义顺序就行了。

比如,上面的例子会首先应用 LogFilter然后再应用AuthenFilter,但是下面这个例子将会反转应用的顺序:

1 <filter-mapping>
2    <filter-name>AuthenFilter</filter-name>
3    <url-pattern>/*</url-pattern>
4 </filter-mapping>
5  
6 <filter-mapping>
7    <filter-name>LogFilter</filter-name>
8    <url-pattern>/*</url-pattern>
9 </filter-mapping>
View Code