{{π型人才养成计划}}Servlet

Servlet笔记01

一. 引言

1. 概念

1) servlet一段运行在tomcat服务器上的java小程序,能够生成动态网页,是JavaEE规范的一部分
2)动态网页 : 构成网页内容的数据是实时变化
3)运行方式: 开发好的java程序,需要发布到tomcat服务器上,由服务器在用户请求达到时调用

2. 搭建开发环境

需要将servlet技术对应的servlet-api.jar引入到java项目中

二. 第一个servlet程序开发

1. 写代码

1) 实现servlet程序的三种方式

​ ① implements Servlet , 覆盖5个方法(service方法),与协议无关程序

​ ② extends GenericServlet,覆盖service方法,定义与协议无关的程序

​ ③ extends HttpServlet , 覆盖service方法, 必须使用http协议通信

2) 具体代码

在这里插入图片描述

2. 发布程序(手动发布) — 部署(deploy)

 ~~~java
Tomcat
   |-- lib
   |-- conf
   |-- bin
   |-- work
   |-- webapps
      |-- myweb
         |-- html文件,image图片,css文件
         |-- WEB-INF
             |-- classes    存放java程序的字节码文件(注意:带着包结构)
             |-- lib        如果有,存放当前应用需要使用的私有的jar包
             |-- web.xml文件
 ~~~

3. 写配置文件web.xml

 <servlet>
      <servlet-name> servlet程序的简称(必须保证当前文件中唯一)</servlet-name>
      <servlet-class> servlet程序的全类名(包名.类名)</servlet-class>
 </servlet>
 <servlet-mapping>
      <servlet-name> servlet程序简称,与上面的简称一致(注意区分大小写)</servlet-name>
      <url-pattern> /程序网名 (必须以/开头) </url-pattern>
 </servlet-mapping>

4. 启动服务器访问程序

 http://127.0.0.1:8989/myweb/first

访问程序

 http://127.0.0.1:8989/myweb/first

Servlet笔记02
一.复习

  1. Servlet : 生成动态网页技术

  2. 第一个动态网页
    1)写程序
    ① implements Servlet ② extends GenericServlet ③ extends HttpServlet
    继承HttpServlet 覆盖 service方法
    Public void service(HttpServletRequest req,HttpServletResponse res)
    throws ServletException,IOException{
    Request response
    }
    2)部署( 目录 ) — 手动部署
    Tomcat —webapps — myweb
    |-- others( html image css js jsp 视频… )
    |-- WEB-INF ( 是client屏蔽 )
    |-- classes .class文件和它所在的包结构
    |-- lib .jar包
    |-- web.xml 一个web应用的配置文件

    Tomcat软件默认的CLASSPATH是什么? classes + 两个lib
    3)写配置文件web.xml
    ---- 全名
    — /xxx
    4)访问( 地址 )
    http:// ip : port / 应用名 / 网名

  3. 请求的发送方式 — 3种

  1. 地址栏手工输入 2) 超链接 href 3) 表单的提交按钮 action

二.Web应用3.0版 — 利用myeclipse自动部署web应用

  1. 将tomcat服务器软件配置到myeclipse里
  1. 菜单window --> show view --> others --> 搜索Servers --> 选中
  2. 右键 --> configure server connector
  3. 选择tomcat7 --> enable --> 第一个对话框选择tomcat安装路径
  4. 在myeclipse里启动关闭tomcat软件
  1. 在myeclipse里新建web project
    在myeclipse里完成应用的所有编写开发任务, 然后再部署
    1)写程序 2) 写配置文件 3) 部署 4) 启动tomcat 5) 使用外部的浏览器软件访问

  2. 在myeclipse里自动部署

  1. 方法一: 选中tomcat7.x --> 右键–> add deployment --> 选中部署的项目
  2. 方法二: 选择工具栏里的deploy按钮 --> 选中项目 --> 添加服务器 --> 部署
    注意:
    1)部署时 , 会自动使用项目名作为web应用名发布
    2)如果单方面修改了项目名 , 则需要手动更新部署后的应用名
    项目右键 --> properties --> 搜索web --> 修改web context root值

三.Servlet程序的生命周期

  1. Servlet程序的生命周期由Tomcat服务器来管理

  2. Client发出请求后 , tomcat做了哪些工作使得响应回到client

  1. client在地址栏发出请求 , 根据请求里的ip和port找到tomcat服务器
  2. 根据请求里的”应用名”找到应用的配置文件web.xml
  3. 读取web.xml , 查找”请求里的网名”对应的程序名
  4. 利用反射技术 , 获取程序对象 ( 第一次请求到达,使用”全类名”构建程序对象 ; 不
    是第一次请求 , 则直接获取之前创建好的对象 )
    Class a = Class.forName(“全类名”);
    Object obj = a.newInstance();
    5)使用obj对象调用程序的service()
    6)service()运行,将结果输出到浏览器
  1. Servlet程序的声明周期相关方法
    在这里插入图片描述

  2. 关于构建时机问题
    Tomcat会为每一个servlet程序构建1个对象, 为所有client提供服务, 默认对象会在第
    一次请求到达时构建 , 也可以通过配置, 人为设置构建时机( 可以控制在启动时构建)
    在这里插入图片描述

  3. 线程安全问题
    Tomcat容器中,每个servlet只有一个对象为所有请求它的client服务,多个client(线
    程)并发访问该对象(临界资源)时,要求程序必须有保证数据线程安全的措施:

 1) 优选 : 尽量不要为servlet程序定义”成员变量”(静态成员或者实例变量) 
 2) 如果定义了成员 , 则需要对”敏感代码”(修改临界资源数据的代码)加锁
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210605134237334.png)

三.关于servlet程序间的跳转问题

  1. 当client的请求过于复杂 , tomcat端需要多个servlet配合来完成要求 ,配合方式
    1. 请求转发 forward 2) 请求重定向 redirect
 相同点: 都可以将 “程序的流程” 和 “请求” 由servlet1同时送入servlet2 , 在servlet2
         执行结束后 , 请求不会”回头”(随着响应发出,request消亡) , 流程会遵照”函
        数调用”的特点回到调用点执行跳转后的代码( 不能再使用request和response) 
  1. 请求转发 forward
    在这里插入图片描述

    1. 代码
      RequestDispatcher rd = request.getRequestDispatcher(“下一个程序的网名”);
      Rd.forward(request,response);

    2. 数据的传递
      ① request本身是一个存储空间( 作用域 )可以存放起了名字的数据( 命名属性 )
      ② 代码
      存数据 —> request.setAttribute(“name”,value);
      取数据 —> Object value = request.getAttribute(“name”);

  1. forward特点
    ① forward连接的多个程序之间 共享”一个请求” *****
    ② 请求在服务器内部被转发 , client不知晓 , 浏览器地址栏和网页内容不匹配
    ③ 使用request对象做数据传递
    ④ forward方式不能”跨域”( 跨应用 )

    1. action代码模版
      在这里插入图片描述

Servlet笔记 第三天
一.复习

  1. 自动部署web项目 ( 工具使用 )
  2. Servlet程序的生命周期
    1)请求响应的过程
    Ip和port --> tomcat --> 应用名 --> 读取配置文件web.xml --> 找网名对应的程序名
    –> 创建对象( 反射 + 第一次请求到达 ) --> 对象.service(request,response)
    2)生命周期里的方法
    构造方法 --> init() —> 反复调用service() --> destroy()
    3)servlet程序初始化时机 ****
    ① 默认第一次请求到达时
    ② 手动设置 : —
    4)临界资源
    Tomcat只为servlet创建一个对象, 会被多线程(client)并发访问
    ① 尽量不定义成员变量( 实例 和 静态 )
    ② 对敏感代码(修改成员变量的代码)加锁
  3. 多个servlet配合
    1)配合方式(跳转方式) : forward(转发) redirect(重定向)
    提示: ① 处理请求(应对request相关功能) — XxxAction
    ② 作出回应(应对response相关功能) ---- XxxxView
    ③ action是纯java代码,需要通过”代码”(forward或者redirect)控制跳转
    View可以向浏览器输入界面,可以将跳转封装成超链接或者表单,不需要
    借助代码跳转
    2)Forward
    ① 代码
    RequestDispatcher rd = request.getRequestDispatcher(“下一个资源的网名”);
    Rd.forward( request,response) ;
    资源: 静态网页 动态网页( view 或者 action )
    ② 数据传递 — 借助”作用域request”
    request.setAttribute(“name”,value); Object value = request.getAttribute(“name”);
    ③ 特点
    共享一个请求 发生在服务器内部,client的表现( 地址栏和网页内容不匹配 )

二.多个servlet配合方式二 — 重定向redirect

  1. 代码
    response.sendRedirect( “ 下一个资源的uri — /应用名/网名 ” );

  2. 特点

 1) 重定向连接的两个程序,处于两个请求的生命周期中 ( 浏览器会根据第一次请求的
    响应,自动发送第二次请求)
 2) 浏览器地址栏会发生改变 , 地址和网页内容最终匹配的
 3) 重定向不能使用request传递数据
 4) 重定向可以跨应用 ( 跨域 )
  1. 选择标准( forward 和 redirect ) ---- 重点
 1) 如果当前action程序结束时, 业务功能完成 , 向下一个目的地跳转选择redirect
 2) 如果当前action程序结束时, 业务功能没完成 , 则选择forward向下跳转
      Action和view做同一个业务功能, 一定会有业务数据的传递
 3) 如果无法确定是否结束 , 建议选择redirect
  1. 重定向过程的数据传递问题 — 不重要
 1) 一般重定向过程伴随着功能切换, 通常不需要数据传递
 2) 非传不可
    ① 简单少量数据(String -- 非中文 , 整数) 
       传 -- response.sendRedirect(uri?name=value);
       收 -- String value = request.getParameter(“name”);
    ② 中文数据 或者 复杂数据(对象,集合)
       使用作用域HttpSession传递数据

三.用户信息追踪

  1. 概念: 保留用户做个的重要步骤的信息数据(痕迹) , 供后续程序使用

  2. Cookie

  1. 概念 : 是服务器程序写到浏览器上的一小段字符串(name和value组成,不支持中文)
    http协议规定server有权读写浏览器上的cookie(读”自己”写过的cookie)

2)读写cookie的api
① 写cookie
A. 创建一个cookie对象( 在java里一切都是对象 )
Cookie c = new Cookie(“name”,”value”);
B. 写出去 — 随着response发出去
response.addCookie© ;
C. 可以设置cookie的存活时间
c.setMaxAge( time ); – time单位是秒
注意: time为正数单位是秒 ; time为0表示删除cookie ; time为负数表示可以活
到浏览器关闭
D. 可以设置cookie的路径( http协议规定默认只能读取同一路径下的程序写的
cookie )
cookie.setPath(“/” ); — 当前服务器里的所有应用程序都可以访问
② 读cookie
Cookie[] cs = request.getCookies() ; – 如果没有cookie , cs值为null

  1. HttpSession — 服务器端存放数据的手段
 1) 获取HttpSession对象
    HttpSession  session =  request.getSession( true );

 2) 是一个作用域 , 可以存放命名属性
    存数据: session.setAttribute(“name”,value ); 
    取数据: Object value = session.getAttribute(“name”);
    移除数据: session.removeAttribute(“name”);

 3) session的特点

在这里插入图片描述

   ① 生命周期长 ( 至少比request长 ) 
      A. Begin : 从用户请求里第一次出现request.getSession(true)时创建session对象
               “懒汉式”
      B. End : 用户离开session销毁( timeout ) , 在设置的有效时间内,用户没有任何操
             作视为离开(tomcat默认有效时间为30分钟).

        调整有效时间:
        I. 统一修改tomcat里session的有效时间 tomcat/conf/web.xml
          
        II. 可以在应用的程序里通过方法修改
           session.setMaxInactiveInterval( time );  --> 单位是秒
        III. 直接销毁session
           Session.invalidate();   --- 销毁session   实现安全退出功能

       时间长短? 
       I. 数据安全角度 : 短 
       II. 内存的使用: 短 , 提高用户体验( 内存置换 -- 将到期的session以及里面
                     的数据写入”硬盘” , 用户访问时,再将session恢复回内存 )

   ② 保存用户相关信息( 用户特指浏览器软件 -- 一个浏览器软件在tomcat上对应一
      个session对象 ) 

      如何保证用户(client)与session的一一对应关系:
      答: 当client发出请求获取session时, tomcat会首先读取浏览器上的cookie,查找
         叫做JSESSIONID的cookie( 32位16进制数)
         I. 找到 : 说明曾经为client创建过session , 拿着sessionId去内存中查找对应
                  的session对象,返回给client使用
         II. 没找到 : 说明client是第一次申请session , tomcat创建新的session给
                  client使用 , 同时将新session的id以cookie的形式写入浏览器
      注意: 保存session id的cookie 默认存活时间为负数( 浏览器关闭销毁 )

Servlet笔记04
一.复习

  1. Redirect
  1. 代码 response.sendRedirect(“uri”); /应用名/网名
  2. 和forward区别
    请求 : forward 一个 ; redirect 两个( 用户发送 , 浏览器自动发送 )
    地址栏 : forward地址栏不变 ; redirect 地址栏会发生改变
    数据传递: forward使用request ; redirect使用session
    跨域 : forward不能 ; redirect可以
  3. 应用选择
    当前action程序结束业务功能结束使用redirect
    当前action程序结束, 跳转前业务功能未结束 , 使用forward
    无法区分使用redirect
  1. Cookie
  1. 是什么 : 一小段String (http协议允许server写到浏览器) , 由name=value组成,不能
    有中文,有大小限制
  2. api : Cookie c = new Cookie(name,value);
    c.setMaxAge(time); 正数(秒) 0( 读取cookie ,将cookie的time设为0, 在将
    cookie写回浏览器) 负数(浏览器关闭销毁)
    c.setPath(“/”); 只有同一路径下的程序可以读取彼此写过的cookie
    response.addCookie©;
    request.getCookies() —> Cookie[]
  1. HttpSession ******
  1. 获取session对象 : request.getSession(true); [新建 , 获取原有的 ]
  2. 是一个作用域 ( 存放命名属性 — 与用户相关的数据 )
    Session.setAttribute(name,value) Object value = session.getAttribute(name);
    session.removeAttribute(name);
  3. 特点
    ① 存放与用户相关数据 ( 登陆标识 username password 购物车 )
    ② 生命周期长
    Begin : 用户访问的程序第一次出现request.getSession(true);
    End : 有效时间结束 , session被销毁
    I. 默认时间tomcat设置为30分钟
    II. 通过 session.setMaxInactiveInterval(time);
    III. 直接注销 session.invalidate()
    ③ 与用户一一对应
    Server每次回读取浏览器上的cookie, 寻找JSESSIONID
    找到: 根据cookie的value查找对应的session对象
    没找到: 创建新的session, 并将id写入浏览器

二.HttpSession的补充 ( 了解 )

  1. 如果浏览器拒绝接受cookie
 1) 一般不要求程序员在代码中处理此种情况
 2) 可以使用函数 response.encodeRedirectURL(“正常的跳转地址”) --> String 处理跳转
    地址 , 该函数会自动检测浏览器是否支持cookie :
    支持 : 不对地址做任何操作,原样返回
    不支持: 会自动将session的id拼接到给定的地址后, 带着id跳转到下一个程序 , 
           目的程序就可以使用当前程序的session

三.ServletContext

  1. 从文件的角度
  1. tomcat启动时会读取每一个应用的配置文件 , 并将读到的内容封装成ServletContext
    对象保存在内存中.
    ServletContext对象是配置文件在内存中的表现 .
    一个web应用只有唯一一个ServletContext对象

2)tomcat读取配置文件时, 将读到的每一段servlet配置信息封装成ServletConfig对象

  1. 获取ServletContext对象
    ServletContext application1 = this.getServletContext();
    This指当前servlet程序对象( 同时也是ServletConfig对象 – 父类实现了
    ServletConfig接口)

4)使用场景
可以借助web.xml文件保存web程序需要的配置数据
① 将配置数据写入配置文件
在这里插入图片描述

  ② 获取配置文件中的数据
     String value = application.getInitParameter(“ 参数名 ”);
     String value = config.getInitParameter(“ 参数名 ”);
  1. 从作用域角度
  1. 是一个作用域 , 可以存放命名属性
    ServletContext application2 = session.getServletContext();
    — application1 == application2 —> true
    存数据: application.setAttribute(“name”,value);
    取数据: Object value = application.getAttribute(name);
    删除数据: application.removeAttribute(name);

2)特点:
① 生命周期 : 最长 , 与”天地”同寿 , tomcat启动begin, tomcat关闭end
② 数据共享范围:里面的数据被当前应用的所有程序共享

  1. 三大作用域
    在这里插入图片描述

  2. tomcat正常关闭时, 会自动将内存中所有处于活动状态的session以及里面的数据,
    以文件的形式保存在硬盘上 ( tomcat/work/应用/sessions.ser ) , 再次启动时,自动将文
    件内容读回 , 并在内存中恢复session.
    — 注意: session里的数据必须是可以”序列化的” ( implements Serializable )

四.过滤器 Filter

  1. 对于java程序中的”冗余代码”( 多次出现的基础功能代码 )处理方式
  1. corejava里处理 : 封装成函数 , 在需要的地方调用
  2. servlet里处理 : 将冗余代码单独定义在Filter程序里

特点: Filter程序会对request和response进行”预处理” , 会在request到达servlet之前 以
及 response返回到client之前 运行

  1. 开发过滤器程序(封装冗余代码)
  1. 写程序 — implements Filter
    在这里插入图片描述

  2. 写配置文件

    filter的简称
    filter程序的全类名


    与上面一致
    需要被当前filter预处理的请求的网名

    注意: 如果有多个请求需要过滤器预处理, 可以定义多个url-pattern罗列所有网名
    /* — 表示来自于client端的所有请求( servlet请求 html请求 图片请求… )

  3. 部署 访问

  1. 当一个请求需要通过多个过滤器时, 通过的顺序与配置文件里配置的先后顺序一致

  2. 关于请求方向问题

  1. 过滤器默认只过滤来自于client的请求 , 对于服务器内部转发的请求不过滤
  2. 如果需要全方位过滤 , 需要手动设置

    |--
    |--
    |-- REQUEST(默认值) FORWARD INCLUDE
    注意: 不写dispatcher标签默认值生效 , 写了这个标签,则写什么过滤什么
  1. 关于过滤器的配置数据处理 [ 了解 ]

    1. 如果配置数据只有Filter程序需要使用,可以将数据定义在里
      在这里插入图片描述

    2. filter程序中通过FilterConfig获取
      filterConfig.getInitParameter(“xxxx”);

  2. Url-pattern的处理技巧

  1. 过滤少量的servlet请求 — 定义多个url-pattern标签进行罗列
  2. 过滤所有的请求 — /*
  3. 过滤大量的请求(不是所有) — /tel/* 通过添加前缀的方式来区分
    /LoginAction ----> /user/LoginAction
    /QueryAllAction —> /tel/QueryAllAction
    /DeleteAction —> /tel/DeleteAction
    /InsertAction --> /tel/InsertAction

4)如果需要按资源类型过滤( 静态网页 动态网页(servlet , jsp) ) — *.action
http://ip:port/myweb/xxx.html
http://ip:port/myweb/index.jsp
http://ip:port/myweb/first.action —> servlet程序的网名添加后缀
在这里插入图片描述
在这里插入图片描述

五.监听器 Listener [ 了解 ]

  1. 事件监听模型 [ 掌握 ]
    事件源(Source) 事件对象(Event) 监听器(Listener)

工作方式: 当事件源产生特定的事件对象时, 会触发监听器相应功能运行

  1. Servlet里的监听器(接口)
  1. 作用域生命周期监听器
    ServletContextListener : 监听ServletContext对象的创建和销毁 常用
    HttpSessionListener : 常用
    ServletRequestListener
    在这里插入图片描述
    在这里插入图片描述

  2. 命名属性监听器 [ 了解 ]
    ServletContextAttributeListener
    HttpSessionAttributeListener
    ServletRequestAttributeListener

  1. 编码
    1)写程序 implements XxxxListener
    每一个event都有一个方法getSource() 获取事件源
    2)写配置文件

    监听器全名

六.验证码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值