在BaseServlet之前,需要提及工厂factory去管理dao以及service,以及页面转发或重定向的管理

1.创建一个工厂类,以及一个资源文件,资源文件中以键值对的形式去存储key,以及对应的类的路径。工厂类中通过key拿到类的路径,通过这个路径反射的到对象。

public class BeanFactory {

    //加载配置文件
private static ResourceBundle bundle;
static{
bundle = ResourceBundle.getBundle("instance");
} /**
* 根据指定的key,读取配置文件获取类的全路径,创建对象
*/ public static <T> T getInstance(String key,Class<T> clazz){
String className = bundle.getString(key); try {
return (T) Class.forName(className).newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
} }
}

2.将重定向以及转发的操作提取出来,放到WebUtil类中,作为一个静态方法。静态方法中有一个uri参数,根据它类型的不同去考虑是转发还是重定向。

public class WebUtil {

    /**
* 页面跳转通用方法
*/
public static void goTo(HttpServletRequest req,HttpServletResponse resp, Object uri) throws ServletException, IOException{
if (uri instanceof RequestDispatcher) {
((RequestDispatcher) uri).forward(req, resp);
} else if (uri instanceof String){
resp.sendRedirect(req.getContextPath() + uri);
}
}
}

每个Servlet在启动之后都会去自动调用service方法,而service方法会去调用doGet()或者doPost(),同时在servlet中都需要去实例化service实例对象,所以可以把实例化service对象的操作以及,doGet()和doPost()编写在BaseServlet中,让其他的servlet去继承BaseServlet,当然BaseServlet类肯定是要继承HttpServlet类的

public abstract class BaseServlet extends HttpServlet{

    private static final long serialVersionUID = 1L;

    //注意要用protected
protected ServiceA serviceA = BeanFactory.getInstance("serviceA", ServiceA.class); @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object returnValue = null;
//获取操作类型;
String methodName = req.getParameter("method");
try {
//1.获取当前运行类的字节码
Class clazz = this.getClass();
//2.获取当前执行的方法的Method类型
Method method = clazz.getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
//3.执行方法
returnValue = method.invoke(this, req,resp);
} catch (Exception e) {
e.printStackTrace();
returnValue = "/error/error.jsp";
}
WebUtil.goTo(req, resp, returnValue); } @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}

在请求转发的时候,url中会有路径加servlet以及方法名(method的值需要与servlet中编写的方法的名称相同),通过获取method中的值,拿到方法名,然后让当前运行类去调用该方法。

这样的话,其他的servlet只需要去编写方法就好了,不需要写doGet()以及doPost(),因为,在某一个servlet启动的时候,自动调用找不到doGet或者doPost方法就会去父类去找,这样就会调用父类中的上述代码,然后调用相应的方法。

BaseServlet的编写的更多相关文章

  1. Java Web(十四) 编写MyBookStore项目的总结

    这几天一直没有发博文,原因是在写一个书城的小项目,作为web学习的最后沉淀,接下来就要到框架的学习了. --WH 一.项目介绍 从网上找的一个培训机构的小项目,名称叫做 书城购物网站 吧,其中就是分前 ...

  2. JavaWeb - 模仿SpringMVC抽取 BaseServlet + 封装表单参数

    模仿SpringMVC抽取一个BaseServlet,接收所有请求,然后自动封装表单参数和分发到对应的servlet执行,下面用一个页面表单提交,转发显示的项目做示例. 1)首先准备一个Entity, ...

  3. 《JavaWeb从入门到改行》关于BaseServlet那些事

    @为什么需要BaseServlet?  我们知道一个POST或者GET提交对应着一个Servlet, 无数的提交会让Servlet页面增加,我们希望一个Servlet就能处理很多提交的请求. @Bas ...

  4. 利用反射优化Servlet抽象出父类BaseServlet

    在编写servlet的时候发现每个servlet里面的doPost方法都如: protected void doPost(HttpServletRequest request, HttpServlet ...

  5. Angular2入门系列教程2-项目初体验-编写自己的第一个组件

    上一篇 使用Angular-cli搭建Angular2开发环境 Angular2采用组件的编写模式,或者说,Angular2必须使用组件编写,没有组件,你甚至不能将Angular2项目启动起来 紧接着 ...

  6. 从零开始编写自己的C#框架(28)——建模、架构与框架

    文章写到这里,我一直在犹豫是继续写针对中小型框架的设计还是写些框架设计上的进阶方面的内容?对于中小型系统来说,只要将前面的内容进行一下细化,写上二三十章具体开发上的细节,来说明这个通用框架怎么开发的就 ...

  7. 从零开始编写自己的C#框架(27)——什么是开发框架

    前言 做为一个程序员,在开发的过程中会发现,有框架同无框架,做起事来是完全不同的概念,关系到开发的效率.程序的健壮.性能.团队协作.后续功能维护.扩展......等方方面面的事情.很多朋友在学习搭建自 ...

  8. 从零开始编写自己的C#框架(26)——小结

    一直想写个总结,不过实在太忙了,所以一直拖啊拖啊,拖到现在,不过也好,有了这段时间的沉淀,发现自己又有了小小的进步.哈哈...... 原想框架开发的相关开发步骤.文档.代码.功能.部署等都简单的讲过了 ...

  9. 从零开始编写自己的C#框架(25)——网站部署

    导航 1.关掉访问保护 2.发布网站 3.复制网站到服务器 4.添加新网站 5.设置网站访问权限 6.设置文件夹访问权限 7.控制可更新文件夹执行权限 8.设置“应用程序池”.net版本与模式 9.附 ...

随机推荐

  1. javascript---split 和 join 的区别

    //相同点 : split 和 join 都是对字符或字符串进行操作的 //split(切割字符串) : 把字符串根据切割符切割,返回数组 //第一个参数 分隔符 //第二个参数 返回数组中元素的个数 ...

  2. Python基础之面向对象2(封装)

    一.封装定义: 二.作用 三.私有成员: 1.基本概念及作用 2.__slots__手段私有成员: 3.@property属性手段私有成员: 四.基础示例代码 1.用方法封装变量 "&quo ...

  3. 分享使用tcb-router路由开发的云函数短信平台SDK

    上篇文章我们分享了如何使用纯的云函数开发的榛子短信短信(http://smsow.zhenzikj.com)SDK,由于微信对于未付费云函数个数的限制,这种方法存在缺陷,经过改进,使用tcb-rout ...

  4. 为什么导入本地jquery.js老是无效?(已解决)

    我从jquery官网里复制过来jquery.js内容,然后粘贴到本地,但是引用的时候总是无效. 在翻看脚本所在目录,无意间发现脚本文件是个jquery.js.js,    原来是我的文件的扩展名的问题 ...

  5. css实现超出两行隐藏

    overflow:hidden; text-overflow:ellipsis; display:-webkit-box; -webkit-box-orient:vertical; -webkit-l ...

  6. [文章汇总]ASP.NET Core框架揭秘[最近更新:2018/10/31]

    之前一段时间都在个人公众号账号“大内老A”发布关于ASP.NET Core的系列文章,很多人留言希望能够同步到这里,所以在这里 对这些文章做一个汇总,以便于PC端阅读.如果说微软官方文档主要关于ASP ...

  7. Zookeeper+Dubbo+SpringMVC环境搭建

    项目码云GIT地址:https://gitee.com/xshuai/dubbo/ 开发工具 MyEclipse 10.7 JDK 1.7 容器 Tomcat 8(运行dubbo) zookeeper ...

  8. Lock、ReentrantLock、ReentrantReadWriteLock区别

    Lock Lock相比于synchronized具有更强大的功能,在jdk1.6之前,锁竞争激烈的情况下使用lock的实现类ReentrantLock甚至比synchronized具有更好的性能,1. ...

  9. 对某菠菜网站的一次渗透测试 heatlevel

    前言 无意间发现一个thinkphp的菠菜站,最近tp不是刚好有个漏洞吗?然后就顺手测试了一下,但过程并不太顺利,不过最后还是拿下了,所以特发此文分享下思路. 0x00 一键getshell? 简单看 ...

  10. [Swift]LeetCode509. 斐波那契数 | Fibonacci Number

    The Fibonacci numbers, commonly denoted F(n) form a sequence, called the Fibonacci sequence, such th ...