当前位置:编程学习 > JAVA >>

Struts 的工作原理是什么?

Struts 的工作原理是什么? --------------------编程问答-------------------- 用一个servlet拦截用户的请求,并分发到具体的action中去处理,再将返回的response进行封装,这是处理页面流程的机制,
另外还有一些标签,非常容易在页面进行显示,这是我自己理解的。说的不对的,请大家提出来。 --------------------编程问答-------------------- MVC --------------------编程问答-------------------- 用户的一个请求过来,交给struts的servelet,分发给相应的action进行处理(比如调用业务逻辑),返回ActionMapping,封装了转向信息,然后在返回给浏览器,其中的配置文件很重要 --------------------编程问答-------------------- Struts的流程
  服务器启动后,根据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方法。 --------------------编程问答--------------------
引用 4 楼 qjlsharp 的回复:
Struts的流程
服务器启动后,根据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,调用f…


这个是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)

我也是刚学不久,还望指教~:) --------------------编程问答-------------------- 呵呵,谢谢大家哦,不知道Struts 的工作流程和工作原理有什么不同!工作原理是不是主要要讲Struts的核心是怎么处理一个请求的。我的想法是当一个请求过来,Struts的核心处理类会将请求字符串进行切割,取出点前面的部分,然后再根据结果字符串到配置文件中找到相应的类,然后还需要遍历request中的所有属性字段,如过是普通的字段需要做一个处理,如果是多媒体字段又应该做什么样的具体处理,然后调用common-beanUtil包的具体类型转换后转换成的相应字段影射到formBean里,然后回传给与结果字符串相对应的实列来处理,然后利用mappingForward实现跳转(实际上是对requesDispatch的包装)!希望得到大家的指点? --------------------编程问答-------------------- 它的最终原理还是 HttpServlet 只不过是在这个基础上封装了而已 --------------------编程问答--------------------
引用 5 楼 David_Jiang 的回复:
引用 4 楼 qjlsharp 的回复:
Struts的流程 
服务器启动后,根据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的包名类名,先实例化fo…

学习了 --------------------编程问答--------------------
引用 4 楼 qjlsharp 的回复:
Struts的流程 
  服务器启动后,根据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,把表单的值填…

拜读了一下,不错 --------------------编程问答-------------------- mvc的一个经典实现 --------------------编程问答-------------------- servlet --------------------编程问答-------------------- 给你个链接,很好很强大。
http://space.itpub.net/13750068/viewspace-493899 --------------------编程问答-------------------- 核心原理:java反射 --------------------编程问答-------------------- 管他一还是二,都是struts的actionContext对action进行转发。 --------------------编程问答-------------------- 学习了,看了你们的很不错 --------------------编程问答-------------------- 不错,java反射机制 --------------------编程问答-------------------- 是strut1.x 
还是sruts2.x
是有不同的

 strut1.x 
          核心: actionServlet  是一个servlet在web.xml中配置

            actionServlet       
                       作用 1 : 得到用户请的的信息 如用户名,密码等封装到 actionForm里面去
                               2 : 得到url的信息找到相应的action好分发

          实现步骤:           
                                               (跟据请求信息)

                                              --------------> 封装好actionForm  
              用户发出请求----> actionServlet 
                                              --------------> 分发到相应的action


  上面是strut1.x



                                             
                               
                         
         
          
              
   --------------------编程问答-------------------- 当服务器被启动后,根据jsp页面里的action属性的值判断调用相应的Action然后再调用相应的小Action
然后返回到中央处理器ActionServlet加载Struts-config.xml配置文件,根据配置跳转到不同的Jsp
--------------------编程问答-------------------- xia下学期将学 --------------------编程问答--------------------
引用 4 楼 qjlsharp 的回复:
Struts的流程 
  服务器启动后,根据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,把表单的值填…


  如果详细点就更好了 --------------------编程问答-------------------- ActionServlet------控制器
Action
ActionForm
struts-config.xml------配置一个请求与一个Action对应
ApplicationResources.properties
jsp
jsp------请求----->
ActionServlet根据请求在struts-config.xml寻找去调用哪一个Action(ActionFrom完成数据的封装)----->
做相应的业务逻辑处理------根据struts-config.xml显示给用户看的---->jsp
                                                        --------------------编程问答-------------------- 4楼理解的很好
应该大体就那意思
--------------------编程问答-------------------- MVC 的经典实现. --------------------编程问答-------------------- 1.ActionServlet核心控制器会拦截所有*.do的请求
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实现转发;

不知道对你有没有帮助,希望有用 --------------------编程问答--------------------
引用 24 楼 xl10230 的回复:
1.ActionServlet核心控制器会拦截所有*.do的请求
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实现转发;

不知道对你有没有帮助,希望有用

很好很强大,学习勒。 --------------------编程问答-------------------- 学习啦,学习啦。。。。。。 --------------------编程问答-------------------- --------------------编程问答-------------------- 就是 MVC 的一个结构表现   --------------------编程问答-------------------- 再次申明我说的是struts2的工作原理:
    1、struts2核心技术是拦截器,相信学过Java的人都用到过拦截器,struts2的提供了很多内置拦截器。
     2、核心控制器--FilterDispatcher,该控制器运行在WEB容器中负责拦截用户请求,如果用户请求以*.action形式出现,那么核心控制器就将用户请求拦截并处理,这其中显然运用了控制反转的技术,真正执行操作的还是用户写的业务逻辑层代码。
     3、主要流程: --------------------编程问答-------------------- struts2 主要是前台接对象 通过struts2的Action类跳转 把对象处理传给DAO类 struts2的Action类再把传回来的对象或对相集合再传回前台页 --------------------编程问答-------------------- --------------------编程问答-------------------- 建议你买些书看,比如孙卫琴的《精通Struts》她的一系列书,你学习了之后肯定受益匪浅 --------------------编程问答-------------------- 进google呀!什么都解决了呀
--------------------编程问答-------------------- struts的核心类是ActionServlet,其可以接收所有.do结尾的请求。
核心配置文件是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页面中。 --------------------编程问答-------------------- struts1 2相差不是很大,一个要通过servlet  一个是通过filter,细节实现上有些不同,过程就是拦截-封装 --------------------编程问答-------------------- 第一步 看看风中叶之类的视频,了解struts2大致的使用
第二步 花些时间看看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 --------------------编程问答-------------------- struts1用actinServlet中央控制器拦截请求,Struts2用中央过滤器拦截请求,异曲同工! --------------------编程问答-------------------- 还是2楼最精炼 UP UP --------------------编程问答-------------------- 学习一下,Struts2是从Webwork框架继承过来的,跟Struts1框架有区别的。。。 --------------------编程问答-------------------- 虽然已经很了解,但是还是来学习一下 --------------------编程问答-------------------- 31楼的分的很详细,不错
--------------------编程问答--------------------
引用 31 楼 aerter 的回复:
工作机制:

  Struts的工作流程:

  在web应用启动时就会加载初始化ActionServlet,ActionServlet从

  struts-config.xml文件中读取配置信息,把它们存放到各种配置对象

  当ActionServlet接收到一个客户请求时,将执行如下流程.

  -(1)检索和用户请求匹配的ActionMapping实例,如果不存在,就……


up! 很多人讲得都正确! --------------------编程问答-------------------- truts1 2相差不是很大,一个要通过servlet 一个是通过filter,细节实现上有些不同,过程就是拦截-封装 --------------------编程问答--------------------   09年的帖子。。 --------------------编程问答-------------------- 好帖留名 --------------------编程问答-------------------- 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求
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
--------------------编程问答-------------------- 我怎么觉得struts只有拦截有点儿用 其他我都不太想用啊。。。 --------------------编程问答-------------------- 拦截器。。。就是filter。。它会在servlet执行之前被执行,
看一下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> --------------------编程问答-------------------- Struts其实就是一种框架来的,也是JSP,只是它用一些配置文件(也就是映射吧)来包装,使之运行更快,方便开发 --------------------编程问答-------------------- 09年的帖子还不结? --------------------编程问答-------------------- 楼主,管理员喊你快结贴

让我们来仔细分析下这句话:
1.其中的帖子,就是大家看到的东西,相当于页面,也就是mvc中的v
2.管理员的角色,是负责喊,喊什么,要根据楼主的行为来决定,在这个案例中,由于楼主长时间不结贴,所以管理员必须提醒你,及时结贴,可以看作是连接楼主和帖子的纽带,相当于sevelet,mvc中的c
3.楼主,负责及时处理管理员的要求,只要你结了贴,管理员就会马上知道,然后告诉这个帖子,楼主结贴了,你赶紧变身~~~,mvc中的m
4.struts,其实就是楼主+管理员+帖子的结合体。
但是很明显,楼主没有及时响应管理员的要求,所以,楼主不是一个合格的楼主,鉴定完毕! --------------------编程问答-------------------- 这贴 重出 江湖 了》。。。。。。 --------------------编程问答-------------------- 说一句话吧:
其实struts2就是解决了视图和请求分离的问题,记住这句话
当然顺序先filter,进struts.xml,根据xml配置进入不同的action,action调用业务逻辑。将结果返回到struts.xml,根绝xml文件result配置,派发到不同的视图。 --------------------编程问答-------------------- 我是菜鸟,是来学习的。很有收获

--------------------编程问答-------------------- 我本想深入了解一下struts2的工作原理的,才搜索至此,结果发现大家讲的也都是流程。我也来说说自己的理解吧。
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的其它功能也有很多特色。这里就不敢班门弄斧了。
以上只代表自己蹩脚的理解,拿出来讨论一下。
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,