Struts2学习
在公司每天都是望着公司项目源码发呆
使用struts2框架时,需要两个配置文件,分别为web.xml和struts.xml,服务器一启动就加载web.xml的配置,web.xml启动时,在StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作;struts2读取到struts.xml后,以javabean形式存放到内存中,以后struts2对用户的每次请求处理将使用内存中的数据,而不是每次都读取struts.xml文件
访问流程:
(1)客户端提交请求
(2)请求被提交到一系列过滤器(先ActionContentCleanUp.然后其他过滤器,最后FilterDispatcher)
(3)FiiterDispatcher咨询ActionMapper是否需要调用某个Action来处理这个请求,若ActionMapper决定调用某个Action,FilterDispatcher则把请求的处理交给ActionProxy
(4)ActionProxy通过Configuration Manager (struts.xml)询问框架的配置文件,找到需要调用的Action类
(5)ActionProxy创建一个ActionInvocation实例,同时ActionInvocation通过代理模式调用Action,但在调用之前,ActionInvocation会根据配置加载Action相关的所有Interceptor(拦截器)
(6)一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果result
OGNL
概念:Object Graph Navigation Language,是表达式语言,Struts2默认采用ONGL表达式访问Action的数据,实际上是通过ValueStack对象来访问Action
用法:OGNL表达式要结合Struts2标签来访问数据
EL:${user.userName} == OGNL:<s:property value="user.userName">
访问基本属性 <s:property value="属性名"/>
访问实体对象 <s:property value="对象名.属性名"/>
访问数组/集合 <s:property value="someArray[1]"/> | <s:property value="someList[1]"/>
访问Map <s:property value="someMap.key" />
运算 <s:property value="'My name is' + name" />
调用方法 <s:property value="name.toUpperCase()" />
创建集合 <s:property value="{'a','b','c'}" /> ArrayList
创建Map <s:property value="#{'mm':'MM','nn':'NN'}" /> LinkedHashMap
ValueStack
概念:是Struts2中,Action向页面传递数据的媒介,封装了Action数据,并允许JSP通过PGNL来对其访问
原理:
访问ValueStack
通过<s:debug>观察其结构
输出栈顶:<s:property />
访问Context对象:
OGNL表达式以“#”开头
以key来访问context对象的值,即“#key”得到context中的属性值
迭代集合
按数字迭代
Action基本原理
核心组件
FC:前端控制器,负责统一的分发请求
Action:业务控制器,负责处理某一类业务
ValueStack:Action与JSP数据交互的媒介
interceptor:拦截器,负责扩展Action,处理Action的共通事务
Result:负责输出的组件
Tags:标签,负责显示数据,生成框体
2.获取Session的方式
a)ActionContext
- ActionContext.getContext().getSesion(),返回Map<String, Object>
b)ServletActionContext
- ServletActionContext.getRequest().getSession(),返回HttpSession
c)SessionAware(推荐使用)
- 让Action实现SessionAware接口
- 实现setSession(Map<String, Object> session)方法,Struts2会在实例化Action后调用方法,通过方法参数将Session对象注入进来
- 定义成员变量,接收注入进来的Session对象
Result原理
介绍:用于做输出的组件,用于向页面输出一些内容,转发,重定向可以理解为特殊方式的输出,每一个Result实际上是一个类,这些类都实现了共同接口Result,Strust2预置了10种类型的Result,定义在strutsdefault.xml
Result类型
a)dispatcher:用于转发的result,可以将请求转发给JSP,这种类型的Result对应的类为ServletDispacherResult,通过default="true"指定该Result为Struts2默认的Result类型。
b)stream:用于向页面输出二进制数据,此种类型的Result可以将二进制数据输出到请求发起端,对应类为StreamResult
c)redirectAction:用于将请求重定向给另外一个Action,对应类ServletActionRedirectResult
d)json:用于向页面输出json格式的数据,可以将json字符串输出到请求发起端。对应类为JSONResult
UI标签
1.表单 <s:form action="" method="" theme="simple" ></s:form>
2.文本框 <s:textfield name="userName" />
3.布尔框 <s:checkbox name="marry" />
4.单选框 <s:radio name="sex" list="#{'M':'男','F':'女'}"/> 静态初始化
<s:radio name="favoriteCities" list="cities" listKey="cityCode" listValue="cityName" /> 动态初始化
5.多选框 <s:checkboxlist name="travelCities" list="#{'01':'北京','02':'上海','03':'广州'}" /> 静态初始化
<s:checkboxlist name="travelCities" list="cities" listKey="cityCode" listValue="cityName" /> 动态初始化
6.下拉选 <s:select name="home" list="#{'01':'北京','02':'上海','03':'广州'}" /> 静态初始化
<s:select name="home" list="cities" listKey="cityCode" listValue="cityName" /> 动态初始化
拦截器
用途:拦截器适合封装一些通用处理,便于重复利用。例如请求参数传递给Action属性,日志记录,权限检查,事务处理,拦截器通过配置方式调用,方法灵活,便于维护和拓展