servlet关于service()的实现

servlet关于service()的实现

**

很自然的,我们知道服务器接收到了浏览器请求后将创建servlet对象(关于其生命周期,可以看文结尾链接),然后通过xml映射文件配置,将调用service()方法进行业务实现,那么,是怎么调用service()方法的呢?

首先,明确一点,方法的调用必须经过对象的调用,那么,对象自然而然就是服务器创建的servlet对象,那么,我们创建的功能类,是怎么new出这个对象的呢?这个很简单,实现servlet接口,就能够重写出五种方法,其中就有我们需要的service()方法;

由此,我们就可以达到创建servlet对象的目的。

以实现登陆功能为例;

但这样有没有发现另外四个方法一般是不是我们不会用?那不对啊,不符合我们java的敏捷高效,好,伟大牛x的大佬们想出了办法,由此诞生了三种达到目的的方式;

第一种就是最原始的,不再重复;

最优秀的,第三种,四层架构,我来说说我对这个的理解,

功能类继承

Httpservlet抽象类源码,我调整了下顺序,等下讲;

genenicservlet抽象类源码

好了,素材有了,咱来捋一捋;

何为四层架构,首先看要达到的目的是什么:屏蔽功能类多余方法,让功能类专注于service的实现;那么我们可以想到一个很有特点的类:抽象类;它的特点是什么:

    1. 可以同时包含n个抽象方法与m个普通方法(其中n,m均可为o),
    2. 不可被实例化

      现在我们来想一点额外的东西:为什么实现接口要重写所有方法?

      因为接口中的所有方法都是抽象的,这样我们普通类实现所有方法时,就必须重写;因为普通类能有抽象方法吗?不能嘛。。但谁可以?抽象类啊,可以同时包含n个抽象方法与普通方法,所以我们创建第二个层:genenicservlet抽象类来实现servlet接口;

      并且只保留service()方法,是不是就屏蔽掉了其他多余的方法?

      然后我们在想一个问题,如果功能类直接继承,是不是会继承到抽象方法?也就是成了抽象类,那不行,看下上面抽象类第二个特点:不可被实例化;那岂不是gg?

      于是我们迎来了第三个层:Httpservlet抽象类;

      然后在这个类中重写service()方法,最后功能层直接继承,就不会成为抽象类了;

      而且需要补充的几点:

      ???为什么功能类里的方法传参变了

      很简单,看Httpservlet抽象类源码其中instanceof的作用是判断对象在内存中实际是不是该类型,基本用于强制转换;

      这个方法就改变了传参类型了;

      ???为什么不直接第二层实现,而要搞到第三层

      。。。我也不知道。。希望有大佬能够解答。。。不过感觉和装饰器设计模式有关系,还有就是这样的设计能够在第二三层提供大量的方法,也就可以更高效的达到目的了;

原文地址:https://www.cnblogs.com/youngThief/p/9683149.html

时间: 2024-10-24 03:24:39

servlet关于service()的实现的相关文章

Servlet中service方法

在学习Servlet的过程中,我们大多时候编码都是直接继承HttpServlet这个类,并且重写doGet ,doPost,但是查看Api时我们会发现Servlet接口 ,GenericSevlet抽象类 以及HttpServlet类中都有service方法,那么为什么我们继承HttpSevlet类时不要重写service 而要重写doGet doPost呢?service的作用是什么捏?? 正如上文中所说的,Servlet中,service方法是一直存在的,因为最高层的接口Servlet(像H

servlet中service doGet doPost 的关系

在servlet中默认情况下,无论你是get还是post 提交过来都会经过service()方法来处理,然后转向到doGet 或是doPost方法,可以看HttpServlet 类的service方法: protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getMethod(); if(

Java Servlet(四):Servlet接口service工作(ServletRequest,ServletResponse对象)(jdk7+tomcat7+eclipse)

本篇将会记录,Servlet接收客户端传递来的参数信息,并返回信息使用的对象,及这些对象的函数相关用法. 还是在java ee工程中进行操作,在WebContent目录下创建一个login.jsp文件,并修改文件内容为: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUB

servlet+javabean+service+dao完成注册登录

domain package cn.code.domain; /* * 实体类 * */ public class User { private String username; private String password; private String verifyCode; @Override public String toString() { return "User [username=" + username + ", password=" + pa

servlet的service方法吞异常问题

今天发现一个问题,编写代码向Servlet发送请求,接收响应报文,发出去之后"报服务器返回500"异常,然而从后台日志中没有发现异常记录.然后用浏览器发请求,发现日志中出现了异常记录. 思来想去,不知道怎么回事,之前也遇见过几个此种问题,但是都绕过去了,回头看代码,发现是IDE的问题. 之前的Servlet中的service方法在声明的时候都不会声明抛出异常,然而,如果用eclipse 的快捷键选择重写service方法的话,默认的会声明service方法抛出ServletExcept

servlet中service() doGet() doPost() 方法

HttpServlet 里的三个方法:service(HttpServletRequest req, HttpServletResponse resp) ,doGet(HttpServletRequest req, HttpServletResponse resp), doPost(HttpServletRequest req, HttpServletResponse res)的区别和联系: 在servlet中默认情况下,无论你是get还是post 提交过来 都会经过service()方法来处理

Servlet的Service方法和doget 和 dopost方法的区别,常见的错误解析

package com.sxt.in; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Service方法和doget 和 dopost方

servlet注入service业务bean

项目中用到spring容器来管理业务bean,在servlet中就收到前台传递来的请求参数后,调用业务bean,老是出错 部门代码如下 [java] view plaincopy <span style="font-size:18px;">private UserService userService; public UserService getUserService() { return userService; } @Resource public void setU

tomcat异常之Servlet.service() for servlet [spring-mvc] in context with path

严重: Servlet.service() for servlet [spring-mvc] in context with path [/helloworld-springmvc] threw exception [Handler processing failed; nested exception is java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config] with root cause java.lang.