Web
Tomcat
Tomcat的安装
无需安装,直接解压即可(注意路径中不要有中文!!!)
如下图:这是Tomcat解压后的样子:
启动
Tomcat服务器是使用Java编写的 , 本机需要有Java环境.即需要有JDK , 且需要配置好环境变量!
打开Tomcat的解压路径 , 进入到 bin 目录下,找到 startup.bat ,双击:
**bug : **如果点击后 , 一闪而过 . 那么需要在系统变量中配置JRE_HOME, 值为你jre的地址
.然后配置环境变量 path 配置 JRE 的路径%JRE_HOME%\bin
然后打开浏览器访问 : http://localhost:8080 , 或者 http://127.0.0.1:8080 进入Tomcat首页:
点击 shutdown.bat 即关闭服务器 ; 或者 , 直接关闭服务器对话框也可以关闭服务器 !
IDEA 创建 JavaWeb 项目
(一) . 编写 web 程序 - Servlet
Servlet是运行在服务器上的小程序 .
Servlet 是 Tomcat 提供的接口,供编程人员实现 . 实现后 , 服务器启动 , 即可执行实现了Servlet 接口的代码 .
步骤:
1.创建 web 项目;
2.创建类实现 Servlet 接口;
3.写代码逻辑;
4.编写 web.xml 映射文件;
5.启动服务器访问;
(二) . 编写 Servlet 接口
package com.xuanxuan.servlet;
import javax.servlet.*;
import java.io.IOException;
/**
* @author Zheng Zi Xuan
* @date 2021/1/20
* @desc
*/
public class Demo1Servlet implements Servlet{
public Demo1Servlet() {
System.out.println("Demo1Servlet创建了" );
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("Demo1 Servlet 初始化" );
}
@Override
public ServletConfig getServletConfig() {
return null; // 不用,此方法略过
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Demo1 Servlet 正在服务" );
}
@Override
public String getServletInfo() {
return null; // 不用,此方法略过
}
@Override
public void destroy() {
System.out.println("Demo1 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">
<servlet>
<servlet-name>heihei</servlet-name>
<servlet-class>com.xuanxuan.Demo1Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>heihei</servlet-name>
<url-pattern>/indexs</url-pattern>
</servlet-mapping>
</web-app>
(四) . 启动
(五) . 访问
浏览器输入: http://localhost:8080/indexs 访问 .
浏览器访问 : http://localhost:8080/ 默认访问的是根据路径下的index.jsp页面 .
与http://localhost:8080/index.jsp 访问效果是一致的 .
原因 :
是因为 web.xml 中默认的配置 .
(六) . 执行流程
1 . 服务器启动 , 会加载 web.xml 文件.
2 . 浏览器发出请求 http://localhost:8080/indexs
3 . 解析路径 , 找到 ip + 端口对应的服务器 , 再找到对应的应用程序
4 . 解析出请求路径 /indexs , 拿着该路径与 web.xml中配置的路径进行匹配 . 如果匹配一致 ,
即通过 Servlet-name 找到 Servlet-class 对应的类 , 执行 !
创建
初始
服务
如果匹配不一致 , 即报错 404 .
Web 项目配置 Tomcat
Servlet 的生命周期
1 . 当请求到该 Servlet 类时 , 该类对象才创建 , 且只创建这一次 .
2 . 创建后立即初始化 , 且只初始化一次 .
3 . 以后每次通过路径访问该 Servlet 时 , 都会调用 service 方法 , 执行服务 .
4 . 服务器宕机或者项目从服务器卸载时即销毁 .
Servlet 的映射细节
1 . 映射路径细节
1.1 绝对路径写法:
只能访问 /demo 才行 .
1.2 多层路径:
只能访问 /demo/a 才行 .
1.3 模糊匹配路径:
1.4 固定后缀路径:
1.5 多个请求路径 , 可以到达同一个 Servlet
换句话说 , 即同一个 Servlet 可以处理多个请求 .
1.6 一个请求不能到达多个 Servlet
换句话说,是一个请求 '不能 ' 同时被多个 Servlet 处理 .
报错:
Caused by: java.lang.IllegalArgumentException:
The servlets named [com.xuanxuan.servlet.Demo1Servlet] and [com.xuanxuan.servlet.Demo2Servlet] are both mapped to the url-pattern [/a] which is not permitted
非法参数异常
HttpServlet
因为之前都是实现 Servlet 接口 , 重写了所有方法 . 但是 , 通常我们只关心如果接收请求 ,
做出响应 , 其余方法不经常用 . 所以实现 Servlet 接口 , 显得很笨重 .
因此 , Servlet 架构中提供了一个专门用于处理 http 请求和响应的类 : HttpServlet .
HttpServlet是抽象类 , 但是在其中没有抽象方法 , 即不要求我们强制重写某些方法 .
该类提供了几乎所有的 Http 请求方法对应的 Java方法 .
Http 请求方法 | Java 方法 |
---|---|
get | doGet() |
post | doPost() |
delete | doDelete() |
put | doPut() |
trace | doTrace() |
… | … |
我们要根据实际情况 , 浏览发出什么类型请求 . 我们就重写什么方法处理该类型请求 .
接收 Get 请求
接收 get 请求需要重写 doGet() 方法
1 . 通过地址栏直接发出 get 请求
2 . 使用 a 标签发出的也是 get 请求
3 . form 表单 , method = "get"
上述的三种请求方法都可以发出 get请求 , 经过下方 web.xml 的映射 , MainClass即可执行 .
public class Demo3Servlet extends HttpServlet {
/**
* 重新doGet处理get请求
* 参数1 HttpServletRequest 请求对象,其中包含了所有请求数据
* 参数2 HttpServletResponse 响应对象,包含响应的数据和功能
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet执行了.." );
}
}
接收 Post 请求
public class Demo3Servlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost执行了.." );
}
}
Http 请求与响应
可以通过浏览器的开发者工具检测请求与响应 .
请求
请求行 : POST / demo HTTP /1.1
请求头 :
Host:初始URL中的主机和端口
Connection:
表示是否需要持久连接。如果服务器看到这里的值“Keep -Alive”,或者看到请求使
用的是HTTP 1.1(HTTP 1.1默认进行持久连接
Content-Length:表示请求消息正文的长度
Cache-control
max-age>0 时 直接从游览器缓存中 提取
max-age<=0 时 向server 发送http 请求确认 ,该资源是否有修改 有的话 返回200 ,无的
话返回304.
Origin: 请求来源
Upgrade-Insecure-Requests: 1
告知服务器,浏览器可以处理https协议,然后服务器返回Content-Security-Policy:
upgrade-insecure-requests头,或者通过meta头设置,告诉浏览器,对于页面的http资源,请求
时可以自动升级到https
Content-Type:内容类型
告诉服务器浏览器传输数据的MIME类型,文件传输的类型
application/x-www-form-urlencoded
User-Agent:浏览器类型.
Accept:浏览器可接受的MIME类型
MIME 就是指能接收什么类型数据告诉服务器客户端能接收什么样类型的文件。
Referrer:
包含一个URL,用户从该URL代表的页面出发访问当前请求的页面
Accept-Encoding:
浏览器能够进行解码的数据编码方式,比如gzip
Accept-Language:
浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。可以在浏览器中
进行设置。Cookie:这是最重要的请求头信息之一
请求正文 :
响应
响应行 :
响应头 :
响应正文 :
HttpServlet 处理请求
package com.xuanxuan.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
/**
* @author Zheng Zi Xuan
* @date 2021/1/20
* @desc 处理请求
*/
public class Demo4Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// ====== 请求行 ======
// 1 请求方法
String method = req.getMethod( );
// 2 请求路径
String uri = req.getRequestURI( );// 资源标识符
StringBuffer url = req.getRequestURL( );// 资源定位符
// 3 请求协议
String protocol = req.getProtocol( );
System.out.println(method+" "+uri+" "+protocol );
System.out.println("url = "+url );
// ====== 请求头 =====
Enumeration<String> headerNames = req.getHeaderNames( );
while (headerNames.hasMoreElements()) {
String head = headerNames.nextElement( );
String value = req.getHeader(head);
System.out.println(head+": "+value );
}
// ====== 请求正文(参数) =======
// 此方法获得请求中的数据,参数是路径值的key.
// 即<input>中name属性的值
// ===> 其他任何input输入类型,都使用该方法接收参数
String username = req.getParameter("username");
String password = req.getParameter("password");
// 只有多选框使用 req.getParameterValues()
System.out.println(username +" + "+password );
}
}
小提示 :
热部署 - 实时更新
路径问题
端口查杀
win + R 键 然后输入 cmd
1 . 输入: netstat -ano|findstr 8080
2 . 输入: tasklist|findstr 5324
3 . 输入: taskkill /f /t /im javaw.exe