Filter 学习 (2) 字符编码。

本文介绍字符编码Filter的应用,包括解决Tomcat服务器中request和response的乱码问题,以及如何通过配置实现请求编码的一致性。此外,还讲解了jsp中${param.id}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


(1)字符编码 Filter 是最常用 Filter 之一,常用来解决 Tomcat 等服务器 里 request,response乱码的问题。字符编码 Filter 是在 request 提交 Servlet 之前 对request进行指定编码方式的编码。


注意:页面编码方式 必须 与 Filter 编码方式 一致。

另外:如果表单 是get提交的,还需要 修改 Tomcat 的 con/server.xml 文件,指定 URIEncoding;否则 依旧会 乱码。

<Connector port="8080" protocol="http/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8">


(2)jsp ${param.id}用法:

它的取值范围Page,Request,Session,Application。
${param.id} 与输入有关,相对于 request.getParameter("id")。意思是获得输入的参数id。
因为a.jsp提交到b.jsp过程中,id不属于Page,Request,Session,Application任何范围中的一个,所以取不到。
而id是a.jsp传给b.jsp的一个参数,所以${param.id}取到值。
Request的范围是指一个jsp页面发送请求到另一个jsp页面之间。
在a.jsp里<%request.setAttribute("key","Test")%>
当a.jsp转向b.jsp时,b.jsp可以得到a.jsp的变量key的值,而别的jsp页面是得不到值的。
这里面的关键是a.jsp要转向b.jsp,在a.jsp加上<jsp:forward page="b.jsp"/>表示要转向b.jsp.否则b.jsp得不到a.jsp设置的key的值。


代码如下:


package com.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 destroy() { characterEncoding = null; } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { // 如果启用 该 Filter if(enabled || characterEncoding != null){ // 那就 设置 req 编码 req.setCharacterEncoding(characterEncoding); // 还有 也要 设置 res 编码 res.setCharacterEncoding(characterEncoding); } // 执行下一个 Filter chain.doFilter(req, res); } @Override public void init(FilterConfig config) throws ServletException { // 初始化 时 加载 参数 characterEncoding = config.getInitParameter("characterEncoding"); enabled = "true".equalsIgnoreCase(config.getInitParameter("enabled").trim()); // 启用。 } }


<%@ 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=ISO-8859-1"> <title>Insert title here</title> <style type="text/css"> body,input,textarea{font-size:12px} textarea{width:400px; height:50px} </style> </head> <body> <pre> <b>您输入了</b> ${param.text } </pre> <form action="${param.request.requestURI }" method="post"> <textarea name="text">${param.text }</textarea> <br/> <input type="submit"/> </form> </body> </html>



<!-- 设置 编码的 Filter --> <filter> <filter-name>characterEncoding</filter-name> <filter-class>com.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>characterEncoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>enabled</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值