JavaWeb阶段:servlet

一、网络应用体系结构

1.C/S(client-server)
  1. 交互特点 : 基于客户端软件 与 服务器的模式。 要使用C/S结构网络应用必须下载对应的客户端软件。
  2. 优点:
    图形化效果好,用户使用的视觉体验好。
  3. 弊端:
    服务器端一旦升级,所有的客户端都必须升级。

2.B/S(browser-server)
  1. 交互特点:基于客户端浏览器 与 服务器的模式。
  2. 优点:
    PC上只要具备一个浏览器,就能访问和使用B/S结构的应用。
    服务端升级, 不会强制要求客户端升级, 即不影响客户端的使用。
  3. 缺点:
    图形化效果无法做到与C/S结构一样的绚丽。

二、基于B/S结构的WEB应用

1.静态WEB应用
  1. 静态WEB应用是指以html资源作为服务器中的资源文件, 用户请求的时候,服务器是以一个html作为响应的结果(html是目标处理请求的最终资源)。

  2. 缺陷:
    ① 不支持对数据库的访问操作。

    ② 随着用户需求的不断增长,网站系统的内部势必要组织越来越多的html网页以适应用户的需求。

    ③ 一个html网页,只能应对一种类型的需求。 html网页不能根据用户不同的需要求展示不同的内容。
    JavaWeb阶段:servlet

2.动态WEB应用
  1. 动态WEB应用是以一个程序作为最终处理用户请求的资源,程序处理完请求将结果响应给客户端。

  2. 特点:
    ① 程序可以编写访问数据库的代码的。

    ② 可以根据用户不同的需求, 到数据库查询不同的数据响应给客户端。
    JavaWeb阶段:servlet

三、Servlet简介

  1. Servlet主要是用于编写JavaWeb动态WEB应用。 Servlet是 JavaEE规范中的一个子规范, 它是运行于WEB应用服务器端的一段 Java程序 。
  2. 如何开发Servlet应用程序:
    2.1 必须编写一个类去实现 javax.servlet.Servlet接口
    JavaWeb阶段:servlet
  3. Servlet主要作用: 用于生成动态网页

注意: 如果修改了servlet程序源代码 或 修改了web.xml中的信息, 需要重新编译 、重新部署项目。

  1. 客户端浏览器向 tomcat服务器的servlet发送请求到响应的大概流程

    4.1客户端向服务器的某个Servlet发起请求

    4.2tomcat服务器接收到请求,并开始解析请求的路径,明确请求的是哪个项目中的那个url-pattern的servlet

    4.3然后去解析对应项目中的web.xml,找到目标调用的servlet实现类, 根据servlet实现类的全限定名通过反射的方式创建对象。

    4.4自动调用 service方法处理请求

    4.5请求处理完毕,程序使用IO流向客户端响应结果
    JavaWeb阶段:servlet

  2. 编写web应用部署描述符:web.xml
    JavaWeb阶段:servlet

Servlet的生命周期

  1. 初始化
    1.1 第一种时机: 当客户端浏览器第一次请求一个Servlet的时候,tomcat会创建目标Servlet对象。
    1.2 第二种时机: 需要开发人员在web.xml中手动配置。可配置当前servlet启动服务器的时候创建。
    JavaWeb阶段:servlet
  2. 服务
    执行Servlet实现类的service方法提供处理请求的服务。
  3. 销毁
    3.1 在关闭服务器的时候销毁

PS: Servlet实例在tomcat服务器中是一个单例对象。 默认向tomcat中的一个servlet发起请求时,tomcat首先会检查一下当前的服务器中,是否有请求的servlet实例, 如果有直接调用。 如果没有则新创建目标servlet对象。
在多线程并发的场景下,servlet属于临界资源, 是线程不安全的对象。 所以通常不建议在Servlet实现类中定义成员变量。

实现Servlet的几种方式

JavaWeb阶段:servlet

  1. 写一个类实现Servlet接口
  2. 写一个类继承GenericServlet抽象类:这个类实现了Servlet接口。
  3. 写一个类继承HttpServlet抽象类【重点】:HttpServlet是专门设计用于处理Http请求相关的问题,这个类继承了GenericServlet 。
    JavaWeb阶段:servlet

URL、URI、url-pattern的概念

  1. URL : 统一资源定位符,主要作用是在互联网上唯一的标识一个资源。

http://IP:PORT/项目名/url-pattern或静态资源相对路径

  1. URI : 统一资源描述符, 用于在服务器中唯一的标识一个资源。

/项目名/url-pattern或静态资源相对路径

  1. url-pattern : 如果是一个Serlvet程序,那就是在web.xml中的url-pattern标签的配置。

请求一个Servlet的几种方式

  1. 浏览器地址栏请求:
    JavaWeb阶段:servlet

  2. HTML页面超链接请求
    JavaWeb阶段:servlet

  3. HTML页面表单请求

JavaWeb阶段:servlet

客户端与服务器之间数据交互的方式

  1. 使用表单向服务器提交数据
    JavaWeb阶段:servlet
  2. 使用超链接拼接请求数据
    JavaWeb阶段:servlet

小结: 服务器获取请求参数 的方法 String str = request.getParameter(请求参数的key);

  1. 使用request作用域传值与获取
    request.setAttribute(要传的值的名字,要传的值);
    request.getAttribute(要获取的值的名字);

处理请求数据编码

  1. 处理表单POST方式请求中文乱码:
    JavaWeb阶段:servlet
  2. 处理GET方式提交的中文乱码
    修改tomcat/conf/server.xml 文件,指定编码
    JavaWeb阶段:servlet

servlet整合JDBC开发

JavaWeb阶段:servlet

  1. 搭建开发环境
    1.1引入数据库驱动jar
    1.2引入jdbc.properties和 JDBC工具类
  2. 编码
    2.1 创建表
    2.2 封装实体类
    2.3 编写DAO: DAO接口 + DAO接口实现类
    2.4 编写service: Service接口+ Service实现类
    然后先测试一下
    2.5 编写Servlet : 写类继承HttpServlet抽象类、然后编写 web.xml
    JavaWeb阶段:servlet

关于调错:
404 是找不到资源,检查请求路径,或检查项目有没有部署。
500 是你后台的代码有错误。
405 检查请求的servlet是否正确继承了HttpServlet, 或检查覆盖的方法service的声明是否正确。

请求转发(forward)

  1. 什么是请求转发:请求转发机制可以将两个Servlet连接到一起,形成一个工作流,共同完成一个业务需求。使用请求转发可以在两个Servlet之间进行跳转。

  2. 如何使用请求转发从一个Servlet跳转到另一个Servlet

  3. 请求转发的特点
    3.1 请求转发的地址栏不变。 请求转发的动作发生在服务器的内部。
    3.2 请求转发连接的两个Servlet处于同一次请求中。
    3.3 请求转发连接的两个Servelt,只有最后一个可以向客户端响应结果。

request作用域

  1. request作用域 : request作用域可以存储命名属性, 同一个request作用域中的命名属性(数据)可以被请求转发连接的两个Servlet共享。
    JavaWeb阶段:servlet
  2. request作用域的使用
    2.1 存值: request.setAttribute(String name,Object value);
    2.2 取值: Object value = request.getAttribute(String name);
  3. request作用域生命周期
    一次请求有效。 从客户端发起请求 到 结果响应结束。
  4. request作用域中数据共享范围: 一次请求; 一次请求连接的 servlet中可以共享。

请求重定向 (redirect)

  1. 请求重定向可以完成从一个Servlet跳转到另一个 Servlet。
  2. 如何使用请求重定向跳转:
    response.sendRedirect(下一个Servlet的URI);
  3. 请求重定向特点
    3.1 地址栏改变 。
    3.2 请求重定向连接的两个 Servlet,处于两次请求中。不能使用request作用域传递数据。
    JavaWeb阶段:servlet

请求转发和请求重定向的使用场景

  1. 如果两个 Servlet之间需要使用request作用域传递数据, 则使用请求转发。
  2. 如果两个Servlet之间不需要使用request作用域传数据, 则使用请求重定向。