1、Web开发简述
1.1、什么是Web
Web(互联网总称)
web(World Wide Web)即全球广域网,也称为万维网,它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。
1.2、什么是JavaWeb开发
Java Web:是用Java技术来解决相关Web互联网领域的技术综合。
1.3、JavaWeb开发中的资源
静态web资源
HTML
CSS
JavaScript(js)
动态web资源
Servlet
JSP
1.4、URL请求路径
URL(Uniform Resource Locator),统一资源定位符是对互联网上资源位置的一种表示,互联网上的每
个文件都有一个唯一的URL。
完整格式如下:
协议://域名:端口号/资源位置?参数=值&参数2=值&参数3=值
●协议:http、https、ftp等
●域名:域名或IP地址,都可以访问WEB资源
●端口号:程序必须使用端口号,才可以让另一个计算机访问。http协议的默认端口:80 ,https协议默认的端口:443
●资源位置:用于描述WEB资源在服务器上的位置
●参数=值:浏览器和服务器交换传递的数据
例如:
https://www.baidu.com
https://www.jd.com
1.5、软件开发的结构分类
(1)CS结构的软件
CS:Client/Server 客户端和服务器,这种软件往往需要安装,比如:QQ、迅雷、播放器
优缺点:
优点:
●可以减轻服务器压力,将部分代码写到客户端
●界面美观、速度快
缺点:
●一旦服务器更新类,客户端也需要更新
●分布式开发比较弱
●人力资源成本大
(2)BS结构的软件
BS:Browser/Server 浏览器和服务器,这种软件不需要安装,只需要通过浏览器就可以访问。
优缺点:
优点:
●只需要专注于服务器端的开放即可
●分布式开发比较强
缺点:
●服务器端压力会比较大
●对带宽的要求比较高
1.6、WEB服务器
服务器:
硬件:其实就是一台电脑(高配电脑)
软件:需要安装在电脑上,为Web应用程序提供服务,所以称为Web服务器的软件
请求和响应流程图:
1.7、常见的WEB服务器
常见的WEB服务器:
Tomcat:Apache组织提供的一个开源的免费的WEB服务器,满足JavaEE的Servlet和JSP的规范
WebSphere:IBM公司开发的一个收费的大型WEB服务器,满足了JavaEE所有的规范
WebLogic:BEA公司开发的一个收费的大型WEB服务器,满足了JavaEE所有的规范
IIS:应用在.NET平台上,asp
Apache:应用在PHP平台上
2、HTTP协议
2.1、Http简介
什么是Http协议
HTTP协议:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。用于定义WEB浏览器与WEB服务器之间交换数据的过程。
必须先有请求,才会有响应
Http协议的作用及特点
HTTP协议的作用:
HTTP协议是学习JavaWEB开发的基石,不深入了解HTTP协议,就不能说掌握了WEB开发,更无法管理和维护一些复杂的WEB站点。
HTTP协议的特点:
●基于请求/响应模型的协议。
■请求和响应必须成对;
■先有请求后有响应。
●简单快捷
■因为发送请求的时候只需要发送请求方式和请求路径即可
●HTTP协议默认的端口:80
■例如: http://www.bdit.com:80
●HTTP协议是一种明文协议
●HTTP协议是一种无状态协议(无状态指的是服务器端并不会记录客户端的任何信息)
Http协议的版本
HTTP/1.0,发送请求,创建一次连接,获得一个web资源,连接断开。
HTTP/1.1,发送请求,创建一次连接,获得多个web资源,连接断开。
HTTP协议有两种报文格式:
请求报文:由客户端向服务器端发出的报文。
响应报文:从服务端到客户端的报文。
2.2、Http协议详解
2.2.1、Http请求报文详解
HTTP请求报文:由客户端向服务器端发出的报文。
HTTP请求报文格式:包含请求行、请求头、空行、请求体 四个部分
【只有POST请求时,才会有请求体,如果是get请求,给服务器端的数据会直接放在URL的后面】
请求行
例如:POST /web01/login.html HTTP/1.1
请求行必须在HTTP请求格式的第一行。
请求行格式:请求方式 资源路径 协议/版本
请求方式:协议规定7种,常用两种:GET和POST
GET请求:
将请求参数追加在URL后面,不安全。例如:login.html?username=tom&password=1234
URL长度限制GET请求方式的数据大小。
没有请求体
POST请求
请求参数显示请求体处,较安全。
请求数据大小没有显示。
只有表单设置为method=”post”才是post请求.其他的都是get请求。
常见GET请求:地址栏直接访问、< a href=””>、< img src=””> 等
请求头
请求头: 描述了客户端向服务器发送请求时使用的http协议类型,所使用的编码,以及发送内容的长度,referer,等等。
请求头也是用的键值对key:value
常见请求头 | 描述 |
---|---|
Referer | 浏览器通知服务器,当前请求来自何处。如果是直接访问,则不会有这个头。常用于:防盗链 |
Cookie | 与会话有关技术,用于存放浏览器缓存的cookie信息。 |
User-Agent | 浏览器通知服务器,客户端浏览器与操作系统相关信息 |
请求体
通常情况下,只有post请求方式才会使用到请求体,请求体中都是用户表单提交的数据,每一项数据都使用键 值对key=value,多组值使用&相连。
例如:username=tom&password=1234
MIME类型
就是互联网中的内容类型的标准
html----》text/html
css----》 text/css
jpg------》image/jpg
Http请求报文演示
创建页面,编写“login.html”,并提供表单,分别设置表单的提交方式为:get和post。将表单提交位置设置成#,表示提交到当前表单。
<form action="#" method="post">
用户名:<input type="text" name="username" value=""/> <br/>
密 码:<input type="text" name="password" value=""/> <br/>
<input type="submit" />
</form>
观看下图,我们采用GET请求方式、POST请求方式的抓包结果:(Chrome浏览器)
GET请求抓包数据:
POST请求抓包数据:
2.2.2、 Http响应报文详解
响应报文:从服务端到客户端的报文。
HTTP响应报文格式:响应行、响应头、空行、响应体 四个部分
响应行
例如:HTTP/1.1 200 OK
格式:协议/版本 状态码 状态码描述
状态码:服务器与浏览器用于确定状态的固定数字号码
200 :请求成功。
302 :请求重定向。
304 :请求资源没有改变,访问本地缓存。
404 :请求资源不存在。通常是用户路径编写错误,也可能是服务器资源已删除。
500 :服务器内部错误。通常程序抛异常。
响应头
响应头: 用来描述服务器回给客户端浏览器的content的一些描述,例如: 我是什么服务器,我返回的是啥编码,我返回的内容有多长等等
响应头也是用的键值对 key:value
常见请求头 | 描述 |
---|---|
Location | 指定响应的路径,需要与状态码302配合使用,完成跳转 |
Content-Disposition | 文件下载的时候使用。通过浏览器以下载方式解析正文 |
Set-Cookie | 与会话相关技术。服务器向浏览器写入cookie |
Refresh | 定时刷新 |
响应体
响应体,就是服务器发送给浏览器的正文。
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="#" method="post">
用户名:<input type="text" name="username" value=""/> <br/>
密 码:<input type="text" name="password" value=""/> <br/>
<input type="submit"/>
</form>
</body>
</html>
Http响应报文演示
如下图,我们提供的响应的抓包结果(Chrome浏览器)
3、Servlet
3.1、Servlet的概述
什么是Servlet
Servlet(Server Applet)是Java Servlet的简称,称为服务器端小程序,Servlet它是用Java编写的一个服务端程序,没有main方法,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据、生成动态WEB内容。
狭义的Servlet是指Java语言实现的一个接口
广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,将Servlet理解为后者,Servlet运行于支持Java的应用服务器中,简单的来说,Servlet必须运行在一个Web容器中,tomcat就是一个这样的容器。
Servlet是支持多线程的,每个请求对应一个线程,效率高,但是同时也存在线程安全问题,所以为了避免线程安全问题,不建议在Servlet中操作成员(全局)变量。
Servlet它可以接收用户的请求,然后处理请求,并能够做出响应。
3.2、使用Servlet
编写一个Java类实现Servlet的接口
在web.xml中,配置Servlet
3.2.1、Servlet的入门
步骤1,创建包和类,实现Servlet接口
package com.bdit.servlet;
import javax.servlet.*;
import java.io.IOException;
/*** Servlet入门示例 */
public class HelloWorldServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/** 用来处理用户的请求,并且对请求作出响应的方法
*@param servletRequest 代表的是请求对象
* @param servletResponse 代表的是响应对象
* @throws ServletException
* @throws IOException
* */
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("==================我的第一个Servlet程序 =================");
//响应,给客户端浏览器输出一个HelloServlet
servletResponse.getWriter().println("Hello Servlet");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
步骤2,在web.xml配置Servlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--配置Servlet-->
<servlet>
<!--用来给Servlet 指定一个对象名-->
<servlet-name>helloWorldServlet</servlet-name>
<!--指定当前Servlet类的全限定名-->
<servlet-class>com.bdit.servlet.HelloWorldServlet</servlet-class>
</servlet>
<!--配置Servlet的访问路径(映射关系)-->
<servlet-mapping>
<!--配置关联的Servlet名称-->
<servlet-name>helloWorldServlet</servlet-name>
<!--配置Servlet的访问路径,访问路径必须以/开头-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
步骤3,访问Servlet
http://localhost:8080/servlet_base1/hello
3.3、Servlet程序执行的原理
Tomcat容器(引擎)执行的操作:
●接受并解析客户端浏览器的请求URL“/servlet_base1/hello”
●在web.xml中根据请求的路径,找到对应的Servlet
●Tomcat会创建当前Servlet对象并为对象做一些初始化的工作,同时还会创建request,response对象
●调用Servlet中的service方法来处理请求,并作出响应,响应的数据会写在response对象的缓冲区中
●service方法结束后,数据从response对象的缓冲区中取出,组装成HTTP的响应信息,交给tomcat容器
●最终,再由tomcat容器,把响应的结果,回传给客户端的浏览器。
3.4、Servlet生命周期
Servlet对象的创建和生命周期的管理,统统都是由tomcat容器来负责的。我们必须要清楚容器是怎么管理Servlet的生命周期?
【用户发送request,首先请求先到达web容器,然后web容器根据请求的路径,去和web.xml文件中进行相应 信息的查找。然后根据对应的路径,就可以找到相应的Servlet类。这个时候,容器会先判断当前Servlet的 实例在容器中是否已经存在,如果没有,容器则会立马调用当前Servlet的无参数的构造方法,创建对象,对 象创建完后,容器会立马自动回调Init方法,对Servlet对象进行一些初始化的工作,然后容器会自动回调 service方法,service方法否则对用户请求进行处理。当web容器停止时,容器会自动回调servlet中的 destroy方法,进行servlet实例的销毁,释放所占系统资源。】
●init(ServletConfig config) Servlet对象的初始化方法,对象被创建的时候自动回调
在Servlet生命周期中,仅执行一次init()方法
●service(request,response)客户端访问一次,执行一次
它是Servlet的核心,每当客户端发送一个请求,都要交给service方法来处理,同时它还能作出 响应
●destory()方法,Servlet对象销毁时调用
仅执行一次,当Servlet从Web容器中移除或者Web容器关闭服务的时候Servlet对象被销毁,然后垃圾回收器就会将Servlet对象回收
Servlet对象什么时候被创建:
默认情况下,第一次访问的时候,对象被创建
也可以在tomcat容器启动时就创建Servlet的对象,需要修改web.xml(一般不配置),如下:
<servlet>
<servlet-name>lifeCycleServlet</servlet-name>
<servlet-class>com.bdit.servlet.LifeCycleServlet</servlet-class>
<!--容器启动时,就创建servlet的对象,正整数,值越小优先级越高-->
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>lifeCycleServlet</servlet-name>
<url-pattern>/life</url-pattern>
</servlet-mapping>
生命周期,理解参考图:
生命周期,Servlet示例代码:
package com.bdit.servlet;
import javax.servlet.*;
import java.io.IOException;
/*** Servlet生命周期示例 */
public class LifeCycleServlet implements Servlet {
public LifeCycleServlet() {
System.out.println("================LifeCycleServlet无参数的构造方法 ================");
}
/**** @param servletConfig * @throws ServletException */
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("=============对Servlet对象进行一系列初始化的工作 ==============");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("==================处理用户的请求,并作出响应 ===============");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("====================销毁Servlet对象,释放资源 ==============");
}
}
3.5、Servlet的启动时加载(了解)
3.5.1、 什么是Servlet启动时加载
Servlet启动时加载,就是让Web(Tomcat)容器启动的时候创建Servlet对象
【Servlet默认情况下,是第一次访问时,才会创建Servlet对象】
3.5.2、 为什么使用启动时加载
Servlet对象是第一次被访问的时候会被创建,然后执行init方法,进行初始化。
假如在init方法中做了一些比较耗时的操作(例如,加载了一些配置文件并且解析,这个过程可能会消耗3-5秒),那么,第一次访问这个Servlet的时候,需要等待3-5秒。解决办法,我们通过配置Servlet启动时加载就可以避免第一次访问Servlet,等待3-5秒类。
配置Servlet启动时加载,需要修改web.xml文件,格式如下,配置后,Tomcat服务器启动时就会完成Servlet对象的创建
<load-on-starup>...</load-on-starup>
值为正整数,值越小优先级越高
<servlet>
<servlet-name>lifeCycleServlet</servlet-name>
<servlet-class>com.bdit.servlet.LifeCycleServlet</servlet-class> <!--容器启动时,就创建servlet的对象,正整数,值越小优先级越高-->
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>lifeCycleServlet</servlet-name>
<url-pattern>/life</url-pattern>
</servlet-mapping>
3.6、Servlet的访问路径
url-pattern的配置有三种方式:
●完全匹配
●目录匹配(模糊匹配)
●扩展名匹配
1.完美匹配
/path :浏览器地址栏必须写 /path
2.目录匹配(模糊匹配)
/aaa/bbb/*:浏览器地址栏可以写 /aaa/bbb/任意
3.扩展名匹配
*.do :浏览器地址栏可以写 任意.do
注意:目录匹配和后缀名不能同时使用
错误的写法: /aa/bb/*.do
示例代码:
<!--配置Servlet-->
<servlet>
<!--用来给Servlet 指定一个对象名-->
<servlet-name>helloWorldServlet</servlet-name>
<!--指定当前Servlet类的全限定名-->
<servlet-class>com.bdit.servlet.HelloWorldServlet</servlet-class>
</servlet>
<!--配置Servlet的访问路径(映射关系)-->
<servlet-mapping>
<!--配置关联的Servlet名称-->
<servlet-name>helloWorldServlet</servlet-name>
<!--配置Servlet的访问路径,访问路径必须以/开头-->
<url-pattern>/hello</url-pattern>
<!--模糊匹配或者目录匹配-->
<url-pattern>/bdit/java/*</url-pattern>
<!--扩展名,如果是匹配模式,不需要添加/-->
<url-pattern>*.abc</url-pattern>
<url-pattern>/bdit.do</url-pattern>
<!--默认访问路径-->
<url-pattern>/*</url-pattern>
</servlet-mapping>
总结:tomcat获取路径时,访问优先级顺序:完全匹配路径 > 目录匹配(模糊匹配) > 扩展名匹配 >缺省路径(默认路径)
我们在开发中,Servlet配置路径选择完全匹配。
3.7、 Tomcat的全局web.xml配置标签
tomcat安装目录中/conf/web.xml是全局配置文件,所有的WEB项目都使用
我们web项目中的web.xml文件中,也可以配置全局的属性,针对当前整个项目起作用。
<!--配置项目默认页面-->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
</welcome-file-list>
注意,如果项目中web.xml的配置和tomcat全局的web.xml配置冲突了,用我们自己配置的参数作为条件。
4、HttpServlet
4.1、HttpServlet概述
SUN设计Servlet之初,考虑互联网中使用的协议不仅仅只是http协议,为了支持更多的协议,Servlet采用了接口的设计思想。
HttpServlet是一个与HTTP协议相关的Servlet,专门用来处理HTTP协议的请求和响应。
●在HttpServlet类的service方法内部,根据HTTP协议请求方式不同,执行不同的doXXX的方法(get请求执行doGet方法,如果是post请求就会执行doPost方法)
●继承类HttpServlet之后,不需要重写service方法,只需要重写doGet和doPost方法即可。
package com.bdit.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HttpServletDemo1 extends HttpServlet {
/**doGet方法对应客户端的Get请求方式
*@param req * @param resp
*@throws ServletException
*@throws IOException
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("====================使用的get请求 ===================");
doPost(req, resp);
}
/**doPost方法对应客户度的post请求方式
*无论post请求还是get请求,都可以处理,可以通过doGet和doPost的互相调用
*@param req * @param resp
*@throws ServletException
*@throws IOException
**/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("==================使用post请求 =======================");
}
}
4.2、Servlet版本和JavaEE版本对应关系
Servlet版本 | JavaEE版本 |
---|---|
4.0 | 8.0 |
3.1 | 8.0 |
3.1 | 7.0 |
3.0 | 6.0 |
2.5 | 5.0 |
●Servlet2.5版本
○Servlet、过滤器Filter、监听器Listener的声明必须使用web.xml
●Servlet3.0版本开始
○新增注解的支持,用于简化Servlet、过滤器、监听器的配置,所以从3.0开始web.xml不再是必选的。
4.3、基于注解的Servlet
@WebServlet,注解添加到自定义的Servlet中的类声明上即可,注解的属性value和urlPatterns,都是用来指定访问该Servlet的url,它俩只能同时出现一个。
package com.bdit.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "demo2", urlPatterns = {"/demo2"})
public class AnnotationServletDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("=================基于注解的Servlet post请求 ================");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("=================基于注解的Servlet get请求 ================");
}
}