1、servlet创建的方式
- 实现servlet接口,重写5个方法
package com.itheima.web.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;
public class AServlet implements Servlet {
@Override
public void init(ServletConfig config) throws ServletException {
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("servlet创建方式1:实现servlet接口,实现5个方法");
}
@Override
public void destroy() {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
}
- 继承GenericServlet抽象类,重写service方法
package com.itheima.web.servlet;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class BServlet extends GenericServlet {
private static final long serialVersionUID = 1L;
public BServlet() {
super();
}
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
System.out.println("servlet创建方式2:继承GenericServlet抽象类,实现service方法");
}
}
- 继承HttpServlet抽象类
package com.itheima.web.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public CServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("servlet创建方式3:继承HttpServlet抽象类,根据需要(如果是get请求,书写doGet方法;如果是post请求,书写doPost方法)重写doXXX方法");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
注解取代XML配置的方式
package com.itheima.web.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(name="AServlet",urlPatterns="/AServlet")
public class AServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public AServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
System.out.println("调用成功");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
2、servlet生命周期
2.1 生命周期
一个对象的创建到销毁
2.2 创建的问题
与Servlet相关的对象,都由服务器tomcat来负责创建的
2.3 默认情况
- 用户第一次发送请求,由服务器创建Servlet实例
- 一种类型的Servlet只会创建一个实例对象
- 服务器容器创建servlet实例的时候,会调用初始化方法init(ServletConfig config)
- init方法在整个Servlet生命周期中只会被执行一次
- 紧接着会调用服务方法service(ServletRequest request,ServletResponse response)
- service方法在整个Servlet生命周期中会被调用多次
- 用户发送一次请求,调用一次
- 当正常关闭服务器或者将这个项目从服务器容器中移除的时候,调用销毁方法destory()
- destory方法在整个Servlet生命周期中只会被调用一次
- destory在关闭服务器之前调用
其他情况,比如配置配置
3、servlet相关配置
3.1 服务器启动时创建servlet(开发时很少用)
除了默认情况(用户第一次发送请求),在web.xml文件中配置load-on-startup,让servlet在服务器启动的时候就被创建以及初始化
案例
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>web_day34</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>com.itheima.servlet.AServlet</servlet-class>
<!-- 服务器启动的时候初始化 -->
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/AServlet</url-pattern>
</servlet-mapping>
</web-app>
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class AServlet implements Servlet {
@Override
public void destroy() {
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("AServlet被初始化了……");
}
/**
* 所有用户请求的代码写在service方法中
*/
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
// 解决浏览器乱码问题
response.setContentType("text/html;charset=utf-8");
// 向浏览器输出数据
response.getWriter().write("Servlet快速入门");
System.out.println("这是我的一个servlet程序!");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
}
3.2 配置访问路径url-pattern
1. 完全匹配
<url-pattern>/DServlet</url-pattern>
2. 目录匹配
<url-pattern>/a/b/*</url-pattern>
只要是a目录下面的b目录下的任何内容
3. 扩展名匹配
<url-pattern>*.do</url-pattern>
只要后缀名是.do都可以匹配到
4. 匹配所有
<url-pattern>/*</url-pattern>
只要是这个项目下面的内容都可以匹配到这个servlet中去
5. 缺省的
<url-pattern>/</url-pattern>
访问的内容与配置的越接近,优先级越高
eclipse配置servlet模板
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ${primary_type_name} extends HttpServlet {
private static final long serialVersionUID = 1L;
public ${primary_type_name}() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}