Java小白修炼手册--第四阶段--Servlet( 续 )

目录

 

Servlet

验证码

验证码的作用

验证码的绘制

验证码图片的绘制步骤

验证码的验证流程

为登陆功能添加验证码

过滤器

什么是过滤器

如何编写过滤器

实现Filter接口

拦截处理逻辑

添加到Web应用中

打包部署

​过滤器的优先级

多个过滤器的执行流程

​过滤器的初始化参数

读取初始化参数

过滤器的优点

监听器

什么是监听器

生命周期相关的事件

绑定数据相关的事件

如何编写监听器

创建监听器类

编写监听处理业务

注册监听器

应用场景

同步请求和异步请求

JSON

AJax发出的异步请求和JSON的关系

 


Servlet

验证码

验证码的作用

  • 为了防止机器人的破坏性操作,可以使用验证码技术来防止恶意的发送数据
  • 验证码本质上是一张动态产生的图片
  • 图片的内容会随着程序的运行而随机生成


验证码的绘制

  • 验证码图片的生成需要使用java提供的与绘图有关的一系列API
  • 要想绘图,需要画板,画笔,颜料,背景色,字体等多种类对象配合完成


验证码图片的绘制步骤

  • 创建一个内存画板对象
  • 获取画笔
  • 为画笔指定颜色
  • 为画板设置背景色
  • 绘制一个随机的字符串
  • 修改画笔颜色
  • 绘制多条随机干扰线
  • 压缩图片并输出到客户端


验证码的验证流程

  • 请求带有验证码的页面时:
  1. -通过img标签的src属性获取验证码图片
  2. -服务器端生成随机字符串,并绘制
  3. -服务器端将生成的随机字符串绑定到session中
  • 提交表单及填写的验证码内容时:
  1. -处理程序将session中绑定的正确的验证码字符串取出来
  2. 获取表单提交时填写的验证码内容
  3. -比较两者,根据结果做出判断


为登陆功能添加验证码

为登录页面增加验证码图片功能,最终效果如下:
 

过滤器

什么是过滤器

  • 过滤器是Servlet2.3规范中定义的一种小型的、可插入的Web组件。用来拦截Servlet容器的请求和响应过程,以便查看、提取或以某种方式操作正在客户机和服务器之间交换的数据。
  • 过滤器通常是封装了-些功能的Web组件,这些功能很重要,但对于处理客户端请求或发送响应来说不是决定性的。
  • 典型的应用包括记录请求和响应的数据、管理会话属性等


如何编写过滤器

  • 编写一个Java类, 实现Filter接口
  • 在doFilter方法中实现拦截处理逻辑
  • 将过滤器添加到Web程序中
  • 把过滤器和Web应用一起打包部署


实现Filter接口

  • 过滤器API中有3个常用的接口, 位于javax.Servlet包中。
  • Filter、FilterChain、 FilterConfig
  • 编程中,过滤器类要实现Filter接口1
  • 该接口中包含三个必须实现的方法
  1. - void init(FilterConfig filterConfig)
  2. - void doFilter(ServletRequest request, ServletResponse
  3. response, FilterChain chain)
  4. - void destroy()


拦截处理逻辑

public class CommentFilter implements Filter{
    /**创建实例后,调用init方法,只执行一-次*/
    public void init(FilterConfig arg0) throws
    ServletException { // .... .. }
    /**容器调用doFilter方法处理请求*/
    public void doF ilter(ServletRequest arg0 ,ServletResponse
    arg1 , FilterChain arg2) throws IOExcept ion,ServletException
    { //...
    arg2 . doFilter(arg0 , arg1 );
    }
    /**容器删除过滤器实例之前调用该方法,只执行一次*/
    public void destroy(){..... }
}


添加到Web应用中

修改web. xml文件,增加注册过滤器的节点


<filter>
    <filter- name>filter1< /filter- name>
    <fi lter-class >web. xxxServlet</Servlet-class>
</filter>
<filter- mapping>
    <filter- name> fitler1</ filter- name>
    <ur1- pattern>/ xXx< /url-pattern>
</filter-mapping>


打包部署

与Web应用程序一起部署过滤器时, 只需把过滤器类和其他Web组件类包括在一起,把web.xml文件(连同过滤器注册)放进Web应用程序结构中, Servlet 容器将处理之后的其他所有事情



过滤器的执行流程


过滤器的优先级

如果有多个过滤器都满足过滤的条件,则容器依据


多个过滤器的执行流程


过滤器的初始化参数

  • 容器启动之后,会创建过滤器实例
  • 接下来,容器会调用过滤器的init方法,而容器会事先创建Filter onfig对象。该对象可以访问在web.xml文件中配置的一些参数
  • 这些在web.xmI文件中存储,由FilterConfig对象读取,在执行init方法时能够访问的参数值,叫初始化参数
  • 通过这些初始化参数可以方便快捷的配置及修改一些辅助参数
<filter>
        <filter- name >filter1</filter- name>
        <filter- class >web. xxxFilter</ filter-class>
    <! -初始化参数
    <init-par am>
        <param- name> il legalStr</ param- name>
        <param-value>xxx< /param-va lue>
    </ init- param>
</filter>


读取初始化参数

使用FilterConfig对象可以读取在web.xml中配置的初始化参数
 String config.getInitParamter('illegalStr")
 


过滤器的优点

  • 实现代码的“可插拔性”, 即增加或减少某个功能模块,不会影响程序的正常执行
  • 可以将多个相同处理逻辑的模块集中写在过滤器里面,方便代码的维护
     

监听器

什么是监听器

  • Servlet规范中定义的一种特殊的组件,用来监听Servlet容器产生的事件并进行相应的处理
  • 容器产生的两大类事件
  1. 生命周期相关的事件
  2. 绑定数据相关的事件


生命周期相关的事件

  • 容器创建或者销毁request,session,ServletContext时产生的事件
  • ServletRequestListener
  1. requestDestroyed ( ServletRequestEventsre )
  2. requestInitialized ( ServletRequestEventsre )
  • HttpSessionListener
  1. sesssionCreated ( HttpSessionEventse )
  2. sessionDestroyed ( HttpSessionEventse )
  • ServletC ontextListener
  1. contextDestroyed ( ServletContextEventsce )
  2. contextInitialized ( ServletContextEvent sce)


绑定数据相关的事件

  • 调用了request,session,Servlet ontext的setAttribute、removeAttribute方法时产生的事件
  • ServletRequestAttributeListener
  1. attributeAdded(ServletRequestAttributeEvent srae)
  2. attributeRemoved(ServletRequestAttributeEvent srae)
  3. attributeReplaced(ServletRequestAttributeEvent srae)
  • HttpSessionAttributeListener
  1. -参考API Document
  • ServletContextAttributeListener
  1. -参考API Document
     


如何编写监听器

  1. step1 ,编写一个Java类,依据监听的事件类型选择实现相应的监听器接口。如,要监听Session对象的创建和销毁,要实现HttpSessionListener
  2. step2,在监听器接方法中,实现相应的监听处理逻辑。
  3. step3,在web.xml文件中注册该监听器


创建监听器类

代码如下:

这里实现不同的接口监听不同的对象



public class Coulistener implements HttpSessionListener {
//实现方法
}


编写监听处理业务

public class Coulistener implements Httpsessionlistener {
    public void sessionCreate ( HttpSessionEvent argo ){
    //... ....
    HttpSession session = argo. getSession( );
    ServletContext ctx = session. getServletContext( ) ;
    //... ..
    }
}


注册监听器

web. xml文件中, 增加以下节点:


<! --监听器-->
<l istener>
    <listener- class >web . CouL is tener</li stener-class>
</ listener>
<!--&nbsp;&nbsp. ;实现相同的Listenner接口的多个监听器,在执行时是按
web. xm1注册出现的顺序来决定&nbsp;-->


应用场景

  • 由于ServletRequest. HttpSession、 Servlet Context对象都是容器创建的,通过对这些对象注册监听器,就可以得知何时创建了。
  • 比如;
  1. 在contextDestroyed方法中对应用级别的资源进行释放。
  2. 统计在线人数可以通过HttpSessionL istener监听器的sessionCreated方法监听session的创建动作。
     

同步请求和异步请求

  • 同步请求: 返回的内容包括页面和数据, 整个页面内容刷新使用

    通过浏览器地址栏, 超链接,form表单发出请求

  • 异步请求: 返回的内容只有数据,局部页面内容刷新使用

    通过ajax发出异步请求

前后端分离:服务器端接收到请求后不需要考虑这个请求是浏览器发出的还是客户端app发出的, 一视同仁 统统只返回数据即可. 对于后端Java程序员而言只需要开发一套业务代码即可, 要想实现前后端分离必须要求 浏览器发出的请求必须是异步请求, 这样网站的所有功能都是静态页面里面通过Ajax发出异步请求实现

JSON

  • JSON是一个类似于XML的轻量级数据封装格式(数据交换格式).

<books>

​	<book>

​	<name>Java基础</name>

​	<author>苍老师</author>

​	<price>5</price>

</book>

​	<book>

​	<name>Java基础</name>

​	<author>苍老师</author>

​	<price>5</price>

</book>

</books>

json:格式 [{"name":"Java基础","author":"苍老师","price":"5"},{"name":"Java基础","author":"苍老师","price":"5"}]

 

AJax发出的异步请求和JSON的关系

AJax是前端开发中发出异步请求的技术, 发出异步请求服务器在进行处理时一般给客户端返回的只有数据没有页面, 那么当返回的数据比较复杂时就需要使用JSON字符串将数据封装到JSON字符串中,便于客户端进行处理.

 

猜你喜欢

转载自blog.csdn.net/c202003/article/details/107040484