利用filter实现MVC应用框架 及 网页编码问题的解决方案
MVC(Model-View-Controller)是java网页应用的一种实现框架。亦即model-2。其主要思想是:统一的controller(一个或一组servlet)来处理request和response,然后决定和构造(通常利用jsp模板)显示给用户的界面(view),同时使用处理特定事务的共享的bean/EJB(model)。
Struts就是MVC框架的一个实例。
可是要使用这些框架,势必要花时间学习它们、同时局限于它们的实现机制。
servlet规范( specification )version 2.3 增加了一个新的机制:filter。其定义参见规范第6章。
凡是宣称支持servlet 2.3的web服务器都应支持filter机制。
利用filter,可以非常简便地实现自己的MVC。
简单地说,filter就是在调用web应用的若干或全部的动态内容(servlet/jsp)和静态内容(html/)之前,由servlet包容器自动调用的代码。
filter是web应用程序的一部分、 由开发者自己编写和发布。
--------- 以下内容整理自servlet specification version 2.3
filter可以实现以下功能:(动态和静态内容合称为“web资源”)
* 在调用request之前,访问request需要的一个资源。
* 在一个资源调用request之前,处理request。
* 修改request的头信息和数据,将request封装成定制的request版本。
* 修改response的头文件和数据,提供定制的response版本。
* 拦截对一个资源的调用。
* 以特定的顺序,零个、一个、或多个filter,作用于一个servlet、一组servlet或静态内容上。
filter的例子包括:
* 认证filter
* 日志和审计filter
* 图片转换fiter
* 数据压缩 filter
* 加密 filter
* 标记(Tokenizing) filter
* 触发资源访问事件的 filter
* 转换XML内容的XSL/T filter
* MIME-type 链 filter
* 缓存 filter
----------- 更多内容有劳其他/她好事者翻译吧
以下是本人实现和发布的一个character encoding filter的内容。
1)作用:统一设置所有servlet的编码方式。
2)好处:
(1)所有servlet都不需要包含设置编码方式的代码。
(2)可以统一管理/修改所有servlet的编码方式。
3)发布此filter。在“应用程序目录/web/WEB-INF/web.xml”的最前面(<web-app>下一行)添加:
-----------------在<web-app>下一行添加的内容-----------------
<!-- Example filter to set character encoding on each request -->
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>see.common.filters.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
<!-- Filter mapping to apply the \"Set Character Encoding\" filter
to *all* requests processed by this web application -->
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
----------------------------------
4)此filter的代码如下:(注意,所有servlet中就不要设置request和response的编码了)
-----------filter的代码,已包含javadoc格式,写得很规范呐 (得意中...)----------
/*
* FileName: CharacterEncodingFilter.java
*
* Last Updated: 2002-4-19
*
* Writer: Mara Ren
*
*/
package see.common.filters;
import java.io.IOException;
import javax.servlet.*;
/**
* This filter sets the character encoding to be used for current
* request and response.
*
* The value is set according the following order:
* <li>Current user\'s configuration, if the user has registered</li>
* <li>The character encoding used in the body of current request</li>
* <li>The default character encoding in application\'s configuration</li>
*
* @version 2002-4-19
* @author Mara Ren
*/
public class CharacterEncodingFilter
implements Filter {
// --------------------- Instance Variables -----------------
/**
* The character encoding to set be used for current request
* and response
*/
private String encoding = null;
/**
* The filter configuration object we are associated with. If this value
* is null, this filter instance is not currently configured.
*/
protected FilterConfig filterConfig = null;
// ------------ Public Methods (standard, overrided) ---------
/**
* Place this filter into service.
*
* @param filterConfig The filter configuration object
*/
public void init(FilterConfig filterConfig)
throws ServletException {
this.filterConfig = filterConfig;
}
/**
* This filter sets the character encoding to be used for current
* request and response.
*
* @param request The servlet request we are processing
* @param result The servlet response we are creating
* @param chain The filter chain we are processing
*
* @exception IOException if an input/output error occurs
* @exception ServletException if a servlet error occurs
*/
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
encoding = getUserEncoding(); //当前用户的编码方式,是用户配置的一个值
if (encoding == null)
{
encoding = request.getCharacterEncoding(); // 浏览器返回的编码方式
}
if (encoding == null)
{
encoding = filterConfig.getInitParameter(\"encoding\"); //应用程序的编码方式
}
if (encoding != null)
{
request.setCharacterEncoding(encoding); //这是servlet 2.3新加的方法,专门在设置request编码方式
response.setContentType(\"text/html;charset=\" + encoding); //设置response编码方式
}
// Pass control on to the next filter
chain.doFilter(request, response);
}
/**
* Take this filter out of service.
*/
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}
/**
* Get encoding from current user\'s configuration.
*/
private String getUserEncoding() {
// 从当前用户的session或配置文件中读取,自己编写吧
}
}
------------------------------------------------------
再罗嗦一句,看到很多朋友在为网页编码问题苦恼,不禁要问一句:
你们搞清楚request编码和response编码的区别了吗?
不要认为在response中设置了gb2312,就能直接按gb2312来访问request的数据。
request是浏览器返回给服务器、服务器处理后提供给你的。
request的编码取决于非常多的因素:
1)浏览器可以不返回编码方式,也可以返回约定的缺省编码(iso8859-1),也可以按客户端的当前设置(例如你的IE被你设为gb2312)。它可不是按照你提供的response的编码方式来返回request的!
2)如果浏览器不告诉服务器request编码方式,服务器可以按照约定的编码方式(iso8859-1)来为你提供request(这是servlet规范要求的,是最简洁最正确的解决办法),也可以好事地为你猜测客户端的设置或服务器端的设置而编码request(其实这样做是非常危险的,本人认为不可取!)。
3)有些java编程平台也会为你设置或猜测request的编码方式(如果你要真正发布一个应用,这个问题最好不要依赖于编程平台!)
4)开发者可以设置服务器用来解释和提供request的编码方式。
所以很多人往往不处理request编码、就访问request数据(大家倒是总记得处理reponse编码),要么运行结果乱七八糟,要么只能在特定情况下才能正确显示。
处理request编码的一个方案是:(不干预服务器解释和提供request的编码方式)
1)判断服务器是按什么编码方式来提供和解释request的
2)如果不是你要的编码方式,将request数据转换你要的编码方式,然后再按你的编码方式来使用request数据。
以上filter其实是解决request编码的另一个方案:(干预服务器解释和提供request的编码方式)
1)按照servlet 2.3定义,用户可以用request.setCharacterEncoding(encoding)方法来要求服务器按你要求的编码方式来解释和提供request。
2)不必转换request编码方式、就可以直接按你的编码方式来使用request数据了。
可以看到,后一种方案更简洁(不必转换编码了)。
分享到:
相关推荐
<filter-name>encodingFilter</filter-name> <filter-class> org.springframework.web.filter.CharacterEncodingFilter </filter-class> <param-name>encoding <param-value>UTF-8 </filter> ...
spring mvc 过滤器,实现url过滤,权限模块经常用到的,很不错
ASP.NET MVC框架开发系列课程(14):Authorization Filter,Exception Filter与Action Filter
MSDN赵劼老师MVC视频 第七讲 ASP.NET MVC框架开发系列课程(7):Action Filter
MVC3 Filter 验证 AOP 实例
Struts2--1.使用 Filter 作为控制器的 MVC,过滤器的使用
使用filter过滤器解决中文乱码问题,包含源码,以及filter的配置,希望能帮上大家
利用java filter 实现业务异常拦截 跳转到错误信息提示页面 我们在做项目中肯定都会遇到自定义业务异常 ,然后将业务异常信息跳转的统一的信息提示页面的情况,比如我们在struts的时候我们会用到struts的异常处理...
filter是javaWeb中一个十分重要的知识点,可以拦截webApp的所有请求。 使用场景: 1、可以利用filter做到网站自登录。...2、可以利用filter全局修改参数编码,从而解决中文乱码问题(十分重要)。
web.xml配置filter和filtermapping,编写类 读取或写死filter的init-params中的字符编码传入 reqeust中 调用dofilter方法,乱码解决
使用Filter过滤器和js实现ASP.NET MVC的前后端AES加密通信,避免重复对每一个接口实现加解密
ASP.NET MVC框架开发系列课程(7):Action Filter(Level 200) _Video.zip ASP.NET MVC框架开发系列课程(7):Action Filter(Level 200) _Video.zip
MVC框架Filter 过滤器s
JSP_利用Filter解决Servlet输出中文乱码的问题.docx
简单的struts的validator框架代码,以及validation.xml和validator-rules.xml配置 validator对日期的验证 以及乱码问题,采用fliter解决乱码问题
这边有必有说明的是如果是jsp+java bean+servlet的方案,中文乱码很好解决,统一设成gb2312就可以了。 1.2 使用struts框架字符集不能设成gb2312,要改成utf-8。 2. 在struts.properties 添加: struts.devMode=...
Aspnet Mvc教程 1.说明 01:06 Aspnet Mvc教程 2.准备工作 02:37 Aspnet Mvc教程 3. 建立并运行 02:46 Aspnet Mvc教程 4.默认程序结构 04:18 Aspnet Mvc教程 5. 基本工作流程 05:13 Aspnet Mvc教程 6.mvc理论讲解...
MVC4 API Filter 验证 AOP 实例
面对恶意软件的威胁,Android 使用了一套应用程序安全框架来保护安全。本文以 Android 现有的安全机制为基础,通过研究当前安全机制的不足,分析恶意软件攻击的特点,提出了多个具体的安全扩展和保护方案,达到了较好的...
使用Intent filter来实现不同应用中Activity的相互跳转,点击A应用中的Activity,就跳转到B应用中的Activity,这种方式可以实现从一个应用的Activity 跳转到另一个应用的Activity,它们之间还可以传递数据。