Servlet
一、Servlet概述
1.1什么是Servlet
-
Servlet是JavaEE规范之一。规范就是接口
-
Servlet就JavaWeb三大组件之一。三大组件分别是:Servlet程序、Filter过滤器、Listener监听器。
-
Servlet是运行在服务器上的一个java小程序,它可以接收客户端发送过来的请求,并响应数据给客户端
1.2 实现Servlet程序
1.2.1 创建WEB项目操作————idea 2021版本
- 点击确认后即可创建成功
1.2.2 手动实现第一个Servlet程序
- 编写一个类去实现Servlet接口
- 实现service方法,处理请求,并响应数据
- 到web.xml中去配置servlet程序的访问地址
Servlet程序的示例代码:
import javax.servlet.*;
import java.io.IOException;
//实现Servlet接口后并重写他的五个方法,这五个方法的含义后面会说
public class MyServlet 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("HelloServlet被访问了");
}
@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标签给Tomcat配置Servlet程序-->
<servlet>
<!--servlet-name标签Servlet程序起一个别名(一般是类名)-->
<servlet-name>HelloServlet</servlet-name>
<!--servlet-class是Servlet程序的全类名-->
<servlet-class>com.LIUli.Servlet.MyServlet</servlet-class></servlet>
<!--servlet-mapping标签给servlet程序配置访问地址-->
<servlet-mapping>
<!--servlet-name标签的作用是告诉服务器,我当前配置的地址给哪个Servlet程序使用-->
<servlet-name>HelloServlet</servlet-name>
<!--url-pattern标签配置访问地址
/斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径
/hello表示地址为:http://ip:port/工程路径/hello<br/>-->
<url-pattern>/hello</url-pattern></servlet-mapping></web-app>
1.2.3 Servlet常见的错误
- ①url_patten中配置的路径没有以**”/“**打头:
- ②servlet-name配置的值不存在:
- ③Servlet-class标签的全类名配置错误:
- ④lib文件的位置放错,要放在web-inf下
1.3 url地址到Servlet程序的访问
1.4 Servlet的生命周期
-
1、执行Servlet构造器方法
-
2、执行init()初始化方法
第一、二步,是在第一次访问,的时候创建Servlet程序会调用。
-
3、执行service()方法
第三步,每次访问都会调用。
-
4、执行destroy()销毁方法
第四步,在web工程停止的时候调用
1.5 GET和POST请求的分发处理
publicvoidservice(ServletRequestservletRequest,ServletResponseservletResponse)throwsServletException,IOException{
//类型转换(因为它有getMethod()方法)
HttpServlet RequesthttpServletRequest=(HttpServletRequest) servletRequest;
//获取请求的方式String method=httpServletRequest.getMethod();
if("GET".equals(method)){
doGet();
}elseif("POST".equals(method)){
doPost();
}
}
/***做get请求的操作*/
public void doGet(){
System.out.println("get请求");
System.out.println("get请求");
}
/***做post请求的操作*/
public void doPost(){
System.out.println("post请求");
System.out.println("post请求");
}
}
1.6通过继承HttpServlet实现Servlet程序
- 在继承HttpServlet实现Servlet程序之前,我们需要在外部库里先导入Tomcat
- 如果不进行上述操作,可能会出现无法继承HttpServlet
一般在实际项目开发中,都是使用继承HttpServlet类的方式去实现Servlet程序。
-
编写一个类去继承HttpServlet类
-
根据业务需要重写doGet或doPost方法
-
到web.xml中的配置Servlet程序的访问地址
Servlet类的代码:
class HelloServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("执行了HelloServlet的doPost方法 ");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("执行了HelloServlet的doGet方法 ");
}
}
web.xml中的配置:
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.LIUli.Servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/helloServlet</url-pattern>
</servlet-mapping>
1.7 Servlet类的继承体系
二、ServletConfig类
ServletConfig类从类名上来看,就知道是Servlet程序的配置信息类。
Servlet程序和ServletConfig对象都是由Tomcat负责创建,我们负责使用。
Servlet程序默认是第一次访问的时候创建,ServletConfig是每个Servlet程序创建时,就创建一个对应的ServletConfig对象。
2.1 ServletConfig类的三大作用
- 可以获取Servlet程序的别名servlet-name的值
- 获取初始化参数init-param
- 获取ServletContext对象
web.xml中的配置:
<!--servlet标签给Tomcat配置Servlet程序-->
<servlet>
<!--servlet-name标签Servlet程序起一个别名(一般是类名)-->
<servlet-name>HelloServlet</servlet-name>
<!--servlet-class是Servlet程序的全类名-->
<servlet-class>com.LIUli.Servlet.MyServlet</servlet-class>
<!--init-param是初始化参数-->
<init-param>
<!--是参数名-->
<param-name>username</param-name>
<!--是参数值-->
<param-value>root</param-value>
</init-param>
<!--init-param是初始化参数-->
<init-param>
<!--是参数名-->
<param-name>url</param-name>
<!--是参数值-->
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</init-param>
</servlet>
<!--servlet-mapping标签给servlet程序配置访问地址-->
<servlet-mapping>
<!--servlet-name标签的作用是告诉服务器,我当前配置的地址给哪个Servlet程序使用-->
<servlet-name>HelloServlet</servlet-name>
<!--url-pattern标签配置访问地址
/斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径
/hello表示地址为:http://ip:port/工程路径/hello<br/>-->
<url-pattern>/hello</url-pattern></servlet-mapping>
Servlet中的代码
@Override
public void init(ServletConfigservletConfig) throws ServletException{
System.out.println("2init初始化方法");
//1、可以获取Servlet程序的别名servlet-name的值
System.out.println("HelloServlet程序的别名是:"+servletConfig.getServletName());
//2、获取初始化参数init-param
System.out.println("初始化参数username的值是;"+servletConfig.getInitParameter("username"));
System.out.println("初始化参数url的值是;"+servletConfig.getInitParameter("url"));
//3、获取ServletContext对象
System.out.println(servletConfig.getServletContext());
三、ServletContext类
3.1 ServletContext概述
-
1、ServletContext是一个接口,它表示Servlet上下文对象
-
2、一个web工程,只有一个ServletContext对象实例。
-
3、ServletContext对象是一个域对象。
-
4、ServletContext是在web工程部署启动的时候创建。在web工程停止的时候销毁。
什么是域对象?
域对象,是可以像Map一样存取数据的对象,叫域对象。这里的域指的是存取数据的操作范围,整个web工程。
域对象 | 取数据 | 删除数据 | |
---|---|---|---|
Map | put() | get() | remove() |
域对象 | setAttribute() | getAttribute() | removeAttribute() |
3.2 ServletContext类的四个作用
- 获取web.xml中配置的上下文参数context-param
- 获取当前的工程路径,格式:/工程路径
- 获取工程部署后在服务器硬盘上的绝对路径
- 像Map一样存取数据
ServletContext演示代码:
@WebServlet(name = "ServletDemo", value = "/ServletDemo")
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("小飞棍来了");
System.out.println("/demo1,收到请求了");
String str = "zhangsan";
//域对象,就是来共享数据。
//获取全局域对象
ServletContext servletContext = this.getServletContext();
//往域中存储数据
servletContext.setAttribute("name", str);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
@WebServlet(value = "/demo2", name = "ServletDemo2")
public class ServletDemo2 extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("/demo2,收到请求了");
//我要取到 /demo1 中数据
ServletContext servletContext = this.getServletContext();
Object name = servletContext.getAttribute("name");
System.out.println(name);
//手动销毁数据
servletContext.removeAttribute("name");
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
动态获取服务器路径
//我在我们项目的三个地方,放了三个文件
//src 目录下放了一个 a.txt
//web 目录下放了一个 b.txt
//web/WEB-INF 下 放了一个 c.txt
/* getRealPath():
1. web下:项目根目录下
2. WEB - INF下:项目根目录下 / WEB - INF
3. src下:项目根目录下 / WEB - INF / classes*/
ServletContext servletContext = this.getServletContext();
//获取服务器的真实路径
// F:\JAVA\LI2\GuoQingWebDay01\out\artifacts\GuoQingWebDay01_war_exploded\
String realPath = servletContext.getRealPath("/");
System.out.println(realPath);
FileInputStream in = new FileInputStream(servletContext.getRealPath("/WEB-INF/classes/a.txt"));
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String s = reader.readLine();
System.out.println(s);
System.out.println(in);
FileInputStream in2 = new FileInputStream(servletContext.getRealPath("/b.txt"));
System.out.println(in2);
FileInputStream in3 = new FileInputStream(servletContext.getRealPath("/WEB-INF/c.txt"));
System.out.println(in3);
}
web项目中,一个普通的类(不是Servlet)他怎么读取配置文件
//普通的类(不是Servlet),他只能读取放在src下的位置文件,其他两个地方读不到
//src下的文件,编译完之后,就放在项目的 classes 目录下 这个目录叫做类路径
//方式1:
InputStream in = MyUtils.class.getClassLoader().getResourceAsStream("a.txt");
System.out.println(in);
System.out.println("=====================================");
//方式2:
//1.获取该类对应的类加载器对象 //反射
ClassLoader loader = MyUtils.class.getClassLoader();
//2.获取文件运行的真实路径
URL url = loader.getResource("a.txt");
//获取路径
String path = url.getPath();
System.out.println(path);
FileInputStream fileInputStream = new FileInputStream(path);
System.out.println(fileInputStream);
String realPath = servletContext.getRealPath("/");
System.out.println(realPath);