什么是web
WEB,在英语中web即表示网页的意思,它用于表示Internet主机(服务器)上供外界访问的资源
C/S架构
Client / Server,客户端和服务器端,用户需要安装专门客户端程序。(QQ、微信、LOL)
B/S架构
Browser / Server,浏览器和服务器端,不需要安装专门客户端程序,浏览器是操作系统内置。(微信网页版、购物网站)
-
相同点
都是基于请求-响应交互模型:即浏览器(客户端) 向 服务器发送 一个 请求。服务器 向 浏览器(客户端)回送 一个响应 。
-
不同点
实现C/S模型需要用户在自己的操作系统安装各种客户端软件(百度网盘、腾讯QQ等);实现B/S模型,只需要用户在操作系统中安装浏览器即可。
注:B/S模型可以理解为一种特殊C/S模型。
B/S:使用方便,更加通用,易于维护,不稳定,依赖网络、安全性相对较差。
C/S:稳定性较好,软件资源可以提前加载,安全性相对较高,更新维护成本较高(xp、win7、win8、win10、安卓、ios、ipad)
-
浏览器必须先请求服务器, 服务器处理请求, 给浏览器响应
-
浏览器和服务器之间通信是基于HTTP协议
-
一次请求,一次响应
-
先有请求,后有响应
什么是服务器
服务器就是提供服务的机器(电脑),提供数据库服务我们就称为数据库服务器,提供WEB服务我们就称为WEB服务器。(MySQL服务器=MySQL软件+电脑)
服务器就是一个软件,任何电脑只需要安装上了服务器软件, 我们的电脑就可以当做一台服务器了. 安装了MySQL软件的电脑就是一台数据库服务器,可以向外提供数据存储查询的服务。
服务器: 硬件(电脑)+软件(mysql, tomcat,nginx)
MySQL+主机:MySQL服务器 提供外部存储和访问的服务
tomcat+主机:web服务器 提供外部访问资源【静态资源+动态资源】的服务
常见web服务器
-
WebLogic
Oracle公司的产品,是目前应用比较多的Web服务器,支持J2EE规范。WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。
-
Glass Fish
最早是Sun公司的产品,后来被Oracle收购,开源免费,中型服务器。
-
JBoss
JBoss公司产品,开源,支持JavaEE规范,占用内存、硬盘小,安全性和性能高。
Tomcat
中小型的应用系统,免费,开源,效率特别高, 适合扩展(搭集群)支持JSP和Servlet.
-
服务器:软件+硬件
-
MySQl+主机:数据库服务器 提供外部进行数据存储查询的服务
-
tomcat+主机:web服务器 通过外部访问静态资源和动态资源的服务
-
HTTP是HyperText Transfer Protocol(超文本传输协议)的简写,传输HTML文件。就是规范.
HTTP是互联网上用的最多的一个协议, 所有的www开头的都是遵循这个协议的(可能是https 超文本传输安全协议)
HTTP协议的作用
HTTP作用:用于定义WEB浏览器与WEB服务器之间交换数据的过程和数据本身的内容
浏览器和服务器交互过程: 浏览器请求, 服务器处理请求响应
请求(请求行,请求头,请求体)
响应(响应行,响应头,响应体)
-
响应行
-
协议版本 HTTP/1.1
-
HTTP状态码
-
200:请求成功
-
404:请求资源不存在 【路径写错 或 资源真的不存在】
-
500:服务器内部错误 【java代码运行出错】
-
-
-
响应头:服务器告诉浏览器一些信息
-
location:重新设置请求地址
-
refresh:定时刷新
-
content-Type:服务器告诉浏览器我响应给你的内容类型
-
content-disposition:服务器告诉浏览器你给我去下载
-
-
响应体:服务器响应给浏览器的内容
1什么是Servlet
Servlet 运行在服务端(tomcat)的Java小程序,是sun公司提供一套规范. 就是动态资源
Servlet是充当于服务器(tomcat)和java程序之前沟通的桥梁中介
Servlet作用
用来接收客户端请求信息、处理客户端请求、响应给浏览器的动态资源。
但servlet的实质就是java代码,通过java的API动态的向客户端输出内容
2.3 servlet与普通的java程序的区别
-
必须实现servlet接口
-
必须在servlet容器(服务器 tomcat)中运行
-
servlet程序可以接收用户请求参数以及向浏览器输出数据
Servlet生命周期描述
-
常规【重点】
init:默认情况下, 来了第一次请求, 会调用init()方法进行初始化 【调用一次】
service:每次请求 都会调用service()方法处理这个请求 【多次调用】
destroy:服务器正常关闭或者项目从服务器移除, 调用destory()方法进行销毁【调用一次】
-
扩展
servlet是单例多线程的, 尽量不要在servlet里面使用全局(成员)变量,可能会导致线程不安全,但是可以使用一些公共对象。
单例: 在程序运行期间,有且仅有一个对象。
多线程: 服务器会针对每次请求, 开启一个线程调用service()方法处理这个请求
-
创建web项目,创建两个Servlet CountServlet和ShowServlet 使用ServletContext存储网站访问的次数
-
编写CountServlet
//计数 记录网站访问人数
//1.获取当前访问次数 +1
编写ShowServlet
//显示 显示你是当前第几位访问用户
CountServlet
package com.itheima.web;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
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;
/**
* 记录用户访问次数
* 用户访问次数存在ServletContext对象中 实现数据共享
*/
@WebServlet("/count")
public class CountServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
//设置第一次访问之前 访问次数为0
config.getServletContext().setAttribute("count",0);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取之前的访问次数
ServletContext servletContext = this.getServletContext();
Integer count = (Integer) servletContext.getAttribute("count");
//2.将访问次数+1
count++;
//3.将新的访问次数重新存入到ServletContext对象中
servletContext.setAttribute("count",count);
response.getWriter().print("Welcome...");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
package com.itheima.web;
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("/show")
public class ShowServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取访问次数
Object count = this.getServletContext().getAttribute("count");
//2.显示 你是第几个访问的用户
// 解决响应中文乱码问题
response.setContentType("text/html;charset=UTF-8");
response.getWriter().print("你是第"+count+"个访问的用户");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}