前言
前面对Servlet大致了解了一下
真的了解Servlet吗?- Tomcat与Servlet
但是Servlet中还有很多重要的对象,以及一些细节需要去研究一下
目录
- Tomcat与IDEA的一些细节
1.1. 部署工程
1.2. IDEA中的Tomcat - ServletConfig
2.1. 重写登录功能 - ServletContext
- 转发与重定向
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的作用
既然是配置信息,那么作用就是获得配置信息
- 可以获取 Servlet 程序的别名 servlet-name 的值
- 获取初始化参数 init-param
- 获取 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:
- 一个Web工程,只有一个ServletContext上下文对象,且在Web启动的时候创建,在Web停止时销毁
- 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