struts-helloapp学习小记

来源:互联网 发布:读屏软件 编辑:程序博客网 时间:2024/05/19 19:59

<html:errors>:用于显示Struts框架中其他组件产生的错误消息。

<html:form>:用于创建HTML表单,它能够把HTML表单的字段和ActionForm Bean的属性关联起来。

<html:text>:该标签是<html:form>的子标签,用于创建HTML表单的文本框。它和ActionForm Bean的属性相关联。

<bean:message>:用于输出本地化的文本内容,它的key属性指定消息key,和消息key匹配的文本内容来自于专门的Resource Bundle

<bean:write>:用于输出JavaBean的属性值。本例中,它用于输出personbean对象的userName属性值:<bean:write name="personbean" property="userName" />

<logic:present>标签用来判断JavaBean在特定的范围内是否存在,只有当JavaBean存在,才会执行标签主体中的内容。


控制器组件包括ActionServlet类和Action类。ActionServlet类是Struts框架自带的,它是整个Struts框架的控制枢纽,通常不需要扩展。Struts框架提供了可供扩展的Action类,它用来处理特定的HTTP请求。


当用户提交了HTML表单,Struts框架自动把表单数据组装到ActionForm Bean中。ActionForm Bean中的属性和HTML表单中的字段一一对应。接下来Struts框架会自动调用ActionForm Bean的validate()方法进行表单验证。如果validate()方法返回的ActionErrors 对象为null,或者不包含任何ActionMessage对象,就表示没有错误,数据验证通过。如果ActionErrors中包含ActionMessage对象,就表示发生了验证错误,Struts框架会把ActionErrors对象保存到request范围内,然后把请求转发到恰当的视图组件,视图组件通过<html:errors>标签把request范围内的ActionErrors对象中包含的错误消息显示出来,提示用户修改错误。

Action类的工作机制:当ActionForm Bean被创建,并且表单验证顺利通过后, Struts框架就会调用Action类的execute()方法。execute()方法包含以下参数:

ActionMapping:包含了这个Action的配置信息,和struts-config.xml文件中的<action>元素对应。

ActionForm:包含了用户的表单数据,当Struts框架调用execute()方法时,ActionForm中的数据已经通过了表单验证。

HttpServletRequest:当前的HTTP请求对象

HttpServletResponse:当前的HTTP响应对象

Action类的execute()方法返回ActionForward对象,它包含了请求转发路径信息。


当HelloAction类调用HttpServletRequest的setAttribute()方法,向hello.jsp传递PersonBean对象时,需要提供一个名为"personbean"的属性key:

request.setAttribute("personbean",pb);

hello.jsp通过这个名为"personbean"的属性key来读取PersonBean对象:

<logic:present name="personbean" scope="request">

 <h2>

       Hello <bean:write name="personbean" property="userName" />!<p>

 </h2>

</logic:present>


 


<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" path="/hello.jsp" /> //定义了一个请求转发路径

</action>

本例中的<action>元素配置了HelloAction组件,对应的类为hello.HelloAction,请求访问路径为"HelloWorld",当Action类被调用时,Struts框架应该把已经包含表单数据的HelloForm Bean传给它。HelloForm Bean存放在request范围内,并且在调用Action类之前,应该进行表单验证。如果表单验证失败,请求将被转发到接收用户输入的网页hello.jsp,让用户纠正错误。

Struts工作机制

Java的Servlets是用来处理Web浏览器的请求的,而JSP是用来建立动态网页,使得网站成为活动的应用的。Struts使用了一个特殊的Servlet作为交换器,将Web浏览器的请求导向到适合的JSP页面去。这使得Web应用的设计,创建和维护更加容易。

以下是Struts的一些详细的机制和对其他技术的依赖:

  • 你开发的web应用必须要写一个发布描述文件(WEB-INF/web.xml),这个文件描述了你的web应用的配置,包括欢迎页(当web请求是一个目录而没有指明具体的文件时,服务器显示的文件),servlet的映象(路径和扩展名)和这些servlet的参数。
    在这个文件中,你将Struts的ActionServlet配置为处理所有映象(通常的扩展名为.do)的请求的servlet。这就是上面提到的交换器。
    在这个文件中,你为Struts本身设置ActionServlet使用一个或多个配置文件。
    本文档中,假设我们把web应用安装在服务器的/myapp目录下,并从那里使用最为简单的配置。
    如果你需要发布描述文件的详细信息,请阅读Servlet Specification,它可以从Sun Microsystem的Java网站上得到。
  • 在Struts的配置文件中,你将路径信息和你的应用中的控制组件相关联,这些控制组件为Action类(例如:“login”——>LoginAction类)。这就告诉Struts的ActionServet当收到的请求为:http://myhost/myapp/login.do的时候,它应该调用你的LoginAction控制组件。
    注意在URL中的.do扩展名,这个扩展名使得你的Servlet容器(例如Tomcat)调用ActionServlet,ActionServlet知道这个单词“login”就是你需要做的事情。然后从配置文件中查找对应的Action类,于是你的LoginAction将会被执行。
  • 对于每一个Action类,你也要为Struts配置结果页面的名字,这些结果页面是该Action类执行的结果。一个Action可能会有多个执行结果的视图(通常,至少有两个:一个为成功的,一个为失败的)。
    你的Action(你写的控制组件)是基于这些逻辑结果页面的名称的。这些名称会返回到ActionServlet类去,使用诸如“success”,“failure”,“ready”,“ok”,“UserIsIncompetent”一类的名称。Struts系统(通过你写的配置)知道怎样找到适合的指定页面。这就使得通过简单的编辑Struts的XML配置文件,就能重新配置视图层。
    在这一点上,Struts知道怎样代表你的控制组件,显示你的控制组件运行的结果。应用程序的模式层则完全取决于你,它会在你的控制组件中被调用。
  • 你也可以在Struts的配置文件中,将Java Bean作为一个Action(或者一系列Action)。Java Bean被作为表单或者显示数据的容器,这些数据可以在视图层和控制层中交流。
    这些Bean能被你的控制组件(例如LoginAction)和任何与该控制组件联系的视图页面自动的看到。
    这些Bean也能在Struts系统的帮助下被验证,保证用户在表单中录入了正确的数据。它们能置入session中,使得表单能用多个视图页面来表示,以及在控制层表单能被多个Action处理。
    注意:你必须在视图层(将会在客户端显示的)使用服务器端的技术(JSP,Velocity,XSLT)去得到这些数据。(纯HTML是没办法得到的)。Struts在服务器上工作,所以客户能看到的视图必须也在服务器端被合成。
    客户通过正常的表单提交(POST/GET)来反馈数据,Struts系统则在调用你的控制组件之前,更新在Bean中的这些数据。
    在你的web应用中,页面将会代表用户看到的视图。这些页面可以是JSP页面,Velocity模板,XSLT页面等等。一系列JSP标记同Struts一同发布,因此你能马上开始。但是你仍然可以在Struts中使用任何标准的展示技术。
    就算纯HTML文件也能在你的Struts应用中使用,尽管他们不能使用动态技术的任何好处。
    下面是Struts的JSP标记的例子,你也可以获得其他一些包使得Struts框架在你喜欢的展示技术中更加容易使用。在Velocity模板中,Velocity ViewTools支持Struts。如果你想使用XSLT,你能在stxx和StrutsCX中选择。
    这些包使得标准的Struts框架元素看上去或者感觉上去像是这些展示技术无缝的一部分。Struts也使得它容易跟其他技术混合和结合。如果需要,你可以在同一个应用程序中一起使用JSP,Velocity模板和XSLT。
    因为Struts是基于标准的Servlet技术,你应该能和Struts一起使用任何Java展示技术。
  • Struts框架主要集中在控制器,而展示层也是应用程序相当重要的一部分。Struts的JSP标记包括了一些通用和Struts专用的标记,它们能帮助你在你的视图中使用动态的数据。
    定制的JSP标记是Struts代码基础中很大的一部分。注意到在版本1.1b3中,Struts内核的Java代码大概有28,000行,而这些标记(包括tiles)的Java代码大概是41,000行是非常有意义的。
    这些标记能使你将你的视图层与控制层结合在一起,而不用在JSP页面中嵌入很多的Java代码。这使得页面看上去象XML,这就能比纯JSP更加容易的被web页面设计者处理。它同时也能减少在控制层和视图层之间的依赖关系。
    定制标记被用来建立表单(隐式的与前面提到的Bean相互作用),逻辑地转向到其他页面,调用web应用的其他Action。
    这些标记也能帮你进行国际化,错误信息处理等等。
    所有这些能力都是在一定程度上依赖于你提供给Struts的配置文件的。

当ActionServlet处理web请求的时候,所有在这里描述的机制才是有效的,请记住这点,这是很重要的。

因为仅当一个请求提交时,你的容器(例如,Tomcat,WebShpere等)调用ActionServlet,所有这些才会发生。你必须保证通过一个将会映象到ActionServlet的请求(例如,有一个.do的扩展名)得到的任何依赖于Struts的页面都已经准备好了。

原创粉丝点击