Java Web
Tomcat
安装
Tomcat官网:https://tomcat.apache.org/
Tomcat启动和配置
启动和关闭 Tomcat
可以配置启动的端口号(conf\server.xml)
- Tomcat 的默认端口号为:8080
- MySQL:3360
- HTTP:80
- HTTPS:443
<Connector potr="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
可以配置主机的名字
- 默认主机名称为:localhost-->127.0.0.1
- 默认网站应用存放的位置为:webapps
<Host name="kbws.com" appbase="wwebapps"
unpackWARs="true" autoDeploy="true"/>
面试题
请你谈谈网站是如何访问的!
- 输入一个域名,回车
- 检查本机的
C:\Windows\System32\drivers\etc\hosts
配置文件下有没有这个域名的映射 - 有:直接返回对应的 ip 地址,这个地址中,有我们需要访问的 web 程序,可以直接访问
127.0.0.1 www.qinjiang.com
- 没有:去 DNS 服务器去找,找到的话就返回,找不到就返回找不到
发布一个Web网站
将自己写的网站,放到服务器(Tomcat)中指定的web应用的文件夹(webapps)下,就可以访问了
网站应有的结构:
--webapps:Tomcat服务器的web目录
-Root
-kuangstudy:网站的目录名
-WEB-INF
-classes:java程序
-lib:web应用所依赖的jar包
-web.xml:网站配置文件
-index.html 默认的首页
-static
-css
-style.css
-js
-img
-.......
HTTP
什么是HTTP
超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消 息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当
- 文本:html,字符串,~.....
- 超文本:图片,音乐,视频,定位,地图.......
- 默认端口:80
HTPS:安全的
- 默认端口:443
HTTP请求
客户端---发送请求(Request)---服务器
百度:
Request URL: https://www.baidu.com/ 请求地址
Request Method: GET get方法/post方法
Status Code: 200 OK 状态码:200
Remote(远程) Address: 110.242.68.4:443
Accept: text/html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9 语言
Cache-Control: max-age=0
Connection: keep-alive
请求行
- 请求行中的请求方式:GET
- 请求方式:Get/Post
- get:一次请求能够携带的参数较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但高效
- post:一次请求能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏显示数据内容,安全,但不高效
请求头
Accept:告诉浏览器,它所支持的数据类型
Accept-Encoding:支持哪种编码格式 GBK UTF-8 GB2312 ISo8859-1
Accept-Language:告诉浏览器他的语言环境
Cache-Control:缓存控制
Connection: 告诉浏览器,请求完成是断开还是保持连接
HOST:主机
HTTP响应
服务器---响应---客户端
百度:
Cache-Control: private 缓存控制
Connection: keep-alive 连接
Content-Encoding: gzip 编码
Content-Type: text/html;charset=utf-8 类型
响应体
Accept:告诉浏览器,它所支持的数据类型
Accept-Encoding:支持哪种编码格式 GBK UTF-8 GB2312 ISo8859-1
Accept-Language:告诉浏览器他的语言环境
Cache-Control:缓存控制
Connection: 告诉浏览器,请求完成是断开还是保持连接
HOST:主机
Refrush:告诉客户端,多久刷新一次
Location:让网页重新定位
响应状态码
200:相应成功 3xx:请求重定向 4xx:找不到资源 404 5xx:服务器代码错误 500 502:网关错误
Servlet
简介
- Servlet 是 sun 公司开发动态web的一门技术
- Sun 在这些 API 中提供的一个接口叫做:Servlet,如果你想开发一个 Servlet 程序,只需要完成两个步骤:
- 编写一个类,实现 Servlet 接口
- 把开发好的 Java 类部署到 web 服务器中
把实现了 Servlet 程序的 Java 程序叫做,Servlet
HelloServlet
Servlet 接口 sun 公司有两个默认的实现类:HttpServlet
,GenericServlet
一、构建一个空白Maven项目,删掉里面的src目录,之后的学习就在这个项目里建立 Moudel;这个空的工程就是 Maven 的主工程
Servlet 依赖:
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
<scope>provided</scope>
</dependency>
JSP依赖:
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
<scope>provided</scope>
</dependency>
<!--Tomcat10的依赖-->
<dependency>
<groupId>jakarta.servlet.jsp</groupId>
<artifactId>jakarta.servlet.jsp-api</artifactId>
<version>3.0.0</version>
<scope>provided</scope>
</dependency>
二、关于Maven父子工程的理解
父项目中会有
<modules>
<module>servlet-01</module>
</modules>
子项目中会有
<parent>
<artifactId>demo3</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
父项目中的Java子项目可以直接使用
son extends father
三、Maven 环境优化
1、修改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"
metadata-complete="true">
</web-app>
2、将Maven的结构搭建完整
四、编写一个Servlet程序
1、编写一个普通类
2、实现 Servlet 接口,这里我们直接继承 HttpServlet
public class HelloServlet extends HttpServlet {
//由于get或者post只是请求实现的不同方式,可以相互调用,业务逻辑都一样
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();//相应流
writer.print("Hello,Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
五、编写 Servlet 的映射(在web.xml中)
为什么需要映射:我们写的是 Java 程序,但是需要通过浏览器访问,而浏览器需要连接 web 服务器,所以我们需要在 web 服务器中注册我们写的 Servlet,还需要给他一个浏览器能够访问的路径
<!--注册Servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.java.Servlet.HelloServlet</servlet-class>
</servlet>
<!--Servlet的请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
一个 Servlet 要对应一个 Class 文件
六、配置 Tomcat
注意项目发布的路径
七、启动测试
问题:Tomcat10 无法实例化类
Tomcat10 对 Servlet 依赖包级目录改变,Maven 导入依赖时应该导入:
<dependency>
<groupId>jakarta.servlet.jsp</groupId>
<artifactId>jakarta.servlet.jsp-api</artifactId>
<version>3.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
<scope>provided</scope>
</dependency>
Servlet详解
核心接口和类
在 Servlet 体系结构中,除了实现 Servlet 接口,还可以通过继承 GenericServket 和 HttpServlet 类,实现编写
Servlet接口
在 Servlet API 中最重要的是 Servlet 接口,所有的 Servlet 都会直接或间接的与该窗口发生关系,或是直接实现该接口,或间接继承自实现了该接口的类
该接口包含以下五个方法:
init(ServletConfig config)
ServletConfig getServletConfig()
service(ServletRequest req,ServletResponse res)
String getServletInfo()
destroy()
GenericServlet抽象类
GenericServlet 抽象类使得编写 Servlet 变得容易。它提供的生命周期方法 init 和 destroy 的简单实现,要编写一般的 Servlet,只需要重写 service 方法即可
HttpServlet类
HttpServlet 是继承 GenericServlet 的基础上进一步的拓展
提供将要被子类化以创建适用于 Web 站点的 HttpServlet 抽象类。HttpServlet 的子类至少重写一个方法,该方法通常是以下这些方法之一:
doGet,如果servlet支持HTTP GET请求
doPost,用于HTTP POST请求
doput,用于HTTP PUT请求
doDelete,用于HTTP DELETE请求
Servlet的两种创建方式
实现接口Servlet
/*
* Servlet创建的第一种方式:实现接口Servlet
* */
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 {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
该方式比较麻烦,需要实现接口中的所有方法
继承HttpServlet(推荐)
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException, IOException {
PrintWriter writer = resp.getWriter();//相应流
writer.print("Hello,Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
常见错误
HTTP Status 404 资源找不到
- 第一种情况:地址书写错误
- 第二种情况:地址没有问题,把IDEA项目中的out目录删去,然后重新运行
- Servlet地址配置重复。
- Servlet地址配置错误。
Servlet两种配置方式
使用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"
metadata-complete="true">
<!--注册Servlet-->
<servlet>
<!--名称-->
<servlet-name>hello</servlet-name>
<!--Servlet的全称名称-->
<servlet-class>com.java.servlet.HelloServlet</servlet-class>
<!--启动的优先级,数字越小越先起作用-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--映射配置-->
<!--Servlet的请求路径-->
<servlet-mapping>
<!--名称-->
<servlet-name>hello</servlet-name>
<!--资源匹配规则:精确匹配-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<!--Error-->
<servlet>
<servlet-name>error</servlet-name>
<servlet-class>com.java.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>error</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
url-pattern定义匹配规则,取值说明:
精准匹配 | /具体的名称 | 只有url路径是具体的名称的时候才会触发Servlet |
---|---|---|
后缀匹配 | *.xxx | 只要是以xxx结尾的就匹配触发Servlet |
通配符匹配 | /* | 匹配所有请求,包含服务器的所有资源 |
通配符匹配 | / | 匹配所有请求,包含服务器的所有资源,不包括.jsp |
load-on-startup
- 元素标记容器是否应该在 web 应用程序的时候就加载这个 Servlet
- 它的值必须是一个整数,表示 servlet 被加载的先后顺序
- 如果该元素的值为负数或没有设置,则容器会当 Servlet 被请求时再加载
- 如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个 Servlet,值越小,servlet 的优先级越高,就越被优先加载。值相同时,容器就会自己选择顺序来加载