Struts1的实现原理
一 开文背景 -- 废话讲一段~
本文借助动力节点-王勇老师的视频教程中的引例来了解struts1的实现原理,虽然现在已经很少使用struts1了,但是了解了其原理之后,对了解其他mvc框架还是有较大的帮助的.
二 简介 -- 切入主题
struts1主要实现从请求到servlet的映射.
e.g. 现有的一个业务为实现用户的添加删除修改,按照原有的model2的原理可以实现上述功能.
2.1没有struts1之前的基于model2 mvc的实现.
直接在servlet中实现如下代码:
String username = request.getParameter("username");
UserManager userManager = new UserManager();
String forward = "";
if ("/servlet/delUser".equals(path)) {
userManager.del(username);
forward = "/del_success.jsp";
}else if ("/servlet/addUser".equals(path)) {
userManager.add(username);
forward = "/add_success.jsp";
}else if ("/servlet/modifyUser".equals(path)) {
userManager.modify(username);
forward = "/modify_success.jsp";
}else if ("/servlet/queryUser".equals(path)) {
List userList = userManager.query(username);
request.setAttribute("userList", userList);
forward = "/query_success.jsp";
}else {
throw new RuntimeException("请求失败");
}
request.getRequestDispatcher(forward).forward(request, response);
到现在,基本的功能是已经实现了,但是看着上面的代码就像吐啊~一坨的if-else,复杂的每一个if-else节点处理~毫无半点的扩展性可言.
解决办法:
将每一个小的业务处理单独来处理.抽象出一个借口Action,抽象方法:execute(HttpServletRequest,HttpServletResponse). struts1中返回一个ActionForword对象.
public interface Action {
public String execute(HttpServletRequest request, HttpServletResponse response)
throws Exception;
}
每一个小的功能(添加\删除\修改),都抽象成一个action,实现上面的接口.
Action action = null;
if ("/servlet/delUser".equals(path)) {
action = new DelUserAction();
}else if ("/servlet/addUser".equals(path)) {
action = new AddUserAction();
}else if ("/servlet/modifyUser".equals(path)) {
action = new ModifyUserAction();
}else if ("/servlet/queryUser".equals(path)) {
action = new QueryUserAction();
}else {
throw new RuntimeException("请求失败");
}
String forward = null;
try {
forward = action.execute(request, response);
} catch (Exception e) {
e.printStackTrace();
}
request.getRequestDispatcher(forward).forward(request, response);
虽然相对上面的"代码",这次有了一定程度的提高(仅仅是思想上),代码的扩展性,还是没有达到要求的.
如今,对一些较多可选择性的代码,将其从代码中抽离出来,转化为配置文件是提高扩展性的一种方式.
/
<action-config>
<action path="/servlet/delUser" type="com.bjpowernode.servlet.DelUserAction">
<forward name="success">/del_success.jsp</forward>
<forward name="error">/del_error.jsp</forward>
</action <action path="/servlet/addUser" type="com.bjpowernode.servlet.AddUserAction">
<forward name="success">/add_success.jsp</forward>
<forward name="error">/add_error.jsp</forward>
</action <action path="/servlet/modifyUser" type="com.bjpowernode.servlet.ModifyUserAction">
<forward name="success">/modify_success.jsp</forward>
<forward name="error">/modify_error.jsp</forward>
</action <action path="/servlet/queryUser" type="com.bjpowernode.servlet.QueryUserAction">
<forward name="success">/query_success.jsp</forward>
<forward name="error">/query_error.jsp</forward>
</action </action-config>
每一个<action></action>结点指定该action对应的请求路径,对应处理该请求的具体Action类型,以及处理之后的转向.在装载这些配置文件需要一个对象来装填,这就是ActionMapping类型.
/
ActionMapping {
private String path;//请求路径
private String type;//对应的处理该请求的action类型.
Map forwardMap; //处理完成之后的跳转信息.
/
同样,需要将跳转信息保存起来,实现对象为ForwordMap<key,value>
/
}
forwardMap {
key="success";
value="/del_success.jsp"
key="error"
value="/del_error.jsp"
}
/
在struts1中使用Map将这些action保存起来Map<request_url,ActionMapping>.在actionmapping中同样保存着request_url.
Map map = new HashMap();
map.put("/servlet/delUser", actionMapping1);
map.put("/servlet/addUser", actionMapping2);
map.put("/servlet/modifyUser", actionMapping3);
map.put("/servlet/queryUser", actionMapping4);
如果是删除ActionMapping存储如下:
actionMapping {
path= "/servlet/delUser";
type = "com.bjpowernode.servlet.DelUserAction";
forwardMap {
key="success",value="/del_success.jsp"
key="error", value="/del_error.jsp"
}
}
三 综合总结
下面就使用一个例子来总结一下整个struts1的处理流程
String path = "/servlet/delUser";
1.根据截取的URL请求,到Map(从配置文件中获取)中取得本次请求对应的Action
ActionMappint actionMappint = (ActionMappint)map.get(path);
2.取得本请求对应的Action类的完整路径
String type = actionMappint.getType(); //com.bjpowernode.servlet.DelUserAction
3.采用反射动态实例化Action
Action action = (Action)class.forName(type).newInstance();
4.动态待用Action中的execute方法
String forward = action.execute(request, response);
5.根据路径完成转向
request.getRequestDispatcher(forward).forward(request, response);
真正来驱动这一切行为的操作者为Servlet,也就是MVC中的控制器,实现了请求url的截取,然后从配置文件中按照截取的url,来实现分发.读取配置文件,创建actionmapping,forwardmap对象,由此创建action对象,实现业务的处理,然后转向.
Struts1的实现原理的更多相关文章
- struts1和struts2原理解析
1.struts1和struts2 是2个完全不同的框架 其实struts2核心就是 webwork框架 struts1以ActionServlet作为核心控制器,由ActionServlet负责拦截 ...
- struts1之工作原理
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zkn_CS_DN_2013/article/details/34452341 1.初始化:strut ...
- struts1 工作原理
struts1的原理和工作流程 struts1的工作原理或者说工作流程: 1.在web应用程序启动就会加载ActionServlet,ActionServlet从配置文件struts-config.x ...
- struts1与struts2的区别
Struts2其实并不是一个陌生的Web框架,Struts2是以Webwork的设计思想为核心,吸收了Struts1的优点,因此,可以认为Struts2是Struts1和Webwork结合的产物. 简 ...
- Liferay JSP中常用的标签
(本文转载自http://www.cnblogs.com/edwardlauxh/archive/2010/03/26/1918614.html) 在Liferay框架中拥有它自身的标签,虽然Port ...
- Java知识总结
...
- Struts的前世今身
1.Struts1的运行原理 a.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件( ...
- Java框架知识点总结
一.Struts1的运行原理 在启动时通过前端总控制器ActionServlet加载struts-config.xml并进行解析,当用户在jsp页面发送请求被struts1的核心控制器ActionSe ...
- Struts1——从BeanUtils看struts的实现原理2
上一篇博客中我们简单的介绍了BeanUtils的使用.以及其最主要的原理,今天我们进一步的理解这个类在Struts1中的使用. 首先我们先回想一下搭建一个简单的基于Struts1框架的 ...
随机推荐
- JAVA_用_JCO连接_SAP,实现调用SAP_的_RFC_函数(整理)(附一篇看起来比较全面的说明)(JCO报错信息)
// 获取RFC返回的字段值 11 JCoParameterList exportParam = function.getExportParameterList(); 12 String exPara ...
- KISSY对vm的抽取
vm <script type="text/javascript"> KISSY.use(['bops/js/forced-closure', 'common/js/t ...
- excel读入数据库
POI3.9效率大幅度提高,支持xls以及xlsx. 首先需要POI的JAR包,MAVEN配置如下: <!-- excel start --> <dependency> < ...
- Android 关于调用系统内已安装的相机问题
Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent,1); 调用系统内已安 ...
- 概率图模型(PGM)学习笔记(三)模式判断与概率图流
我们依旧使用"学生网络"作为样例,如图1. 图1 首先给出因果判断(Causal Reasoning)的直觉解释. 能够算出来 即学生获得好的推荐信的概率大约是0.5. 但假设我们 ...
- asp.net个人笔记
1.进程外session一记 配置进程外session, 在webconfig中配置<sessionState timeout="60" mode="StateSe ...
- HTTP消息头详解
HTTP是一个属于应用层面的面向对象的协议,由于其便捷.快速的方式.适用于分布式超媒体信息系统.于1990年提出 HTTP 协议主要特点概括如下 1.支持客户/服务器模式. 2.简单快速 请求方法常用 ...
- 无法编辑的word解密
打开文档后,将其另存为XML文件,然后用UltraEdit(或者EditPlus,下载华军里搜索一下就行了)这个编辑软件打开刚刚存储的 XLM文件,查找<w:documentProtection ...
- HDU 4548(美素数)
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 小明对数的 ...
- SAE部署Java应用
链接地址:http://blog.csdn.net/shuixin536/article/details/9031335 SAE为开发者提供了非常宽松的开发环境,你甚至不用做任何特别定制就能将各种Ja ...