锁定老帖子 主题:Struts 1实现原理之我理解
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-03-06
最后修改:2010-03-06
Struts是在servlet基础上设计的一种框架。下面看一段servlet的web.xml配置的配置。
在其配置文件中可以看出WEB容器会将浏览的每一个地址交给一个对应的servlet类来处理,从而每一个路径都必须对应一个servlet类。在做servlet开发时,其servlet仅仅将路径交给相应servlet类来处理,并没有对页面提交过来的数据进行一些处理,然而在开发时往往要求对页面数据进行一些处理。这是servlet的不足之处,Struts框架弥补了servlet的不足之处。 下面是struts框架总的执行流程: 在做servlet开发时,配置web.xml中可以采用*号通配符的形式来配置浏览器的路径例如:<url-pattern>*.do</url-pattern>,意思是说将以.do结尾的路径都交给这个servlet类来处理。这样就明白了struts框架中.do和ActionServlet了,意思就是说在struts中会将所有以.do结尾的路径的请求都会交给ActionServlet(一个大的servlet类)来处理。在struts框架中每一个具体路径交给ActionServlet时,它会根据struts-config.xml的配置信息找到该路径对应的Action类。从而将这个路径交给其对应Action来处理。
在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框架中通过反射技术将页面中form提交过来数据封装成一个formbean对象传给 Action类中execute方法中的ActionForm参数(也就是前面提到的ActionForm类),在struts中也提供了直接通过request请求来获得参数,但是既然使用了struts框架就应该使用前面的方法来获得页面数据。 在ActionForm的类中提供了valiedate()方法,它返回一个ActionError类的对象。如果该对象为空,说明校验没有出错,action不会跳转到input视图(也就是struts配置文件中<action></action>标签队中input属性,该属性的作用是校验出错跳转的页面,一般情况下也就是输入数据的页面,这下明白为什么叫input而不叫error了吧)。如果校验成功则把该参数传给对应的Action来处理。在Action处理完这些数据后,会依据要求传到不同页面。这就是一个完整的struts1的实现原理。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-03-09
这不是在总结czbk的视频吗。。。
|
|
返回顶楼 | |
发表时间:2010-03-09
最后修改:2010-03-09
说得直白点。
以*.do为例,容器把符合*.do的请求给ActionServlet,ActionServlet根据请求.do前面的路径找map里是否有对应的action(类)。根据这个路径看保存action 映射的map里是否有,如有则直接获取否则创建一个并放到这个map中去,这也就是说为什么struts1的action不是线程安全。然后就是执行它的execute()方法,再就是forward |
|
返回顶楼 | |
发表时间:2010-03-09
恩,分析的很好。
|
|
返回顶楼 | |
发表时间: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的实例是线程安全的。 |
|
返回顶楼 | |
发表时间:2010-03-10
// Return any existing Action instance of this class
instance = (Action) actions.get(className); 他只创建一个实例,共享成员变量,怎么线程安全? |
|
返回顶楼 | |
浏览 3792 次