Servlet在IDEA中的应用

部署TomCat项目的方式

1、直接将项目放到webapps目录下即可
/hello:项目的访问路径–>虚拟目录
简化部署:将项目打成一个war包,在将war包放置到webapps目录下
war包会自动解压缩
2、配置conf/server.xml文件
在标签中配置

<Context docDase="D:\hello" path="/hehe"/>
docBase:项目存放的路径
path:虚拟目录

3、在conf\Catalina\localhost创建任意名称的xml文件。在文件中编写

<Context docDase="D:\hello" />
虚拟目录:xml文件的名称

静态项目和动态项目

目录结构
Java动态项目的目录结构

---项目的根目录
	---WEB-INF目录:
		---web.xml:web项目的核心配置文件
		---classes目录:放置字节码文件的目录
		---lib目录:放置依赖的jar包
将Tomcat集成到IDEA中,并创建Java EE 项目,部署项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Servlet:server applet

概念:运行在服务器端的小程序
Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则
将来我们自定义一个类,实现Servlet接口,复写方法
在这里插入图片描述

快速入门

1、创建一个JavaEE项目
2、定义一个类,实现servlet接口
3、实现接口中的抽象方法
4、配置Servlet
我们需要使用浏览器通过URL来访问新创建的Java类,就需要将Java类在web.xml文件中映射成为对应的资源路径,也可理解为URL后面加的东西。
在这里插入图片描述

Java类
package com.example.day06_tomcat;

import javax.servlet.*;
import java.io.IOException;

public class ServletDemo01 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("zgDaren!");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

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>demo1</servlet-name>
        <servlet-class>com.example.day06_tomcat.ServletDemo01</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>demo1</servlet-name>
        <url-pattern>/demo01</url-pattern>
    </servlet-mapping>
</web-app>

问题:当我们定义了一个Java类,但我们并没有创建对象,我们也没有调用方法,自己就被执行了

servlet执行原理

1、当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径(demo01)
2、查找web.xml文件,是否有对应的<url-pattern>标签体内容
3、如果有,则在找到对应的<servlet-class>全类名
4、tomcat会将字节码文件加载进内存,并且创建其对象
5、调用其方法

在这里插入图片描述

servlet生命周期(5个方法)

1、被创建:执行init方法 ,只执行一次
Servlet什么时候被创建?
指定Servlet的创建时机,在web.xml文件中的<servlet>标签下进行配置
第一次被访问时创建<load-on-startup>为负数,其默认为-1
在服务器启动时加载<load-on-startup>为正数或0
Servlet的init方法只执行一次,说明一个servlet在内存中只存在一个对象,servlet是单例的
多个用户同时访问时,可能会存在线程安全问题所以尽量不在servlet中定义成员变量,可在service中定义,即使定义了成员变量,也不要修改获取值

2、提供服务:执行service方法,执行多次
每次访问servlet时,service方法都会被调用一次
3、被销毁:执行destroy方法,只执行一次
servlet被销毁时执行,服务器正常关闭,servlet被销毁
只有正常关闭时,才会执行destory方法
destroy方法在servlet销毁之前执行,释放资源

Java类
package com.example.day06_tomcat;

import javax.servlet.*;
import java.io.IOException;

/*
* Servlet的方法
* */
public class ServletDemo02 implements Servlet {
    /*
    * 初始化方法
    * 在servlet被创建时执行,只会执行一次
    * */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init...");
    }
    /*
    * 获取ServletConfig对象
    * ServletConfig:Servlet的配置对象*/
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    /*
    * 提供服务方法
    * 每一次servlet被访问时执行,执行多次*/
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service...");
    }
    /*
    * 获取Servlet的一些信息,版本,作者*/
    @Override
    public String getServletInfo() {
        return null;
    }
    /*
    * 销毁方法
    * 在服务器正常关闭时执行,执行一次*/
    @Override
    public void destroy() {

    }
}

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>demo1</servlet-name>
        <servlet-class>com.example.day06_tomcat.ServletDemo01</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>demo1</servlet-name>
        <url-pattern>/demo1</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>demo2</servlet-name>
        <servlet-class>com.example.day06_tomcat.ServletDemo02</servlet-class>
        <!--指定Servlet的创建时机
            1、第一次被访问时创建<load-on-startup>为负数,其默认为-1
            2、在服务器启动时加载<load-on-startup>为正数或0-->

        <load-on-startup>5</load-on-startup>
    </servlet>


    <servlet-mapping>
        <servlet-name>demo2</servlet-name>
        <url-pattern>/demo2</url-pattern>
    </servlet-mapping>
</web-app>

servlet注解配置

1、创建一个JavaEE项目,选择servlet的版本在3.0以上,可以不创建web.xml
2、定义一个类,实现servlet接口
3、实现接口中的抽象方法
4、在类上使用@webServlet注解,进行配置

@WebServlet("资源路径")
@WebServlet(urlPatterns = "/demo")
@WebServlet("/demo")
package cn.zg.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;


//@WebServlet(urlPatterns = "/demo")
@WebServlet("/demo")
public class ServletDemo 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("Servlet4.0来了...");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

== 切换项目时,一定要先关闭tomcat服务器,设置好后在重新启动,不然就会出现端口被占用的情况,如果端口被占用则在cmd窗口中netstat -aon|findstr 1099 命令查看到该1099端口的PID,然后结束进程==

IDEA与tomcat相关配置

1、IDEA会为每一个tomcat部署的项目单独建立一份配置文件
在项目中启动tomcat服务器后,查看控制台log:Using CATALINA_BASE: “C:\Users\64359\AppData\Local\JetBrains\IntelliJIdea2020.3\tomcat\af080da0-49e3-4185-a2c8-ba394708d02c”
2、工作空间项目和tomcat部署的web项目
tomcat真正访问的是“tomcat部署的web项目”,“tomcat部署的web项目”对应着“工作空间项目”的web目录下的所有资源
WEB-INF目录下的资源不能被浏览器直接访问。
3、断点调试,使用“dubug”启动

Servlet体系结构

Servlet–接口
GenericServlet–抽象类
HttpServlet–抽象类
GenericServlet:将servlet接口中其他方法做了默认空实现,只将service()方法作为抽象
将来定义servlet类时,可以继承GenericServlet,实现service()方法即可
HttpServlet:对http协议的封装和实现,简化操作
定义类继承HttpServlet
复写doGet/doPost方法
在这里插入图片描述

继承HttpServlet的类
package cn.zz.servlet;

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("/demo3")
public class ServletDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost...");
    }
}

在webapp目录下新建login.html,用来检测post方法
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/demo3" method="post">
        <input name="username">
        <input type="submit" value="提交">
    </form>
</body>
</html>
Servlet相关配置

一、urlpartten:Servlet访问路径
1、一个Servlet可以定义多个访问路径:@WebServlet({"/d4","/dd4","/ddd4"})
2、路径定义规则:
a、/xxx
b、/xxx/xxx:多层目录结构
c、*.do:但是前面一定不要写/

HTTP协议

概念:Hyper Text Transfer Protocol 超文本传输协议
传输协议:定义了,客户端和服务器端通信时,发送数据的格式
特点:基于TCP/IP的高级协议
默认端口号:80
基于请求/响应模型的:一次请求对应一次响应
无状态的:每次请求之间相互独立,不能交互数据
历史版本:1.0:每次请求响应都会建立新的连接
1.1:复用连接
在这里插入图片描述

请求消息数据格式
请求行

请求方式 请求url 请求协议/版本
GET/login.html HTTP/1.1

请求方式:HTTP协议有7种请求方式,常用的有2种
GET:1、请求参数在请求行中,在url后
2、请求的url长度有限制
3、不太安全
POST:1、请求参数在请求体中
 2、请求的url长度没有限制
 3、相对安全

请求头

请求头名称:请求头值
常见的请求头:
1、Host:请求的主机
2、User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息
可以在服务器端获取该头信息,解决浏览器的兼容性问题
3、Accept:告诉服务器浏览器可以解析啥文件
4、Accept-Language:支持的语言环境
5、Accept-Encoing:可接收的语言格式
6、Referer:http://localhost/login.html
告诉服务器“我”从哪里来
防盗链:
统计工作:
在这里插入图片描述

		7、Connection:keep-alive(表示可以一直被复用)

3、请求空行
空行:就是用于分隔post请求的请求头和请求体的
4、请求体(请求正文)
get无请求体,post有请求体,封装post请求消息的请求体的

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zgDaren

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

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

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

打赏作者

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

抵扣说明:

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

余额充值