目录
1.Servlet介绍
1.1什么是Servlet
Servlet是Server Applet的简称,是用Java编写的是运行在 Web 服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
1.2Servlet的使用方法
Servlet技术的核心是Servlet接口,定义了Servlet与Servlet容器之间的契约,Servlet容器将Servlet类载入内存,生成Servlet实例并调用它具体的方法,所以它是所有Servlet类必须直接或者间接实现的一个接口。
1.3Servlet接口的继承结构
-
Servlet接口:只负责定义Servlet程序的访问规范;
-
GenericServlet抽象类:实现了Servlet接口,做了很多空实现,并持有一个ServletConfig类的引用,并提供了一些ServletConfig的使用方法;
-
HttpServlet抽象类:实现了service方法,并实现了请求分发处理;
2.Servlet快速入门
2.1创建javaweb项目
2.1.1创建maven工程
2.1.2添加webapp目录
(1)右击项目,选择Add Frameworks Support
(2)选择Web Application,再点击OK
(3)将web目录拖拽到main目录下,并改名为webapp
-
webapp:静态资源比如 html css js可以定义在web下面
-
WEB-INF:里面的资源不能直接被外界访问 web.xml 是web项目的核心配置文件
-
index.jsp:web项目的访问首页,在默认情况我们访问的首页就是index.jsp
2.1.3idea没有此选项问题
但有的新版idea右击项目没有这个,需要自己添加。
然后点击右下角的这个按钮即可
2.2添加依赖
在pom.xml添加依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
2.3创建servlet实例
创建一个.java实现Servlet接口
package com.by.servlet;
import javax.servlet.*;
import java.io.IOException;
public class HelloServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest req, ServletResponse servletResponse)
throws ServletException, IOException {
servletResponse.setContentType("text/html;charset=utf-8");
servletResponse.getWriter().write("<h1>hello<h1>");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
2.4配置servlet
找到Wab.xml进行配置
<!--
配置Servlet
servlet-name:servlet的名称
servlet-class:servlet的全类名
url-pattern: 访问servlet的url
-->
<servlet>
<servlet-name>hello</servlet-name>
<!-- servlet-name要和servlet-mapping所对应,映射的关系-->
<servlet-class>com.by.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
-
servlet-name:servlet的名称
-
servlet-class:servlet的全类名
-
url-pattern: 访问servlet的url
servlet-name必须一样
注解方式配置:
@WebServlet("/hello")
public class HelloServlet implements Servlet {}
2.5设置打包方式
修改pom.xml
2.6部署web项目
①点击“Edit Configurations”
②点击"+"
③点击Tomcat Server中的Local
④配置Tomcat路径
⑤部署web项目
⑥启动tomcat
3.servlet的生命周期
3.1什么是servlet的生命周期
Servlet的生命周期就是servlet类对象什么时候创建?什么时候调用对应的方法,什么时候销毁。
对象的生命周期:
Student student = new Student(); //创建对象
student.setName("eric"); // 使用对象
student.show();// 使用对象
student = null; // 销毁对象
也就是说自定义对象的生命周期由我们程序员自己手动控制。但是!!!Servlet它不是一个普通的java类。是一个被tomcat服务器调用的。所以Servlet是生命周期是被tomcat服务器去控制的。
3.2servlet生命周期中重要的方法
-
构造方法:创建servlet的时候调用。默认情况下,第一次访问servlet的时候,会创建servlet对象。此时会有且只会调用1次构造函数,证明了servlet对象是单实例的。
-
init方法:创建完servlet对象之后调用,也只是会调用1次。
-
service方法:提供服务的方法,接收用户的请求,并处理用户的请求,然后响应用户的请求。每次发送请求,都会调用service方法。调用几次,service方法会执行几次。
-
destroy方法:销毁的方法。销毁servlet对象的时候调用。比如我们停止tomcat服务器或者重新部署tomcat服务器,都会销毁servlet对象,只会调用1次。
3.3tomcat服务器内部执行代码的原理
1、用户发送请求,tomcat服务器会根据用户发送的请求,解析web.xml配置文件,获取servlet-class的全限定名路径(com.by.servlet.ServletDemo)
2、获取字节码对象,然后通过字节码对象获取对应的实例对象
Class clazz = Class.forName("com.by.servlet.ServletDemo");
Object o = clazz.newInstance();
3、创建ServletConfig对象,然后调用init方法
Method method = clazz.getDeclaredMethod("init",ServletConfig.class);// 获取方法对象
method.invoke(o,config);
4、创建request对象,创建response对象,然后调用service方法
Method m = clazz.getDeclaredMethod("service",ServletRequest.class,ServletResponse.class);
m.invoke(o,request,response);
5、销毁servlet实例对象,也是通过反射的机制实现的
Method m1 = clazz.getDeclaredMethod("destroy",null);
m1.invoke(o,null);
3.4测试servlet的声明周期
public class LifeCycleServlet implements Servlet {
public ServletDemo(){
System.out.println("LifeCycleServlet has run........");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init method has run........");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service method has run........");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("destroy method has run........");
}
}