详细剖析struts(转)

MVC模式
M:Model---模型
封装应用程序状态
响应状态查询
应用程序功能
通知视图改变

由实现业务逻辑的JavaBean或EJB组件构成

=============================================================

v:View---视图
解释模型
模型更新请求
发送用户输入给控制器
允许控制器选择视图

有一组JSP文件组成

=============================================================

C:Controller----控制器
定义应用程序行为
用户动作映射成模型更新
选择响应的视图

由ActionServlet和Action来实现.

=============================================================

Control:在Struts中,承担MVC中Controller角色的是一个Servlet,叫ActionServlet。ActionServlet是一个通用的控制组件。这个控制组件提供了处理所有发送到Struts的HTTP请求的入口点。它截取和分发这些请求到相应的动作类(这些动作类都是Action类的子类)。另外控制组件也负责用相应的请求参数填充 Action From(通常称之为FromBean),并传给动作类(通常称之为ActionBean)。动作类实现核心商业逻辑,它可以访问java bean 或调用EJB。最后动作类把控制权传给后续的JSP 文件,后者生成视图。所有这些控制逻辑利用Struts-config.xml文件来配置。

View:主要由JSP生成页面完成视图,Struts提供丰富的JSP 标签库: HtmlBeanLogicTemplate等,这有利于分开表现逻辑和程序逻辑。

Model:模型以一个或多个java bean的形式存在。这些bean分为三类:Action FormJavaBean or EJB。Action Form通常称之为FormBean,封装了来自于Client的用户请求信息,如表单信息。Action通常称之为ActionBean,获取从ActionSevlet传来的FormBean,取出FormBean中的相关信息,并做出相关的处理,一般是调用Java Bean或EJB等.

=============================================================

流程:在Struts中,用户的请求一般以*.do作为请求服务名,所有的*.do请求均被指向ActionSevlet,ActionSevlet根据Struts-config.xml中的配置信息,将用户请求封装成一个指定名称的FormBean并将此FormBean传至指定名称的ActionBean由ActionBean完成相应的业务操作,如文件操作,数据库操作等。每一个*.do均有对应的FormBean名称和ActionBean名称,这些在Struts-config.xml中配置。

Struts响应请求的基本流程
1.view发起一个请求
2.ActionServlet接受这个请求,它根据Struts-config.xml文件来得到处理这个请求的Action对象,并将请求发送给这个Action对象。
3.Action对象接受这个请求,并调用model去处理这个请求,并将处理结果返回给ActionServlet。
4.ActionServlet根据Action 的返回结果中的信息,决定将处理结果返回给对应的view。
5.view得到处理结果,并将他显示给用户。

=============================================================

对于Struts 如何控制、处理客户请求,让我们通过对struts的四个核心组件介绍来具体说明。这几个组件就是:ActionServlet、Action Classes、Action Mapping(此处包括ActionForward)、ActionFrom Bean

ActionServlet
1.ActionServlet继承自javax.servlet.http.HttpServlet类,其在Struts framework中扮演的角色是控制器。控制器ActionServlet主要负责将客户的HTTP请求信息组装后,根据配置文件的指定描述,转发到适当的处理器。 按照Servelt的标准,所有得Servlet必须在web配置文件(web.xml)声明。同样,ActionServlet必须在Web Application配置文件(web.xml)中描述。
2.当用户向服务器端提交请求的时候,实际上信息是首先发送到控制器ActionServlet,一旦控制器获得了请求,其就会将请求信息传交给一些辅助类(help classes)处理。这些辅助类知道如何去处理与请求信息所对应的业务操作。在Struts中,这个辅助类就是org.apache.struts.action.Action。通常开发者需要自己继承Aciton类,从而实现自己的Action实例。

Struts Action Classes
1.Action类所作的工作,正如它的名称一样,就是具体的业务操作。
Action类中最为常用的是execute()方法。
2.当Controller收到客户的请求的时候,就会将请求转移到一个Action实例,然后会调用这个Action实例的execute()方法。Struts Framework为应用系统中的每一个Action类只创建一个实例。所有的用户都使用这一个实例, Action 类运行在一个多线程的环境中
3.注意,客户自己继承的Action子类,必须重写execute()方法
因为Action类在默认情况下是返回null的。

Struts Action Mapping
上面讲到了一个客户请求是如何被控制器转发和处理的,但是,控制器如何知道什么样的信息转发到什么样的Action类呢?这就需要一些与动作和请求信息相对应的映射配置说明。在struts 中,这些配置映射信息是存储在特定的XML文件(struts-config.xml)。
<action-mappings>
<action path="/logonAction"
           type="com.test.LogonAction"
           name="LogonForm"
           scope="request"
           input="logoncheck.jsp"
validate=“true">
<forward name="welcome" path="/welcome.jsp"/>
<forward name=" error " path="/logon_failure.jsp "/>
</action>
</action-mappings>

这些配置信息在系统启动的时候被读入内存,供struts framework在运行期间使用。在内存中,每一个<action>元素都与org.apache.struts.action.ActionMapping类的一个实例对应。
注:
Path:这个属性用来和JSP页面中,调用<html:form>时的action属性相对应,它将JSP页面和处理这个JSP页面的Action对象对应起来。
Type: 对应的Action子类的完整类名。
Name: 对应的ActionForm的名称。他与下面将描述的<form-bean>元素的name属性相应。
Scope:这个属性表示相对应的ActionForm bean 的scope属性。它的值可以是 “request”、“session” 。分别对应java bean的 “request”、“session” 属性。
Input:这个属性表示如果对应的ActionForm的validate方法返回值的ActionErrors非空,即ActionForm的属性没有通过校验,则跳转到当前的页面。
Validate: 是否调用FormBean的validate()方法来验证,关闭它之后就不会报出错误信
息了。True表示需要调用validate方法;false表示不需要调用validate方法。
forward:定义可能的跳转路径。Name属性表示Action类的execute方法中,生成的返回结果时的参数;path表示将要跳转到的页面的路径。
<form-beans>
<form-bean name="LoginForm"   type="com.test.LoginForm"/>
</form-beans>
上面的配置表示:当可以通过/logonAction.do提交请求信息的时候,控制器将信息委托com.test.LogonAction处理。调用LogonAction实例的execute()方法。同时将Mapping实例和所对应的LogonForm Bean信息传入。



global-forwards
其在配置文件中描述了整个应用系统可以使用的ActionForward,而不是仅仅是一个特定的Action。目的是控制器将Action类的处理结果转发至目的地
<global-forwards>元素用来表示全局的跳转页面。和<action>元素一样,他有无数个<forward>元素。当一个Action对象的execute方法执行完毕以后,如果他返回的ActionForward对象没有在这个<action>元素的<forward>子元素中有对应值的话,他将要查找<global-forwards>中的<forward>元素,并跳转到相应页面。

<global-forwards>
    <forward name="logout" path="/logout.do"/>
<forward name="error" path="/error.jsp"/>
</global-forwards>
<message-resource>

Struts采用属性文件来保存应用程序的信息,那么,Struts如何知道属性文件的路径呢,也在struts-config.xml文件来配置:
<message-resource>元素用来表示ApplicationResources.properties文件的位置。这个元素有一个属性――parameter,这个属性用来表示ApplicationResources.properties文件的存放地点,但有意思的是,他是用一个类名来来表示存放路径的。比如“com. ApplicationResources”是表示存放在WEB-INF/classes / com 路径下面的ApplicationResources.properties文件。
注意:以上所述的这些元素在struts-config.xml文件中的位置也是有先后顺序的。它们的顺序是:
<form-beans/>
< global-forwards/ >
<action-mappings/>
<action/>
< message-resources/>

Struts ActionForm Bean
在上面讲解ActionServlet,Action Classes和Action Mapping的时候,我们都提到了ActionForm Bean的概念。ActionForm的主要功能就是为Action的操作提供提交表单相映射的数据。
对于每一个客户请求,Struts framework在处理ActionForm的时候,一般需要经历如下几个步骤:
(1)检查Action的映射,确定Action中已经配置了对ActionForm的映射
(2)根据name属性,查找form bean的配置信息
(3)检查Action的formbean的使用范围,确定在此范围下,是否已经有此form bean的实例。
(4)假如当前范围下,已经存在了此form bean的实例,而是对当前请求来说,是同一种类型的话,那么就重用。
(5)否则,就重新构建一个form bean的实例
(6)form bean的reset()方法 被调用
将form bean 的实例邦定到request或者session作用域之上
(7)调用对应的setter方法,对状态属性赋值
(8)如果的属性北设置为true,那么就调用form bean的validate()方法。

=============================================================

Struts配置
Struts应用采用两个基于xml的配置文件来配置应用:
Web.xml
Struts-config.xml

Web.xml 配置ActionServlet
<servlet>            //声明ActionServlet
<servlet-name>action</servlet-name>
<servlet-class> org.apache.struts.action.ActionServlet </servlet-class>
<init-param>   //声明初始化参数
   <param-name>config</param-name>
   <param-value>/WEB-INF/struts-config.xml
   </param-value>
······
</servlet>

Web.xml 配置文件
//指定ActionServlet可以处理的URL
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servelt-mapping>
//指定struts使用的标签库
<taglib>
   <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
   <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib> ·······

struts配置文件-Struts-config.xml
Struts框架在启动时会读入其配置文件,根据它来创建和配置各种struts组件。
配置文件使得开发者可以灵活的组装和配置各个组件,提高了应用软件的可扩展性和灵活性,避免硬编码。

<struts-config>元素
<struts-config>元素是struts配置文件的根元素。
<data-sources>元素用来配置数据源。
<form-beans>元素用来配置多个ActionForm Bean。
<global-exceptions>元素用于配置异常处理。
<global-forwards>元素用来声明全局的转发关系。
<action-mappings>元素包含零或多个<action>元素
<controller>元素用于配置ActionServlet(多个子应用)
<message-resources>元素用来配置Resource Bundle。
<plug-in>元素用于配置struts插件。

struts-config.xml配置文件
<data-sources >
    <data-source key="org.apache.struts.action.DATA_SOURCE">
      <set-property property="password" value="sa" />
      <set-property property="minCount" value="5" />
      <set-property property="maxCount" value="20" />
      <set-property property="user" value="sa" />
      <set-property property="driverClass" value="com.microsoft.jdbc.sqlserver.SQLServerDriver" />
      <set-property property="description" value="qulx" />
      <set-property property="url" value="jdbc:microsoft:sqlserver://localhost:1433;databasename=pubs" />
      <set-property property="readOnly" value="false" />
      <set-property property="autoCommit" value="true" />
      <set-property property="loginTimeout" value="5000" />
    </data-source>
</data-sources>

struts-config.xml配置文件
<!--=========Form Bean Definitions=====-->
<form-beans>
   <form-bean name = “HelloForm”           // 页面中表单对应的Bean存储表单数据, 验证
         type = “hello.HelloForm”   // FormBean 对应的包名.类名      
/> </form-beans>
<global-forwards>
        <forward name = “SayHello“//全局转发的名字 , 此项必须有
path="/jsp3.jsp“ // 指向转发或重定向的URI. 此项是必需的, 必须以"/"开头.
        redirect =“true”
contextRelative=“fasle”
/>
</global-forwards>
<action-mapping>
   <action path     = “/helloworld”          // 请求访问Action的路径, 必须以“/”开头         
    type     = “hello.HelloAction”   // Action的完整类名           
    name    = “HelloForm”            // 要传给Action 的ActionForm Bean
    scope   = “request”            // ActionForm Bean 的存放范围
    validate= “true”                     // 是否执行表单验证
    input     = “/hello.jsp”             // 当表单验证失败时转发的路径, 必须以“/”开头
/>
<forward name = “SayHello”       // 键值用于标识此forward           
path = “/hello.jsp”/>      // 请求转发的路径, 必须以“/”开头
</action>      
</action-mapping>
<message-resource    parameter = "hello.application"
   // 指定使用的消息资源文件      
// hello.application 表明
       // 消息资源文件名为"application.properties"
       // 存放路径为
         // WEB-INF/classes/hello/application.properties
/>
</struts-config>

mvc模式图:

JSP Model-1

 

JSP Model-2:

 

表单Bean的配置
1.分类:
静态变淡Bean           动态表单Bean          已存在表单Bean

表单Bean
1.       静态表单Bean:每个Bean类都是实际存在的java类文件
2.       动态表单Bean
a)         struts-config.xml中配置的一个虚拟的Bean
b)        所有要捕获的参数在struts-config.xml中以属性方式配置
3.       属性规则
Jsp文件上表单参数的名称,必须与动态FormBean上属性的名称相同

2.表单Bean在struts-config.xml中的配置
          每个表单Bean都会在struts-config.xml中有自己的配置
          <form-bean name="表单Bean别名" type="表单Bean物理路径" />
EG:
<form-beans >
    <form-bean name="loginForm" type="com.hygj.furong.struts.form.LoginForm" />
</form-beans>

ActionForm 中 Validate()方法:
1.实现客户端输入信息的基本语法和格式的验证
2.前期在客户期用js实现的各种验证效果,都可以在此java代码实现
3.不能执行输入信息的有效性验证

reset()方法:
实现变量信息的功能的初始化操作。

执行顺序:
reset()---->set()---->validate()

规则:
1.变量名必须与jsp上表单的参数同名。
2.jsp上的form参数,必须遵守java变量命名规范
3.actionForm必须遵守javaBean规范

Action在struts中的配置
作用:实现控制层处理的对象
           接收表单Bean,传递Bean类,接收返回值,实现转发
actoin在struts-config.xml中的配置
         每个actionServlet都会在struts-config.xml中有自己的配置
<action-mappings >
    <action
      attribute="表单Bean在作用域中的属性名称"
      input="Error Page Path"
      name="所调用的表单Bean的别名"
      path="action的调用路径"
      scope="表单Bean的作用域---request或者session"
      type="action的物理路径"
       validate="是否执行表单Bean中的validate方法----true/false" >
<forward name="转发页面调用别名" path="转发页面的物理路径"></forward>----转发页面配置
      </action>
</action-mappings>

EG:
<action-mappings >
    <action
      attribute="loginForm"
      input="/error.jsp"
      name="loginForm"
      path="/login"
      scope="request"
      type="com.hygj.furong.struts.action.LoginAction" >
<forward name="suc" path="/login_success.jsp"></forward>
   <forward name="fal" path="/login_failure.jsp"></forward>
      </action>
</action-mappings>

转发在struts中的配置
1.action实现数据处理后,以转发的机制实现结果的显示
2.转发:
局部转发:当前actoin可调用的页面
全局转发:所有action可调用的页面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值