论坛首页 入门技术论坛

Struts 1实现原理之我理解

浏览 3792 次
该帖已经被评为新手帖
作者 正文
   发表时间:2010-03-06   最后修改:2010-03-06

Struts是在servlet基础上设计的一种框架。下面看一段servletweb.xml配置的配置。

servlet的web.xml

在其配置文件中可以看出WEB容器会将浏览的每一个地址交给一个对应的servlet类来处理,从而每一个路径都必须对应一个servlet类。在做servlet开发时,其servlet仅仅将路径交给相应servlet类来处理,并没有对页面提交过来的数据进行一些处理,然而在开发时往往要求对页面数据进行一些处理。这是servlet的不足之处,Struts框架弥补了servlet的不足之处。

下面是struts框架总的执行流程:

struts总流程

在做servlet开发时,配置web.xml中可以采用*号通配符的形式来配置浏览器的路径例如:<url-pattern>*.do</url-pattern>,意思是说将以.do结尾的路径都交给这个servlet类来处理。这样就明白了struts框架中.doActionServlet了,意思就是说在struts中会将所有以.do结尾的路径的请求都会交给ActionServlet(一个大的servlet类)来处理。在struts框架中每一个具体路径交给ActionServlet时,它会根据struts-config.xml的配置信息找到该路径对应的Action类。从而将这个路径交给其对应Action来处理。

web.xml配置struts信息

在struts的Action类的execute方法中有四个参数,分别是ActionMapping 类、ActionForm类、HttpRequest类、HttpResponse类。实际上这些参数是不需要手动来传值的,ActionServet传过来的。

ActionMapping类:该类实际上ActionServlet读取struts配置文件中<forward name=”***” path=”***.jsp”></forward>标签生成的一个类,它的作用是把当前Action<forward></forward>标签对中path属性中的jsp文件关联。在一个Action中可以有多个<forward><forward>标签对。从而得知ActionMapping 可以包含多个forward标签对的信息。

ActionForm类:该类实际上是ActionServlet类读取struts配置文件中的:

<form-bean></form-bean>标签对中type属性(通过反射)生成一个 formbean对象,它实际可以封装页面提交过来数据。

其余两个没有什么好讲的了。

 

看看下面一张图就会明白struts框架到底做了那些事。

struts实现细节

从这张流程图中可以看出struts是怎么做的。

struts框架中通过反射技术将页面中form提交过来数据封装成一个formbean对象传给 Action类中execute方法中的ActionForm参数(也就是前面提到的ActionForm),struts中也提供了直接通过request请求来获得参数,但是既然使用了struts框架就应该使用前面的方法来获得页面数据。

ActionForm的类中提供了valiedate()方法,它返回一个ActionError类的对象。如果该对象为空,说明校验没有出错,action不会跳转到input视图(也就是struts配置文件中<action></action>标签队中input属性,该属性的作用是校验出错跳转的页面,一般情况下也就是输入数据的页面,这下明白为什么叫input而不叫error了吧)。如果校验成功则把该参数传给对应的Action来处理。在Action处理完这些数据后,会依据要求传到不同页面。这就是一个完整的struts1的实现原理。

 

 

 

   发表时间:2010-03-09  
这不是在总结czbk的视频吗。。。
0 请登录后投票
   发表时间:2010-03-09   最后修改:2010-03-09
说得直白点。
以*.do为例,容器把符合*.do的请求给ActionServlet,ActionServlet根据请求.do前面的路径找map里是否有对应的action(类)。根据这个路径看保存action 映射的map里是否有,如有则直接获取否则创建一个并放到这个map中去,这也就是说为什么struts1的action不是线程安全。然后就是执行它的execute()方法,再就是forward
0 请登录后投票
   发表时间:2010-03-09  
恩,分析的很好。
0 请登录后投票
   发表时间:2010-03-10  
lydawen 写道
说得直白点。
这也就是说为什么struts1的action不是线程安全。然后就是执行它的execute()方法,再就是forward



Struts1是线程安全的,

看代码:
 synchronized (actions) {

            // Return any existing Action instance of this class
            instance = (Action) actions.get(className);
            if (instance != null) {
                if (log.isTraceEnabled()) {
                    log.trace("  Returning existing Action instance");
                }
                return (instance);
            }
...


每个Action都是线程安全的构造,加上Java方法的重进入,所以Action的实例是线程安全的。



0 请登录后投票
   发表时间:2010-03-10  
// Return any existing Action instance of this class 
instance = (Action) actions.get(className);

他只创建一个实例,共享成员变量,怎么线程安全?
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics