Struts开始于年月是采用Java Servlet/JavaServer Pages技术开发Web应用程序的开放源码的框架当前最新的正式版本是本文内容就是针对这个版本的采用Struts能开发出基于MVC(ModelViewController)设计模式的Java Web前端应用通常MVC设计模式把一个系统划分为相互协作的三个部分
Model(模型)模型用于封装系统的状态比如业务数据
View(视图)视图是模型的表示提供用户交互界面当模型状态发生变化时视图应该得到通知以便更新模型的变化
Controller(控制器)接受来自视图的请求修改模型的状态
但是在基于JSP/Servlet的Web应用中要使用MVC模式需要解决这样一个问题就是HTTP的底层是TCP/IP协议而TCP/IP是一种无状态连接的协议如果我们的模型发生了变化就无从通知视图而Struts采用了在JSP规范v中就提出的MVC Model 这是对MVC在Web上应用的修订版它可以解决这个问题见图
图 MVC Model(FromMalcolm Davis)
图 Sturts工作机理(From Malcolm Davis)
Struts应用有个主要部件一个是使用Servlet实现的中心控制器(Controller Servlet由Struts提供的orgapacheaction ActionServlet类实现)及负责具体业务逻辑处理的Action(orgapacheactionAction的子类)一个是用于显示的JSP页面(viewer)另一个是用于封装系统状态的业务逻辑元件(Model)Struts 的中心控制器接受所有来自客户端的请求并根据系统的配置(strutsconfigxml)路由HTTP请求到其它Action对象(开发者实现的orgapachestruts actionAction的子类)在这些Action对象中会完成所有的业务操作比如插入一条订单修改一条记录等处理完毕由Struts的Controller Servlet根据配置转向到适当的JSP页面将处理结果显示给用户从这里可以看出在Struts中Controller Servlet担任了重要的角色它控制所有的程序流转使MVC三个相对独立的部分协调工作从而使系统的功能更加完善从图可见Struts是MVC Model 的一个典型应用
安装
你可以从struts/release/下载Struts最新的二进制版本和源码首先进入v下载页面下载jakartastrutszip(MB)然后将jakartastrutszip解压其中包含lib和webapps两个子目录lib子目录中是使用Struts需要的Jar文件标签库定义文件(tld)以及对一个Struts Web应用的webxml和strutsconfigxml配置文件的DTD定义(dtd)webapps子目录中包含了几个Struts的示例应用都已打包为war格式这里主要介绍其中三个
strutsexamplewar一个采用Struts框架的简单的示例程序Controller
strutsdocumentationwarStruts文档的war包
strutsblankwar一个空白的Struts的应用可以方便地修改并且配置自己的应用
下面运行strutsexample这个示例程序因为Struts是一个Web应用所以要运行这个示例需要一个兼容Servlet JSP 以上规范的Web容器本文以Tomcat a(对Tomcat 也适用)为例进行介绍首先保证Tomcat可以正常运行而运行struts example不需要其它特殊配置的只要把strutsexamplewar拷入Tomcat下的webapps目录Tomcat在启动时就会自动解压了然后启动Tomcat在浏览器中输//localhost:/strutsexample如果能看到如图页面就说明已经运行成功
在图中你可以点击Register with the MailReader Demonstration Application注册一个MailReader用户或直接点击Log on to the MailReader Demonstration Application输入用户名和密码(示例程序已经预置了一个用户user/pass配置在strutsexample下的WEBINF\databasexml文件中)登入
分析
webxml
在图所示的页面中点击Log on to the MailReader Demonstration Application链接进入/logonjsp页面输入预定义的用户名为user密码为pass然后提交就进入了图的用户主页面
图 struts example主页面
图 用户主页面
大家可能已经注意到了这里的URL的后缀是do那么它有什么意义?服务器又是怎样处理这样的请求呢?下面我们看看{TOMCAT}\WEBINF\webxml文件就会非常清楚在webxml中你可以找到如下配置片断
action
*do
从上面配置代码中可以知道以do结尾的请求URL是由一个名为action的Servlet处理实际上可以为应用取另一个后缀只要修改就行了但下面所有的讨论都以do为例我们再看一下这个Servlet的配置
action
orgapachestrutsactionActionServlet
application
orgapachestrutswebappexampleApplicationResources
config
/WEBINF/strutsconfigxml
……
由此可见action对应的类是orgapachestrutsactionActionServlet这是一个Struts提供的处于中心控制地位的Servlet即图中的Controller Servlet正是用它监听所有的来自于用户的以do为后缀的请求在上面的配置中为ActionServlet配置了一个名为config的初始化参数值为 /WEBINF/strutsconfigxmlstrutsconfigxml是一个基于Struts应用的最重要的配置文件其中包含了所有的Action请求(指以do结尾的请求)相应的Action处理类Form Bean以及页面的转向等信息的配置strutsconfigxml在应用启动时读入然后根据这些配置进行响应下面以示例程序中的LogonAction的配置为例对strutsconfigxml进行分析
strutsconfigxml
下面是strutsconfigxml中对LogonAction进行配置的部分代码
path=/logon
type=orgapachestrutswebappexampleLogonAction
name=logonForm
scope=request
input=/logonjsp>
从上面可以看出MailReader应用中对/logondo的请求是由orgapachestrutswebappexample LogonAction类进行处理的name属性指定的是这个请求对应的表单
logonForm也是在strutsconfigxml中配置的配置代码为: