WEB后端_Day01(JavaWeb、Web资源的分类、常用的Web服务器、Tomcat 服务器和 Servlet 版本的对应关系、Tomcat 的使用、在tomcat中部署web应用、使用idea创建一个web工程、在idea中将项目部署到tomcat、动态web技术、Servlet的生命周期、Servlet的另一种开发方式、Servlet的相关对象ServletConfig、Servlet的相关对象ServletContext)
JavaWeb
什么是JavaWeb
- JavaWeb 是指,所有通过Java 语言编写可以通过浏览器访问的程序的总称,叫JavaWeb。
- JavaWeb 是基于请求和响应来开发的。
什么是请求
- 请求是指客户端给服务器发送数据,叫请求Request。
什么是响应
- 响应是指服务器给客户端回传数据,叫响应Response。
请求和响应的关系
- 请求和响应是成对出现的,有请求就有响应。
Web资源的分类
web 资源按实现的技术和呈现的效果的不同, 又分为静态资源和动态资源两种。
- 静态资源: html、 css、 js、 txt、 mp4 视频 , jpg 图片
- 动态资源: jsp 页面、 Servlet 程序
常用的Web服务器
- Tomcat: 由 Apache 组织提供的一种 Web 服务器, 提供对 jsp 和 Servlet 的支持。 它是一种轻量级的 javaWeb 容器(服务器) , 也是当前应用最广的 JavaWeb 服务器(免费) 。
- Jboss: 是一个遵从 JavaEE 规范的、 开放源代码的、 纯 Java 的 EJB 服务器, 它支持所有的 JavaEE 规范(免费) 。
- GlassFish: 由 Oracle 公司开发的一款 JavaWeb 服务器, 是一款强健的商业服务器, 达到产品级质量(应用很少) 。
- Resin: 是 CAUCHO 公司的产品, 是一个非常流行的服务器, 对 servlet 和 JSP 提供了良好的支持,性能也比较优良, resin 自身采用 JAVA 语言开发(收费, 应用比较多) 。
- WebLogic: 是 Oracle 公司的产品, 是目前应用最广泛的 Web 服务器, 支持 JavaEE 规范,而且不断的完善以适应新的开发要求, 适合大型项目(收费, 用的不多, 适合大公司) 。
Tomcat 服务器和 Servlet 版本的对应关系
Servlet Spec | JSP Spec | EL Spec | Apache Tomcat version | Supported Java Versions |
---|---|---|---|---|
4.0 | TBD (2.4?) | TBD (3.1?) | 9.0.x | 8 and later |
3.1 | 2.3 | 3.0 | 8.5.x | 7 and later |
3.1 | 2.3 | 3.0 | 8.0.x | (superseded) |
3.0 | 2.2 | 2.2 | 7.0.x | 6 and later (7 and later for WebSocket) |
2.5 | 2.1 | 2.1 | 6.0.x | 5 and later |
2.4 | 2.0 | N/A | 5.5.x (archived) | 1.4 and later |
2.3 | 1.2 | N/A | 4.1.x (archived) | 1.3 and later |
2.2 | 1.1 | N/A | 3.3.x (archived) | 1.1 and later |
Servlet 程序从 3.0 版本是现在世面使用最多的版本(xml 配置)
到了 Servlet3.0 之后。 就是注解版本的 Servlet 使用。
以 3.0 版本为主线讲解 Servlet 程序。
Tomcat 的使用
安装
找到你需要用的 Tomcat 版本对应的 zip 压缩包, 解压到需要安装的目录即可。
tomcat的目录介绍
bin | 专门用来存放 Tomcat 服务器的可执行程序 |
---|---|
conf | 专门用来存放 Tomcat 服务器的配置文件 |
lib | 专门用来存放 Tomcat 服务器的 jar 包 |
logs | 专门用来存放 Tomcat 服务器运行时输出的日记信息 |
temp | 专门用来存放 Tomcat 运行时产生的临时数据 |
web apps | 专门用来存放部署的 Web 工程。 |
work | 是 Tomcat 工作时的目录, 用来存放 Tomcat 运行时 jsp 翻译为 Servlet 的源码, 和 Session 钝化的目录。 |
tomcat的运行
启动界面
访问tomcat服务器
http://localhost:8080/
Tomcat启动时的常见问题:
- 出现了cmd窗口 但是cmd窗口一闪而过,没有启动运行窗口
Tomcat是基于java语言开发的,因此tomcat的运行需要依赖jdk 依赖jvm 所以tocmat要正常启动,首先必须保证你的jdk的环境变量配置必须正确
解决方案:就是检查你的环境变量的配置
- 启动时报错
确定问题:查看tomcat的启动日志
这个原因是因为我们电脑的8080端口被其他程序占用。
解决端口占用问题:修改配置文件 修改端口
tocmat的停止.
- 将启动的cmd窗口 直接关闭即可
- 可以通过tomcat的命令来关闭
在bin目录下,运行shutdown.bat 即可停止tomcat的运行。
tocmat的下载
https://tomcat.apache.org/download-90.cgi
tomcat启动时,cmd窗口的中文乱码
修改conf/logging.properties
tocmat的相关配置
应用管理:conf/tomcat-user.xml
主机管理
在tomcat中部署web应用
欢迎页面的访问
apache-tomcat-9.0.43\webapps\ROOT这个目录就是欢迎页面项目所在的目录
ROOT目录 是tomcat的一个默认访问目录。
localhost:8080改地址默认访问的就是ROOT目录下的index.html/index.jsp等这样的页面
手动部署自己的应用到tocmat
方式一:将应用部署到webapps目录下
将《零点读书》网上书城的项目部署到tomcat中
部署的步骤:
- 在webapps目录下创建一个目录 books(项目名称)
- 将webcontent目录下的所有文件及目录拷贝到books目录下
- 重启tomcat
- 访问项目:http://localhost:8080/books/ 默认会访问项目下的index.html
方式二:采用目录映射的方式
- 如果不想将项目部署到webapps下 则可以将项目放置到服务器的任意目录下
- 在tomcat的conf\Catalina\localhost目录下 新建一个文件app.xml
<!-- Context 表示一个工程上下文
path 表示工程的访问路径:/abc
docBase 表示你的工程目录在哪里
-->
<Context path="/app" docBase="E:\books” />
- 重启tomcat
- 访问我们的应用
http://localhost:8080/app/
直接访问 和使用web服务器访问的区别
直接访问:
Web访问
http://localhost:8080/app/
区别:
1 协议不同:直接访问 使用file协议 web访问:http
2 访问方式: 就是打开一个文件 基于请求响应模式
使用idea创建一个web工程
创建工程
项目命名
对Java项目提供web支持
Web项目的最终目录结构
修改index.jsp的内容
在idea中将项目部署到tomcat
给idea配置tomcat
将项目工程部署到tomcat中
一般将Application_context的值修改为/
http://localhost:8080/
动态web技术
什么是Servlet
- Servlet 是JavaEE 规范之一。规范就是接口
- Servlet 就JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。
- Servlet 是运行在服务器上的一个java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。
开发一个Servlet程序
需要在工程中引入tomcat容器对serlvet规范的实现引入相关依赖
创建一个类
package cn.lanqiao.servlet;
import javax.servlet.*;
import java.io.IOException;
/**
* @author Mr.Hu
* @create 2021/03/30
*/
public class HelloServlet implements Servlet {
// 进行servlet的初始化
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
//获取servlet 的配置
@Override
public ServletConfig getServletConfig() {
return null;
}
// servlet提供服务的方法
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
//获取serlvet信息的方案
@Override
public String getServletInfo() {
return null;
}
//当servlet销毁的时候需要执行的方法
@Override
public void destroy() {
}
}
- 配置servlet
在web/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 注册servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>cn.lanqiao.servlet.HelloServlet</servlet-class>
</servlet>
<!-- 配置serlvet的映射路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
- 部署并启动
http://localhost:8080/web01/hello
请求的分析
url-pattern的配置
第一种 :以/开头
<url-pattern>/hello</url-pattern>
http://localhost:8080/web01/hello/abc/def
<url-pattern>/hello/abc/def</url-pattern>
http://localhost:8080/web01/hello/abc/def
<url-pattern>/</url-pattern>
http://localhost:8080/web01/
第二种:使用通配符配置
<url-pattern>*.do</url-pattern>
使用通配符的时候 前边不能由/
<url-pattern>*.action</url-pattern>
*代表任意字符
Servlet的生命周期
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
Init方法只执行一次 而且默认是在serlvet第一次请求的时候执行。先于service方法执行。在整个过程中 执行一次。
@Override
public void destroy() {
System.out.println("servlet 销毁。。。。。");
}
Destroy也只执行一次 实在servlet从servlet容器(tomcat)中卸载的时候 执行。
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("serlvet提供服务.......");
}
这是真正提供服务的方法。可以处理请求和响应。
在serlvet中存在构造方法,他也只执行一次,而且先于init方法执行。从而说明servlet是一个单例的。
Servlet的 构造和初始化时机:
- 默认情况下(<0) 实在第一次请求servlet的时候 构造和初始化serv’let
- 配置构造和初始化的时机load-on-startup
配置为>=0 则servlet随着容器的启动而完成构造和初始化
当参数大于等于0的时候 参数数值越小 构造和初始化的时机越早。
Servlet的另一种开发方式
package cn.lanqiao.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author Mr.Hu
* @create 2021/03/30
*/
//此时通过继承HttpServlet 该servlet对http协议提供了更好的支持
//请求的方式 目前请求方式常用的就只有get和post 原因就在于浏览器只支持get和post servlet是可以支持head put delete get post等 restful风格的请求的url
public class AppServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("do post方法执行......");
}
}
在以后的开发中,我们开发servlet只需要继承httpServlet即可,并需要重写其中的doGet和doPost方法
自定义的Servlet–>HttpServlet(抽象类)—>GenericServlet(抽象类)–> 实现了Servlet接口
在idea中快捷创建servlet
Servlet的相关对象ServletConfig
- ServletConfig 类从类名上来看, 就知道是 Servlet 程序的配置信息类。
- Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建, 我们负责使用。
- Servlet 程序默认是第一次访问的时候创建, ServletConfig 是每个 Servlet 程序创建时, 就创建一个对应的 ServletConfig 对象。
public void init(ServletConfig servletConfig) throws ServletException {
String servletName = servletConfig.getServletName();
ServletContext context = servletConfig.getServletContext();
Enumeration<String> pameterNames = servletConfig.getInitParameterNames();//获取配置的所有的初始化参数的名称
System.out.println(servletName);//hello
System.out.println(context);//Servlet的上下文对象
while (pameterNames.hasMoreElements()){
String name = pameterNames.nextElement();
//根据初始化参数的名称获取对应的值
String value = servletConfig.getInitParameter(name);
System.out.println(name+"--"+value);
}
}
ServletConfig 类的三大作用
- 可以获取 Servlet 程序的别名 servlet-name 的值
- 获取初始化参数 init-param
- 获取 ServletContext 对象
在通过继承HttpServlet的Servlet中 如何获取ServletConfig对象?
ServletConfig servletConfig = this.getServletConfig();
Servlet的相关对象ServletContext
什么是ServletContext
- ServletContext 是一个接口,它表示Servlet 上下文对象
- 一个web 工程,只有一个ServletContext 对象实例。
- ServletContext 对象是一个域对象。
- ServletContext 是在web 工程部署启动的时候创建。在web 工程停止的时候销毁。
什么是域对象?
域对象,是可以像Map 一样存取数据的对象,叫域对象。
这里的域指的是存取数据的操作范围,整个web 工程。
- | 存数据 | 取数据 | 删除数据 |
---|---|---|---|
Map | put() | get() | remove() |
域对象 | setAttribute() | getAttribute() | removeAttribute() |
ServletContext 类的四个作用:
- 获取web.xml 中配置的上下文参数context-param
- 获取当前的工程路径,格式: /工程路径
- 获取工程部署后在服务器硬盘上的绝对路径
- 像Map 一样存取数据
@Override
public void init(ServletConfig servletConfig) throws ServletException {
ServletContext context = servletConfig.getServletContext();//servlet的上下文对象
String contextPath = context.getContextPath();///web01
System.out.println(contextPath);
//获取初始化参数
Enumeration<String> names = context.getInitParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
String value= context.getInitParameter(name);
System.out.println(name+"---"+value);
}
//使用servletContext域对象存取数据
context.setAttribute("name","张三");
String n =(String) context.getAttribute("name");
System.out.println(n);
}
Web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<context-param>
<param-name>school</param-name>
<param-value>中北大学</param-value>
</context-param>
<context-param>
<param-name>address</param-name>
<param-value>太原</param-value>
</context-param>
<!-- 注册servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>cn.lanqiao.servlet.HelloServlet</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123455</param-value>
</init-param>
<!--load-on-startup 必须位于init-param之后-->
<load-on-startup>10</load-on-startup>
</servlet>
<!-- 配置serlvet的映射路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>cn.lanqiao.servlet.TestServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>cn.lanqiao.servlet.AppServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/app</url-pattern>
</servlet-mapping>
</web-app>
在继承了httpservlet的servlet中 获取ServletContext对象
//获取servletContext对象
ServletContext context1 = this.getServletContext();
ServletContext context2 = servletConfig.getServletContext();