- Web:全球广域网,也称为万维网(www),能够通过浏览器访问的网站。
在我们日常的生活中,经常会使用浏览器去访问`百度`、`京东`、`传智官网`等这些网站,这些网站统称为Web网站。 - JavaWeb:用Java技术来解决相关web互联网领域的技术栈
- B/S 架构:Browser/Server,浏览器/服务器 架构模式,它的特点是,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器,获取Web资源,服务器把Web资源发送给浏览器即可。
好处:易于维护升级:服务器端升级后,客户端无需任何部署就可以使用到新的版本。
- 静态资源主要包含HTML、CSS、JavaScript、图片等,主要负责页面的展示。
- 动态资源主要包含Servlet、JSP等,主要用来负责逻辑处理。
- 数据库主要负责存储数据。
- Web服务器:负责解析 HTTP 协议,解析请求数据,并发送响应数据
* 第一天:HTTP、Tomcat、Servlet
* 第二天:Request(请求)、Response(响应)
* 第三天:JSP、会话技术(Cookie、Session)
* 第四天:Filter(过滤器)、Listener(监听器)
* 第五天:Ajax、Vue、ElementUI
* 第六天:综合案例
(1)Request是从客户端向服务端发出的请求对象,
(2)Response是从服务端响应给客户端的结果对象,
(3)JSP是动态网页技术,
(4)会话技术是用来存储客户端和服务端交互所产生的数据,
(5)过滤器是用来拦截客户端的请求,
(6)监听器是用来监听特定事件,
(7)Ajax、Vue、ElementUI都是属于前端技术
这些技术都该如何来使用,我们后面会一个个进行详细的讲解。接下来我们来学习下HTTP、Tomcat和Servlet。
二、HTTP 2.1简介 1.HTTP概念HyperText Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。
2.HTTP协议特点1.基于TCP协议: 面向连接,安全
TCP是一种面向连接的(建立连接之前是需要经过三次握手)、可靠的、基于字节流的传输层通信协议,在数据传输方面更安全。
2. 基于请求-响应模型的:一次请求对应一次响应
请求和响应是一一对应关系
3.HTTP协议是无状态协议:对于事物处理没有记忆能力。每次请求-响应都是独立的
无状态指的是客户端发送HTTP请求给服务端之后,服务端根据请求响应数据,响应完后,不会记录任何信息。这种特性有优点也有缺点,
- 缺点:多次请求间不能共享数据。java使用会话技术(Cookie、Session)`来解决这个问题
- 优点:速度快
请求之间无法共享数据会引发的问题,如:
* 京东购物,`加入购物车`和`去购物车结算`是两次请求,
* HTTP协议的无状态特性,加入购物车请求响应结束后,并未记录加入购物车是何商品
* 发起去购物车结算的请求后,因为无法获取哪些商品加入了购物车,会导致此次请求无法正确展示数据
具体使用的时候,我们发现京东是可以正常展示数据的,原因是Java早已考虑到这个问题,并提出了使用`会话技术(Cookie、Session)`来解决这个问题。具体如何来做,我们后面会详细讲到。刚才提到HTTP协议是规定了请求和响应数据的格式,那具体的格式是什么呢?
2.2请求数据格式 1.格式介绍- 请求数据总共分为三部分内容,分别是请求行、请求头、请求体
1.请求行: HTTP请求中的第一行数据,请求行包含三块内容,分别是 GET[请求方式] /[请求URL路径] HTTP/1.1[HTTP协议及版本]
请求方式有七种,最常用的是GET和POST
2.请求头: 第二行开始,格式为key: value形式
3.请求体: POST请求的最后一部分,存储请求参数
- 请求头中会包含若干个属性,常见的HTTP请求头有:
Host: 表示请求的主机名
User-Agent: 浏览器版本,例如Chrome浏览器的标识类似Mozilla/5.0 ...
Chrome/79,IE浏览器的标识类似Mozilla/5.0 (Windows NT ...)like Gecko;
Accept:表示浏览器能接收的资源类型,如text/*,image/*或者*/*表示所有;
Accept-Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页;
Accept-Encoding:表示浏览器可以支持的压缩类型,例如gzip, deflate等
2.实例演示
3.小结
1. 请求数据中包含三部分内容,分别是请求行、请求头和请求体
2. POST请求数据在请求体中,GET请求数据在请求行上
2.3响应数据格式 1.格式介绍响应数据总共分为三部分内容
1.响应行:响应数据的第一行,响应行包含三块内容,分别是 HTTP/1.1[HTTP协议及版本] 200[响应状态码] ok[状态码的描述]
2.响应头:第二行开始,格式为key:value形式
3.响应体: 最后一部分。存放响应数据
2.响应状态码重定向是指重定到其他地方。在response对象中中重点讲解。4XX和5XX是错误情况,4XX是客户单错误,5XX是服务器端错误。
关于响应状态码,我们先主要认识三个状态码,其余的等后期用到了再去掌握:
* 200 ok 客户端请求成功
* 404 Not Found 请求资源不存在。就是改你的路径,你要访问资源把路径改一下,看一下你服务器端是如何定义的,你的浏览器端写的对不对。
* 500 Internal Server Error 服务端发生不可预期的错误。就是看你的java代码,哪里出现了异常,把异常解决就好了。
3.实例演示a.html
序号
品牌名称
企业名称
010
三只松鼠
三只松鼠
009
优衣库
优衣库
008
小米
小米科技有限公司
Server.java
/*
自定义服务器
*/
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(8080); // 监听指定端口
System.out.println("server is running...");
while (true){
Socket sock = ss.accept();
System.out.println("connected from " + sock.getRemoteSocketAddress());
Thread t = new Handler(sock);
t.start();
}
}
}
class Handler extends Thread {
Socket sock;
public Handler(Socket sock) {
this.sock = sock;
}
public void run() {
try (InputStream input = this.sock.getInputStream()) {
try (OutputStream output = this.sock.getOutputStream()) {
handle(input, output);
}
} catch (Exception e) {
try {
this.sock.close();
} catch (IOException ioe) {
}
System.out.println("client disconnected.");
}
}
private void handle(InputStream input, OutputStream output) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8));
// 读取HTTP请求:
boolean requestOk = false;
String first = reader.readLine();
if (first.startsWith("GET / HTTP/1.")) {
requestOk = true;
}
for (;;) {
String header = reader.readLine();
if (header.isEmpty()) { // 读取到空行时, HTTP Header读取完毕
break;
}
System.out.println(header);
}
System.out.println(requestOk ? "Response OK" : "Response Error");
if (!requestOk) {
// 发送错误响应:
writer.write("HTTP/1.0 404 Not Found\r\n");
writer.write("Content-Length: 0\r\n");
writer.write("\r\n");
writer.flush();
} else {
// 发送成功响应:
//读取html文件,转换为字符串
BufferedReader br = new BufferedReader(new FileReader("http/html/a.html"));
StringBuilder data = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null){
data.append(line);
}
br.close();
int length = data.toString().getBytes(StandardCharsets.UTF_8).length;
writer.write("HTTP/1.1 200 OK\r\n");
writer.write("Connection: keep-alive\r\n");
writer.write("Content-Type: text/html\r\n");
writer.write("Content-Length: " + length + "\r\n");
writer.write("\r\n"); // 空行标识Header和Body的分隔
writer.write(data.toString());
writer.flush();
}
}
}
4.小结
1. 响应数据中包含三部分内容,分别是响应行、响应头和响应体
2. 掌握200,404,500这三个响应状态码所代表含义,分布是成功、所访问资源不存在和服务的错误
三、Tomcat 3.1什么是Web服务器Web服务器是一个应用程序(软件),对HTTP协议的 *** 作进行封装,使得程序员不必直接对协议进行 *** 作,让Web开发更加便捷。主要功能是"提供网上信息浏览服务"。
Tomcat就是一款软件,我们主要是以学习如何去使用为主。具体我们会从以下这些方向去学习:
1. 简介: 初步认识下Tomcat
2. 基本使用: 安装、卸载、启动、关闭、配置和项目部署,这些都是对Tomcat的基本 *** 作
3. IDEA中如何创建Maven Web项目
4. IDEA中如何使用Tomcat,后面这两个都是我们以后开发经常会用到的方式
首选我们来认识下Tomcat。
3.2Tomcat- 概念:Tomcat是Apache软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范
- JavaEE: Java Enterprise Edition,Java企业版。指Java企业级开发的技术规范总和。包含13项技术规范:JDBC、JNDI、EJB、RMI、JSP、Servlet、XML、JMS、Java IDL、JTS、JTA、JavaMail、JAF。
-
Tomcat也被称为Web容器、Servlet容器。Servlet需要依赖Tomcat才能运行
-
Tomcat的官网: Apache Tomcat® - Welcome!
1. Web服务器的作用
- 封装HTTP协议 *** 作,简化开发
- 可以将Web项目部署到服务器中,对外提供网上浏览服务
2. Tomcat是一个轻量级的Web服务器,支持Servlet/JSP少量JavaEE规范,也称为Web容器,Servlet容器。
3.4 Tomcat基本使用 1.下载Apache Tomcat® - Welcome!
2.安装绿色版的,直接解压即可。
将`apache-tomcat-8.5.68-windows-x64.zip`进行解压缩,会得到一个`apache-tomcat-8.5.68`的目录,Tomcat就已经安装成功
bin:目录下有两类文件,一种是以`.bat`结尾的,是Windows系统的可执行文件,一种是以`.sh`结尾的,是Linux系统的可执行文件。
webapps:就是以后项目部署的目录, 到此,Tomcat的安装就已经完成。
3.卸载卸载比较简单,可以直接删除目录即可.
4.启动双击: bin\startup.bat.
控制台乱码就是吧conf文件下的logg.properties中的编码格式utf-8改为gbk格式的。
5.关闭---有3种方式关闭有三种方式
1.直接x掉运行窗口:强制关闭[不建议]
2.bin\shutdown.bat:正常关闭
3. ctrl+c: 正常关闭
6.配置1.Tomcat默认的端口是8080,要想修改Tomcat启动的端口号,需要修改 conf/server.xml。
Tomcat的端口号取值范围是0-65535之间。
注: HTTP协议默认端口号为80,如果将Tomcat端口号改为80,则将来访问Tomcat时,将不用输入端口号。
2.启动时可能出现的错误:
1.端口冲突:找到对应程序,将其关闭掉。
2.Tomcat启动的时候,启动窗口一闪而过: 需要检查JAVA_HOME环境变量是否正确配置
7.部署项目Tomcat部署项目: 将项目放置到webapps目录下,即部署完成。
一般JavaWeb项目会被打包成war包,然后将war包放到Webapps目录下,Tomcat会自动解压缩war文件。
3.5idea中创建Maven Web项目 1.Web项目结构Web项目的结构分为:开发中的项目和开发完可以部署的Web项目,这两种项目的结构是不一样的,我们一个个来介绍下:
- 开发项目通过执行Maven打包命令package,可以获取到部署的Web项目目录
- 编译后的Java字节码文件和resources的资源文件,会被放到WEB-INF下的classes目录下
- pom.xml中依赖坐标对应的jar包,会被放入WEB-INF下的lib目录下
具体的步骤包含:
1.创建Maven项目
2.选择使用Web项目骨架
结尾是webapp结尾的,前面是maven开头的。
3.输入Maven项目坐标创建项目
4.确认Maven相关的配置信息后,完成项目创建
5.删除pom.xml中多余内容
6.补齐Maven Web项目缺失的目录结构--就是缺失2个目录,java目录和resource目录。
方式二: 不使用骨架 具体的步骤包含:
1.创建Maven项目
2.选择不使用Web项目骨架
3.输入Maven项目坐标创建项目
4.在pom.xml设置打包方式为war
默认的打包方式是jar,我们要改为打包方式为war的。
5.补齐Maven Web项目缺失webapp的目录结构
缺少的webapp的目录,我们可以手动补全,但是我们推荐自动创建。
6.补齐Maven Web项目缺失WEB-INF/web.xml的目录结构
3.6IDEA使用Tomcat--2种方式 1.集成本地Tomcat
1.点击add configuration配置项,配置tomcat就可以了。tomcat有2种,local是本地的,remove是远程的,我们选择local本地的
需要注意的事项:
2.Tomcat Maven插件--2步在IDEA中使用本地Tomcat进行项目部署,相对来说步骤比较繁琐,所以我们需要一种更简便的方式来替换它,那就是直接使用Maven中的Tomcat插件来部署项目,具体的实现步骤,只需要两步,分别是:
1. 在pom.xml中添加Tomcat插件
alt+insert快捷键,选择插件模板。
org.apache.tomcat.maven
tomcat7-maven-plugin
2.2
2. 使用Maven Helper插件快速启动项目,选中项目,右键-->Run Maven --> tomcat7:run
注意:
如果选中项目并右键点击后,看不到Run Maven和Debug Maven,这个时候就需要在IDEA中下载Maven Helper插件,具体的 *** 作方式为: File --> Settings --> Plugins --> Maven Helper ---> Install,安装完后按照提示重启IDEA,就可以看到了。
* Maven Tomcat插件目前只有Tomcat7版本,没有更高的版本可以使用
* 使用Maven Tomcat插件,要想修改Tomcat的端口和访问路径,可以直接修改pom.xml
org.apache.tomcat.maven
tomcat7-maven-plugin
2.2
80
/
3.小结
通过这一节的学习,大家要掌握在IDEA中使用Tomcat的两种方式,集成本地Tomcat和使用Maven的Tomcat插件。后者更简单,推荐大家使用,但是如果对于Tomcat的版本有比较高的要求,要在Tomcat7以上,这个时候就只能用前者了。
四、Servlet 4.1简介- Servlet是JavaWeb最为核心的内容,它是Java提供的一门动态web资源开发技术。
- Servlet是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet
1. 创建Web项目`web-demo`,导入Servlet依赖坐标
javax.servlet
javax.servlet-api
3.1.0
provided
2. 创建:定义一个类,实现Servlet接口,并重写接口中所有方法,并在service方法中输入一句话
/**
* Servlet 快速入门
*/
@WebServlet("/demo1")
public class ServletDemo1 implements Servlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("servlet hello world~");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
@Override
public void init(ServletConfig config) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
}
3. 配置:在类上使用@WebServlet注解,配置该Servlet的访问路径
4. 访问:启动Tomcat,浏览器中输入URL地址访问该Servlet
5. 器访问后,在控制台会打印`servlet hello world~` 说明servlet程序已经成功运行。
4.3执行流程&生命周期/**
* Servlet 生命周期方法
*/
@WebServlet(urlPatterns="/demo2",loadOnStartup = 1)
public class ServletDemo2 implements Servlet {
/**
* 初始化方法
* 1. 调用时机:默认情况下,Servlet被第一次访问时,调用
* * loadOnStartup:
* 2. 调用次数:1次
* @param config
* @throws ServletException
*/
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init...");
}
/**
* 提供服务
* 1. 调用时机:每一次Servlet被访问时,调用
* 2. 调用次数:多次
*
*
* @param req
* @param res
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("servlet hello world~");
}
/**
* 销毁方法
* 1. 调用时机:内存释放或者服务器关闭的时候,Servlet对象会被销毁,调用
* 2. 调用次数:1次
*/
@Override
public void destroy() {
System.out.println("destroy...");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public ServletConfig getServletConfig() {
return null;
}
}
4.4方法介绍&体系结构
/**
* Servlet 方法介绍
*/
@WebServlet(urlPatterns="/demo3",loadOnStartup = 1)
public class ServletDemo3 implements Servlet {
private ServletConfig config;
/**
* 初始化方法
* 1. 调用时机:默认情况下,Servlet被第一次访问时,调用
* * loadOnStartup:
* 2. 调用次数:1次
* @param config
* @throws ServletException
*/
@Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
System.out.println("init...");
}
@Override
public ServletConfig getServletConfig() {
return config;
}
/**
* 提供服务
* 1. 调用时机:每一次Servlet被访问时,调用
* 2. 调用次数:多次
*
*
* @param req
* @param res
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("servlet hello world~");
}
/**
* 销毁方法
* 1. 调用时机:内存释放或者服务器关闭的时候,Servlet对象会被销毁,调用
* 2. 调用次数:1次
*/
@Override
public void destroy() {
System.out.println("destroy...");
}
@Override
public String getServletInfo() {
return "";
}
}
@WebServlet("/demo4")
public class ServletDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post...");
}
}
a.html
Title
MyHttpServlet.java
public class MyHttpServlet implements Servlet {
@Override
public void init(ServletConfig config) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// 根据请求方式的不同,进行分别的处理
HttpServletRequest request = (HttpServletRequest) req;
//1. 获取请求方式
String method = request.getMethod();
//2. 判断
if("GET".equals(method)){
// get方式的处理逻辑
doGet(req,res);
}else if("POST".equals(method)){
// post方式的处理逻辑
doPost(req,res);
}
}
protected void doPost(ServletRequest req, ServletResponse res) {
}
protected void doGet(ServletRequest req, ServletResponse res) {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
@WebServlet("/demo5")
public class ServletDemo5 extends MyHttpServlet {
@Override
protected void doGet(ServletRequest req, ServletResponse res) {
System.out.println("get。。。。");
}
@Override
protected void doPost(ServletRequest req, ServletResponse res) {
System.out.println("post。。。。");
}
}
ServletDemo5
@WebServlet("/demo5")
public class ServletDemo5 extends MyHttpServlet {
@Override
protected void doGet(ServletRequest req, ServletResponse res) {
System.out.println("get。。。。");
}
@Override
protected void doPost(ServletRequest req, ServletResponse res) {
System.out.println("post。。。。");
}
}
4.5urlPattern配置
WebServlet注解有urlPatterns属性,它是一个数组格式,在数组里面可以配置多个访问路径。通过多个访问路径都可以访问到servlet。
/**
* urlPattern:
* * 精确匹配
*/
@WebServlet(urlPatterns = "/user/select")
public class ServletDemo8 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo8 get...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
/**
* urlPattern:
* * 扩展名匹配: *.do
*/
@WebServlet(urlPatterns = "*.do")
public class ServletDemo10 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo10 get...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
/**
* urlPattern:
* * 任意匹配:/
*/
//@WebServlet(urlPatterns = "/")
public class ServletDemo11 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo11 get...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
/**
* urlPattern:
* * 任意匹配:/*
*/
//@WebServlet(urlPatterns = "/*")
public class ServletDemo12 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo12 get...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
4.6xml配置servlet
public class ServletDemo13 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo13 get...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
web.xml
demo13
com.itheima.web.ServletDemo13
demo13
/demo13
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)