第1个回答 推荐于2018-02-18
这是我当初学习struts2的总结笔记Struts2
1 架构和核心技术
1·1 核心架构及控制流程
FC(Front)前端控制器,用一个过滤器写的
拦截请求;数据的初始化(ValueStack的建成,要访问的Action放在栈顶);启动控制层的调用
Valuestack
存储数据(一个专门设计的基于ognl的数据结构)
为其他组件提供数据共享的载体
Action
用于实现控制流程,本身置于ValueStack的Root栈的顶;
根据输入(用户的提交)计算输出(向用户显示的结果)
决定输出什么样的试图View
Result
把当前的ValueStack中得数据,转换为某种形式输出
Struts2提供了多种result(dispatcher,redirect,json,stream)
Interceptor
拦截Action的调用及Result的调用
可以在action调用之前,去做一些辅助性的工作;这些实现可以很方面的复用,比如说文件上传
拦截器的操作一般会涉及到ServletAPI及ValueStack
(ActionInvocation\ServletActionContext)
拦截器可以不调用后面的Action和Result,某种情况下可以决定选择Result,
(不调用invoke)由拦截器决定返回的Result
调用invokeActionOnly;只调用Action
调用invoke,就由Action决定返回的Result
控制流程
-->FC-->ValueStack,实例化Action,置于栈顶-->调用拦截器(before)-->调用Action-->调用Result
-->View输出-->调用拦截器(after)
1·2 核心技术
OGNL
一个表达式,用于实现对数据的存取(用一个字符串表达对数据的存取)是一种字符表达式规范,用于表示
对对象的属性的存取
name当前Root对象的name属性
arry[1]Root对象arry属性的第一个对象
list[2]同上
map['key']
emp.name
value>10
num1+num2
format(jireDate)调用当前栈顶的对象的方法和属性
empList.{salary}投影,取出当前对象的这个集合
#{'one':'java','two':'javajava'}
empList.{?#salary>10000}.{name}
ValueStack的基本机构
OGNL引擎
|________Root
|________Context
Action置于Root栈的栈顶
Context中的常用的key-value
request
session
application
struts2的配置文件
<package name="" namespace="" extends="">
<global-results>
<result name="" type=""></result>
</global-results>
<global-exception-mappings>
<exception-mapping result="" exception="">
</global-exception-mappings>
<interceptors>
<interceptor name="" class="">
<interceptor-stack name="">
<interceptor name=""/>
</interceptor-stack>
</interceptors>
<action name="" class="" method="">
<param name="">...</param>
<interceptor name="">
</interceptor>
<result name="" type="">
<param name="">...</param>
</result>
</action>
</package>
标记库
<s:property value="emp.name"/>
<s:property value="#session.token"/>
<s:property/>
<s:property value="[1].name"/>
<s:action name="" excuteResult="true" var="someAction"/>
<s:property value="#someAction.name"/>
<s:if test="page>1">
</s:if>
<s:else>
</s:else>
<s:iterator value="emplist" status="st">
<s:property value="#st.index"/>
<s:property value="name"/>
</s:iterator>
<s:url action="" includeParams="get/none"/>
<s:set value="ognl" scope="request" var="name"/>
<s:form action="" theme="">
<s:textfield name=""/>
<s:password name=""/>
<s:textarea name=""/>
<s:checkbox name=""/>
<s:checkboxList name="" listKey="value" listvalue="value"/>
<s:redio name=""/>
<s:select name=""/>
</s:form>本回答被网友采纳