Struts 的工作原理是什么?
解决方案 »
- "No action config found for the specified url"的错误
- hibernate联合查询问题
- 请问服务端的handler怎么部署
- poi 与 jxl比较
- struts中通过getDataSource(request)无法得到链接但直接连接数据库能成功,返回为null,请问如何解决
- 就这个问题老师找不到答案!!!!EJB BEAN 为什么必须继承JAVA.IO.SERIALIZABLE
- 怎样从一个servelt或bean中通过http发送一个xml文件?
- Runtime.getRuntime().freeMemory()/maxMemory() 内存问题
- 哪里可以下载到, Windows平台下的图形化CVS客户端软件?哪种使用更方便些?
- EJB部署问题!(解决问题马上给分.在线等候)
- SSH框架,导入导出dbf或zip文件
- jbpm4.4怎么获取最新版本的流程
另外还有一些标签,非常容易在页面进行显示,这是我自己理解的。说的不对的,请大家提出来。
服务器启动后,根据web.xml加载ActionServlet读取struts-config.xml文件内容到内存。
以登陆为例:第一次进login.jsp会先实例化Form、把默认值赋给表单元素。
输入用户名密码提交表单、提交到action属性的login.do,通过ActionServlet读struts-config.xml文件找到 action下的path属性找到.do,通过name属性找form-beans中的form-bean的name属性得到ActionForm的包名类名,先实例化form,把表单的值填充给form,调用form的validate方法验证、ActionErrors返回null表示验证通过,否则失败返回input指定的页面.验证通过会实例化Action,执行Action的excute方法。
这个是struts 1 的,呵呵,我说说2的:
(省略服务器启动部分,呵呵)
1.当用户在页面上进行操作时,生成了*.action的请求传给struts.xml(MVC中的V)
2.服务器根据这个配置文件中所定义的action名称,寻找匹配的处理方法:如果没有定义method,则直接调用的是class里面的类的execute方法,如果定义了method,则是调用的class类里的method中所指明的方法(MVC中的C)
3.在method中进行处理,在这里有可能采用若干高深莫测的方法,但都属于较为底层的工作,比如访问数据库等等(MVC中的M)
4.方法处理完后(可能有一串的处理方法,但终究有一个方法是最终进行的),return了一个字符串,比如success、error等,并将这个字符串送回给struts.xml,struts.xml在前面action标签内部定义的若干个result中,找到name属性与返回字符传相同的,然后根据type的类型,向指定页面进行跳转。(MVC中的C)
5.跳转的页面接受到了请求,生成页面在浏览器里进行显示。(MVC中的V)我也是刚学不久,还望指教~:)
http://space.itpub.net/13750068/viewspace-493899
还是sruts2.x
是有不同的 strut1.x
核心: actionServlet 是一个servlet在web.xml中配置 actionServlet
作用 1 : 得到用户请的的信息 如用户名,密码等封装到 actionForm里面去
2 : 得到url的信息找到相应的action好分发 实现步骤:
(跟据请求信息) --------------> 封装好actionForm
用户发出请求----> actionServlet
--------------> 分发到相应的action
上面是strut1.x
然后返回到中央处理器ActionServlet加载Struts-config.xml配置文件,根据配置跳转到不同的Jsp
Action
ActionForm
struts-config.xml------配置一个请求与一个Action对应
ApplicationResources.properties
jsp
jsp------请求----->
ActionServlet根据请求在struts-config.xml寻找去调用哪一个Action(ActionFrom完成数据的封装)----->
做相应的业务逻辑处理------根据struts-config.xml显示给用户看的---->jsp
2.从struts-config.xml中找到用户请求的Action
3.通过struts-config.xml中的配置再去找这个Action对应的ActionForm,并实例化
4.把用户填写的数据自动填充到ActionForm中(调用ActionForm中的setXX()方法填充)
5.同时把ActionForm放入到指定的范围中(request,session)
6.然后把请求转发给Action
7.Action获取ActionForm中的值然后调用业务逻辑层实现功能
8.在通过ActionMapping查找Actionforward实现转发;不知道对你有没有帮助,希望有用
1、struts2核心技术是拦截器,相信学过Java的人都用到过拦截器,struts2的提供了很多内置拦截器。
2、核心控制器--FilterDispatcher,该控制器运行在WEB容器中负责拦截用户请求,如果用户请求以*.action形式出现,那么核心控制器就将用户请求拦截并处理,这其中显然运用了控制反转的技术,真正执行操作的还是用户写的业务逻辑层代码。
3、主要流程:
核心配置文件是struts-config.xml文件说明url与Action及ActionForm的对应关系,url不可以重复。
在web.xml中说明ActionServlet、其可以接收所有以do结尾的请求;
说明struts-config.xml所在位置,以参数的形式传给ActionServlet。
当启动容器时,容器(tomcat、weblogic)实例化ActionServlet,初始化ActionServlet,在初始化ActionServlet时加载struts-config.xml文件。
当客户通过url.do将请求发给ActionServlet,ActionServlet将处理转发给助手RequestProcessor,RequestProcess通过struts-config.xml
找到对应的actionForm及action,如果有ActionForm用已有的,没有
通过类的反射实例化ActionForm,通过反射将表单域的值填充到actionForm中。
如果有Action用已有的,没有产生一个新的,通过反射调用action的execute方法,在执行前将actionForm通过参数注入到 execute方法中,execute 方法执行结束前通过actionMapping找到actionForward转发到另一个jsp页面中。
第二步 花些时间看看struts2的过滤器的源代码另外还可以自己简单的实现一个mvc的小框架。可以参考我们写的这个很简陋的mvc框架
http://code.google.com/p/simplejee/source/browse/trunk/simplejee/src/com/yuqiaotech/simplejee/minimvc/MiniMvcHandlerFilter.java
以及一个相对完善一点的
http://code.google.com/p/simplejee/source/browse/#svn/trunk/simplejee/src/com/yuqiaotech/simplejee/mvc
2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
6 ActionProxy创建一个ActionInvocation的实例。
7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper
看一下web.xml里的配置就知道啦。。struts2是通过org.apache.struts2.filter.FilterDispatcher这类来响应客户端请求的,然后再查找struts.xml中的action,通过反射机制执行action的execute。。
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.filter.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
1.其中的帖子,就是大家看到的东西,相当于页面,也就是mvc中的v
2.管理员的角色,是负责喊,喊什么,要根据楼主的行为来决定,在这个案例中,由于楼主长时间不结贴,所以管理员必须提醒你,及时结贴,可以看作是连接楼主和帖子的纽带,相当于sevelet,mvc中的c
3.楼主,负责及时处理管理员的要求,只要你结了贴,管理员就会马上知道,然后告诉这个帖子,楼主结贴了,你赶紧变身~~~,mvc中的m
4.struts,其实就是楼主+管理员+帖子的结合体。
但是很明显,楼主没有及时响应管理员的要求,所以,楼主不是一个合格的楼主,鉴定完毕!
其实struts2就是解决了视图和请求分离的问题,记住这句话
当然顺序先filter,进struts.xml,根据xml配置进入不同的action,action调用业务逻辑。将结果返回到struts.xml,根绝xml文件result配置,派发到不同的视图。
1,服务器启动根据web.xml初始化struts组件,这其中的细节就让研究服务器的人去了解吧
2,页面上的一条http请求发送至服务器,服务器根据struts.xml引导消息请求action,struts的拦截器首先会截取http消息,并进行一系列的解析,处理和封装然后根据解析的地址调用相应的action
3,j2ee提供了对http消息接收和处理的机制这是开发的充分条件,也是j2ee之核心,struts中也必然是使用了servlet的技术,凭借HttpServlet类中的接口方法来实现对http请求的解析。并能将其处理后再封装为结果对象并重新发送一条请求调用jsp,jsp再解读数据信息并生成标准的静态页面返回给浏览器。至于怎么处理和调用这些就是开发框架的人去解决了,一般都是同过xml文档技术实现。
4,我们可以看到struts1中的action是继承了ActionSupport父类,并且配置ActionForm以获取http请求消息内容,这些就是我在3中提到的对http消息处理后的结果。
5,然而在struts2中的action和基本的java类一样,不需要任何继承,获取请求信息只需要get方法即可。这也是struts2最大的亮点,struts2的内核使用了自动匹配技术,这是进一步封装的结果,然而会不会影响效率就不知道了。struts2的其它功能也有很多特色。这里就不敢班门弄斧了。
以上只代表自己蹩脚的理解,拿出来讨论一下。