JavaWeb中使用Filter以及装饰者设计模式解决全局编码格式问题

本文介绍装饰者设计模式的应用场景及如何利用该模式解决Web应用中的中文乱码问题,通过实现Filter过滤器实现全局编码过滤。

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

装饰者设计模式简介

  • 定义:动态给对象添加一个额外的职责,扩充其功能,使用装饰者设计模式相比生成的子类显得更为灵活。
  • 设计初衷:Java中通常使用继承来达到扩充功能的目的,如果需要实现的功能种类繁多,势必会扩充出很多子类,这增加了系统的复杂性,而且如果要使用继承来扩充功能,那么这些功能在编译时候就已经确定了,我们必须预见这些功能,是静态的。

乱码问题分析

  • 在从前端表单提交数据时,采用GET方法和POST方法在后端进行的解决乱码的方式有所区别。Tomcat内部传输数据是默认使用的编码方式为ISO-8859-1,不支持中文。
  • 假如是GET方法提交,则要在后台先进行先编码再解码的方式,解决乱码问题。parameter=new String(parameter.getBytes("iso8859-1"),"UTF-8");,用String对象的getBytes()方法,先将获取到的数据进行ISO-8859-1编码,然后再用UTF-8进行解码,来获取中文。
  • 假如是POST方法提交,在后台中只需要request.setCharacterEncoding("UTF-8"); ,这句代码就有可以解决POST方法提交表单时产生的中文乱码问题。

Filter的引入

  • 假如我们一个项目要定义很多的Servlet,在每个业务中都要根据表单的提交方式来用响应的代码解决乱码问题,从软件工程的角度来讲,我们的项目中就产生了大量的重复的代码。这个时候我们就需要用Filter过滤器来实现全局编码的过滤。在我们的Web应用服务器中,访问资源的流程一般为(假如配置了全局的过滤器),前端的request请求先经过实现的Filter类,然后经过doFilter()方法放行后在找到相应的servlet进行资源的访问。我们就可以在个全局的Filter中对前端发送过来的数据进行编码处理,以结局乱码问题,这样就减少了大量的重复的代码。
  • Filter的实现过程一般为这样,实现一个Java类,实现Filter借口,并实现其中的doFilter()方法,doFilter()方法中有三个参数,public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    request和response是前端传来的请求和响应,由于是ServletRequest所以在使用时要进行强制类型转换,转换成HttpRequest类型,第三个参数chain负责过滤完毕后执行doFilter()方法,实现类之后要在web.xml中配置,配置规则一般如下,
    <filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>com.web.filter.EncodingFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    配置完成后就实现了全局编码的功能。
    在过滤类的内部实现细节中,用到了装饰着设计模式,
public class EncodingFilter implements Filter{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
        arg0.setCharacterEncoding("UTF-8");




        //在传递request之前对request的getparameter方法进行增强

        /*
         * 装饰着模式(包装)
         * 1.增强类与被增强的类要实现同一个接口
         * 2.在增强类中传入被增强的类
         * 3.需要增强的方法重写,不需要增强的方法调用父类
         * */


        //被增强的对象
        HttpServletRequest request=(HttpServletRequest)arg0;
        //增强的对象
        EnhanceRequest enhanrequest=new EnhanceRequest(request);
        arg2.doFilter(enhanrequest, arg1);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }   

}
class EnhanceRequest extends HttpServletRequestWrapper {

    private HttpServletRequest request;
    public EnhanceRequest(HttpServletRequest request) {
        super(request);
        this.request=request;
    }
    //重写getparameter
    @Override
    public String getParameter(String name) {
        String parameter = request.getParameter(name);//乱码
        try {
            parameter=new String(parameter.getBytes("iso8859-1"),"UTF-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return parameter;
    }
}

在使用装饰着设计模式中有三个必须注意的地方:1.实现一个增强类,增强类和被增强类要实现同一个接口2.在增强类中要传入被增强的类3.对需要的方法进行重写,对不需要增强的方法直接调用父类的方法。
这样我们就解决了全局编码的乱码问题。

<think>我们正在讨论JavaWeb程序设计的相关知识或教程。根据引用内容,我们可以构建一个关于JavaWeb程序设计教程的详细大纲。下面将按照用户需求,整理出一个结构化的教程详解。###JavaWeb程序设计教程详解####一、网页开发基础(WEB前端开发规范)1.**HTML技术**:构建网页的基本骨架,包括标签、表单、表格等元素。2.**CSS技术**:用于美化网页,实现布局、颜色、字体等样式控制。3.**JavaScript技术**:为网页添加交互功能,如表单验证、动态内容更新等。4.**阶段性案例:传智书城的页面设计**:综合应用HTML+CSS+JavaScript完成一个电商网站的前端页面。5.**XML和约束文档**:了解XML语法及其在配置中的应用(如web.xml),以及DTD/XSD约束。6.**HTTP协议及浏览器与服务器如何使用HTTP协议**:掌握HTTP请求/响应模型、状态码、报文结构等。####二、JavaWeb开发准备1.**JavaWeb应用开发简介**:Web应用架构(B/S模式)、核心组件(Servlet/JSP)等。2.**JavaWeb开发环境配置**:-安装EclipseIDEforEnterpriseJavaDevelopers(引用[3])。-安装Tomcat服务器(8以上版本,配置到Eclipse中)。3.**JavaBean基础**:封装业务逻辑的可重用组件。4.**JAVA开发规范**:命名规范、代码结构、注释要求等。####三、Servlet基础1.**Servlet技术**:-生命周期:`init()`,`service()`,`destroy()`。-创建Servlet:继承`HttpServlet`,重写`doGet()`/`doPost()`方法。2.**ServletConfig**:获取Servlet初始化参数。3.**ServletContext**:Web应用全局共享对象,用于存储所有Servlet共享的数据。####四、请求和响应1.**请求和响应的概述**:`HttpServletRequest`和`HttpServletResponse`对象的作用。2.**HttpServletResponse对象**:设置响应头、状态码、重定向、输出数据等。3.**HttpServletRequest对象与RequestDispatcher对象**:-获取请求参数、请求头信息。-请求转发(`forward`)和包含(`include`)。####五、会话及其会话技术1.**Cookie**:客户端会话技术,存储少量数据(如用户登录状态)。2.**Session**:服务端会话技术,通过SessionID跟踪用户状态。####六、JSP技术1.**JSP概述**:动态网页技术,本质是Servlet。2.**JSP基本语法**:脚本片段(`<%%>`)、表达式(`<%=%>`)、声明(`<%!%>`)。3.**JSP指令**:`page`,`include`,`taglib`。4.**JSP隐式对象**:`request`,`response`,`session`,`application`等9大对象。5.**JSP动作元素**:`<jsp:include>`,`<jsp:forward>`等。6.**阶段案例:传智书城JSP页面**:用JSP重构传智书城前端,实现动态数据展示。####七、EL表达式和JSTL1.**EL表达式**:简化JSP中的Java代码,如`${user.name}`。2.**JSTL**:标准标签库(Core、SQL、XML等),常用`<c:forEach>`,`<c:if>`。####八、异步交互1.**Ajax技术**:使用XMLHttpRequest对象实现局部刷新。2.**jQueryAjax**:简化Ajax调用。###学习建议1.**环境搭建**(引用[3]):-下载EclipseEnterprise版本。-下载Tomcat8+并配置到Eclipse中。2.**实践驱动**:每个知识点完成后立即编码练习(如创建Servlet处理表单提交)。3.**综合案例**:通过“传智书城”案例贯穿前后端技术,巩固知识体系。###扩展知识-**MVC架构**:将应用分为Model(数据)、View(JSP)、Controller(Servlet)。-**Filter**:实现权限控制、日志记录等全局功能。-**Listener**:监听Web应用事件(如Session创建)。§§相关问题§§1.如何配置Tomcat服务器到Eclipse中?2.Servlet和JSP的区别与联系是什么?3.如何在JavaWeb项目中实现用户登录功能?4.什么是MVC模式?它在JavaWeb中如何应用?5.如何解决JSP页面中的中文乱码问题?</think>### JavaWeb程序设计教程详解 #### 一、核心知识体系 1. **基础技术栈** - **前端三要素** - HTML:页面结构设计(表单/表格/语义化标签) - CSS:布局与样式(Flex/Grid/响应式设计) - JavaScript:交互逻辑(DOM操作/事件处理) - **HTTP协议** - 请求方法(GET/POST)、状态码(200/404/500)、无状态特性 - 报文结构:请求头/响应头、Cookie传递机制 2. **JavaWeb核心组件** ```mermaid graph LR A[客户端] -->|HTTP请求| B(Servlet) B --> C[JavaBean业务逻辑] C --> D[数据库] D -->|返回数据| B B -->|生成响应| E[JSP/HTML] E -->|HTTP响应| A ``` 3. **Servlet技术** - 生命周期: `init() → service() → destroy()` - 关键对象: - `HttpServletRequest`:获取参数/请求头/输入流 - `HttpServletResponse`:设置状态码/响应头/输出流 - `ServletContext`:应用级共享数据(跨会话) 4. **会话管理** | 技术 | 存储位置 | 特点 | |-------------|------------|--------------------------| | **Cookie** | 客户端 | 大小限制4KB,可设置有效期| | **Session** | 服务端 | 依赖JSESSIONID,更安全 | 5. **JSP与EL表达式** - JSP执行流程: `JSP → 转译成Servlet → 编译为.class → 执行` - EL表达式简化: 替换 `<%= request.getAttribute("user") %>` 为 `${user}` #### 二、开发环境搭建(引用[3]) 1. **必要工具** - Eclipse IDE for Enterprise Java Developers - Apache Tomcat 8+([官网下载](https://tomcat.apache.org/)) 2. **配置步骤**: ```bash # 解压Tomcat后配置环境变量 CATALINA_HOME = C:\apache-tomcat-9.0.xx # Eclipse中添加Server Runtime ``` #### 三、实战案例:用户登录 ```java // LoginServlet.java protected void doPost(HttpServletRequest request, HttpServletResponse response) { String username = request.getParameter("username"); String password = request.getParameter("password"); if(UserDAO.validate(username, password)) { HttpSession session = request.getSession(); session.setAttribute("user", username); response.sendRedirect("welcome.jsp"); // 登录成功跳转 } else { request.setAttribute("error", "用户名或密码错误"); request.getRequestDispatcher("login.jsp").forward(request, response); // 返回登录页 } } ``` #### 四、进阶技术 1. **过滤器(Filter)** - 实现权限控制/日志记录/编码统一设置 ```java public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) { req.setCharacterEncoding("UTF-8"); // 解决中文乱码 chain.doFilter(req, res); // 传递给下一个过滤器 } ``` 2. **AJAX异步交互** ```javascript // 使用Fetch API与Servlet交互 fetch('/getProducts', {method: 'GET'}) .then(response => response.json()) .then(data => renderProductList(data)); ``` #### 五、学习资源推荐 1. 官方文档:[Servlet规范](https://jakarta.ee/specifications/servlet/) 2. 开源项目:传智书城(引用[1][2]中的案例) 3. 调试工具:Postman(API测试)、浏览器开发者工具 > **最佳实践提示**: > - 始终使用`Filter`设置`request.setCharacterEncoding("UTF-8")`解决中文乱码 > - JSP中避免编写Java代码,改用EL+JSTL > - Session存储最小必要数据(建议<1KB)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值