BaseServlet的编写
在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的编写的更多相关文章
- Java Web(十四) 编写MyBookStore项目的总结
这几天一直没有发博文,原因是在写一个书城的小项目,作为web学习的最后沉淀,接下来就要到框架的学习了. --WH 一.项目介绍 从网上找的一个培训机构的小项目,名称叫做 书城购物网站 吧,其中就是分前 ...
- JavaWeb - 模仿SpringMVC抽取 BaseServlet + 封装表单参数
模仿SpringMVC抽取一个BaseServlet,接收所有请求,然后自动封装表单参数和分发到对应的servlet执行,下面用一个页面表单提交,转发显示的项目做示例. 1)首先准备一个Entity, ...
- 《JavaWeb从入门到改行》关于BaseServlet那些事
@为什么需要BaseServlet? 我们知道一个POST或者GET提交对应着一个Servlet, 无数的提交会让Servlet页面增加,我们希望一个Servlet就能处理很多提交的请求. @Bas ...
- 利用反射优化Servlet抽象出父类BaseServlet
在编写servlet的时候发现每个servlet里面的doPost方法都如: protected void doPost(HttpServletRequest request, HttpServlet ...
- Angular2入门系列教程2-项目初体验-编写自己的第一个组件
上一篇 使用Angular-cli搭建Angular2开发环境 Angular2采用组件的编写模式,或者说,Angular2必须使用组件编写,没有组件,你甚至不能将Angular2项目启动起来 紧接着 ...
- 从零开始编写自己的C#框架(28)——建模、架构与框架
文章写到这里,我一直在犹豫是继续写针对中小型框架的设计还是写些框架设计上的进阶方面的内容?对于中小型系统来说,只要将前面的内容进行一下细化,写上二三十章具体开发上的细节,来说明这个通用框架怎么开发的就 ...
- 从零开始编写自己的C#框架(27)——什么是开发框架
前言 做为一个程序员,在开发的过程中会发现,有框架同无框架,做起事来是完全不同的概念,关系到开发的效率.程序的健壮.性能.团队协作.后续功能维护.扩展......等方方面面的事情.很多朋友在学习搭建自 ...
- 从零开始编写自己的C#框架(26)——小结
一直想写个总结,不过实在太忙了,所以一直拖啊拖啊,拖到现在,不过也好,有了这段时间的沉淀,发现自己又有了小小的进步.哈哈...... 原想框架开发的相关开发步骤.文档.代码.功能.部署等都简单的讲过了 ...
- 从零开始编写自己的C#框架(25)——网站部署
导航 1.关掉访问保护 2.发布网站 3.复制网站到服务器 4.添加新网站 5.设置网站访问权限 6.设置文件夹访问权限 7.控制可更新文件夹执行权限 8.设置“应用程序池”.net版本与模式 9.附 ...
随机推荐
- Linux的小知识点
uname 2.whereis 3.df 4.which 5.apt和dpkg 6.service 7./etc/init.d/ 8.netstat -anptu 查看端口占用 9.netstat 1 ...
- Red and Black---POJ - 1979
There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A ...
- 接口自动化项目搭建(Java+testng+maven+git+springboot)
自动化测试: https://www.bilibili.com/video/av31078661?from=search&seid=16551153777362561361 一工具准备 二 环 ...
- 【RL-TCPnet网络教程】第28章 RL-TCPnet之DNS应用
第28章 RL-TCPnet之DNS应用 本章节为大家讲解RL-TCPnet的DNS应用,学习本章节前,务必要优先学习第27章的DNS基础知识.有了这些基础知识之后,再搞本章节会有事半功倍的 ...
- 【DFS】n皇后问题
回溯: 递归调用代表开启一个分支,如果希望这个分支返回后某些数据恢复到分支开启前的状态以便重新开始,就要使用到回溯技巧,全排列的交换法,数独,部分和,用到了回溯.下一个状态在开始之前需要利用到之前的状 ...
- 选择 25k 的 996 还是 18k 的 965
阅读本文大概需要 3.7 分钟. 文中部分内容来源:http://h5ip.cn/hSDk 最近的 996.ICU 话题持续在火爆,一般热点新闻的热度持续时间为一星期,这次是程序们的集体发声导致,戳中 ...
- [Swift]LeetCode113. 路径总和 II | Path Sum II
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...
- 注解式controller开发,action找不到controller???
Spring这一列列的 , 配置是真的多,学完我都忘啦 那个配置是干什么的了. 这里我遇到的问题是 我前台 使用action请求controller中的方法时,却找不到 报错404. 首先你路径 ...
- Ubuntu12.04下安ns-3.29及Ubuntu换源方法
目录 1.下载ns-3.29 2.安装gcc-4.9.2 3.编译.测试ns-3.29 第一种:更新,文章开头说的 第二种,更新源 主机型号:Ubuntu12.04 仿真环境版本:NS-3.29 安装 ...
- Python中面向对象的概念(科普)
面向对象(OOP)基本概念 面向对象编程 —— Object Oriented Programming 简写 OOP 目标 了解 面向对象 基本概念 01. 面向对象基本概念 我们之前学习的编程方式就 ...