一.什么是Struts2框架
是一个基于MVC设计模式的web应用框架,相当于一个servlet,相当于MVC中的C层(controller)。它的前身是webwork,控制器应用框架,可以优化对C层的操作。
二.Struts2框架的工作流程
1.流程图我是从百度百科截图截下来的,如下:
2.Struts2工作流程如下:(注:在请求之前,首次访问页面时会先执行一次web.xml文件,去找到核心控制器StrutsPrepareAndExecuteFilter的源文件)
(1) 接收请求后,web容器将请求传递给ActionContextCleanUp过滤链,保证后面的过滤器的执行,然后再经过其他过滤器处理后,将请求传递到核心控制器FilterDispatcher(StrutsPrepareAndExecuteFilter)。
(2) StrutsPrepareAndExecuteFilter调用ActionMapper来确定请求是哪个action,然后再将控制权委派给ActionProxy代理。
(3)ActionProxy调用配置管理器ConfigurationManager从配置文件struts.xml中读取配置信息,然后创建ActionInvocation对象。
(4) ActionInvocation在调用action之前会依次调用拦截器链,然后执行action,返回结果字符串,ActionInvocation会根据结果字符串查找对应的Result。
(5)Result会调用视图显示,在给客户端响应之前,会执行相反顺序的拦截器链,最后通过服务器响应将视图发送到客户端。
三.Struts2框架配置(以一个小例子为列)
1.下载Struts2框架:
下载地址为:http://struts.apache.org/download.cgi,2.3版本与2.5版本有一定区别,2.5版本将xwork包封装到了struts2包中,并且2.5中的部分包名与2.3版本有区别。
2.引入jar文件到WEB-INF下的lib文件夹下,常用包如下:
3.新建3个JSP页面:index.jsp,success.jsp(正确界面),error.jsp(错误界面)
index.jsp如下:
4.在当前web项目的web.xml中配置核心控制器
5.编写action类
如下:
6.在struts.xml中配置action,action必须在package中
注:
(1)Struts常量:用于改变Struts2框架默认行为(如:改变编码),可以定义在如下三个文件中:
struts.xml,struts.properties,web.xml
加载的顺序:从左到右
覆盖的顺序:从右到左
a.在struts.xml中通过<constant name="常量属性名 " value="常量值 " />来配置常量。
b. 在src下创建struts.properties文件,在其中以属性名=值的形式存储常量,
如struts.i18n.encoding=UTF-8,设置struts的编码为UTF-8,默认值就是utf-8。
注:. properties文件:都是程序中使用的属性文件,在其中一般以键值对的形式存储数据,方便修改。
c.在web.xml中配置:
<init-param>
<param-name></param-name>
<param-value></param-value>
</init-param>
建议:在实际开发中不建议在web.xml中配置常量,如果常量较少可以在struts.xml中配置,如果常量较多一般都是选择直接在struts.properties文件中定义的方式。
(2)包:package,作为引用名来使用
<package name="default" namespace="/" extends="struts-default">
name:必须属性,指明被引用时的名称。extends:指定继承的其他包,可选属性。
namespace:可选的属性(命名空间)。
注:
namespace(命名空间):为了解决同名action问题,同一个命名空间中不可以出现同名action,namespace="/";表示默认命名空间。
命名空间的值将会影响用户访问数据时的映射地址(访问地址):
例如:
默认的namespace:http://ip地址:端口/web地址/user.action
namespace的值为:/one,则映射地址为:http://ip地址:端口/web地址/one/user.action。
另:命名空间错误会出现异常404(找不到路径)
Struts2搜索action的顺序:1.指定命名空间下的action 2.寻找默认命名空间下的action 3.未找到会出现异常
在struts.xml中引用其他xml文件:<include file="xml文件地址 "/>(将其他xml文件的内容引入到struts.xml中)。