赞
踩
WEB,在英语中web即表示网页的意思,它用于表示Internet主机(服务器)上供外界访问的资源
Client / Server,客户端和服务器端,用户需要安装专门客户端程序。
Browser / Server,浏览器和服务器端,不需要安装专门客户端程序,浏览器是操作系统内置。
相同点
都是基于请求-响应交互模型:即浏览器(客户端) 向 服务器发送 一个 请求。服务器 向 浏览器(客户端)回送 一个 响应 。
必须先有请求 再有响应
请求和响应成对出现
不同点
实现C/S模型需要用户在自己的操作系统安装各种客户端软件(百度网盘、腾讯QQ等);实现B/S模型,只需要用户在操作系统中安装浏览器即可。
注:B/S模型可以理解为一种特殊C/S模型。 B 其实指的就是浏览器…
基于http协议,请求响应的机制
请求一次响应一次
先有请求后有响应
服务器就是一个软件,任何电脑只需要安装上了服务器软件, 我们的电脑就可以当做一台服务器了.
这个软件可以部署(运行)我们写的一些java程序。所以平常说,把网页数据(form表单)提交给服务器,其实就是提交给我们的java程序
服务器: 硬件(电脑)+软件(mysql, tomcat,nginx)
WebLogic
Oracle公司的产品,是目前应用比较多的Web服务器,支持J2EE规范。WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。
WebSphere
IBM公司的WebSphere,支持JavaEE规范。WebSphere 是随需应变的电子商务时代的最主要的软件平台,可用于企业开发、部署和整合新一代的电子商务应用。
Glass Fish
最早是Sun公司的产品,后来被Oracle收购,开源免费,中型服务器。
JBoss
JBoss公司产品,开源,支持JavaEE规范,占用内存、硬盘小,安全性和性能高。
Tomcat
中小型的应用系统,免费,开源,效率特别高, 适合扩展(搭集群)支持JSP和Servlet.
Tomcat服务器是一个免费的开放源代码的Web应用服务器。
Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet 和JSP规范总是能在Tomcat中得到体现。
因为Tomcat技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,是目前比较流行的Web应用服务器。
tar.gz 文件 是linux操作系统下的安装版本
exe文件是window操作系统下的安装版本
zip文件是window操作系统下压缩版本(我们选择zip文件)
如果Tomcat能够一下子就启动起来,那么不需要做任何的设置。如果不能启动,出现一闪而过的情形,那么可以启动一个dos命令行,然后把startup.bat拖拽到黑窗口里面, 回车运行,观察出现的错误效果。跟着改即可。
直接解压当前这个tomcat压缩包:(不要有中文,不要有空格)
配置环境变量:
tomcat运行依赖于java环境:
bin : 二进制文件,启动和关闭tomcat startup.bat shutdown.bat conf: 配置文件 lib: Tomcat的jar包 log: Tomcat运行的日志 temp: Tomcat运行存放的一些临时文件 webapps: 存放我们想要让Tomcat托管的java web程序 如果想要让Tomcat执行我们的代码,那么代码就应该放在 这个文件夹里面。 work: 项目的一些文件。
启动效果:
测试访问tomcat服务器
打开浏览器在,在浏览器的地址栏中输入:
关闭tomcat服务器
查找tomcat目录下bin目录,查找其中的shutdown.bat命令,双击关闭服务器:
报如下异常: java.net.BindException: Address already in use: JVM_Bind 8080
解决办法:
第一种:修改Tomcat的端口号
修改conf/server.xml , 第70行左右
第二种:查询出来哪一个进程把8080占用了, 结束掉占用8080端口后的程序
打开命令行输入: netstat -ano
找到占用了8080 端口的 进程的id
去任务管理器kill掉这个id对应的程序
WebAPP(文件夹,项目)
|---静态资源: html,css,js,图片(它们可以以文件存在,也可以以文件夹存在)
|---WEB-INF 固定写法。此目录下的文件不能被外部(浏览器)直接访问
|---lib:jar包存放的目录
|---web.xml:当前项目的配置文件(3.0规范之后可以省略)
|---classes:java类编译后生成class文件存放的路径
只要将准备好的web资源直接复制到tomcat/webapps文件夹下,就可以通过浏览器使用http协议访问获取
第四步:添加second.xml文件的内容为: docBase就是你需要作为虚拟路径的项目的路径
<?xml version = "1.0" encoding = "utf-8"?>
<Context docBase="G:/myApp" />
第五步:直接访问(通过写配置文件的路径来访问):
http://localhost:8080/second/a.html (second就是配置文件的名字, 映射成了myApp)
HTTP是HyperText Transfer Protocol(超文本传输协议)的简写,传输HTML文件。就是规范.
HTTP是互联网上用的最多的一个协议, 所有的www开头的都是遵循这个协议的(可能是https)
HTTP作用:
其实就是定义了浏览器和服务器在进行数据传输的一套规范…说的通俗一点就是暗号。
浏览器和服务器交互过程: 浏览器请求, 服务请求响应
不管是请求还是响应,都得约定里面的内容,也就是请求要携带什么数据,响应要返回什么数据,这些数据的格式该怎么放。都是由http协议规定。
请求(请求行,请求头,请求体)
响应(响应行,响应头,响应体)
【请求行】
GET /heima/success.html?username=aa&password=bb HTTP/1.1
【请求头】
Accept: text/html, application/xhtml+xml, */*
X-HttpWatch-RID: 41723-10011
Referer: http://localhost:8080/heima/login.html
Accept-Language: zh-Hans-CN,zh-Hans;q=0.5
User-Agent: Mozilla/5.0 (MSIE 9.0; qdesk 2.4.1266.203; Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Host: localhost:8080
Connection: Keep-Alive
【请求行】 POST /heima/success.html HTTP/1.1 【请求头】 Accept: text/html, application/xhtml+xml, */* X-HttpWatch-RID: 37569-10012 Referer: http://localhost:8080/heima/login.html Accept-Language: zh-Hans-CN,zh-Hans;q=0.5 User-Agent: Mozilla/5.0 (MSIE 9.0; qdesk 2.4.1266.203; Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate Host: localhost:8080 Content-Length: 23 Connection: Keep-Alive Cache-Control: no-cache 【请求体】 username=aa&password=bb
响应部分
【响应行】 HTTP/1.1 200 【响应头】 Accept-Ranges: bytes ETag: W/"143-1557909081579" Last-Modified: Wed, 15 May 2019 08:31:21 GMT Content-Type: text/html Content-Length: 143 Date: Sun, 08 Dec 2019 02:20:04 GMT 【响应体】 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> Success </body> </html>
响应行
响应头: 服务器告诉浏览器做什么的,指示浏览器做什么 ; 以key:value存在, 可能存在一个key多个value的情况
响应体: 页面展示的内容
Servlet 是一套规范,是一个接口,是一个API …它的作用是,能够接受浏览器提交的数据。
注意的是: 它必须放在tomcat里面,由tomcat来托管|管理。必须放在tomcat里面才能接受浏览器提交的数据
用来处理客户端请求、响应给浏览器的动态资源。
但servlet的实质就是java代码,通过java的API动态的向客户端输出内容
我们要将idea和tomcat集成到一起,可以通过idea就控制tomcat的启动和关闭:
在IDEA编写Servlet,发布到Tomcat. 在浏览器输入路径请求, 控制台打印Hello…
package com.itheima.servlet; import javax.servlet.*; import java.io.IOException; /* * @描述: * @ 思路 * 1. 只有servlet才能处理网页的请求 * 2. 所以这个类,必须要跟servlet扯上关系 * 3. servlet是一个接口,是一个规范,所以这里要实现接口Servlet * 4. 写完之后,这个类还只是普通的java类,tomcat不理它。 * 5. 必须得登记 | 注册这个servlet * 有两种做法: * 1. 最简单的做法: 使用注解 @WebServlet("/xx") * 最终访问路径是这样。localhost:8080/day24_servlet/xx * * 2. 在web.xml中配置。 * */ //localhost:8080/day24_servlet/aa public class HelloServlet02 implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("HelloServlet02收到请求了~~"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { } }
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <servlet> <servlet-name>hello02</servlet-name> <servlet-class>com.itheima.servlet.HelloServlet02</servlet-class> </servlet> <!--以后只要有一个请求,请求的地址是aa 那么就把这个请求交给hello02去处理 其实就是交给HelloServlet02 处理--> <servlet-mapping> <servlet-name>hello02</servlet-name> <url-pattern>/aa</url-pattern> </servlet-mapping> </web-app>
package com.itheima.servlet; import javax.servlet.*; import javax.servlet.annotation.WebServlet; import java.io.IOException; /* * @创建时间: 2020/7/27 15:06 * @描述: * @ 思路 * 1. 只有servlet才能处理网页的请求 * 2. 所以这个类,必须要跟servlet扯上关系 * 3. servlet是一个接口,是一个规范,所以这里要实现接口Servlet * 4. 写完之后,这个类还只是普通的java类,tomcat不理它。 * 5. 必须得登记 | 注册这个servlet * 有两种做法: * 1. 最简单的做法: 使用注解 @WebServlet("/xx") * 最终访问路径是这样。localhost:8080/day24_servlet/xx * * 2. 在web.xml中配置。 * */ //localhost:8080/day24_servlet/aa @WebServlet("/aa") public class HelloServlet implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { } @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() { } }
配置tomcat服务器启动测试
浏览器地址栏输入:http://localhost:8080/day24_servlet/aa
注解方式简化的javaweb代码开发,可以省略web.xml配置文件.
但是配置文件方式必须掌握的(后面在框架或者大项目里面会使用到的)
在地址栏上,敲了一个地址,怎么就执行了我们的servlet代码? 他们的背后是如何关联的?
通过上述流程图我们重点需要掌握如下几个点:
url-pattern配置方式共有三种:
例如: 配置了/demo01 请求的时候必须是: /demo01
<!--1. 完全路径匹配: 以 / 打头,以定义的路径结尾-->
<servlet-mapping>
<servlet-name>hello02</servlet-name>
<url-pattern>/hello02</url-pattern>
</servlet-mapping>
例如: 配置/* 访问/a, /aa, /aaa; 配置 /aa/* 访问 /aa/b , /aa/cc
<!-- 2. 目录匹配: 以/ 打头, 以*结尾 *表示后面的内容可以有,也可以没有-->
<servlet-mapping>
<servlet-name>hello02</servlet-name>
<url-pattern>/hello02/*</url-pattern>
</servlet-mapping>
例如: *.action; 访问: aa.action, bb.action, c.action; 错误写法: /*.do, 不可以写*.jsp,*.html
<!--3. 后缀名匹配的方式 : 以*打头, 以后缀名结尾-->
<servlet-mapping>
<servlet-name>hello02</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
注意的地方:
一个路径只能对应一个servlet, 但是一个servlet可以有多个路径
tomcat获得匹配路径时,优先级顺序:完全路径匹配> 目录匹配 > 扩展名匹配
servlet从创建到销毁的过程
出生:(初始化)用户第一次访问时执行。
活着:(服务)应用活着。每次访问都会执行。
死亡:(销毁)应用卸载。
serrvlet生命周期方法:
init(ServletConfig config)
service(ServletRequest req, ServletResponse res)
destroy()
package com.itheima.servlet; import javax.servlet.*; import java.io.IOException; /* * @创建时间: 2020/7/27 16:08 * @描述: servlet的生命周期 * * @思路: * 1. init: * 调用时机:第一次访问servlet的时候调用 * 作用: 用于初始化.. 准备工作(创建流对象 | 准备数据库连接..) * 2. service: * 调用时机:每来一次请求就会执行一次 * 作用:接收请求,响应请求。 * * 3. destroy: * 调用时机:1.正常关闭服务器,2.从服务器里面移除托管的项目 * 作用:用于处理收尾的工作。 关流 | 释放连接 * */ public class ServletLifeCycle03 implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("init~~~~"); } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("service~~~~"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { System.out.println("destroy~~~~"); } }
常规
默认情况下, 来了第一次请求, 会调用init()方法进行初始化【调用一次】
任何一次请求 都会调用service()方法处理这个请求
服务器正常关闭或者项目从服务器移除, 调用destory()方法进行销毁【调用一次】
扩展
servlet是单例多线程的, 尽量不要在servlet里面使用全局(成员)变量,可能会导致线程不安全
单例: 只有一个对象(init()调用一次, 创建一次)
多线程: 服务器会针对每次请求, 开启一个线程调用service()方法处理这个请求
Servlet的配置对象, 可以使用ServletConfig来获得Servlet的初始化参数, 在SpringMVC里面会遇到
<!--这里配置_04_ServletConfig的 servlet--> <servlet> <servlet-name>config</servlet-name> <servlet-class>com.itheima.servlet._04_ServletConfig</servlet-class> <init-param> <param-name>username</param-name> <param-value>zhangsan</param-value> </init-param> <!--设置servlet,在加载项目的时候,就初始化,不用等到访问的时候初始化--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>config</servlet-name> <url-pattern>/config</url-pattern> </servlet-mapping>
package com.itheima.servlet; import javax.servlet.*; import java.io.IOException; /* * @创建时间: 2020/7/27 16:33 * @描述: ServletConfig对象 * * 1. 可以获取servlet在注册的写名字 * 2. 可以拿到servlet配置一些初始化参数 * * 3. servlet默认是第一次访问的时候才会进行初始化,能否让这个初始化的时机提前呢? * 可以,提前到部署的时候,就执行。这样子的话,以后再来请求|第一次来请求,就不用初始化了。 * 那么程序的响应速度就很快。 */ public class _04_ServletConfig implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { //1. 得到这个servlet在web.xml中配置的名称 | 别名 String name = servletConfig.getServletName(); System.out.println("name=" + name); //2. 可以获取servlet的初始化参数。 String username = servletConfig.getInitParameter("username"); System.out.println("username=" + username); } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { } @Override public String getServletInfo() { return null; } @Override public void destroy() { } }
Servlet默认情况下什么是创建? 默认情况下是第一次请求的时候.
如果我想让Servlet提前创建(服务器器的时候), 这个时候就可以使用启动项 在SpringMVC里面会遇到
Servlet接口
前面我们已经学会创建一个类实现sevlet接口的方式开发Servlet程序,实现Servlet接口的时候,我们必须实现接口的所有方法。但是,在servlet中,真正执行程序逻辑的是service,对于servlet的初始化和销毁,由服务器调用执行,开发者本身不需要关心。因此,有没有一种更加简洁的方式来开发servlet程序呢?
我们先来查阅API回顾Servlet接口:
由上图可知在servlet接口规范下,官方推荐使用继承的方式,继承GenericServlet 或者HttpServlet来实现接口,那么我们接下来再去查看一下这两个类的API:
阅读上图API可知,GenericServlet 是一个类,它简化了servlet的开发,已经提供好了一些servlet接口所需的方法,我们开发者只需要重写service方法即可
我们来使用GenericServlet 创建servlet:
package cn.itcast.web; import javax.servlet.GenericServlet; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebServlet; import java.io.IOException; @WebServlet(name = "GenericDemoServlet",urlPatterns = "/generic") public class GenericDemoServlet extends GenericServlet { @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("GenericDemoServlet执行......."); } }
虽然,GenericServlet已经简化了servlet开发,但是我们平时开发程序需要按照一种互联网传输数据的协议来开发程序——http协议,因此,sun公司又专门提供了HttpServlet,来适配这种协议下的开发。
阅读上图的API可知,继承HttpServlet,我们需要重写doGet、doPost等方法中一个即可,根据Http不同的请求,我们需要实现相应的方法。
我们来使用HttpServlet创建servlet:
package cn.itcast.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(name = "HttpDemoServlet",urlPatterns = "/http") public class HttpDemoServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("HttpDemoServlet执行......."); } }
通过以上两个API阅读,同学们注意一个细节HttpServlet是GenericServlet的子类,它增强了GenericServlet一些功能,因此,在后期使用的时候,我们都是选择继承HttpServlet来开发servlet程序。
ServletContext: 它是一个对象,有且只有一个。一个servlet项目里面,有且只有一个ServletContext对象。
API
代码
ServletDemo05
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//存
//1.获得ServletContext
ServletContext servletContext = getServletContext();
//2.调用存的方法
servletContext.setAttribute("akey","aaa");
response.getWriter().print("ServletDemo03");
}
ServletDemo06
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//取
//1.获得ServletContext
ServletContext servletContext = getServletContext();
//2.调用取的方法
String value = (String) servletContext.getAttribute("akey");
response.getWriter().print("ServletDemo04..."+value);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//根据文件名获得文件的mini类型
//1.获得ServletContext
//2.调用getMimeType()方法
String file01 = "a.mp3";
String file02 = "b.png";
String mimeType01 = getServletContext().getMimeType(file01);
String mimeType02 = getServletContext().getMimeType(file02);
String value = getServletContext().getInitParameter("bkey");
response.getWriter().print("ServletDemo05..."+mimeType01+":"+mimeType02+":"+value);
}
在web.xml配置
通过ServletContext来获得
注意: filepath:直接从项目的根目录开始写
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获得文件的绝对路径 getRealPath()这个方法的路径已经在项目下了, 已经到了web目录下了
String realPath = getServletContext().getRealPath("a.txt");
System.out.println("realPath="+realPath);
//2.获得文件的输入流 getResourceAsStream(String path);这个方法的路径已经在项目下了, 已经到了web目录下了
//new FileInputStream(realPath);
InputStream is = getServletContext().getResourceAsStream("a.txt");
System.out.println(is);
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。