目录
JavaWeb基础 (二):Servlet
Servlet API的主要类型
-
Servlet接口是所有Servlet直接或间接实现的一个接口。
-
Servlet接口定义了Servlet与Servlet容器(Web服务器/Tomcat)之间的契约,Servlet运行在 Servlet容器/Web应用服务器/tomcat,负责与客户端通信。
-
在一个应用程序中,每种Servlet类型只能有一个实例
Servlet的功能:
- 创建并返回基于客户请求的动态HTML页面
- 与数据库进行通信
Servlet工作流程
Servlet的工作流程也可看作是 Servlet的生命周期
- 当浏览器访问Servlet时,Tomcat会查询当前Servlet的实例化对象是否存在,若不存在,则通过反射机制动态创建对象(无参构造函数),如果存在,则直接执行service
- 调用init方法完成初始化操作
- 调用service方法完成业务逻辑操作
- 关闭Tomcat时,调用destroy方法,释放当前对象所占用的资源
如何使用Servlet
Servlet本身是一组接口,javax.servlet包下,定义Java类实现Servlet接口,这个类就具备接受客户端请求以及做出响应的功能
Servlet接口中定义了以下5个方法:
-
public void init(ServletConfig servletConfig) throws ServletException {}
-
public ServletConfig getServletConfig() {return null;}
-
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {}
-
public String getServletInfo() {return null;}
-
public void destroy() {}
ServletRequest
对于每一个HTTP请求,Servlet容器都会创建一个ServletRequest实例,并将它传给Servlet的Service方法。 ServletRequest封装了关于这个请求的信息。
getParameter是在ServletRequest中最常用的方法,该方法通常用于返回HTML表单域的值。
getParameter也可以用于获取查询字符串的值。
例如,利用URI调用Servlet:
http://xx/xxx//xx?id=123
用下面这个语句,可以通过Servlet内部获取id值:
String id = request.getParameter(“id”);
如果该参数不存在,getParameter将返回 null
ServletResponse
javax.servlet.ServletResponse接口表示一个Servlet响应。在调用Servlet的Service方法前,Servlet容器首先创建一个ServletResponse,并将它作为第二个参数传给Service方法。ServletResponse隐藏了向浏览器发送响应的复杂过程。
ServletConfig 和 ServletContext
对于每一个应用程序,Servlet容器还会创建一个ServletContext实例。这个对象中封装了上下文(应用程序)的环境详情。每个上下文只有一个ServletContext。 每个Servlet实例也都有一个封装Servlet配置的ServletConfig。
- ServletConfig作用于某个Servlet实例,每个Servlet都有对应的ServletConfig
- ServletContext作用于整个Web应用,一个Web应用对应一个ServletContext,多个Servlet实例对应一个ServletContext
下面一段代码 描述了ServletConfig和ServletContext 之间的区别
ServletConfig 中 getInitParameterNames() 和 getInitParameter() 获取到的参数是Web.xml里的<servlet> 标签中的 <init-param> 中的属性。
ServletContext中的 getInitParameterNames() 和 getInitParameter() 获取到的参数是Web.xml里的 <context-param>标签中的属性。
这也说明了,ServletConfig是属于单个Servlet实例的,而ServletContext是属于整个Web应用的,多个Servlet共用
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("[MyServlet init()] init()...");
// <servlet-name>MyServletDemo</servlet-name>
System.out