servlet三种方式实现servlet接口
简单介绍
Servlet接口实现类
1、Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet。
2、HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
3、HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。
接口分离原则:
将一个包含多功能的单一接口根据函数功能分离称多个独立的接口,同时每个接口都有自己特有的、有意义的、具有实际哦那功能的修饰器。
多重接口修饰:
每个修饰器设计时都需要首先实现他要修饰的接口,可以配合应用 适配器和修饰器这两个模式来构建多重修饰器,同时也能保证代码量最少。
客户端构建:
为客户端提供接口实例的方式一定程度上取决于接口实现的数目。如果每个接口都有自己特有的实现,那就需要构造所有实现的实例并提供给客户端。或者如果所有的接口的实现都包含在单个类中,那么只需要构建该类的实例就能够满足客户端的所有依赖。
1、多接口、多实例:
控制器类:将所有方法整合到控制器类中(构造函数传入参数为各个接口)。控制器类中的每个方法都需要一个不同的接口来执行他的功能。
2、单接口、单实例:
在单个类中继承并实现所有接口。这样将每个接口的实现方法都整合到一个类中。(一般用于叶子实现类)
Servlet的作用:
1.接收请求数据
2.处理请求
3.完成响应
Servlet接口中的五大方法:
其中有三个是生命周期方法:
1.void init(ServletConfig).当Servlet对象被服务器创建时调用,仅调用一次。
2.void service(ServletRequest, ServletResponse).可被服务器调用多次。
3.void destroy().服务器关闭连接之前调用,仅一次。
另外的两个:
4.ServletConfig getServletConfig()
5.String getServletInfo()
Servlet代码源
- package javax.servlet;
- import java.io.IOException;
- public interface Servlet {
- void init(ServletConfig var1) throws ServletException;
- ServletConfig getServletConfig();
- void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
- String getServletInfo();
- void destroy();
- }
HttpServlet代码源
- package javax.servlet.http;
- import java.io.IOException;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.text.MessageFormat;
- import java.util.Enumeration;
- import java.util.ResourceBundle;
- import javax.servlet.DispatcherType;
- import javax.servlet.GenericServlet;
- import javax.servlet.ServletException;
- import javax.servlet.ServletOutputStream;
- import javax.servlet.ServletRequest;
- import javax.servlet.ServletResponse;
- public abstract class HttpServlet extends GenericServlet {
- private static final long serialVersionUID = 1L;
- private static final String METHOD_DELETE = "DELETE";
- private static final String METHOD_HEAD = "HEAD";
- private static final String METHOD_GET = "GET";
- private static final String METHOD_OPTIONS = "OPTIONS";
- private static final String METHOD_POST = "POST";
- private static final String METHOD_PUT = "PUT";
- private static final String METHOD_TRACE = "TRACE";
- private static final String HEADER_IFMODSINCE = "If-Modified-Since";
- private static final String HEADER_LASTMOD = "Last-Modified";
- private static final String LSTRING_FILE = "javax.servlet.http.LocalStrings";
- private static final ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.http.LocalStrings");
- public HttpServlet() {
- }
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- String protocol = req.getProtocol();
- String msg = lStrings.getString("http.method_get_not_supported");
- if (protocol.endsWith("1.1")) {
- resp.sendError(405, msg);
- } else {
- resp.sendError(400, msg);
- }
- }
- protected long getLastModified(HttpServletRequest req) {
- return -1L;
- }
- protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- if (DispatcherType.INCLUDE.equals(req.getDispatcherType())) {
- this.doGet(req, resp);
- } else {
- NoBodyResponse response = new NoBodyResponse(resp);
- this.doGet(req, response);
- response.setContentLength();
- }
- }
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- String protocol = req.getProtocol();
- String msg = lStrings.getString("http.method_post_not_supported");
- if (protocol.endsWith("1.1")) {
- resp.sendError(405, msg);
- } else {
- resp.sendError(400, msg);
- }
- }
- protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- String protocol = req.getProtocol();
- String msg = lStrings.getString("http.method_put_not_supported");
- if (protocol.endsWith("1.1")) {
- resp.sendError(405, msg);
- } else {
- resp.sendError(400, msg);
- }
- }
- protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- String protocol = req.getProtocol();
- String msg = lStrings.getString("http.method_delete_not_supported");
- if (protocol.endsWith("1.1")) {
- resp.sendError(405, msg);
- } else {
- resp.sendError(400, msg);
- }
- }
- private static Method[] getAllDeclaredMethods(Class<?> c) {
- if (c.equals(HttpServlet.class)) {
- return null;
- } else {
- Method[] parentMethods = getAllDeclaredMethods(c.getSuperclass());
- Method[] thisMethods = c.getDeclaredMethods();
- if (parentMethods != null && parentMethods.length > 0) {
- Method[] allMethods = new Method[parentMethods.length + thisMethods.length];
- System.arraycopy(parentMethods, 0, allMethods, 0, parentMethods.length);
- System.arraycopy(thisMethods, 0, allMethods, parentMethods.length, thisMethods.length);
- thisMethods = allMethods;
- }
- return thisMethods;
- }
- }
- protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- Method[] methods = getAllDeclaredMethods(this.getClass());
- boolean ALLOW_GET = false;
- boolean ALLOW_HEAD = false;
- boolean ALLOW_POST = false;
- boolean ALLOW_PUT = false;
- boolean ALLOW_DELETE = false;
- boolean ALLOW_TRACE = true;
- boolean ALLOW_OPTIONS = true;
- Class clazz = null;
- try {
- clazz = Class.forName("org.apache.catalina.connector.RequestFacade");
- Method getAllowTrace = clazz.getMethod("getAllowTrace", (Class[])null);
- ALLOW_TRACE = (Boolean)getAllowTrace.invoke(req, (Object[])null);
- } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | ClassNotFoundException var14) {
- ;
- }
- for(int i = 0; i < methods.length; ++i) {
- Method m = methods[i];
- if (m.getName().equals("doGet")) {
- ALLOW_GET = true;
- ALLOW_HEAD = true;
- }
- if (m.getName().equals("doPost")) {
- ALLOW_POST = true;
- }
- if (m.getName().equals("doPut")) {
- ALLOW_PUT = true;
- }
- if (m.getName().equals("doDelete")) {
- ALLOW_DELETE = true;
- }
- }
- String allow = null;
- if (ALLOW_GET) {
- allow = "GET";
- }
- if (ALLOW_HEAD) {
- if (allow == null) {
- allow = "HEAD";
- } else {
- allow = allow + ", HEAD";
- }
- }
- if (ALLOW_POST) {
- if (allow == null) {
- allow = "POST";
- } else {
- allow = allow + ", POST";
- }
- }
- if (ALLOW_PUT) {
- if (allow == null) {
- allow = "PUT";
- } else {
- allow = allow + ", PUT";
- }
- }
- if (ALLOW_DELETE) {
- if (allow == null) {
- allow = "DELETE";
- } else {
- allow = allow + ", DELETE";
- }
- }
- if (ALLOW_TRACE) {
- if (allow == null) {
- allow = "TRACE";
- } else {
- allow = allow + ", TRACE";
- }
- }
- if (ALLOW_OPTIONS) {
- if (allow == null) {
- allow = "OPTIONS";
- } else {
- allow = allow + ", OPTIONS";
- }
- }
- resp.setHeader("Allow", allow);
- }
- protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- String CRLF = "\r\n";
- StringBuilder buffer = (new StringBuilder("TRACE ")).append(req.getRequestURI()).append(" ").append(req.getProtocol());
- Enumeration reqHeaderEnum = req.getHeaderNames();
- while(reqHeaderEnum.hasMoreElements()) {
- String headerName = (String)reqHeaderEnum.nextElement();
- buffer.append(CRLF).append(headerName).append(": ").append(req.getHeader(headerName));
- }
- buffer.append(CRLF);
- int responseLength = buffer.length();
- resp.setContentType("message/http");
- resp.setContentLength(responseLength);
- ServletOutputStream out = resp.getOutputStream();
- out.print(buffer.toString());
- out.close();
- }
- protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- String method = req.getMethod();
- long lastModified;
- if (method.equals("GET")) {
- lastModified = this.getLastModified(req);
- if (lastModified == -1L) {
- this.doGet(req, resp);
- } else {
- long ifModifiedSince;
- try {
- ifModifiedSince = req.getDateHeader("If-Modified-Since");
- } catch (IllegalArgumentException var9) {
- ifModifiedSince = -1L;
- }
- if (ifModifiedSince < lastModified / 1000L * 1000L) {
- this.maybeSetLastModified(resp, lastModified);
- this.doGet(req, resp);
- } else {
- resp.setStatus(304);
- }
- }
- } else if (method.equals("HEAD")) {
- lastModified = this.getLastModified(req);
- this.maybeSetLastModified(resp, lastModified);
- this.doHead(req, resp);
- } else if (method.equals("POST")) {
- this.doPost(req, resp);
- } else if (method.equals("PUT")) {
- this.doPut(req, resp);
- } else if (method.equals("DELETE")) {
- this.doDelete(req, resp);
- } else if (method.equals("OPTIONS")) {
- this.doOptions(req, resp);
- } else if (method.equals("TRACE")) {
- this.doTrace(req, resp);
- } else {
- String errMsg = lStrings.getString("http.method_not_implemented");
- Object[] errArgs = new Object[]{method};
- errMsg = MessageFormat.format(errMsg, errArgs);
- resp.sendError(501, errMsg);
- }
- }
- private void maybeSetLastModified(HttpServletResponse resp, long lastModified) {
- if (!resp.containsHeader("Last-Modified")) {
- if (lastModified >= 0L) {
- resp.setDateHeader("Last-Modified", lastModified);
- }
- }
- }
- public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
- HttpServletRequest request;
- HttpServletResponse response;
- try {
- request = (HttpServletRequest)req;
- response = (HttpServletResponse)res;
- } catch (ClassCastException var6) {
- throw new ServletException("non-HTTP request or response");
- }
- this.service(request, response);
- }
- }
GenericServlet代码源
- package javax.servlet;
- import java.io.IOException;
- import java.io.Serializable;
- import java.util.Enumeration;
- public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
- private static final long serialVersionUID = 1L;
- private transient ServletConfig config;
- public GenericServlet() {
- }
- public void destroy() {
- }
- public String getInitParameter(String name) {
- return this.getServletConfig().getInitParameter(name);
- }
- public Enumeration<String> getInitParameterNames() {
- return this.getServletConfig().getInitParameterNames();
- }
- public ServletConfig getServletConfig() {
- return this.config;
- }
- public ServletContext getServletContext() {
- return this.getServletConfig().getServletContext();
- }
- public String getServletInfo() {
- return "";
- }
- public void init(ServletConfig config) throws ServletException {
- this.config = config;
- this.init();
- }
- public void init() throws ServletException {
- }
- public void log(String msg) {
- this.getServletContext().log(this.getServletName() + ": " + msg);
- }
- public void log(String message, Throwable t) {
- this.getServletContext().log(this.getServletName() + ": " + message, t);
- }
- public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
- public String getServletName() {
- return this.config.getServletName();
- }
- }
实现接口代码:
- package com.wbg;
- import javax.servlet.*;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
- @WebServlet("/MyServlet")
- public class MyServlet implements Servlet {
- @Override
- public void init(ServletConfig servletConfig) throws ServletException {
- System.out.println("初始化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("正在销毁");
- }
- @Override
- public String getServletInfo() {
- System.out.println("getServletInfo()");
- return null;
- }
- @Override
- public void destroy() {
- System.out.println("正在销毁");
- }
- }
浏览器访问servlet时,需要将servlet与路径绑定,需要在web.xml中对servlet进行配置:
- <?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>testservlet</servlet-name>
- <servlet-class>com.wbg.testservlet</servlet-class>
- </servlet>
- </web-app>
实现接口的意义:
1、接口和实现分离给软件系统提供了无限的想像空间,才使得软件世界如此丰富多彩。
2、接口和实现分离使得多态变为可能
3、接口和实现分离使得解耦变为可能
4、接口和实现分离使得组合更有意义
5、接口和实现分离使得设计模式变为可能,才能衍生出23种设计模式。
简单的说接口和实现分离给软件系统提供了无限的想象空间、多态变为可能、解耦变为可能、组合更有意义、设计模式变为可能,才能衍生出23钟设计模式(创建型、结构型、行为型)
servlet三种方式实现servlet接口的更多相关文章
- Servlet接口应用(开发servlet三种方式)
参见 文库/java/javaEE全新学习教程2.2节 1.通过URL调用 2通过提交表单 3超链接 4 javascript写一个函数,调用这个函数 1,首先在工程的WebRoot文件夹下建立一个j ...
- 开发servlet三种方式
第一种:实现Servlet接口 ServletDemo类 实现Servlet接口 public class ServletDemo implements Servlet { //初始化该servlet ...
- 创建线程的第三种方式——使用Callable接口
Callable是类似于Runnable的接口,实现Callable的类和实现Runnable的类都是可被其他线程执行的任务. 优点:有返回值 缺点:实现繁琐 简单实现: CallableAndFut ...
- Servlet实现的三种方式
实现Servlet的三种方式:一个实现,两个继承 /*========================================== * servlet的执行过程: * 1.创建servlet对 ...
- 创建servlet的三种方式
第一种方式,实现Servlet接口 package com.example.servlet; import java.io.IOException; import javax.servlet.Serv ...
- 详细理解servlet实现的三种方式和生命周期
阅读目录 开发servlet的三种方式 理解实现servlet接口的方式,理解servlet生命周期 Servlet接口有五个方法 继承GenericServlet 继承HttpServlet 现在很 ...
- SpringBoot学习笔记(6)----SpringBoot中使用Servlet,Filter,Listener的三种方式
在一般的运用开发中Controller已经大部分都能够实现了,但是也不排除需要自己实现Servlet,Filter,Listener的方式,SpringBoot提供了三种实现方式. 1. 使用Bean ...
- Servlet三种创建方式
直接实现 Servlet 接口不太方便,所以 Servlet 又内置了两个 Servlet 接口的实现类(抽象类),分别为 GenericServlet 和 HttpServlet,因此,创建 Ser ...
- java:struts框架2(方法的动态和静态调用,获取Servlet API三种方式(推荐IOC(控制反转)),拦截器,静态代理和动态代理(Spring AOP))
1.方法的静态和动态调用: struts.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCT ...
随机推荐
- Best HTTP
http://blog.csdn.net/u012322710/article/details/52860747 Best HTTP (Pro) 这是一款很多公司都在用的网页插件,感觉确实不错,分P ...
- C# 面试题二
1. 请编程实现一个冒泡排序算法? int [] array = new int [*] ; ; ; i < array.Length - ; i++) { ; j < ar ...
- bzoj 5291: [Bjoi2018]链上二次求和
Description 有一条长度为n的链(1≤i<n,点i与点i+1之间有一条边的无向图),每个点有一个整数权值,第i个点的权值是 a_i.现在有m个操作,每个操作如下: 操作1(修改):给定 ...
- ICONIX方法(用例分析方法实例教程)
- 冒泡排序——Java实现
一.排序思想 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复以上的步骤, ...
- Redis的Publish/Subscribe
Publish/Subscribe 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个key值上进行了消息发布 ...
- sublime开启vi编辑器功能,与vi常用快捷键
sublime开启vi编辑器 install package -> vintageES 设置里面 ignored_packages 里面的vintage去掉 VI命令 游标控制 h 游标向左移 ...
- PAT 1076 Forwards on Weibo
#include <cstdio> #include <cstdlib> #include <vector> #include <queue> #inc ...
- The eighteen day
27th Nov 2018 Setting goals is the first step in turning the invisible into the visiable ---Tony R ...
- 【Linux】小应用 大智慧
小应用 大智慧--重视 以工程师的标准要求自己