tomcat和servlet快速入门教程!!!

Posted 大忽悠爱忽悠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tomcat和servlet快速入门教程!!!相关的知识,希望对你有一定的参考价值。

Tomact和servlet快速入门教程


tomcat的入门必备知识

1.下载:

tomcat官网下载地址

2.安装: 解压压缩包即可

注意:安装目录建议不要有中文和空格
在这里插入图片描述

3.卸载: 删除目录即可

4.启动:

4.1 bin/startup.bat ,双击运行该文件即可
4.2 访问:浏览器输入: http://localhost:8080 回车访问自己
或者 http://别人的ip:8080 访问别人
可以通过ipconfig:查看本机ip地址

4.3 启动可能出现的问题:

4.3.1 黑窗口一闪而过:

原因: 没有正确配置JAVA_HOME环境变量

4.3.2 启动报错:

原因: 端口号被占用

推荐的解决方法1: 找到占用的端口号,并且找到对应的进行,杀死该进程

在cmd窗口输入netstat -ano
在这里插入图片描述
打开任务管理器,找到刚才的进程ID,然后结束该进程
在这里插入图片描述

解决方法2: 修改自身端口号

conf/server.xml用记事本打开,将其默认端口号修改即可,可能还需要连带着修改其他的相关默认端口号才行
在这里插入图片描述
一般会把tomcat的默认端口号修改为80.
80端口号是http协议的默认端口号
好处:在访问时,就不需要输入端口号了

5.关闭:

强制关闭: 点击窗口的x
正常关闭: bin/shutdown.bat
或者ctrl+c

6.部署:

部署方式:
1.直接将项目放到webapps目录下即可
/hello: 项目的访问路径---->虚拟目录
简化部署:将项目打包成一个war包,再将war包部署到webapps目录下面
war包会自动解压缩.

2.配置conf/server.xml文件
在< Host >标签体中配置

<Context docBase="D:\\hello" path="/hehe" />

docBase: 项目存放的路径
path: 虚拟目录

3.在conf\\Catalina\\localhost创建了一个任意名称的xml文件。
在文件中编写:

<Context docBase="D:\\hello"/>

虚拟目录就是xml文件的名称

静态项目和动态项目

目录结构:
java动态项目的目录结构:
-项目根目录
–WEB-INF目录:
— web.xml: web项目的核心配置文件
—classes: 放置字节码文件的目录
—lib目录: 放置依赖的jar包


将tomcat集成到IDEA中,并且创建JavaEE项目,部署项目

tomcat集成到IDEA的教程


Servlet

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

web动态工程目录介绍

在这里插入图片描述


热部署

Tomcat上的部署问题,有时候也是个麻烦的问题,要是不采用热部署,我们就只能每次对原来的文件做一次改动的时候就要重新部署,而每次重新部署都要关闭tomcat,部署完重启tomcat,可见这是一个多么烦人的事情。现在,我们可以采用热部署了,以后,就不用做烦人的关闭重起工作。

热部署的设置:

在这里插入图片描述


快速入门

  1. 创建JavaEE项目
  2. 定义一个类,实现Servlet的接口
  3. 实现接口中的抽象方法
  4. 配置servler

在wed.xml的< web-app >标签里面进行配置:

<?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标签Servlet程序起一个别名(一般是类名)-->
        <servlet-name>demo1</servlet-name>
        <!--servlet-class是servlet的全类名-->
        <servlet-class>web.servlet.servletDemo</servlet-class>
    </servlet>
    <!--给servlet程序配置访问地址-->
    <servlet-mapping>
        <!--告诉服务器,我当前配置的地址给哪个servlet程序使用-->
        <servlet-name>demo1</servlet-name>
        <!--配置访问地址
           / 斜杠在服务器解析的时候表示地址为: http://ip:port/工程路径
           /demo1 表示地址为:  http://ip:port/工程路径/demo1
        -->
        <url-pattern>/demo1</url-pattern>
    </servlet-mapping>
</web-app>

常见错误:
url-pattern配置的路径中没有以斜杠打头
servlet-name配置的值不存在
servlet-class标签全类名配置错误

工程路径名修改:
在这里插入图片描述


URL地址定位实现原理

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

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


生命周期方法

servlet中的生命周期:

  1. 被创建: 执行Init方法,只执行一次
  2. 提供服务: 执行service方法,执行多次
  3. 被销毁: 执行destory方法,只执行一次

Servlet的创建时机:
默认情况下,第一次被访问时,Servlet被创建
可以配置执行Sevlet的创建时机,如下:

<?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标签Servlet程序起一个别名(一般是类名)-->
        <servlet-name>demo1</servlet-name>
        <!--servlet-class是servlet的全类名-->
        <servlet-class>web.servlet.servletDemo</servlet-class>

      <!--  指定Servlet的创建时机
           1.第一次被访问时,创建
            <load-on-startup>的值为负数
            2.在服务器启动时,创建
             <load-on-startup>的值为0或者正整数
      -->
        <load-on-startup>5</load-on-startup>
    </servlet>
    <!--给servlet程序配置访问地址-->
    <servlet-mapping>
        <!--告诉服务器,我当前配置的地址给哪个servlet程序使用-->
        <servlet-name>demo1</servlet-name>
        <!--配置访问地址
           / 斜杠在服务器解析的时候表示地址为: http://ip:port/工程路径
           /demo1 表示地址为:  http://ip:port/工程路径/hello
        -->
        <url-pattern>/demo1</url-pattern>
    </servlet-mapping>
</web-app>

Servlet的init方法只执行一次,说明Servlet在内存中只存在一个对象,说明Servlet是单例的

  1. 多个对象同时访问时,可能存在线程安全问题
  2. 解决: 净量不要再Servlet中定义成员变量.即使定义了成员变量也不要修改其值

每次访问Servlet时,service方法都会被调用一次

Servlet被销毁时执行。服务器关闭时,Servlet被销毁。
只有服务器正常关闭时,才会执行destory
销毁方法在对象被销毁前执行


注解配置

Servlet 3.0以上才支持注解配置,支持注解配置后,就不需要web.xml了。

对于web.xml来说,对应的每一个servlet工程都需要重新配置一个web.xml太过繁琐

步骤:

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

在这里插入图片描述
注解就是加在类上面的,因此不需要关心全类名了,也就不需要再通过name属性做对应关系了

@WebServlet(urlPatterns="资源路径");
简化写法---->注解中最重要的属性value,其实就是urlPatterns属性,因此可以省略value
@WebServlet("资源路径");

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


IDEA与tomcat的相关配置

在这里插入图片描述


Servlet的体系结构

在这里插入图片描述


Servlet的urlpattern配置

1. urlpattern:servlet的访问路径

2.一个servlet可以定义多个访问路径: @WebServlet({"/Demo2","/dhy","/ly"})
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
3.路径定义规则:

1. /xxx
2. /xxx/xxx :多层路径,目录结构
在这里插入图片描述

  1. *.xxx
    在这里插入图片描述
    Servlet的url详解

Http

在这里插入图片描述


Http请求数据格式

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

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


Request对象

在这里插入图片描述

在这里插入图片描述


Request对象的继承体系结构

在这里插入图片描述


Request的功能

获取请求行数据

在这里插入图片描述

在这里插入图片描述
代码演示:

package request;

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

@WebServlet("/RequestServlet")
public class RequestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  //1.获取请求方式: GET
        String method=request.getMethod();
        System.out.println(method);
        //2.获取虚拟目录: /demo2
        String contextPath=request.getContextPath();
        System.out.println(contextPath);
        //3.获取servlet路径:/RequestServlet
        String servletPath=request.getServletPath();
        System.out.println(servletPath);
        //4.获取get方式请求参数: name=dhy
        String queryString=request.getQueryString();
        System.out.println(queryString);
        //5.获取请求URI: /demo2/RequestServlet
        String requestURI=request.getRequestURI();
        StringBuffer requestURL=request.getRequestURL();
        System.out.println(requestURI);
        System.out.println(requestURL);
        //6.获取协议及版本: HTTP/1.1
        String  protocol=request.getProtocol();
        System.out.println(protocol);
        //7.获取客户机的IP地址
        String remoteAddr=request.getRemoteAddr();
        System.out.println(remoteAddr);
        
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

在这里插入图片描述


获取请求头数据

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

获取所有头名称代码演示:

package request;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.Enumeration;

@WebServlet("/req")
public class reqServlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求头数据
        //1.获取所有请求头名称
        Enumeration<String> headerNames=request.getHeaderNames();
        //2.遍历
        while(headerNames.hasMoreElements())
        {
            String name=headerNames.nextElement();
            //更据名称获取请求头的值
            String header=request.getHeader(name);
            System.out.println(name+"------"+header);
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

在这里插入图片描述
获取浏览器版本相关信息代码演示:

package request;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.Enumeration;

@WebServlet("/req")
public class reqServlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           //演示获取请求头数据: user-agent
        String agent=request.getHeader("user-agent");//不区分大小写

        //判断agent的浏览器版本:
        if(agent.contains("Chrome"))
        {
            System.out.println("当前正在使用的是谷歌浏览器");
        }
        else if(agent.contains("Firefox"))
        {
            System.out.println("当前正在使用火狐浏览器");
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

在这里插入图片描述

告诉服务器请求从哪里来—referer:

package request;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.Enumeration;

@WebServlet("/req")
public class reqServlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           //演示获取请求头数据: user-agent
        //告诉服务器请求当前servlet实例的请求从哪里来的,是否来自指定网址
        String referer=request.getHeader("referer");//不区分大小写
        System.out.println(referer); //  http://localhost:8080/demo2/login.html

      //防止盗链
        if(referer!=null)
        {
            if(referer.contains("/demo2"))
            {
                System.out.println("下面播放极限挑战");
            }
            else//盗链
                System.out.println("请付费支持正版");
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}


获取请求体数据

在这里插入图片描述

代码演示:

package request;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Enumeration;

@WebServlet("/demo")
public class reqServlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpSe

以上是关于tomcat和servlet快速入门教程!!!的主要内容,如果未能解决你的问题,请参考以下文章

Servlet快速入门

Tomcat&Servlet快速入门

保姆级 tomcat 快速入门

Servlet快速入门

Servlet快速入门:第一个Servlet程序

Servlet的快速入门