JavaWeb的技术栈:
BS架构:浏览器-服务器架构,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。浏览器请求服务器,服务器把web资源发送给浏览器。
服务器端有很多资源:
1、静态资源:HTML、CSS、JavaScript,负责页面展示
2、动态资源:Servlet、JSP等,主要用来负责逻辑处理,处理完逻辑后会交给静态资源来展示
3、数据库:存储数据
HTTP协议:
作用:主要定义通信规则
浏览器发送请求到服务器,服务器响应数据给浏览器,整个过程都遵守HTTP协议(一种规则)
Web服务器:
负责解析HTTP协议,解析请求数据,发送响应数据。
浏览器按照HTTP协议发送请求和数据,Web服务器根据HTTP协议解析请求和数据,再按照HTTP协议发送给浏览器。
Tomcat是一种Web服务器
Request是从客户端向服务器发出的请求对象
Response是从服务器端响应给客户端的结果对象
JSP是动态网页技术
绘画技术是来存储客户端和服务器交互所产生的数据
过滤器是来拦截客户端的请求
监听器是来监听特定事件
HTTP
超文本传输协议,规定了浏览器和服务器之间的数据传输规则
请求数据和响应数据需要根据指定的格式进行传输
HTTP协议的特点:
1)基于TCP协议:面向连接、安全
2)基于请求-响应模型 的:一次请求对应一次响应,请求-响应是一一对应的关系
3)无状态协议:每次请求-响应都是独立没有记忆的
*缺点:多次请求间不能共享数据
*优点:速度快
利用会话技术来解决多次请求间无法共享数据
请求数据:
请求行、请求头、请求体
请求行: HTTP请求中的第一行数据,请求行包含三块内容,分别是 GET[请求方式] /[请求URL路径]HTTP/1.1[HTTP协议及版本]
请求方式有七种,最常用的是GET和POST
请求头: 第二行开始,格式为key: value形式
请求头中会包含若干个属性,常见的HTTP请求头有:
服务器可以根据请求头中的内容来获取客户端的相关信息。
不同浏览器解析HTML和CSS标签的结果不一致,导致相同的代码在不同的浏览器出现不同的效果,服务器根据客户端请求头中的数据获取到浏览器的类型,可根据不同的浏览器设置不同的代码来达到一致的效果。==》浏览器兼容问题
请求体:post请求的最后一部分,存储请求参数。
请求体和请求头之间是有一个空行隔开
GET和POST请求之间的区别:
1)GET请求参数在请求行中,没有请求体,POST请求的请求参数在请求体中
2)GET请求请求参数大小有限制,POST没有限制
响应数据:
响应行、响应头、响应体
响应行:响应数据的第一行,响应行包含三块内容,分别是 HTTP/1.1[HTTP协议及版本] 200[响应状态码] ok[状态码的描述]
响应头:第二行开始,格式为key:value形式
响应头中会包含若干个属性,常见的HTTP响应头有:
响应体:存放响应数据。与响应头之间有个空行隔开
响应状态码:
200 ok 客户端请求成功
404 Not Found 请求资源不存在
500 Internal Server Error 服务端发生不可预期的错误
Maven创建web项目
在Tomcat中运行的绝大多数是web项目,使用Maven工具能更简单快捷的创建web项目。
web项目结构分为两种:
1)开发中的项目
2)开发完可部署的web项目
开发项目可通过Maven打包命令:package,获取到部署的web项目目录
编译后的java字节码文件和resources的资源文件,会放到WEB-INF下的classes目录下
pom.xml中依赖坐标对应的jar包,会被放到WEB-INF中的lib目录
Maven来创建Web项目有两种方式:
1)使用骨架
2)不使用骨架
注意:上述两种方式创建web项目都不齐全,需要手动补充内容。推荐不使用骨架。
Tomcat
web服务器是一个应用程序,对HTTP协议的操作进行封装
Web服务器是安装在服务器端的一款软件
Tomcat是一款软件,开源的轻量级web服务器,支持servlet、jsp少量JavaEE规范。
Tomcat也被成为web容器、servlet容器。Servlet需要依赖Tomcat才能运行。
web服务器的作用:
封装HTTP协议操作,简化开发
将web项目部署到服务器中,对外提供网上浏览服务
在TDEA中使用Tomcat有两种方式:
1)本地集成Tomcat
2)Tomcat插件(推荐)
注意:若对Tomcat的版本有较高要求,要在Tomcat7以上,就只能使用本地集成Tomcat
在pom.xml中添加Tomcat插件:
<build>
<plugins>
<!--Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>80</port><!--访问端口号 -->
<!--项目访问路径
未配置访问路径: http://localhost:80/tomcat-demo2/a.html
配置/后访问路径: http://localhost:80/a.html
如果配置成 /hello,访问路径会变成什么?
答案: http://localhost:80/hello/a.html
-->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
Servlet
servlet是javaweb最核心的内容,是java提供的一门动态web资源开发技术
使用servlet可以实现:不同的用户在页面上动态显示不同的内容
Servlet是JavaEE规范之一,其实就是一个接口,我们需要定义一个servlet类实现Servlet接口,并由web服务器运行Servlet.
Servlet的快速入门:
(1)创建web项目,导入Servlet依赖坐标
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!--
此处为什么需要添加该标签?
provided指的是在编译和测试过程中有效,最后生成的war包时不会加入
因为Tomcat的lib目录中已经有servlet-api这个jar包,如果在生成war包的时候生效就会和
Tomcat中的jar包冲突,导致报错
-->
<scope>provided</scope>
</dependency>
(2)创建一个类,实现servlet接口,重写接口中所有方法
重写的方法中最重要的方法是service方法
(3)在创建的servlet实现类上加@WebServlet注解,配置servlet的访问路径
@WebServlet(“/demo1”)
(4)启动Tomcat,浏览器中输入URL地址http://localhost:8080/web-demo/demo1访问该Servlet
Servlet的执行流程:
向浏览器发出 http://localhost:8080/web-demo/demo1请求,可从请求中可解析出三部分:
localhost:8080 可找到要访问的Tomcat web服务器
web-demo 可以找到部署在Tomcat服务器上的web-demo项目
demo1 可以找到要访问的是项目中的哪个Servlet类,根据@WebServlet后面的值进行匹配
==找到servlet类后,Tomcat服务器会为这个类创建一个对象,然后调用对象中的service方法
service方法有ServletRequest和ServletResponse两个参数,ServletRequest封装的是请求
数据,ServletResponse封装的是响应数据,后期我们可以通过这两个参数实现前后端的数据
交互
Servlet的生命周期:
注意:servlet容器==Tomcat服务器
servlet对象是由Tomcat服务器创建的,运行在服务器中,生命周期由服务器管理
分为4个阶段:
1、加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象。
默认情况,Servlet会在第一次访问被容器创建,但是如果创建Servlet比较耗时的话,那么第一个访问的人等待的时间就比较长,用户的体验就比较差,可设置参数使在服务器启动时创建servlet对象
@WebServlet(urlPatterns = “/demo1”,loadOnStartup = 1)
loadOnstartup的取值有两类情况
(1)负整数:第一次访问时创建Servlet对象
(2)0或正整数:服务器启动时创建Servlet对象,数字越小优先级越高
2、初始化:在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,
完成一些如加载配置文件、创建连接等初始化的工作。该方法只调用一次
3、请求处理:每次请求servlet时,服务器就会调用一次servlet的service方法
4、服务终止:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()
方法完成资源的释放。
service方法是每次请求servlet都会调用的方法
servlet的体系结构:
其实我们更关注service方法,但必须实现servlet接口的5个方法,比较麻烦。
Servlet的体系结构:
开发B/S架构的web项目都是针对HTTP协议的,所以自定义的servlet都会继承HttpServlet
@WebServlet("/demo1")
public class ServletDemo1 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
//使用request对象,获取请求数据
String name = request.getParameter("name");
System.out.println(name);
//使用response,设置响应数据
response.setHeader("context-type", "text/html;charset=utf-8");
response.getWriter().write("<h1>"+name+",欢迎您!</h1>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
根据请求方式的不同,调用不同的方法原因:
请求方式:一共7种,常见GET和POST两种请求方式。前端发送GET请求和POST请求时,参数位置不一致:GET请求参数在请求行中,POST请求参数在请求体中
HttpServlet的使用步骤:
(1)继承HttpServlet (2)重写doGet和doPost方法
HttpServlet原理:获取请求方式,根据不同的请求方式调用不同的方法
urlPattern配置:
配置servlet的访问路径(urlPattern)
urlPattern配置规则:
精确匹配
目录匹配
扩展名匹配
任意匹配
五种配置的优先级为 精确匹配 > 目录匹配> 扩展名匹配 > /* > /
xml配置访问路径:
前面对应Servlet的配置,我们都使用的是@WebServlet,这个是Servlet从3.0版本后开始支持注解配置,3.0版本前只支持XML配置文件的配置方法。
步骤:
1)创建servlet类
2)在web.xml中配置该Servlet
<!--
Servlet 全类名
-->
<servlet>
<!-- servlet的名称,名字任意-->
<servlet-name>demo13</servlet-name>
<!--servlet的类全名-->
<servlet-class>com.itheima.web.ServletDemo13</servlet-class>
</servlet>
<!--
Servlet 访问路径
-->
<servlet-mapping>
<!-- servlet的名称,要和上面的名称一致-->
<servlet-name>demo13</servlet-name>
<!-- servlet的访问路径-->
<url-pattern>/demo13</url-pattern>
</servlet-mapping>