JavaWeb
集合多天关于JavaWeb开发的学习笔记。利用Servlet开发web应用程序很高效。接下来将学习使用Spring MVC开发web应用程序。
基本概念
- web开发
- web就是网页的意思,如www.baidu.com
- 静态web
- html,css
- 提供给所有人看的数据始终不会发生变化
- 动态web
- 淘宝,几乎是所有网站
- 提供给所有人看的数据始终会发生变化,每个人在不同时间,不同地点看到的网页信息各不相同
- 技术栈:Servlet/JSP,ASP,PHP
- 在Java中,动态web资源开发的技术统称为JavaWeb
- web应用程序:可以提供浏览器访问的程序
- xxx.html…多个web资源,这些资源可以被外界访问,对外界提供服务
- 我们能访问到的任何一个页面或者资源,都存在于这个世界上某一台计算机上
- 统一的web资源会被放在同一个文件夹下,web应用程序–>Tomcat服务器
- 一个web应用由多个部分组成(静态web,动态web)
- html,css,js
- jsp,servlet
- Java程序
- jar包
- 配置文件(properties)
- web应用程序编写完毕后,若想提供给外界访问,需要一个服务器来统一管理
- 静态web
- *.htm,*.html
- 静态web缺点
- web页面无法动态更新,所有用户看到的都是同一个页面
- 轮播图,点击特效:伪动态
- JavaScript:实际开发使用最多
- VBScript
- 无法和数据库交互(数据无法持久化,用户无法交互)
- web页面无法动态更新,所有用户看到的都是同一个页面
- 动态web
- 页面会动态展示,web页面的展示效果因人而异
- 优点
- web页面可以动态更新,提供多样化服务
- 可以于数据库交互(数据持久化:注册,商品信息,用户信息…)
- 缺点
- 若服务器的动态web资源发生错误,需要重新编写后台程序,停机维护,重新发布
web服务器
分类
-
ASP
- 微软:国内最早流行的服务器
- 在HTML嵌入VB脚本,ASP+COM
- 在ASP开发中,基本一个页面都有几千行业务代码,页面及其混乱
- 维护成本高
- C#
-
PHP
- PHP开发速度很快,功能很强大,跨平台,代码简单
- 无法承担大访问量
-
JSP/Servlet
- sun公司主推的B/S架构
- 基于Java语言(所有大公司,或者一些开源组件,都是用Java写的)
- 可以承载三高问题带来的影响
- 语法像ASP
-
IIS
- 微软windows自带
-
Tomcat
- 实际上运行JSP页面和Servlet
- 免费开源web服务器,属于轻量级应用服务器
- 在中小型系统和并发用户不多的场合下被普遍使用
- 开发和调试JSP程序的首选
- JavaWeb初学者最佳选择
网站结构
- JavaWeb网站结构
|--RootDir :Tomcat服务器的web目录
|--webapp:网站目录名
|--WEB-INF
|--classes:Java程序
|--lib:web应用所依赖的jar包
|--web.xml:网站配置文件
|--index.html:默认首页
|--static
|--css
|--style.css
|--js
|--img
|--......
Servlet
Servlet简介
- Servlet(Server Applet)是 Java Servlet 的简称,是使用 Java 语言编写的运行在服务器端的程序。具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容
- 通常来说,Servlet 是指所有实现了 Servlet 接口的类
- Servlet 主要用于处理客户端传来的 HTTP 请求,并返回一个响应,它能够处理的请求有 doGet() 和 doPost() 等
- Servlet 由 Servlet 容器提供,Servlet 容器是指提供了 Servlet 功能的服务器(如 Tomcat)
- Servlet 容器会将 Servlet 动态加载到服务器上,然后通过 HTTP 请求和 HTTP 应与客户端进行交互
- Servlet 应用程序的体系结构如下图所示
- Servlet 的请求首先会被 HTTP 服务器(如 Apache)接收,HTTP 服务器只负责静态 HTML 页面的解析,而 Servlet 的请求会转交给 Servlet 容器,Servlet 容器会根据 web.xml 文件中的映射关系,调用相应的 Servlet,Servlet 再将处理的结果返回给 Servlet 容器,并通过 HTTP 服务器将响应传输给客户端
- Servlet技术特点
- 方便
- Servlet 提供了大量的实用工具例程,如处理很难完成的 HTML 表单数据、读取和设置 HTTP 头,以及处理 Cookie 和跟踪会话等
- 跨平台
- Servlet 使用 Java 类编写,可以在不同的操作系统平台和不同的应用服务器平台运行
- 灵活性和可扩展性强
- 采用 Servlet 开发的 Web 应用程序,由于 Java 类的继承性及构造函数等特点,使得应用灵活,可随意扩展
- 除了上述几点以外,Servlet 还具有功能强大、能够在各个程序之间共享数据、安全性强等特点
- 方便
Servlet相关接口和类
-
在 Servlet 接口中定义了 5 个抽象方法
其中 init()、service() 和 destroy() 方法可以表现 Servlet 的生命周期,它们会在某个特定的时刻被调用 -
Servlet 的接口有两个默认的接口实现类:GenericServlet 和 HttpServlet
- GenericServlet 是一个抽象类,该类为 Servlet 接口提供了部分实现,它并没有实现 HTTP 请求处理
- HttpServlet 是 GenericServlet 的子类,它继承了 GenericServlet 的所有方法,并且为 HTTP 请求中的 GET 和 POST 等类型提供了具体的操作方法。通常情况下,编写的 Servlet 类都继承自 HttpServlet,在开发中使用的也是 HttpServlet 对象
-
HttpServlet 类中包含两个常用方法
-
HttpServlet 主要有两大功能,具体如下
- 根据用户请求方式的不同,定义相应的 doXxx() 方法处理用户请求。例如,与 GET 请求方式对应的 doGet() 方法,与 POST 方式对应的 doPost() 方法
- 通过 service() 方法将 HTTP 请求和响应分别强转为 HttpServletRequest 和 HttpServletResponse 类型的对象
-
需要注意的是,由于 HttpServlet 类在重写的 service() 方法中,为每一种 HTTP 请求方式都定义了对应的 doXxx() 方法,因此,当定义的类继承 HttpServlet 后,只需要根据请求方式重写对应的 doXxx() 方法即可,而不需要重写 service() 方法
Servlet生命周期
-
Servlet声明周期如下图
-
按照功能的不同,大致可以将 Servlet 的生命周期分为三个阶段,分别是初始化阶段、运行阶段和销毁阶段
-
初始化阶段
- 当客户端向 Servlet 容器发出 HTTP 请求要求访问 Servlet 时,Servlet 容器首先会解析请求,检查内存中是否已经有了该 Servlet 对象,如果有,则直接使用该 Servlet 对象,如果没有,则创建 Servlet 实例对象,然后通过调用 init() 方法实现 Servlet 的初始化工作。需要注意的是,在 Servlet 的整个生命周期内,它的 init() 方法只能被调用一次
-
运行阶段
- 这是 Servlet 生命周期中最重要的阶段,在这个阶段中,Servlet 容器会为这个请求创建代表 HTTP 请求的 ServletRequest 对象和代表 HTTP 响应的 ServletResponse 对象,然后将它们作为参数传递给 Servlet 的 service() 方法
- service() 方法从 ServletRequest 对象中获得客户请求信息并处理该请求,通过 ServletResponse 对象生成响应结果
- 在 Servlet 的整个生命周期内,对于 Servlet 的每一次访问请求,Servlet 容器都会调用一次 Servlet 的 service() 方法,并且创建新的 ServletRequest 和 ServletResponse 对象,也就是说,service() 方法在 Servlet 的整个生命周期中会被调用多次
-
销毁阶段
- 当服务器关闭或 Web 应用被移除出容器时,Servlet 随着 Web 应用的关闭而销毁。在销毁 Servlet 之前,Servlet 容器会调用 Servlet 的 destroy() 方法,以便让 Servlet 对象释放它所占用的资源。在 Servlet 的整个生命周期中,destroy() 方法也只能被调用一次
-
-
需要注意的是,Servlet 对象一旦创建就会驻留在内存中等待客户端的访问,直到服务器关闭或 Web 应用被移除出容器时,Servlet 对象才会销毁
Servlet配置虚拟路径映射
- 在 web.xml 文件中,一个 <servlert-mapping> 元素用于映射一个 Servlet 的对外访问路径,该路径也称为虚拟路径
- 创建好的 Servlet 只有映射成虚拟路径,客户端才能对其进行访问
Servlet多重映射
- Servlet 的多重映射指同一个 Servlet 可以被映射成多条虚拟路径。也就是说,客户端可以通过多条路径实现对同一个 Servlet 的访问。Servlet 实现多重映射的两种方式:
- 配置多个 <servlet-mapping> 元素
可以通过浏览器输入地址http://localhost:8080/dmeo/Test01和http://localhost:8080/dmeo/TestServlet01访问同一个servlet对象<servlet-mapping> <!-- 映射为Test01 --> <servlet-name>TestServlet01</servlet-name> <url-pattern>/Test01</url-pattern> </servlet-mapping> <servlet-mapping> <!-- 映射为TestServlet01--> <servlet-name>TestServlet01</servlet-name> <url-pattern>/TestServlet01</url-pattern> </servlet-mapping>
- 配置多个 <url-pattern> 子元素
<servlet-mapping> <!-- 映射为TestServlet01和Test01 --> <servlet-name>TestServlet01</servlet-name> <url-pattern>/TestServlet01</url-pattern> <url-pattern>/Test01</url-pattern> </servlet-mapping>
- 配置多个 <servlet-mapping> 元素
Servlet映射路径中使用通配符
- 在实际开发过程中,开发者有时会希望某个目录下的所有路径都可以访问同一个 Servlet,这时,可以在 Servlet 映射的路径中使用通配符*。通配符的格式有两种,具体如下。
- 格式为“*.扩展名”,例如 *.do 匹配以 .do 结尾的所有 URL 地址
- 格式为 /*,例如 /abc/* 匹配以 /abc 开始的所有 URL 地址
- 以上两种通配符的格式不能混合使用。例如,/abc/*.do 是不合法的映射路径
- 另外,当客户端访问一个 Servlet 时,如果请求的 URL 地址能够匹配多条虚拟路径,那么 Tomcat 将采取最具体匹配原则查找与请求 URL 最接近的虚拟映射路径
默认Servlet
- 如果某个 Servlet 的映射路径仅仅是一个正斜线(/),那么这个 Servlet 就是当前 Web 应用的默认 Servlet
- Servlet 服务器在接收到访问请求时,如果在 web.xml 文件中找不到匹配的 <servlet-mapping> 元素的 URL,则会将访问请求交给默认 Servlet 处理,也就是说,默认 Servlet 用于处理其他 Servlet 都不处理的访问请求
- 配置默认Servlet
<servlet> <servlet-name>De