`
chilongxph
  • 浏览: 138254 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

利用filter实现MVC应用框架 及 网页编码问题的解决方案

阅读更多
利用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数据了。



可以看到,后一种方案更简洁(不必转换编码了)。



分享到:
评论

相关推荐

    JSP乱码解决方案

    在开发Java Web应用程序时,JSP(JavaServer Pages)页面的乱码问题是一个常见的困扰。JSP乱码通常发生在字符编码不一致或者处理不当的情况下,这会影响用户界面的显示,导致文字显示为不可读的方块或者特殊字符。...

    基于java开发简易小型mvc框架smartMVC

    总之,SmartMVC是一个轻量级的Java MVC框架,它的目标是提供一个简单易用的开发环境,让开发者能快速构建Web应用。通过对模型、视图和控制器的分离,以及利用现代Web开发的最佳实践,SmartMVC为开发者提供了一个高效...

    struts 中文乱码问题解决

    本文将深入探讨Struts框架中中文乱码的问题,并提供一系列有效的解决方案。 ### Struts框架简介 Struts是一个开源的MVC(Model-View-Controller)框架,主要用于简化Java Web应用程序的开发。它基于Servlet和JSP...

    Spring Mvc 应用Jar包

    总之,这个压缩包为Spring MVC开发提供了一站式的解决方案,包括必备的库和源代码,简化了项目初始化阶段的工作。开发者只需要根据具体需求进行适当的配置和编码,即可快速搭建起一个功能完善的Spring MVC应用。

    Struts的乱码问题

    ### Struts框架中的乱码问题解析与解决方案 #### 背景介绍 在Web开发过程中,尤其是使用Java Web框架如Struts进行项目开发时,经常遇到的一个问题是中文字符的乱码问题。这个问题主要体现在中文字符在Web页面上的...

    SpringMVC Tomcat控制台乱码问题解决方案

    SpringMVC Tomcat控制台乱码问题解决方案 本文主要介绍了SpringMVC Tomcat控制台乱码问题解决方案,该解决方案通过示例代码进行了详细的介绍,对大家的学习或者工作具有一定的参考学习价值。下面将对该解决方案进行...

    彻底解决Spring MVC中文乱码问题的方案

    在开发Java Web应用程序时,Spring MVC框架经常遇到中文乱码问题,这主要涉及到字符编码的处理。本篇文章将深入探讨如何彻底解决Spring MVC中的中文乱码问题,以便于开发者能够流畅地处理中文数据。 首先,当用户...

    工作流乱码解决方案

    "工作流乱码解决方案"这个主题就针对Activiti5在处理中文或其他非ASCII字符时可能出现的显示异常进行探讨。 Activiti5是一个开源的工作流和业务流程管理平台,它基于Java,支持BPMN 2.0标准,为企业提供了一套强大...

    json 中文乱码解决方案

    ### json 中文乱码解决方案 在处理JSON数据时,经常会出现中文乱码的问题,尤其是在不同编码格式间进行转换时更为常见。本文将详细介绍如何解决JSON中的中文乱码问题,并提供几种简单实用的方法来帮助开发者避免这...

    拦截器解决中文乱码问题

    然而,值得注意的是,尽管拦截器是一个有效的解决方案,但在某些情况下,如静态资源的处理,可能需要通过其他方式(如配置服务器或修改资源文件的编码)来解决乱码问题。此外,对于前后端分离的应用,前端也需要确保...

    Spring MVC参数传递中文乱码解决方法分享

    一、GET 方式中文乱码解决方案 在 GET 方式中,我们可以使用以下方法来解决中文乱码问题: String str = new String(request.getParameter("参数名").getBytes("iso-8859-1"), "utf-8"); 这个方法可以将 GET ...

    struts 2. 5.2解决中文乱码

    Struts 2.5.2 是一款广泛应用的Java Web框架,用于构建企业级的MVC(Model-View-Controller)应用程序。在处理中文字符时,可能会遇到乱码问题,这通常与字符编码设置不当有关。解决这个问题需要深入理解HTTP协议、...

    SpringMVC解决GET请求时中文乱码的问题.rar

    在Spring MVC框架中,处理HTTP GET请求时遇到中文乱码问题是一个常见的开发难题。这个问题主要源于请求参数在URL中编码时使用的是UTF-8以外的字符集,导致服务器接收到的参数解码后出现乱码。本文将深入探讨这个问题...

    struts之中文乱码问题

    Struts是一个非常流行的Java Web应用程序框架,用于构建和管理MVC(模型-视图-控制...如果你的项目中仍然存在乱码问题,建议参考提供的“Struts中文乱码解决方案.doc”文档,它可能包含了更详细的排查步骤和解决方案。

    MySpringMVC-字符乱码处理.rar

    在Spring MVC框架中,字符编码问题是一个常见的挑战,尤其是在处理多国语言或者用户输入的数据时。"MySpringMVC-字符乱码处理.rar"这个压缩包文件很可能包含了关于如何在Spring MVC项目中解决字符乱码问题的相关资料...

    ssh框架项目

    **Hibernate框架**是持久化层的解决方案,简化了数据库操作。它通过ORM(对象关系映射)技术,将数据库表与Java对象对应起来,使得开发者可以使用面向对象的方式处理数据库事务,避免了SQL语句的繁琐编写。Hibernate...

    ssh.rar_SSH框架

    SSH框架,全称为Struts2、Spring和...压缩包中的视频教程和文档应该会详细讲解这些整合步骤,以及在实际项目中遇到的问题和解决方案。通过深入学习,开发者可以提升Java Web开发技能,更好地应对复杂的业务需求。

    乱码过滤类和配置使用方法

    配置方面,乱码问题的解决方案往往需要结合应用框架或服务器环境的配置。以下是一些常见的配置点: 1. **Web服务器配置**:如Apache或Nginx,需要设置HTTP响应头中的`Content-Type`字段,指定正确的字符集,如`...

    处理中文乱码

    3. **使用过滤器**:在服务器端可以通过编写过滤器来统一处理编码问题,例如实现`javax.servlet.Filter`接口,在`doFilter`方法中设置请求的编码为UTF-8。 #### 三、传递参数中文乱码 在Web应用程序中,用户通过...

    struts2.0总结文档2

    Struts是一个开源的Web应用框架,它属于MVC架构的一种实现。Struts2作为Struts1的升级版本,虽然在很多方面进行了优化和改进,但在实际开发过程中仍然会遇到一些常见的问题,其中最让人头疼的就是乱码问题。本文将...

Global site tag (gtag.js) - Google Analytics