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的页面都已经准备好了。