WEB服务器

Web

砸牛顿的那个苹果

Tomcat

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是运行在服务器上的小程序 .

ServletTomcat 提供的接口,供编程人员实现 . 实现后 , 服务器启动 , 即可执行实现了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 方法
getdoGet()
postdoPost()
deletedoDelete()
putdoPut()
tracedoTrace()

我们要根据实际情况 , 浏览发出什么类型请求 . 我们就重写什么方法处理该类型请求 .

接收 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
砸牛顿的那个苹果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小郑要做干饭人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值