1、什么是Servlet?
Servlet是javaweb的三大组件之一,它属于动态资源,servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:
- 接收请求数据
- 处理请求
- 完成响应
例如客户端发出登陆请求,或者输出注册请求,这些请求都应该由Servlet来完成处理,Servlet需要我们自己来编写,每个Servlet必须实现java.servlet.Servlet接口

2、实现servlet的方式(由我们自己来编写)
实现servlet有三种方式
- 实现javax.servlet.Servlet接口
- 继承javax.servlet.GenericServlet类
- 继承javax.servlet.HttpServlet类
通常我们会去继承HttpServlet类来完成我们的servlet,但是学习还是从javax.servlet.Servlet接口开始学习
实现javax.servlet.Servlet接口
- servlet接口的五个方法介绍
import javax.servlet.*;
import java.io.IOException;
public class AServlet implements Servlet{
/*查看servlet接口中的方法*/
/*什么叫生命周期方法?生命周期:(例如人)出生于哪年哪月那日,哪年哪月那日上小学,
哪年哪月那日上初中,哪年哪月那日上大学,哪年哪月那日工作,哪年哪月那日死亡*/
/*servlet的生命周期就为,第一次调用servlet方法起,到调用了多少次,直至最后一次调用*/
/*它是生命周期方法(被Tomcat调用的方法)*/
/*它会在servlet对象创建之后马上执行,并且只执行一次!(出生之后调用的第一个方法)*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init()...");
}
/*可以用来获取servlet的配置信息*/
@Override
public ServletConfig getServletConfig() {
System.out.println("getServletConfig()...");
return null;
}
/*它是生命周期方法*/
/*它会被调用多次!!!*/
/*每次处理请求都是在调用这个方法!*/
@Override
public void service(ServletRequest servletRequest, ServletResponse
servletResponse) throws ServletException, IOException {
System.out.println("service()...");
}
/*获取servlet的信息*/
@Override
public String getServletInfo() {
System.out.println("getServletInfo()...");
return null;
}
/*它是生命周期方法*/
/*它会在servlet被销毁之前调用,并且只会被调用一次(自杀前调用的最后一个方法)*/
@Override
public void destroy() {
System.out.println("destroy()...");
}
}
特性
- 单例:一个类只有一个对象,当然可能存在多个servlet类
- 线程不安全的,所以他的效率是高的
注:servlet类由我们来写,但对象由服务器来创建,并且由服务器来调用相应的方法
3、如何让浏览器访问Servlet
- 给Servlet指定一个Servlet路径,(让Servlet与一个路径绑定在一起)
- 浏览器访问Servlet路径
配置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>
<servlet-name>xxx</servlet-name>
<servlet-class>cn.itcast.web.servlet.AServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>xxx</servlet-name>
<url-pattern>/AServlet</url-pattern>
</servlet-mapping>
</web-app>
ServletConifg介绍

package lxbaoming;
import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;
public class AServlet implements Servlet{
/*查看servlet接口中的方法*/
/*什么叫生命周期方法?生命周期:(例如人)出生于哪年哪月那日,哪年哪月那日上小学,
哪年哪月那日上初中,哪年哪月那日上大学,哪年哪月那日工作,哪年哪月那日死亡*/
/*servlet的生命周期就为,第一次调用servlet方法起,到调用了多少次,直至最后一次调用*/
/*它是生命周期方法(被Tomcat调用的方法)*/
/*它会在servlet对象创建之后马上执行,并且只执行一次!(出生之后调用的第一个方法)*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init()...");
/*获取初始化参数*/
System.out.println(servletConfig.getInitParameter("p1"));
System.out.println(servletConfig.getInitParameter("p2"));
/*获取初始化参数的名称*/
Enumeration e = servletConfig.getInitParameterNames();
while (e.hasMoreElements()){
System.out.println(e.nextElement());
}
}
/*可以用来获取servlet的配置信息*/
@Override
public ServletConfig getServletConfig() {
System.out.println("getServletConfig()...");
return null;
}
/*它是生命周期方法*/
/*它会被调用多次!!!*/
/*每次处理请求都是在调用这个方法!*/
@Override
public void service(ServletRequest servletRequest, ServletResponse
servletResponse) throws ServletException, IOException {
System.out.println("service()...");
}
/*获取servlet的信息*/
@Override
public String getServletInfo() {
System.out.println("getServletInfo()...");
return null;
}
/*它是生命周期方法*/
/*它会在servlet被销毁之前调用,并且只会被调用一次(自杀前调用的
最后一个方法)*/
@Override
public void destroy() {
System.out.println("destroy()...");
}
}
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">
<display-name>AServlet</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>xxx</servlet-name>
<servlet-class>lxbaoming.AServlet</servlet-class>
<init-param>
<param-name>p1</param-name>
<param-value>v1</param-value>
</init-param>
<init-param>
<param-name>p2</param-name>
<param-value>v2</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>xxx</servlet-name>
<url-pattern>/AServlet</url-pattern>
</servlet-mapping>
</web-app>

GenericServlet介绍
1、GenericServlet概述
- GenericServlet是Servlet接口的实现类,我们可以通过继承GenericServlet来编写自己的servlet(是一个写好的抽象类)
- 简化我们的操作,让我们实现servlet接口更方便
模拟 GenericServlet类
package baoming;
import javax.servlet.*;
import java.io.IOException;
/*模拟GenericServlet*/
public class AServlet implements Servlet {
private ServletConfig config;
/*生命周期方法,由Tomcat来调用,并且只调用一次*/
/*它是这些方法中第一个被调用的,它会在构造器之后马上被调用*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
//把tomcat传递的ServletConfig赋值给本类的一个成员,其实就是把它保存起来,
// 方便在其他方法中使用!
this.config = config;
init();
}
/*这个方法是本类自己定义的! 不是servlet接口中的方法*/
public void init(){
}
@Override
public ServletConfig getServletConfig() {
/*请放心,这个方法一定会在init()方法之后被调用
* init()被调用后,本类的成员this.config已经有值了*/
return this.config;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse
servletResponse) throws ServletException, IOException {
/*这里是否可以使用ServletConfig的成员(config)呢?
* 因为这是在init()后面被调用,当然可以使用了*/
System.out.println("每次处理请求都会被调用");
}
public ServletContext getServletContext(){
return config.getServletContext();
}
public String getServletName(){
return config.getServletName();
}
public String getInitParameter(String name){
return config.getInitParameter(name);
}
/*没有用的东西,爱实现不实现,用字符串来对servlet做一个简单的描述*/
@Override
public String getServletInfo() {
return "我是一个快乐的servlet";
}
/*需要就写,不需要就不写,临死之前的方法*/
@Override
public void destroy() {
System.out.println("啊!我就要死了");
}
}
封装后我们子类继承它
package baoming;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class BServlet extends AServlet {
/* public void init(ServletConfig servletConfig) throws ServletException {
//把tomcat传递的ServletConfig赋值给本类的一个成员,其实就是把它保存起来,
// 方便在其他方法中使用!
this.config = config;
init();
}
在父类中的东西相当于在子类中,例如init()方法,tomcat调用init()方法,
给config赋值,然后调用构造init()方法,然后子类重写构造init方法,既没有覆盖父类
中的this.config = config;还能输出我们要在子类中输出的内容
*/
public void init(){
System.out.println("哈哈哈哈哈哈哈哈哈哈哈");
}
public void service(ServletRequest servletRequest, ServletResponse
servletResponse) throws ServletException, IOException {
String value = getInitParameter("p1");
}
}
可以很明显的看出来代码量大大减少
网友评论