Tomca和Servlet简单配置和使用

1.Tomcat

1.目录介绍

  • bin:专门用来存放Tomcat服务器的可执行程序。
  • conf:专门用来存放Tomcat服务器的配置文件
  • lib:专门用来存放Tomact服务器的jar包
  • logs:专门用来存放Tomcat服务器运行时输出的日志信息
  • temp:专门用来存放Tomcat运行时产生的零食数据
  • webapps:专门用来存放部署的web工程
  • work:是Tomcat工作时的目录,用来存放Tomcat运行时jsp范围为Servlet的源码

1.IDE配置Tomcat

在这里插入图片描述

注意花红的:因为TOmcat里面会有许多工程,这意思是我们要访问到次工程,而次工程叫啥。

打开默认会访问到webapp工程下的Index.html而不是在webapp下面的包下面的inde.html。如果在webapp工程下的index.html则直接会报出404.

2.Servlet

1.什么是Servlet

  • 是javaweb三大组件之一。分别是servle,Filter(过滤器),listener(监听器)
  • 接收客户端发过来的请求并响应数据给客户端。

2.如何在idea使用

1.创建一个类实现servlet接口

package com.miao.tong.li;
import javax.servlet.*;
import java.io.IOException;

public class test 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("我来处理数据啦");
    }

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

    @Override
    public void destroy() {

    }
}

2.在web中的web.xml配置servlet的路径

<?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标签给Tomcat配置Servlet程序-->
    <servlet>
        <!--servlet-name标签Servletc程序起一个别名(一般是类型)-->
        <servlet-name>test</servlet-name>
        <!--servlet-class是servletc程序的全类名-->
        <servlet-class>com.miao.tong.li.test</servlet-class>
    </servlet>
    <!--servlet-mappingb标签给sservlet程序配置访问地址-->
    <servlet-mapping>
        <!--servlet-name告诉服务器w我当前配置的地址给哪个Servlet程序使用-->
        <servlet-name>test</servlet-name>
        <!--访问地址localhost:3306/工程名字/hello-->
        <!--注意一定要以/开头-->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

3.启动测试

在这里插入图片描述

3.servlet的生命周期

1.执行servlet构造器方法【若一个类继承了servlet那么会执行servlet的构造方法】

2.执行init执行方法

3.执行service方法

4.执行destory销毁方法

注意:1,2在第一次访问的时候创建servlet程序会调用。3.每次访问都会调用,4.在销毁的时候调用

在这里插入图片描述

4.servlet处理请求的分发

HttpServletRequest request=(HttpServletRequest) servletRequest;
        String method = request.getMethod();
//会获取到是POST方式还是GET方式

3.使用HTTPservlet来实现Servlet

1.通过继承实现

1.写一个类继承httpservlet

package com.miao.tong.li;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author miaotongli
 * @create 2022-10-19-下午 04:10
 * @describe
 */
public class test1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.doGet(req, resp);
        System.out.println("我是doGet里面的方法");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.doPost(req, resp);
        System.out.println("我是doPost里面的方法");
    }
}

2.在web.xml配置该servlet的路径

    <servlet>
        <servlet-name>test1</servlet-name>
        <servlet-class>com.miao.tong.li.test1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>test1</servlet-name>
        <url-pattern>/hello2</url-pattern>
    </servlet-mapping>

在这里插入图片描述

4.ServletConfig类介绍

在这里插入图片描述

是servlet程序的配置信息类。默认在Servlet中的init方法中使用【当然其他地方也可以用】。

Servlet程序和ServletConfig对象都是由Servlet程序的配置信息类。

Servlet程序默认是第一次访问的时候创建,Servlet是每个Servlet程序创建时候,就创建一个对应的ServletConfig对象。

1.作用

1.可以获取Servlet程序的别名

2.获取初始化参数init-paranm

3.获取ServletContext对象

public class test implements Servlet {
    public test() {
        System.out.println("1");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        String servletName = servletConfig.getServletName();
        System.out.println("获取Servlet程序的别名"+servletName);
        String username = servletConfig.getInitParameter("username");
        System.out.println("获取Servlet程序的参数"+username);
        ServletContext servletContext = servletConfig.getServletContext();
        System.out.println("获取Servlet程序的上下文对象");
        System.out.println("2");
    }

    <!--servlet标签给Tomcat配置Servlet程序-->
    <servlet>
        <!--servlet-name标签Servletc程序起一个别名(一般是类型)-->
        <servlet-name>test</servlet-name>
        <!--servlet-class是servletc程序的全类名-->
        <servlet-class>com.miao.tong.li.test</servlet-class>
        <init-param>
            <param-name>username</param-name>
            <param-value>miaotongli</param-value>
        </init-param>
    </servlet>
    <!--servlet-mappingb标签给sservlet程序配置访问地址-->
    <servlet-mapping>
        <!--servlet-name告诉服务器w我当前配置的地址给哪个Servlet程序使用-->
        <servlet-name>test</servlet-name>
        <!--访问地址localhost:3306/工程名字/hello-->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

2.补充说明

当一个子类继承HttpServlet的时候并且重写了init方法此时我们需要在里面写上super.init(config),若不重写则子类config会配置进去导致父类GenricService中的config为空;

public class test1 extends HttpServlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        
    }}

在GenericServlet中this.config=config创建Servlet的时候把配置给了这个类里面的config。
在这里插入图片描述

5.ServletContext类介绍

在这里插入图片描述

1.ServletContext是一个接口,它表示Servlet上下文对象

2.一个web工程,只有一个ServletContext对象实例。【内部含义就是各个Servlet可以共同用某些东西】

3.ServletContext对象是一个域对象。

4.ServletContext是在web工程部署启动的时候创创建。在web工程停止的时候销毁。

什么是域对象?

域对象,是可以像Map一样存取数据的对象,叫域对象。

这里的域指的是存取数据的范围,整个WEB工程

存数据取数据删除数据
mapput()get()remove()
域对象setAttribute()getAttribute()removeAttribute()

1.作用

1.获取web.xml中配置的上下文参数context-param[整个工程而言]

2.获取当前的工程路径,格式:/工程路径

3.获取工程部署后在服务器硬盘上的绝对路径

4.像Map一样存取数据

在这里插入图片描述

修改:servletContext.getRealPath(“/”);

在这里插入图片描述

6.HTTP协议

在这里插入图片描述

1.GET请求

1.请求行

  • 请求的方式 GET
  • 请求的资源路径[+?+请求参数
  • 请求的协议的版本号] HTTP/1.1

2.请求头

key:value 组成

在这里插入图片描述

2.POST请求

1.请求行

2.请求头

空行

3.请求体

请求体就是发送给服务器的数据。

在这里插入图片描述

3.GET有哪些和POST有哪些?

get:

  • form标签 method=get
  • a标签
  • link标签引入css
  • Script标签引入js文件
  • img标签引入图片
  • iframe引入html页面
  • 在浏览器地址栏中输入地址后就回车

post:

  • form标签 method=post

4.响应的HTTP介绍

1.响应行

2.响应头

3.响应体

在这里插入图片描述

5.常见的响应码说明

  • 200:表示请求成功
  • 302:表示请求重定向
  • 404:表示请求服务器已经收到了,但是你要的数据不存在(请求地址错误)
  • 500:表示服务器已经收到请求,但是服务器内部错误(代码错误)

7.HttpServletRequest类

1.有什么用:

每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中。然后传递到service方法(doGet和doPost)中给我们使用。我们可以通过使用HttpServletRequest对象,获取到所有请求的信息

2.常用方法

在这里插入图片描述

注意:最常用的就是getParamter和getParamterValues

  <form action="http://localhost:8080/Tomocat_war_exploded/hello2" method="get">
    姓名:<input type="text" name="username">
    密码:<input type="password" name="password">
    兴趣爱好:<input type="checkbox" name="xingqu" value="cpp">C++
    <input type="checkbox" name="xingqu" value="java">java
    <input type="checkbox" name="xingqu" value="python">python
    <input type="submit">
  </form>
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.doGet(req, resp);
        System.out.println("我是doGet里面的方法");
        String username = req.getParameter("username");
        System.out.println(username);
        String password = req.getParameter("password");
        System.out.println(password);
        String[] xingqus = req.getParameterValues("xingqu");
        for (String s : xingqus) {
            System.out.println(s.toString());
        }
    }
    <servlet>
        <servlet-name>test1</servlet-name>
        <servlet-class>com.miao.tong.li.test1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>test1</servlet-name>
        <url-pattern>/hello2</url-pattern>
    </servlet-mapping>

3.请求得到的数据乱码问题

 req.setCharacterEncoding("UTF8");//即可解决【他在放在最前面即放在获取参数的前面】

4.请求的转发

注意:最重要的是地址栏不发生变化

个人理解:转发会先去web.xml里面找看看是否有对应的地址如果没有再去web看看其他路径

在这里插入图片描述

在这里插入图片描述

public class one extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        System.out.println(username);
        req.setAttribute("key","我是柜台1");
        //请求转发必须要以为/开头因为他要映射到IDEA中的web目录下
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/Two");
        //走向对应的servlet资源位置
        requestDispatcher.forward(req,resp);

    }
}
public class two extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        System.out.println(username);
        Object password = req.getAttribute("key");
        System.out.println(password);
        System.out.println("完成我自己的数据");
    }
}


    <servlet>
        <servlet-name>one</servlet-name>
        <servlet-class>com.miao.tong.li.one</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>one</servlet-name>
        <url-pattern>/one</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>two</servlet-name>
        <servlet-class>com.miao.tong.li.two</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>two</servlet-name>
        <url-pattern>/Two</url-pattern>
    </servlet-mapping>

5.base标签

设置页面相对路径工作时参考的地址

在这里插入图片描述

<!DOCTYPE html>
<!--yuyu.html-->
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <base href="http://localhost:8080/Tomocat_war_exploded/WEB-INF/a/">
</head>
<body>
    <p>我是玉玉</p>
    <a href="../../index.jsp">我要回去</a>
</body>
</html>
<%--
  Created by IntelliJ IDEA.
  User: MTL
  Date: 2022/10/19
  Time: 上午 10:18
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <form action="http://localhost:8080/Tomocat_war_exploded/one" method="get">
    姓名:<input type="text" name="username">
    密码:<input type="password" name="password">
    兴趣爱好:<input type="checkbox" name="xingqu" value="cpp">C++
    <input type="checkbox" name="xingqu" value="java">java
    <input type="checkbox" name="xingqu" value="python">python
    <input type="submit">
  </form>
  $END$
  <p>dddddd</p>
  </body>
</html>

public class one extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求的统一资源定位符(绝对路径)
        String requestURI = req.getRequestURI();
        System.out.println(requestURI);
        //请求转发必须要以为/开头因为他要映射到IDEA中的web目录下
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/WEB-INF/a/yuyu.html");
        //走向对应的servlet资源位置
        System.out.println(requestDispatcher.toString());
       requestDispatcher.forward(req,resp);

    }
}

6.特殊字符

  • .代表本层目录 …代表上层目录
  • /斜杠是一种绝对路径./如果被浏览器解析,得到的地址是:http:ip:port/

8.HttpServletRespone类

HttpServletRespone类和HttpServletRequest类一样。每次请求进来,Tomcat服务器都会创建一个Respone对象转送给Servlet程序去使用。HttpServletRequest表示请求来的信息,HttpServletRespone表示所有响应的信息。

我们如果需要设置返回给客户端信息,都可以通过HttpServletResponse对象来经行设置。

1.两个输出流说明

字节流 getOutputStream(); 常用于下载(传递二进制数据)

字符流 getWriter(); 常用于回传字符串(常用)

两个流同时只能用一个,使用了字节流,就不能再使用字符流,反之亦然,否则就会报错。

2.往客户端回传字符串

PrintWriter writer=resp.getWriter();
writer.write("66666666666666");

3.解决响应数据浏览器数据乱码问题

方案一:

//设置服务器字符集为utf-8
resp.setCharacterEncoding("UTF-8");
//通过响应头,设置浏览器也是用UTF-8字符集
resp.setHeader("Context-Type","text/html;charset=UTF-8");

方案二:

//此方法同时设置服务器和客户端都是用UTF-8字符集,还设置了响应头
//此方法一定要在获取流对象之前调用才有效
resp.setContextType("text/html;charset=UTF-8");

4.请求重定向[网址会变]

方案一:

在这里插入图片描述

public class one extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setStatus(302);
        resp.setHeader("Location","http://localhost:8080/Tomocat_war_exploded/Two");

    }
}
public class two extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("66666");
    }
}

方案二(推荐使用):

public class one extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     resp.sendRedirect("http://localhost:8080/Tomocat_war_exploded/Two")

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值