真的了解Servlet吗? - Servlet的一些细节

前言

前面对Servlet大致了解了一下
真的了解Servlet吗?- Tomcat与Servlet
但是Servlet中还有很多重要的对象,以及一些细节需要去研究一下


目录

  1. Tomcat与IDEA的一些细节
    1.1. 部署工程
    1.2. IDEA中的Tomcat
  2. ServletConfig
    2.1. 重写登录功能
  3. ServletContext
  4. 转发与重定向

Tomcat与IDEA的一些细节

部署工程

关于Tomcat下部署工程的问题
都知道webapps是我们保存工程的地方

在这里插入图片描述
启动Tomcat:startup.bat

在这里插入图片描述
默认地址:得到的首页是webapps下ROOT工程下的index.html

那最简单的部署方法就是在webapps下创建工程
然后可以直接通过地址访问:http://ip:port/工程名/目录下/文件名

还有一种部署方法:

如果想要引入外部的项目,可以在conf 目录\Catalina\localhost\下创建一个xml配置文件
在这里插入图片描述

里面写入:

<!-- Context 表示一个工程上下文 path 表示工程的访问路径:/hello 
docBase 表示你的工程目录在哪里 --> 
<Context path="/hello" docBase="D:\helloWeb" />

就可以访问D:\helloWeb项目了
在这里插入图片描述

IDEA中的Tomcat

有没有想过IDEA中加入的Tomcat是怎么运行的
IDEA配置好Tomcat

在这里插入图片描述

运行,可以看到这些地址:

在这里插入图片描述

Using CATALINA_BASE地址里放了:conf、logs、work
Using CATALINA_HOME是Tomcat的地址
Using CATALINA_TMPDIR是临时数据存放地址
在这里插入图片描述
配置文件conf、日志logs、Tomcat 工作时的目录work

conf里放的是这些东西:是不是就是我们在webapps外部署项目时用到的方法
在这里插入图片描述
打开ROOT.xml

在这里插入图片描述

正是项目存放的地址
也就是说,IDEA运行Tomcat会备份一下关键的配置文件,在localhost目录下创建配置文件,这个配置文件会指向我们真实的地址


ServletConfig

Servlet接口中初始化方法:init会传递参数ServletConfig

在这里插入图片描述

ServletConfig是什么对象?

ServletConfig是Servlet 程序的配置信息类
Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。 Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig对象

ServletConfig的作用

既然是配置信息,那么作用就是获得配置信息

  1. 可以获取 Servlet 程序的别名 servlet-name 的值
  2. 获取初始化参数 init-param
  3. 获取 ServletContext 对象

也就是web.xml中的一些配置信息

重写登录功能

使用HTML表单登录:

login.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/testReqResp" method="get">
        用户名:<input name="name"></br>
        密  码: <input name="password"></br>
        <input type="submit" value="登录">
    </form>
</body>
</html>

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标签给Tomcat配置servlet-->
    <servlet>
        <servlet-name>helloServlet</servlet-name>
        <!--servlet全类名-->
        <servlet-class>test.helloServlet</servlet-class>
    </servlet>
    <!--servlet-mapping配置servlet程序配置访问地址-->
    <servlet-mapping>
        <!--servlet-name告诉服务器,当前地址给该Servlet使用-->
        <servlet-name>helloServlet</servlet-name>
        <!--url配置访问地址-->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>testReqResp</servlet-name>
        <servlet-class>test.TestReqResp</servlet-class>
		//配置参数:登录信息
        <init-param>
            <param-name>name</param-name>
            <param-value>zhangsan</param-value>
        </init-param>
        <init-param>
            <param-name>password</param-name>
            <param-value>123456</param-value>
        </init-param>

    </servlet>

    <servlet-mapping>
        <servlet-name>testReqResp</servlet-name>
        <url-pattern>/testReqResp</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>/login.html</welcome-file>
    </welcome-file-list>
</web-app>

TestReqResp.java

package test;

import javax.servlet.ServletConfig;
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.io.PrintWriter;

public class TestReqResp extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        ServletConfig servletConfig = getServletConfig();

        System.out.println("Servlet的名字:"+servletConfig.getServletName());
        resp.setCharacterEncoding("UTF-8");
        String name = req.getParameter("name");
        String password = req.getParameter("password");
        System.out.println("客户端输入的name:"+name);
        System.out.println("客户端输入的password:"+password);
        PrintWriter writer = resp.getWriter();
        if (name.equals(servletConfig.getInitParameter("name"))&&password.equals(servletConfig.getInitParameter("password"))){
            writer.println("hello Client");
        }
        else {
            writer.println("登录失败");
        }
    }
}

在Servlet中通过getInitParameter获得初始化参数
验证登录信息

在这里插入图片描述

结果:

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

通过ServletConfig获得了init-param属性

那ServletContext又是什么?


ServletContext

Context是上下文对象
那么ServletContext就是ServletContext就是Servlet上下文对象

关于ServletContext:

  1. 一个Web工程,只有一个ServletContext上下文对象,且在Web启动的时候创建,在Web停止时销毁
  2. ServletContext是一个域对象,可以像Map一样存取数据

ServletContext的作用:

  • 获取 web.xml 中配置的上下文参数 context-param
  • 获取当前的工程路径,格式: /工程路径
  • 获取工程部署后在服务器硬盘上的绝对路径
  • 像 Map 一样存取数据

context-param与前面的init-param是不同的
类似与局部变量和全局变量

一个在web-app根目录下
在这里插入图片描述

一个在Servlet中,且只能作用在该Servlet中

在这里插入图片描述

创建方法

可以通过GenericServlet的方法getServletContext()创建
也可以通过配置信息对象ServletConfig获得

在这里插入图片描述
为什么可以直接得到ServletConfig和ServletContext?

GenericServlet的两个方法可以返回这两个对象(其实getServletContext()也是通过ServletConfig获得的)
在这里插入图片描述
ServletContext方法
ServletContext身为整个Web服务器的上下文对象,自然可以得到很多属性
在这里插入图片描述

还有很多,就不一一列举了

总之,上下文信息都可以通过ServletContext对象得到
Web中有3个关键的域对象:HttpRequest、ServletContext、HttpSession
这3个域对象几乎囊括了Web服务器和请求的信息

当然,如何具体实现的,这个就不是Servlet包能够容纳的,它是由服务器去创建及实现其中的方法
具体的可以去深入Tomcat源码

转发与重定向

同为页面跳转,转发与重定向有什么区分?

在这里插入图片描述

转发是在服务端Servlet中跳转
重定向是将下一个URL响应给客户端,然后让客户端再次请求

在这里插入图片描述

转发:

req.getRequestDispatcher("/two").forward(req,resp);

Request对象通过getRequestDispatcher带着HttpServletRequest和HttpServletResponse跳转到下一个Servlet

重定向:

response.sendRedirect("/hello.html")

response对象通过sendRedirect告诉客户端要跳转到哪个URL

发布了109 篇原创文章 · 获赞 31 · 访问量 7376

猜你喜欢

转载自blog.csdn.net/key_768/article/details/105011274
今日推荐