servlet
它是javax.servlet.Servlet接口
- 它是JavaWeb三大组件之一
*Servler 最重要
*Filter
*Listener - Servlet负责的工作
*用来处理请求。
*当客户端发出一个请求给服务器,服务器通过web.xml配置文件找到相应的servlet来处理这一请求。
*一个servlet至少和一个URL绑定在一起。
class MyServlet{
//......
}
//绑定到/abc
通过访问URL来访问servlet
例如:http://localhost:8080/day04_1/abc
- Servlet处理请求过程。
服务器在执行servlet时,会传递给servlet请求数据,请求数据都封装到request对象中。
服务器还会给servlet一个response对象,servlet可以用这个对象完成向客户端响应。
实现servlet
- 实现javax.servlet.Servlet接口。
- 继承javax.servlet.GenericServlet抽象类。
- 继承javax.servlet.http.HttpServlet抽象类。最佳选择。
servlet接口中的方法
- void init(ServletConfig);
- void Service(ServletRequest request,ServletResponse response);
- void destroy();
- String getServletInfo();
- ServletConfig getServletConfig();
生命周期方法: - void init(ServletConfig);Servlet出生后第一个执行的方法,一生执行一次。
- void Service(ServletRequest request,ServletResponse response); 这个方法会执行多次,每次执行表示处理一次请求。
- void destroy();Servlet结束前执行一次,这个也只执行一次。
客户端打出一个请求,服务器通过URL找到对应的servlet,但是若果这个servlet不存在,那么服务器会创建servlet对象,创建对象之后,马上调用init(ServletConfig)方法,传递ServletConfig
服务器调用servlet的service()方法,这需要传递request和response。
当服务器再次访问servlet时,这时servlet对象已经存在,就不会再次创建,servlet是单例的。
当服务器需要销毁servlet时,会先调用servlet的destory()方法,在销毁。
1、servlet创建:第一次被访问,或服务器启动。
2、servlet销毁:服务关闭。
如果希望servlet在服务器启动就创建,那么需要在web.xml中配置
<load-on-startup>1</load-on-startup>
web.xml配置
让url和servlet绑定在一起,当用户访问url时会执行对应的service()请求处理方法。
<servlet>
<servlet-name>xxx</servlet-name>
<servlet-class>cn.my.servlet.AServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>xxx</servlet-name>
<url-pattern>/a_servlet</url-pattern>
</servlet-mapping>
这里注意<servlet-class>cn.my.servlet.AServlet</servlet-class>
是从包名到类名。
package cn.my.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* servlet类是我们写的,但是对象不是我们创建的,方法更不是我们调用的!
* @author green
*
*/
public class AServlet implements Servlet{
private ServletConfig config;
@Override
public void destroy() {
System.out.println("servlet结束了");
}
/**
* 返回servlet配置信息
*/
@Override
public ServletConfig getServletConfig() {
return config;
}
/**
* 返回对当前servlet的一个基本描述
* 没用
*/
@Override
public String getServletInfo() {
return null;
}
/**
* servlet对象被创建之后,马上调用本方法
*/
@Override
public void init(ServletConfig arg0) throws ServletException {
System.out.println("开始创建");
this.config=config;
}
/**
* 没处理一次请求,调用本方法一次,这是servlet一最重要的工作,就是处理请求。
*/
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("hello servlet!");
}
}
我们的jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>nothing</title>
</head>
<body>
<h1>访问Servlet</h1>
<a href="/day04_1/a_servlet">访问AServlet</a>
</body>
</html>
servlet相关类型
- init()方法的参数ServletConfig
ServletConfig对应Servlet的配置信息。
String getServletName()–>返回的是<servlet-name>
的值
ServletContext getServletContext–>获取ServletContext对象
String getInitParameter(String name)–>获取Servlet的初始化参数
Enumeration getInitParameterNames()–>获取所以初始化参数的名称。
添加参数:
<servlet>
<servlet-name>xxx</servlet-name>
<servlet-class>cn.my.AServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<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>
获取参数的值:
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("hello servlet!");
//通过config对象获取名为p1的初始化参数
String P1=this.config.getInitParameter("p1");
String P2=this.config.getInitParameter("p2");
System.out.println(P1+","+P2);
//获取所有初始化参数的名称
Enumeration e=this.config.getInitParameterNames();
while (e.hasMoreElements()) {
String name = (String) e.nextElement();
String value=config.getInitParameter(name);
System.out.println(name+"="+value);
}
}
注意,当需要tomcat循环监视文件是否修改,自动加载:
Tomcat\apache-tomcat-8.5.15\conf\context.xml 添加如下东西
- service()方法的两个参数ServletRequest和ServletResponse。后面分析。
servlet三大域对象:
- ServletContext
- ServletRequest
- HttpSession