JavaWeb阶段:servlet
文章目录
一、网络应用体系结构
1.C/S(client-server)
- 交互特点 : 基于客户端软件 与 服务器的模式。 要使用C/S结构网络应用必须下载对应的客户端软件。
- 优点:
图形化效果好,用户使用的视觉体验好。 - 弊端:
服务器端一旦升级,所有的客户端都必须升级。
2.B/S(browser-server)
- 交互特点:基于客户端浏览器 与 服务器的模式。
- 优点:
PC上只要具备一个浏览器,就能访问和使用B/S结构的应用。
服务端升级, 不会强制要求客户端升级, 即不影响客户端的使用。 - 缺点:
图形化效果无法做到与C/S结构一样的绚丽。
二、基于B/S结构的WEB应用
1.静态WEB应用
-
静态WEB应用是指以html资源作为服务器中的资源文件, 用户请求的时候,服务器是以一个html作为响应的结果(html是目标处理请求的最终资源)。
-
缺陷:
① 不支持对数据库的访问操作。② 随着用户需求的不断增长,网站系统的内部势必要组织越来越多的html网页以适应用户的需求。
③ 一个html网页,只能应对一种类型的需求。 html网页不能根据用户不同的需要求展示不同的内容。
2.动态WEB应用
-
动态WEB应用是以一个程序作为最终处理用户请求的资源,程序处理完请求将结果响应给客户端。
-
特点:
① 程序可以编写访问数据库的代码的。② 可以根据用户不同的需求, 到数据库查询不同的数据响应给客户端。
三、Servlet简介
- Servlet主要是用于编写JavaWeb动态WEB应用。 Servlet是 JavaEE规范中的一个子规范, 它是运行于WEB应用服务器端的一段 Java程序 。
- 如何开发Servlet应用程序:
2.1 必须编写一个类去实现 javax.servlet.Servlet接口 - Servlet主要作用: 用于生成动态网页 。
注意: 如果修改了servlet程序源代码 或 修改了web.xml中的信息, 需要重新编译 、重新部署项目。
-
客户端浏览器向 tomcat服务器的servlet发送请求到响应的大概流程
4.1客户端向服务器的某个Servlet发起请求
4.2tomcat服务器接收到请求,并开始解析请求的路径,明确请求的是哪个项目中的那个url-pattern的servlet
4.3然后去解析对应项目中的web.xml,找到目标调用的servlet实现类, 根据servlet实现类的全限定名通过反射的方式创建对象。
4.4自动调用 service方法处理请求
4.5请求处理完毕,程序使用IO流向客户端响应结果
-
编写web应用部署描述符:web.xml
Servlet的生命周期
- 初始化
1.1 第一种时机: 当客户端浏览器第一次请求一个Servlet的时候,tomcat会创建目标Servlet对象。
1.2 第二种时机: 需要开发人员在web.xml中手动配置。可配置当前servlet启动服务器的时候创建。 - 服务
执行Servlet实现类的service方法提供处理请求的服务。 - 销毁
3.1 在关闭服务器的时候销毁
PS: Servlet实例在tomcat服务器中是一个单例对象。 默认向tomcat中的一个servlet发起请求时,tomcat首先会检查一下当前的服务器中,是否有请求的servlet实例, 如果有直接调用。 如果没有则新创建目标servlet对象。
在多线程并发的场景下,servlet属于临界资源, 是线程不安全的对象。 所以通常不建议在Servlet实现类中定义成员变量。
实现Servlet的几种方式
- 写一个类实现Servlet接口
- 写一个类继承GenericServlet抽象类:这个类实现了Servlet接口。
- 写一个类继承HttpServlet抽象类【重点】:HttpServlet是专门设计用于处理Http请求相关的问题,这个类继承了GenericServlet 。
URL、URI、url-pattern的概念
- URL : 统一资源定位符,主要作用是在互联网上唯一的标识一个资源。
http://IP:PORT/项目名/url-pattern或静态资源相对路径
- URI : 统一资源描述符, 用于在服务器中唯一的标识一个资源。
/项目名/url-pattern或静态资源相对路径
- url-pattern : 如果是一个Serlvet程序,那就是在web.xml中的url-pattern标签的配置。
请求一个Servlet的几种方式
-
浏览器地址栏请求:
-
HTML页面超链接请求
-
HTML页面表单请求
客户端与服务器之间数据交互的方式
- 使用表单向服务器提交数据
- 使用超链接拼接请求数据
小结: 服务器获取请求参数 的方法 String str = request.getParameter(请求参数的key);
- 使用request作用域传值与获取
request.setAttribute(要传的值的名字,要传的值);
request.getAttribute(要获取的值的名字);
处理请求数据编码
- 处理表单POST方式请求中文乱码:
- 处理GET方式提交的中文乱码
修改tomcat/conf/server.xml 文件,指定编码
servlet整合JDBC开发
- 搭建开发环境
1.1引入数据库驱动jar
1.2引入jdbc.properties和 JDBC工具类 - 编码
2.1 创建表
2.2 封装实体类
2.3 编写DAO: DAO接口 + DAO接口实现类
2.4 编写service: Service接口+ Service实现类
然后先测试一下
2.5 编写Servlet : 写类继承HttpServlet抽象类、然后编写 web.xml
关于调错:
404 是找不到资源,检查请求路径,或检查项目有没有部署。
500 是你后台的代码有错误。
405 检查请求的servlet是否正确继承了HttpServlet, 或检查覆盖的方法service的声明是否正确。
请求转发(forward)
-
什么是请求转发:请求转发机制可以将两个Servlet连接到一起,形成一个工作流,共同完成一个业务需求。使用请求转发可以在两个Servlet之间进行跳转。
-
如何使用请求转发从一个Servlet跳转到另一个Servlet
-
请求转发的特点
3.1 请求转发的地址栏不变。 请求转发的动作发生在服务器的内部。
3.2 请求转发连接的两个Servlet处于同一次请求中。
3.3 请求转发连接的两个Servelt,只有最后一个可以向客户端响应结果。
request作用域
- request作用域 : request作用域可以存储命名属性, 同一个request作用域中的命名属性(数据)可以被请求转发连接的两个Servlet共享。
- request作用域的使用
2.1 存值: request.setAttribute(String name,Object value);
2.2 取值: Object value = request.getAttribute(String name); - request作用域生命周期
一次请求有效。 从客户端发起请求 到 结果响应结束。 - request作用域中数据共享范围: 一次请求; 一次请求连接的 servlet中可以共享。
请求重定向 (redirect)
- 请求重定向可以完成从一个Servlet跳转到另一个 Servlet。
- 如何使用请求重定向跳转:
response.sendRedirect(下一个Servlet的URI); - 请求重定向特点
3.1 地址栏改变 。
3.2 请求重定向连接的两个 Servlet,处于两次请求中。不能使用request作用域传递数据。
请求转发和请求重定向的使用场景
- 如果两个 Servlet之间需要使用request作用域传递数据, 则使用请求转发。
- 如果两个Servlet之间不需要使用request作用域传数据, 则使用请求重定向。