Web核心介绍
Web : 全球广域网,也成为万维网(www),能够通过浏览器访问的网站
JavaWeb : 使用Java技术来解决相关web互联网领域的技术栈
JavaWeb技术栈
B/S架构:Browser/Server,浏览器/服务器架构模式。
客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。
浏览器只需要请求服务器,获取Web资源,服务器把Web资源发送给浏览器即可。
优点:易于维护升级:服务端升级后,客户端无需任何部署就可以使用到新的版本。
静态资源:HTML、CSS、JavaScript、图片等,负责页面展示
动态资源:Servlet、JSP等,负责逻辑处理
数据库:负责存储数据
HTTP协议:定义通信规则
Web服务器:负责解析HTTP协议,解析请求数据,并发送响应数据
HTTP
HTTP简介
HyperText Transfer Protocol:超文本传输协议
规定了浏览器与服务器之间数据传输规则
HTTP协议特点:
1. 基于TCP协议:面向连接,安全
2. 基于请求-响应模型的:一次请求对应一次响应
3. HTTP协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的
* 缺点:多次请求不能共享数据。Java中使用会话技术解决此问题
* 优点:速度快
HTTP请求数据格式
* 请求数据分为三部分
1. 请求行:请求数据的第一行。请求方式 资源路径 协议版本
2. 请求头:第二行开始,格式为key:value形式
常见HTTP请求头
Host:表示请求的主机名
User-Agent:浏览器版本
Accept:浏览器能接收的资源类型
3. 请求体:POST请求的最后一部分,存放请求参数
有一空行与请求头隔开
* GET请求和POST请求区别:
1. GET请求请求参数在请求行中,没有请求体。POST请求请求参数在请求体中
2. GET请求请求参数大小有限制,POST没有
HTTP响应数据格式
* 响应数据分为三部分
1. 相应行:响应数据的第一行。协议版本 响应状态码 状态码描述
状态码大类:
1xx:响应中
2xx:成功
3xx:重定向
4xx:客户端错误
5xx:服务器端错误
2. 响应头:第二行开始,格式为key-value形式
常见的HTTP响应头:
Content-Type:响应内容的类型
Cache-Control:指示客户端应如何缓存
3. 响应体:最后一部分,存放响应数据
Web服务器——Tomcat
简介
Web服务器作用:
* 封装HTTP协议操作,简化开发
* 可以将Web项目部署到服务器中,对外提供网上浏览服务
基本使用
Tomcat的下载、安装、卸载、启动、关闭、配置、部署项目
启动:双击bin/startup.bat
配置
1. 修改启动端口号:conf/server.xml
HTTP协议默认端口号为80
部署项目
将项目放到webapps目录下,即部署完成
一般JavaWeb项目会被打成war包,然后将war包放到webapps目录下,Tomcat会自动解压缩war文件
IDEA中创建Maven Web项目
创建方式:
1. 不使用骨架:
1.1 选择web项目骨架,创建项目
1.2 pom.xml中添加打包方式为war
1.3 补齐缺失的目录结构
2. 不使用骨架:
2.1 选择web项目骨架,创建项目
2.2 删除pom.xml中多余的坐标
2.3 补齐缺失的目录结构
<!--
<packaging>:打包方式
*jar:默认值
*war:web项目
-->
<packaging>war</packaging>
IDEA中使用Tomcat
IDEA中使用Tomcat的两种方式:
1. 集成本地Tomcat
2. Tomcat Maven插件(支持到Tomcat7)
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
</configuration>
</plugin>
Servlet
快速入门
1. 创建web项目,导入Servlet依赖坐标
<!--pom.xml-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
2. 创建:定义一个类,实现Servlet接口
public class ServletDemo implements Servlet{
public void service(){}
}
3. 配置:配置Servlet访问路径
@WebServlet("/demo")
public class ServletDemo implements Servlet{
public void service(){}
}
例:
@WebServlet("/demo")
public class ServletDemo implements Servlet {
public void init(ServletConfig servletConfig) throws ServletException {
}
public ServletConfig getServletConfig() {
return null;
}
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello World!");
}
public String getServletInfo() {
return null;
}
public void destroy() {
}
}
4. 访问:启动Tomcat,输入url访问该Servlet
注一问题未解决:
使用IDEA集成Tomcat运行无法访问此Servlet
使用Tomcat Maven插件运行可以访问
Servlet执行流程
Servlet被访问时,service()方法自动执行
1. Servlet由谁创建?Servlet方法由谁调用?
* Serlvet由web服务器创建,Servlet方法由web服务器调用
2. 服务器怎么知道Servlet中一定有service()方法?
* 自定义的Servlet必须实现Servlet接口并复写其方法,而Servlet接口中有service()方法
Servlet生命周期
Servlet运行在Servlet容器(web服务器)中,其生命周期由容器来管理,分为四个阶段:
1. 加载和实例化:
默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象。
2. 初始化:
在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,该方法只被调用一次。
完成一些如加载配置文件、创建连接等初始化工作。
3. 请求处理:
每次请求Servlet时,Serlvet容器都会调用Servlet的service()方法对请求进行处理。
4. 服务终止:
当需要释放内存或容器关闭时,容器就会调用Serlvet实例的destroy()方法完成资源的释放。
在destory()方法调用后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收。
@WebServlet(urlPatterns = "/demo", loadOnStartup = 1)
/*
loadOnStartup:
负整数:第一次被访问时创建Servlet对象
0或正整数:服务器启动时创建Servlet对象,数字越小优先级越高
*/
public class ServletDemo implements Servlet {
//初始化方法,在Servlet被创建时执行,只执行一次
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("ServletDemo init");
}
//提供服务方法,每次Servlet被访问,都会调用此方法
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello World!");
}
//销毁方法,当Serlvet被销毁时调用该方法
public void destroy() {
System.out.println("ServletDemo destroy");
}
//或取ServletConfig对象
public ServletConfig getServletConfig() {
return null;
}
//获取Serlvet信息
public String getServletInfo() {
return null;
}
}
Servlet体系结构
Servlet:Serlvet体系根接口
GenericServlet:Servlet抽象实现类
HttpSerlvet:对HTTP协议封装的Servlet实现类
由于多数开发的B/S架构的web项目,都是针对HTTP协议,所以我们自定义的Servlet会继承HttpSerlvet
public class ServletDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
1. HttpSerlvet中为什么要根据请求方式不同,调用不同方法?
* get和post请求方式请求消息不一样,需要分别处理
2. 如何调用
* 获取请求方式并进行逻辑判断
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//根据请求方式不同,进行分别的处理
HttpServletRequest request = (HttpServletRequest) servletRequest;
//1. 获取请求方式
String method = request.getMethod();
//2. 判断请求方式
if ("GET".equals(method)) {
//get方式处理逻辑
}else{
//post方式处理逻辑
}
}
Servlet urlPattern配置
1. 一个Servlet,可以配置多个urlPattern
2. urlPattern配置规则(优先级由上至下):
* 精确匹配:"/user/select"
* 目录匹配:"/user/*"
* 扩展名匹配(不能以斜杠开头):"*.do"
* 任意匹配:"/*" 或者 "/"
注:当Servlet配置了"/",会覆盖掉tomcat中的DefaultServlet
@WebServlet(urlPatterns = {"/demo7", "/demo8"})
XML配置方式编写Servlet
Servlet从3.0版本后开始支持使用注解配置,3.0版本之前只支持XML配置文件的配置方式
步骤:
- 编写Servlet类
- 在web.xml中配置该Servlet
<web-app> <!--Servlet全类名--> <servlet> <servlet-name>demo</servlet-name> <servlet-class>com.ziping.web.servlet.ServletDemo</servlet-class> </servlet> <!--Servlet访问路径--> <servlet-mapping> <servlet-name>demo</servlet-name> <url-pattern>/demo</url-pattern> </servlet-mapping> </web-app>