day01

目录

一、Web 发展历史

1. 通信条件

2. 服务器

二、JavaWeb 

1. 简介

2. C/S 体系结构

3. B/S 体系结构

三 、Web应用程序

1. 工作原理

2. 应用技术

四、Tomcat

1. 概念

2. Tomcat 目录结构

3. Eclipse  关联 Tomcat

五、HTTP协议

1. 主要特点

2. HTTP 请求

2. HTTP 响应

六、Servlet 实现

1. Servlet 简介

2. 实现步骤

3. 工作原理

4. Servlet 的生命周期

5. Servlet 的配置


一、Web 发展历史

1. 通信条件

  • 需要有服务器端(server) :等待被请求,需要暴露 ip 和 port
  • 需要有客户端(client):主动发起请求 ,知晓服务端的 ip 和 port
  • 通信规则(协议):TCP/IP 协议

2. 服务器

(1)服务器的由来

当客户端请求的资源越来越丰富,需求越来越复杂,程序的核心就应该放在解决业务和计算响应数据上,于是出现了服务器 统一接收客户端处理并进行分发到不同的资源,由 各个资源进行处理,最后结果交由服务器响应。

(2)常用服务器

比较常用的有:Tomcat、JBOOS、IBM的 WebSphere、BEA 的 WebLogic 以及 Apache 等。

二、JavaWeb 

1. 简介

  1. Java Web 是用 Java 技术来解决相关 web 互联网领域的技术总和。
  2. Web 包括:web 服务器和 web 客户端两部分。
  3. Java 在客户端的应用有 java applet,使用得很少,Java 在服务器端的应用非常丰富,比如 Servlet,JSP 和第三方框架等等。

2. C/S 体系结构

(1)概念

C/S 是 Client/Server 的缩写,即客户端 / 服务器结构。

(2)特点

这种结构可以充分利用两端硬件环境的优势,将任务合理分配到客户端和服务器,从而降低了系统的通信开销。

同时安全性较高。

day01

3. B/S 体系结构

(1)概念

B/S 是 Browser/Server 的缩写,即 浏览器/ 服务器结构。统一采用如 IE、Firefox、Chrome 等浏览器,通过 Web 浏览器向 Web 服务器发送请求,由 Web 服务器进行处理,并将处理结果逐级传回客户端。

(2)特点

节约了开发成本,是一种全新的软件体系结构。这种体系结构已经成为当今应用软件的首选体系结构。

安全性相对C/S较低。

day01

三 、Web应用程序

1. 工作原理

(1)静态网站

这些网站使用 HTML 语言来编写,放在 Web 服务器上,用户使用浏览器通过 HTTP 协议请求服务器上的 Web 页
面,服务器上的 Web 服务器将接收到 的用户请求处理后,再发送给客户端浏览器,显示给用户。

day01

(2)动态网站

这些网站通常使用 HTML 语言和动态脚本语言(如 JSP、ASP 或者是 PHP 等)编写,并将编写后的程序部署到 Web 服务器上,由 Web 服务器对动态脚本代码进行处理,并转化为浏览器可以解析的 HTML 代码,返回给客户端浏览器,显示给用户。

day01

2. 应用技术

(1)客户端

  • HTML:HTML 语言是客户端技术的基础,主要用于显示网页信息,有浏览器解释执行,它不需 要编译。
  • CSS:CSS 就是一种叫做样式表的技术,也有人称之为层叠样式表。在制作网页时才有用 CSS 样式,可以有效地对页面的布局、字体、颜色、背景和其他效果实现更加精确的控制。
  •  Flash:Flash 是一种交互式矢量动画制作技术,它可以包含动画、音频、视频以及应用程序, 而且 Flash 文件比较小,非常适合在 Web 上应用。
  • 客户端脚本技术:客户端脚本技术是指嵌入到 Web 页面中的程序代码,这些程序代码是一种解释性的语言,浏览器可以对客户端脚本进行解释。应用最广泛的客户端脚本语言是 JavaScript 脚本,它是 Ajax 的重要组成部分。

(2)服务端

比较传统和经典的 Web 服务器端技术主要 有:CGI、ASP、SERVLET/JSP、PHP 等。

JSP:Java Server Page 简称 JSP。JSP 是以 Java 为基础开发的,所以它沿用 Java 强大的 API 功 能。JSP 页面中的 HTML 代码用来显示静态内容部分,嵌入到页面中的 Java 代码与 JSP 标记 用来生成动态的内容。JSP 允许程序员编写自己的标签库来完成应用程序的特定要求。JSP 可以被预编译,提高了程序的运行速度。另外,JSP 开发的应用程序经过一次编译后,便可随时随地运行。所以在绝大部分系统平台中,代码无需做修改即可在支持 JSP 的任何服务器中运行。

Servlet:Servlet 是 Java 早期的 Web 服务器端技术,用 Java 语言编写。无论是从原理和编程方式 上,几乎就是 CGI 的翻版,具有 CGI 的缺点和优点,与 CGI 主要不同的是,Servlet 对每个请求都是单独启动一个线程,而不是进程。

四、Tomcat

1. 概念

omcat 是一个符合 JavaEE WEB 标准的最小的 WEB  容器,所有的 JSP 程序一定要有 WEB 容器的支持才能运行,而且在给定的 WEB 容器里面都会支持事务处理操作。

2. Tomcat 目录结构

  • bin:启动和关闭 tomcat 的 bat 文件。
  • conf:配置文件 server.xml 该文件用于配置 server 相关的信息,比如tomcat 启动的端口号,配置主机(Host) web.xml 文件配置与 web 应用(web 应用相当于一个 web 站点)tomcat-user.xml 配置用户名密码和相关权限。
  • lib:该目录放置运行 tomcat 运行需要的 jar 包。
  • logs:存放日志,当我们需要查看日志的时候,可以查询信息。
  • webapps:放置我们的 web 应用。
  • work 工作目录:该目录用于存放 jsp 被访问后生成对应的 server 文件和.class 文件。

3. Eclipse  关联 Tomcat

Window → preferences → Server → Runtime Environment → add → apache-tomcat-8.0.23

五、HTTP协议

HTTP 协议(Hypertext Transfer Protocol, 超文本传输协议),是一个客户端请求和回应的 标准协议,这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。

1. 主要特点

  • 支持客户端和服务器模式;
  • 请求服务简单快速、传输数据类型灵活;
  • HTTP1.1以后支持持续连接,分摊开销;
  • 无状态协议,对于事务处理没有记忆能力。

2. HTTP 请求

HTTP 请求由三部分组成,分别是:请求行请求头请求正文

(1)请求行

请求行又分为:请求方式、请求路径、请求协议。

(2)请求头

请求头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。

Refere:该请求头指明请求从哪里来

(3)请求正文

请求正文只有POST方式才有,POST Date 里储存了请求传输的参数。

注意:GET请求方式中没有请求体(请求正文)

2. HTTP 响应

在接收和解释请求消息后,服务器返回一个 HTTP 响应消息。HTTP 响应由三个部分组成,分别是:状态行消息报头响应正文

(1)消息报头(响应头)

响应头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对 Request-URI 所标识的资源进行下一步访问的信息。

Refresh:自动跳转(单位是秒),可以在页面通过 meta 标签实现,也可在后台实现。

六、Servlet 实现

1. Servlet 简介

Servlet 本质上也是 Java 类,但要遵循 Servlet 规范进行编写,没有 main()方法,它的创建、使用、销毁都由 Servlet 容器进行管理(如 Tomcat)。

2. 实现步骤

(1)创建动态 web 项目

day01

(2)新建类

day01

(3)实现 Servlet 规范的方式

这里有三种实现方式,无论哪种都需要重写 service 方法。

A. 继承 HttpServlet 类 (推荐此方法

public class Servlet01 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("我的第一个 servlet实现");
		response.getWriter().write("<h1>Servlet01</h1>");
	}	
}

B. 实现 Servlet 接口

public class Servlet02 implements Servlet {
	
	/**
	 * 正常关闭服务器时调用,销毁servlet实例,只会调用一次
	 */
	@Override
	public void destroy() {
		System.out.println("我走了。。。");
	}

	@Override
	public ServletConfig getServletConfig() {
		return null;
	}

	@Override
	public String getServletInfo() {
		return null;
	}
	
	/**
	 * 当servlet被实例化时被调用,只会调用一次
	 */
	@Override
	public void init(ServletConfig arg0) throws ServletException {
		System.out.println("我出生了。。。");
	}
	
	/**
	 * servlet的服务方法,可以调用多次
	 */
	@Override
	public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
		System.out.println("我的第二个servlet实现");
		response.getWriter().write("<h1>Servlet02</h1>");
	}	
}

C. 继承 GenericServlet 类

public class Servlet03 extends GenericServlet{

	@Override
	public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
		System.out.println("我的第三个servlet实现");
		response.getWriter().write("<h1>Servlet03</h1>");
	}	
}

* 查看这三种源码可看出:

HttpServlet 类继承父类 GenericServlet,而 GenericServlet 类又实现了 Servlet 接口 ,所以建议采用继承 HttpServlet 类的方法。

day01

day01

day01

(4)配置 web.xml 文件

 <!-- 
  	注意:
  		1.servlet中servlet-name不能有重复的
  		2.servlet-mapping的url-pattern不能有重复的
   -->
   <!-- servlet01的配置文件 -->
  <servlet>
  	<servlet-name>servlet01</servlet-name> <!-- 给服务器看的名字,与servlet-mapping中的name保持一致 -->
  	<servlet-class>com.shsxt.servlet.Servlet01</servlet-class> <!-- class对应的路径(包名+类型) -->
  </servlet>
  <servlet-mapping>
  	<servlet-name>servlet01</servlet-name> <!-- 给服务器看的名字,与servlet中的name保持一致 -->
  	<url-pattern>/ser01</url-pattern> <!-- 给浏览器访问的路径,servlet的对外访问路径 -->
  </servlet-mapping>

  <!-- servlet02的配置文件 -->
  <servlet>
  	<servlet-name>servlet02</servlet-name>
  	<servlet-class>com.shsxt.servlet.Servlet02</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>servlet02</servlet-name>
  	<url-pattern>/ser02</url-pattern>
  </servlet-mapping>
  
  <!-- servlet03的配置文件 -->
  <servlet>
  	<servlet-name>servlet03</servlet-name>
  	<servlet-class>com.shsxt.servlet.Servlet03</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>servlet03</servlet-name>
  	<url-pattern>/ser03</url-pattern>
  </servlet-mapping>

(5)发布项目并启动服务

day01   day01  day01

(6)启动项目

day01

(7)启动成功

看到一长串的信息,无蓝色下划线的信息,表示启动成功,就可以访问项目了。

day01

(8)访问并查看结果

通过浏览器访问该项目中的资源,tomcat 的端口为 8080,注意格式必须正确。

此次访问的地址为:http://localhost:8080/sd01/ser01

前台页面显示

day01

后台页面显示

day01

这里就说明 servlet 成功实现了。

3. 工作原理

(1)执行过程

客户端发出请求 → 根据 web.xml 文件的配置 → 找到 servlet-mapping 中对应的servlet-name → 读取中的值 → 找到 servlet 中对应的 servlet-name → 找到该 class 并加载执行该 class,返回结果 由 Web 服务器将结果响应给客户端。

下面是执行示意图

day01

4. Servlet 的生命周期

(1)实例和初始化时机

当请求到达容器时,容器查找该 servlet 对象是否存在,如果不存在,则会创建实例并 进行初始化。

init 方法,在 Servlet 实例创建之后执行(证明该 Servlet 有实例创建了)

(2)就绪/调用/服务阶段

有请求到达容器,容器调用 servlet 对象的 service()方法,处理请求的方法在整个声明周 期中可以被多次调用。

service 方法,每次有请求到达某个 Servlet 方法时执行,用来处理请求。

HttpServlet 的 service()方法,会依据请求方式来调用 doGet()或者 doPost() 方法,我们不常用,就算使用,也会在 doGet() 中直接调用doPost() 方法。

(3)销毁时机

当容器关闭时(正常关闭),会将程序中的 Servlet 实例进行销毁。

destroy 方法,Servlet 实例销毁时执行。

(4)示意图

day01

  1. Web Client 向 Servlet 容器(Tomcat)发出 Http 请求
  2. Servlet 容器接收 Web Client 的请求
  3. Servlet 容器创建一个 HttpRequest 对象,将 Web Client 请求的信息封装到这个对象 中
  4. Servlet 容器创建一个 HttpResponse 对象
  5. Servlet 容器调用 HttpServlet 对象的 service 方法,把 HttpRequest 对象与 HttpResponse 对象作为参数,传给HttpServlet对象
  6. HttpServlet 调用 HttpRequest 对象的有关方法,获取 Http 请求信息
  7. HttpServlet 调用 HttpResponse 对象的有关方法,生成响应数据
  8. Servlet 容器把 HttpServlet 的响应结果传给 Web Client

5. Servlet 的配置

  • Servlet 除了配置基本的访问信息,还可以配置初始化参数,自启动等,并且一个 Servlet 可以配置多个访问路径(),还可以使用通配符。
  • url-pattern 可以配多个(一个 servlet 可以通过多个 url-pattern 访问)当多个 servlet 配置成了同一个 url-pattern,报错java.lang.reflect.InvocationTargetExceptionion 通配符 “*”只能放在最前面或最后面,不能放中间且不能单独存在(以/分割的,不能和单词组成整体)。 越精确越优先。