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,实现上面的接口.

  

 1 Action action = null;
 2         if ("/servlet/delUser".equals(path)) {
 3             action = new DelUserAction();
 4         }else if ("/servlet/addUser".equals(path)) {
 5             action = new AddUserAction();
 6         }else if ("/servlet/modifyUser".equals(path)) {
 7             action = new ModifyUserAction();
 8         }else if ("/servlet/queryUser".equals(path)) {
 9             action = new QueryUserAction();
10         }else {
11             throw new RuntimeException("请求失败");
12         }
13         String forward = null;
14         try {
15             forward = action.execute(request, response);
16         } catch (Exception e) {
17             e.printStackTrace();
18         }
19         request.getRequestDispatcher(forward).forward(request, response);

  虽然相对上面的"代码",这次有了一定程度的提高(仅仅是思想上),代码的扩展性,还是没有达到要求的.

  如今,对一些较多可选择性的代码,将其从代码中抽离出来,转化为配置文件是提高扩展性的一种方式.

 1 /
 2            <action-config>
 3                  <action path="/servlet/delUser" type="com.bjpowernode.servlet.DelUserAction">
 4                    <forward name="success">/del_success.jsp</forward>
 5                    <forward name="error">/del_error.jsp</forward>
 6               </action
 7
 8                  <action path="/servlet/addUser" type="com.bjpowernode.servlet.AddUserAction">
 9                    <forward name="success">/add_success.jsp</forward>
10                    <forward name="error">/add_error.jsp</forward>
11               </action
12
13                  <action path="/servlet/modifyUser" type="com.bjpowernode.servlet.ModifyUserAction">
14                    <forward name="success">/modify_success.jsp</forward>
15                    <forward name="error">/modify_error.jsp</forward>
16               </action
17
18                  <action path="/servlet/queryUser" type="com.bjpowernode.servlet.QueryUserAction">
19                    <forward name="success">/query_success.jsp</forward>
20                    <forward name="error">/query_error.jsp</forward>
21               </action
22
23
24            </action-config>

  每一个<action></action>结点指定该action对应的请求路径,对应处理该请求的具体Action类型,以及处理之后的转向.在装载这些配置文件需要一个对象来装填,这就是ActionMapping类型.

1         /
2            ActionMapping {
3               private String path;//请求路径
4               private String type;//对应的处理该请求的action类型.
5               Map forwardMap; //处理完成之后的跳转信息.
6           /

  同样,需要将跳转信息保存起来,实现对象为ForwordMap<key,value>

1         /
2            }
3            forwardMap {
4               key="success";
5               value="/del_success.jsp"
6               key="error"
7               value="/del_error.jsp"
8            }
9          /

  在struts1中使用Map将这些action保存起来Map<request_url,ActionMapping>.在actionmapping中同样保存着request_url.

1            Map map = new HashMap();
2            map.put("/servlet/delUser", actionMapping1);
3            map.put("/servlet/addUser", actionMapping2);
4            map.put("/servlet/modifyUser", actionMapping3);
5            map.put("/servlet/queryUser", actionMapping4);
6            

  如果是删除ActionMapping存储如下:  

1            actionMapping {
2                path= "/servlet/delUser";
3             type = "com.bjpowernode.servlet.DelUserAction";
4             forwardMap {
5                 key="success",value="/del_success.jsp"
6                 key="error", value="/del_error.jsp"
7             }
8            }

  三 综合总结

  下面就使用一个例子来总结一下整个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对象,实现业务的处理,然后转向.

时间: 2024-10-10 22:46:46

Struts1的实现原理的相关文章

struts1的工作原理

客户端发送号码大全恳求(Http Request),被struts1的中心控件器ActionServlet接纳,ActionServlet依据struts-config.xml里的映射联系找到对就的Action,若找不到就回来500过错到JSP页面关键词挖掘工具.若有就Action里的 excute()办法里履行相应的逻辑操作,比如调用Model层的办法,然后经过ActionForward,跳转到对应的输出页面 struts1的过程: 1.导入struts1在lib文件下的一切架包: 2.把we

struts1之工作原理

1.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的            Servlet,在启动时总控制器会读取配置文件(struts-config.xml)的配置信息,为struts            中不同的模块初始化相应的对象.(面向对象思想)  2.发送请求:用户提交表单或通过URL向WEB服务器提交请求,请求的数据用HTTP协议传给web服务器.  3.form填充:struts的总控制器ActionServl

struts1的原理

struts1似乎是一个离我们比较遥远的东西了,但是不排除现在有些企业还在用以struts1作为框架的项目,你去公司工作也许就那么倒霉地接到了一个struts1的项目,结果你发现,你会用struts2,却不会使用struts1,毕竟struts2和struts1相差有点大,但是,作为一个程序员,总能在某些场合一通百通,你会struts2,但不代表你要使用struts1就得重头学起,只要懂得了struts1的工作原理,聪明的你肯定就知道该如何使用struts1了,至少维护是没问题了吧. 关于str

struts1与struts2的区别

Struts2其实并不是一个陌生的Web框架,Struts2是以Webwork的设计思想为核心,吸收了Struts1的优点,因此,可以认为Struts2是Struts1和Webwork结合的产物. 简单来说二者的区别是: 技术方面,Stuts1有个核心控制器,但是只提供了一个接口,也就是execute,还要配置actionform之类的,很麻烦,所以依赖性比较强:而Stuts2是针对拦截器开发的,也就是所谓的AOP思想,可以配置多个action,用起来比较方便,但是因为请求之前的拦截器有一些注入

【Java基础】之Struts1与Struts2比较

在说到Struts1与Strus2的区别之前,不得不先提到MVC.MVC是一个种设计模式,代表了一种多层的应用程序的实现方式.处理过程为:首先控制器接受了用户的请求,并决定应该调用哪个模型来处理,然后模型处理了用户的请求后返回数据,最后控制器确定用相应的视图将模型返回的数据呈献给用户. 说完了MVC,再说一下为什么要用Struts框架.JSP.Servlet.JavaBean技术的出现给我们构建了强大的企业应用系统提供了可能,但这些技术构建的系统非常繁乱,所以在此基础上我们需要一些规则,一个把这

Liferay JSP中常用的标签

(本文转载自http://www.cnblogs.com/edwardlauxh/archive/2010/03/26/1918614.html) 在Liferay框架中拥有它自身的标签,虽然Portlet也有它自身的标签,但是Portlet的标签不能完全满足我们的需求,下面就介绍几个开发中经常用到的标签 <portlet:actionURL><portlet:renderURL>:这2个是把整个页面当做一个提交到相应的Action中进行处理,因为Portlet中把request分

Struts的前世今身

1.Struts1的运行原理 a.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(struts-config.xml)的配置信息,为struts中不同的模块初始化相应的对象.(面向对象思想) b.发送请求:用户提交表单或通过URL向WEB服务器提交请求,请求的数据用HTTP协议传给web服务器. c.form填充:struts的总控制器ActionServlet在用户提交请求时将

【Struts1】Struts1的配置和原理详解

Action, ActionForm, ActionForward ,这三个对象构成了Struts 的核心. Struts 最核心的控制器是ActionServlet ,该Servlet 拦截用户请求,井将用户请求转入到Struts 体系内. 一.配置ActionServlet ActionServlet 是一个标准的Servlet ,在web.xml 文件中配置,该Servlet 用于拦所有的HTTP 请求.因此,应将该Servlet 配置成自启动Servlet ,即为该Servlet 配置l

Struts1.2,struts2.0原理分析

struts1原理: 1.首先我们表单提交到action 2.进入到web.xml 3.web.xml拦截*.do 4.交给ActionServlet 5.找到path属性,获得url 6.找到name实体类,封装from 7.找到type,type就是action地址 8.进入action 9.完成之后就foroword跳转 struts2原理: 1.表单提交action 2.web.xml拦截/* 3.进入FilterDispatcher 4.之后找到default.properties文件