Servlet与Mybatis-2

news2024/11/23 20:40:20

过滤器

过滤器是一种代码重用的技术,它可以改变 HTTP 请求的内容,响应,及 header 信息。过滤器通常不产生响应或像 servlet 那样对请求作出响应,而是修改或调整到资源的请求,修改或调整来自资源的响应。

作用:既可以对请求进行拦截,也可以对响应进行处理。

常见场景:权限检查,日记操作、拦截请求、过滤操作、对请求字符设置编码

使用过滤器解决中文提交数据的乱码问题

public class CharacterEncodingFilter implements Filter {
    private String encoding;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String ss= filterConfig.getInitParameter("encoding");
        if(StringUtils.nonBlank(ss))
        this.encoding=ss.trim();
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws
IOException, ServletException {
        request.setCharacterEncoding(encoding);
        response.setCharacterEncoding(encoding);
        chain.doFilter(request,response);
    }
    @Override
    public void destroy() {
    }
}

Web.xml配置

<filter>
    <filter-name>characterEncoding</filter-name>
    <filter-class>com.yan.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncoding</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-mapping>

生命周期

Filter 接口是过滤器类必须实现的接口,该接口中有三个方法:

1、init(FilterConfig filterConfig) 该方法是对 filter 对象进行初始化的方法,仅在容器初始化 filter 对象结束后被调用一次,参数 FilterConfig 可以获得 filter 的初始化参数;

2、doFilter(ServletRequest request,ServletResponse response,FilterChain chain) 该方法是 filter 进行过滤操作的方法,是最重要的方法。过滤器实现类必须实现该方法,方法体中可以对 request 和 response 进行预处理。其中 FilterChain 可以将处理后的 request 和 response 对象传递到过滤链上的下一个资源。

3、destroy() 该方法在容器销毁对象前被调用。

应用开发人员通过实现 javax.servlet.Filter 接口并提供一个公共的空参构造器来创建过滤器。该类及构建 Web

应用的静态资源和 Servlet 打包在 Web 应用归档文件中。Filter 在部署描述符中通过元素声明。一个过滤器或一组过滤器可以通过在部署描述符中定义来为调用配置。可以使用 servlet 的逻辑视图名把过滤器映射到一个特定的 servlet,或者使用 URL 模式把一组 Servlet 和静态资源内容映射到过滤器。

在部署描述符中声明的每个在每个 JVM 的容器中仅实例化一个实例。容器提供了声明在过滤器的部署,描述符的过滤器 config,对 Web 应用的 ServletContext 的引用,和一组初始化参数。

过滤器的核心概念是包装请求或响应,以便它可以覆盖行为执行过滤任务。在这个模型中,开发人员不仅可以覆盖请求和响应对象上已有的方法,也能提供新的 API 以适用于对过滤器链中剩下的过滤器或目标 web 资源做特殊的过滤任务。

过滤器可以通过@WebFilter 注解定义或者在部署描述符中使用元素定义。

1、filter-name:用于映射过滤器到 servlet 或 URL

2、filter-class:由容器用于标示过滤器类型

3、init-params:过滤器的初始化参数

容器必须为部署描述符中定义的每个过滤器声明实例化一个 Java 类实例。因此,如果开发人员对一个过滤器类声明了两次,则容器将实例化两个相同的过滤器类的实例。

一旦在部署描述符中声明了过滤器,配置人员使用定义 Web 应用中的 servlet 和静态资源到过滤器的应用。过滤器可以使用元素关联到一个 Servlet。过滤器可以使用风格的过滤器映射关联到一组 servlet 和静态内容。

当使用风格配置元素,容器必须使用路径映射规则决定是否匹配请求 URI。

容器使用的用于构建应用到一个特定请求 URI 的过滤器链的顺序:

  • 1)首先按照在部署描述符中的出现顺序匹配过滤器映射。

  • 2)接下来按照在部署描述符中的出现顺序匹配过滤器映射。 如果过滤器映射同时包含了

    和,容器必须展开过滤器映射为多个过滤器映射(每一个和一个),保持和元素顺序。

通过在部署描述符中使用心得元素,开发人员可以为 filter-mapping 指定是否想要过滤器应用到

请求,当:

1)请求直接来自客户端。可以由一个带有 REQUEST 值的元素,或者没有任何元素来表示。

2)使用表示匹配或的 web 组件的请求分配器的 forward 调用情况下处理请求。可以由一个带有 FORWARD 值的元素表示。

3)使用表示匹配或的 Web 组件的请求分派器的 include 调用情况下处理请求。可以由一个带有 INCLUDE 值的元素表示。

4)使用错误处理指定的错误页面机制处理匹配的错误资源的请求。可以由一个带有 ERROR 值的元素表示。

5)使用异步处理中的异步上下文分派机制对 web 组件使用 dispatcher 调用处理请求。可以由一个带有 ASYNC值的元素表示。

为了保证 MyBatis 中的事务提供,同时管理 SqlSession,实现一次请求响应过程对应一个事务,对应一个SqlSession,处理完成后必须保证 SqlSession 关闭

@WebFilter("*.do")
public class OpenSessionInViewFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws
IOException, ServletException {
        try{
            chain.doFilter(request,response);
            MyBatisSessionFactory.commitTransaction();
        } catch (Exception e){
            MyBatisSessionFactory.rollbackTransaction();
            throw new ServletException(e);
        }finally {
            MyBatisSessionFactory.closeSession();
        }
    }
  @Override
    public void destroy() {
    }
}  

监听器

Servlet 事件监听器支持在 ServletContext、HttpSession 和 ServletRequest 状态改变时进行事件通知。Servlet上下文监听器是用来管理应用的资源或 JVM 级别持有的状态。HTTP 会话监听器是用来管理从相同客户端或用户进入web应用的一系列请求管理的状态或资源。

Servlet请求监听器是用来管理整个Servlet请求周期的状态。

异步监听器用来管理异步事件。如超时和完成异步处理。

可以有多个监听器类监听每一个事件类型,且开发人员可以为每一个事件类型指定容器调用监听器 bean 的顺序。

监听器类在 Web 应用部署描述符中使用 listener 元素声明。它们根据类名列出的顺序就是它们被调用的顺序。

与其他监听器不同,AsyncListener 类型和监听器可能仅通过编程式注册(使用一个 ServletRequest)。

Web 容器创建每一个监听器类的一个实例,并在应用处理第一个请求之前为事件通知注册它。

在分布式 Web 容器中,HttpSession 实例被限定到特定的 JVM 服务会话请求,且 ServletContext 对象被限定到Web 容器所在的 JVM。分布式容器不需要传播 Servlet 上下文事件或 HttpSession 事件到其他 JVM。监听器类实例被限定到每个 JVM 的每个部署描述符声明一个。

JSP基础

同步混编模式,核心是三大指令:page include taglib、六大动作和九大默认对象。

开发模式

SUN 公司推出 JSP 技术后,同时也推荐了两种 web 应用程序的开发模式,一种是 JSP+JavaBean 模式,一种是 Servlet+JSP+JavaBean 模式。

MVC 模型是一种架构型的模式,本身不引入新功能,只是帮助将开发的结构组织的更加合理,使展示与模型分离、流程控制逻辑、业务逻辑调用与展示逻辑分离。

Model:封装业务逻辑和业务数据,使用 JavaBean 实现

View:显示业务数据和收集客户动作,使用 JSP+JSTL 实现

Controller:流程控制,使用 Servlet 实现

AJAX

AJAX 即 Asynchronous JavaScript And XML 异步 javascript 和 xml,Ajax 核心由 HTML、

JavaScript 技术和 DOM组成。是指一种创建交互式网页应用的网页开发技术。是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。

Ajax 包括

1、基于 web 标准 XHTML 和 CSS 进行显示;

2、使用文档对象模型 DOM 作页面的部分更新及动态效果

3、使用 XML 和 XSLT 进行数据交互,目前使用较多的是 JSON,因为 xml 文件解析比较繁琐

4、使用 XMLHttpRequest 进行与网页服务器进行异步资料交换。这个 xhr 已经被纳入到浏览器规范中,所以所有的浏览器都提供了 xhr 的实现,但是不同的浏览器生产商的实现方式不一致

5、使用 JavaScript 将它们绑定在一起

AJAX 原理

客户端发送请求,请求交给 xhr,xhr 把请求提交给服务,服务器进行业务处理,服务器响应数据交给 xhr 对象,xhr 对象接收数据,由 javascript 把数据写到页面上

原生 AJAX 编程

流程:显示一个输入框,用户输入名称后,点击提交,当前页面并不更新,但是异步将用户名提交给 servlet,生成对应的问候信息,页面部分更新进行显示

编程步骤:1、页面事件触发特定函数执行,首先创建 xhr 对象,注意浏览器的差异性

<body>
<div id = "div1">测试AJAX</div>
用户名称:<input id = "username"><input type = "button" onclick="ff()" value="问候">
      <script>
            var xhr = null;
            function ff(){
                createXHR()
            }
            function createXHR(){
                if(window.XMLHttpRequest)//针对非IE浏览器
                    xhr=new XMLHttpRequest()
                else if(window.ActiveXObject)//针对版本低的浏览器
            //实际上这里的参数根据不同版本的IE浏览器参数不同
                    xhr=new ActiveXObject("Microsoft.XMLHttp")
            }
      </script>

2、调用 XMLHttpRequest 中提供的方法和服务器 Servlet之间进行通信

<script>
            var xhr = null;
            function ff(){
            //1、创建xhr对象
                createXHR()
                if(xhr){//2、打开与服务器的连接
                    var name = document.getElementById("username").value;//获取用户在<input id = username>中输入的数据
                    xhr.open('GET','hello.do?username='+name,true);
                    //3、注册回调事件处理函数
                    xhr.onreadystatechange=callback;//就是当xhr的readyState发生改变时,自动执行callback函数
                    //4、发送请求,由于采用的是get方法所以没有协议体数据
                    xhr.send(null);
                }else {
                    alert('您的浏览器不支持异步操作!')
                }
            }
</script>

3、定义事件回调函数

 function callback(){
         //1、检查xhr的响应状态,实际上只关注4
        var div1 = document.getElementById("div1")//获取输出显示的元素对象<div id = "div1">
        if(4==xhr.readyState){
             //2、检查服务器的响应状态码,实际上只关心200
             if(200==xhr.status){
                  //3、可以通过xhr的responseText和responseXML获取服务器的响应值
                  var ss = xhr.responseText//将响应信息显示在<div id = div1>中
              }else{
                     div1.innerHTML='您访问的地址错误'
              }  
         }else{
              div1.innerHTML='数据正在加载中......'
         }
}

4、定义服务器端的 Servlet,用于处理客户端请求信息,并生成对应的文本响应

AJAX 是一种前端技术,运行在浏览器中,和服务器所使用的语言、框架等无关。

@WedServlet("hello.do")
public class HttpAction extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException{
        String username = req.getParameter("username");
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter writer = resp.getWriter();
        writer.print("Hello" + username + "!");
        writer.flush();
        writer.close();
    }
}

优点:

可以无需刷新页面,与服务器进行通信

允许依据用户事件来更新部分页面内容

缺点:

没有浏览历史,不能回退

存在跨域问题(同源)

SEO 不友好(搜索引擎优化,对爬虫不友好)

Xhr 中的常见方法:

xhr 的 open 方法 有两三个参数,

第一个参数是什么方法请求服务器来获取数据,其中包括“GET”,“POST”,“SEND”,根据使用场景的不同,切换使用。

第二个参数是位于这个服务器端口上的 server 这个文件内容。

第三个参数是一个 boolean 值,有 true 和 false 来选择是否以异步的方式发送请求。

onreadystatechange 是 xhr 里的一个方法 字面意思为,当 状态 准备 发生 变化 的时候要怎么做,准确的来说,是在你 open 方法调用后,服务器马上要给你送回数据的时候,你可以预先对即将返回的数据 dosomesing。

这时候 xhr 对象里有一个属性名为 readyState(注意 State 的 S 是大写):0,1,2,3,4 会被赋值,这四个状态是依次改变的,0 到 1,1 到 2,2 到 3,3 到 4。 一共四次状态变化,3 和 4 并不是二选一

0 表示还没开始.为这个属性的初始值

1 表示 open 方法开始被调用结束

2 表示 send()方法已经运行结束

3 表示服务器 一部分 数据送回来了 //这一步的时候其实就可以操作数据了,但是不合理

4 表示全部数据已经返回

为了简化 AJAX 编程开发,可以考虑使用面向对象的方式对 ajax 常规操作进行封装

function AjaxObject() {//在 java 中 class AjaxObject{}
    this.req = null; //定义属性,XMLHttpRequest req;
    //定义成员方法 public void getHttpXMLRequest(){...}
    this.getHttpXMLRequest = function () {//public XMLHttpRequest getHttpRequest(){}
        if (window.XMLHttpRequest) {
            this.req = new XMLHttpRequest();
        } else { //
            if (window.ActiveXObject) {
                this.req = new ActiveXObject("Microsoft.xmlhttp");
            }
        }
    };
    //注意:在 js 中进行调用时参数个数可以不一致
    this.sendRequest = function (url, params, HttpMethod) {
        if (!HttpMethod) { //判断是否有 HttpMethod 参数,如果没有则默认值为 post
            HttpMethod = "POST";
        }
        this.getHttpXMLRequest(); //调用另外的方法创建 xhr 对象
        if (this.req) { //如果 xhr 创建成功,则 this.req 不为空,否则可以报错
            this.req.onreadystatechange = this.showData; //注册回调事件处理函数
            this.req.open(HttpMethod, url, true); // 打开与服务器的连接
            //设置请求头参数,用于模拟一个 post 的 form 表单提交数据
            this.req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            // username=mike&userpass=123
            this.req.send(params); //利用协议体传递数据
        }
    };
    this.showData = function () {
    };
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/610040.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux基础篇 使用SSH远程Ubuntu-03

目录 1.安装ssh服务器 2.启用SSH服务器 3.查看SSH服务运行状态 4.在Windows的CMD下进行验证 在默认情况下&#xff0c;外部设备是无法通过SSH远程Ubuntu的&#xff0c;因为Ubuntu没有启用ssh服务。 说明&#xff1a;当前Ubuntu系统为20.04 1.安装ssh服务器 sudo apt-get …

chatgpt赋能python:Python在一组数据中抽取数的方法

Python在一组数据中抽取数的方法 Python是一种非常流行的编程语言&#xff0c;因为它简单易学&#xff0c;可读性高&#xff0c;功能强大&#xff0c;适用于各种不同的应用场景。在数据科学领域&#xff0c;Python也非常受欢迎&#xff0c;因为它拥有广泛的数据处理和分析库。…

【Go LeetDay】总目录(1~88)

Leetcode Golang Day1~10 Golang每日一练(leetDay0001) 1. 两数之和 Two Sum 2. 两数相加 Add Two Numbers 3. 无重复字符的最长子串 Longest-substring-without-repeating-characters Golang每日一练(leetDay0002) 4. 寻找两个正序数组的中位数 Median of two sorted arra…

使用RP2040自制的树莓派pico—— [1/100] 烧录micropython固件

目录 开发环境烧录模式简介固件下载固件烧录验证阶段micropython初步了解 开发环境 软件&#xff1a;Thonny 烧录固件&#xff1a;micropython 烧录模式简介 正常插上电就启动&#xff0c;这是树莓派pico开发板的正常启动模式。 如果按住 bootset 按键再插上数据线&#xf…

Vue 设计模式

一、什么是设计模式&#xff1f; 设计模式是一套被反复使用、多数人知晓、经过分类编目的、代码设计经验的总结。它是为了可重用代码&#xff0c;让代码更容易的被他人理解并保证代码的可靠性。 设计模式实际上是“拿来主义”在软件领域的贯彻实践&#xff0c;它是一套现成的工…

Linux下配置Qt6安装开发环境

安装JDK 选择自己定义JDK安装路径 点击如下图按钮 安装SDK 提示TLS初始化失败 由于HTTPS问题造成无法下载,暂用Android Studio来安装Android SDK 成功安装SDK 安装NDK与命令行工具 正在下载NDK及命令行工具 NDK与工具下载完成 配置QT的Android SDK路径 配置NDK路径 选择ND…

卡尔曼滤波与组合导航原理笔记(一)卡尔曼滤波方程的推导 第一部分

文章目录 一、滤波的基本概念1、传统数字滤波器2、现代控制中的状态观测器3、最优估计的含义4、温度估计的例子1.问题描述2.分析 二、递推最小二乘 课程链接&#xff1a;https://www.bilibili.com/video/BV11K411J7gp/?p1 参考书目&#xff1a;《捷联惯导算法与组合导航原理》…

日志框架 --- Log4j

文章目录 1. 什么是log4j2. log4j的日志级别3. 日志层级4. log4j使用实例4.1 添加log4j依赖4.2 添加配置文件4.3 编写代码4.4 测试代码4.5 运行结果 5. 配置文件5.1 Logger 日志记录器5.2 Appender 附加器5.3 Layout 日志格式化器 6. 整体演示6.1 配置文件6.2 运行结果 1. 什么…

Linux学习(四)Docker构建Python_Web环境

目录 Docker 安装Docker 使用Docker 启停Docker 换源Docker 镜像Docker 容器Docker 创建内部网段Docker Python 镜像创建Docker MySQL 镜像创建Docker 补充 Docker 是一个开源的应用容器引擎&#xff0c;Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器…

vulnhub靶场渗透之DC-4渗透教程(超级详细)

vulnhub靶场渗透之DC-4渗透教程目录 0x01靶机概述 0x02靶场环境搭建 0x03靶机信息发现 0x04靶机渗透过程 0x05靶机提权 0x06渗透实验总结 0x01靶机概述 靶机基本信息&#xff1a; 靶机下载链接https://download.vulnhub.com/dc/DC-4.zip作者DCAU发布日期2019年4月…

DINO代码学习笔记(二)

在DINO代码学习笔记&#xff08;一&#xff09;中已经将输入transformer之前的参数处理给捋了一遍&#xff0c;接下就是将这些参数传给transformer。 DINO的transformer使用了Deformable-DETR中的可变性transformer&#xff08;他们之前的工作也有用到&#xff09; 这里还是使用…

chatgpt赋能python:Python回滚-避免代码灾难的有效措施

Python回滚-避免代码灾难的有效措施 什么是Python回滚 Python回滚是一种避免代码灾难的有效措施&#xff0c;它可以让你在代码出现问题之后及时回退到之前的版本&#xff0c;保证系统不会受到影响。 回滚是一项非常重要的工作&#xff0c;越是复杂的项目越需要进行回滚。Pyt…

​【指针与数组的恩怨情仇】

指针和数组的关系 指针指的是指针变量&#xff0c;不是数组&#xff0c;指针变量的大小是4/8个字节&#xff0c;是专门来存放地址的。数组也不是指针&#xff0c;数组是一块连续的空间&#xff0c;存放一组相同类型的数据的。 没有关系&#xff0c;但是它们之间有比较相似的地方…

java String类型对象转换为自定义类型对象

问题 java String类型对象转换为自定义类型对象 详细问题 对于java自定义类型对象提供了toString()方法&#xff0c;实现自定义类型对象转换为String类型对象&#xff0c;如何将String类型对象转换为自定义类型对象&#xff0c;譬如对于如下代码所定义的Class类 package co…

Android:Selector + Layer-lists 实现 AppCompatCheckBox

最近做项目涉及到一些UI相关的东东&#xff0c;虽然比较简单&#xff0c;但是也很有趣&#xff0c;写两篇简短的博客记录一下。 一."Selector 两张图片"实现 AppCompatCheckBox AppCompatCheckBox 是 androidx的一个widget&#xff1a;androidx.appcompat.widget.…

chatgpt赋能python:Python图中打字的SEO文章:让你的图片说出更多的话

Python图中打字的SEO文章&#xff1a;让你的图片说出更多的话 图片是传达信息的有力工具。不过&#xff0c;当你在网站上发布图片的时候&#xff0c;这张图片就很可能会被浏览器、机器学习算法、甚至是一些视觉障碍用户忽略。为了弥补这个缺陷&#xff0c;我们可以使用Python来…

chatgpt赋能python:Python回退快捷键:让你的编程更迅速高效

Python回退快捷键&#xff1a;让你的编程更迅速高效 作为一名有10年Python编程经验的工程师&#xff0c;我深知Python回退快捷键对于编程的重要性。当你在编写代码时&#xff0c;可能会出现需要回退或者修改之前的代码的情况&#xff0c;在这种情况下&#xff0c;如果你没有使…

用代码认识整型提升与unsigned signed

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C语言》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c;希望可以…

[架构之路-206]- 常见的需求分析技术:UML图概览

UML&#xff08;Unified Modeling Language&#xff09;是一种统一建模语言&#xff0c;为面向对象开发系统的产品进行说明、可视化、和编制文档的一种标准语言。下面将对UML的九种图包图的基本概念进行介绍以及各个图的使用场景。 一、基本概念   如下图所示&#xff0c;U…

3. 响应状态码及Response对象的status_code属性

3. 响应状态码及Response对象的status_code属性 文章目录 3. 响应状态码及Response对象的status_code属性1. 响应状态码2. 响应状态码共分为5种类型2.1 1xx&#xff08;临时响应&#xff09;2.2 2xx &#xff08;成功&#xff09;2.3 3xx &#xff08;重定向&#xff09;2.4 4x…