![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
请你谈谈对struts2的理解
3个回答
展开全部
struts首先是MVC框架
MVC是一种设计模式
将应用程序分成了视图、模型、控制器三部分,使代码逻辑清晰,同时提高移植性
M与V之间--观察者模式
V与C之间--策略模式
MVC的工作流程
请求----控制器调用模型处理,返回数据-----控制器用相应的视图格式化模型返回的数据完成相应
Struts2在以上流程中解决了三个问题:
1. 控制器如何根据用户的请求决定调用哪个模型(具体是模型中的Action组件)进行处理
2. 如何在业务逻辑处理器与serv let API 分离的情况下使处理器获得请求参数,并得以执行
3. 如何将处理后返回的数据传给相应的视图生成动态网页响应给用户
结合Struts的请求流程加以说明
客户端请求----经三个过滤器(ActionContextCleanUp,其他过滤器,到FilterDispatcher核心控制器)
FilterDispatcher询问ActionMapper是否需要调用Action来处理,如果ActionMapper决定调用,FilterDispatcher就把对请求的处理交给了ActionProxy
ActionProxy通过Configuration Manager 询问框架的配置文件,找到需要调用的Action类
ActionProxy创建一个ActionInvocation实例,同时ActionInvocation通过代理模式调用Action,但在调用之前ActionInvocation会根据配置加载Action相关的拦截器,每执行完一个
拦截器,会调用invocation的invoke方法,把请求传给下个Interceptor,所有的Interceptor执行完以后,会执行Action
Action执行根据后,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果
这个返回结果可能是一个 需要表示为JSP或FreeMarker的模板,或者是另一个Action链
如果是前者,表示的过程中可以使用struts2的标签,生成动态网页后返回给用户
如果是后者,则再把上述过程执行一遍
MVC是一种设计模式
将应用程序分成了视图、模型、控制器三部分,使代码逻辑清晰,同时提高移植性
M与V之间--观察者模式
V与C之间--策略模式
MVC的工作流程
请求----控制器调用模型处理,返回数据-----控制器用相应的视图格式化模型返回的数据完成相应
Struts2在以上流程中解决了三个问题:
1. 控制器如何根据用户的请求决定调用哪个模型(具体是模型中的Action组件)进行处理
2. 如何在业务逻辑处理器与serv let API 分离的情况下使处理器获得请求参数,并得以执行
3. 如何将处理后返回的数据传给相应的视图生成动态网页响应给用户
结合Struts的请求流程加以说明
客户端请求----经三个过滤器(ActionContextCleanUp,其他过滤器,到FilterDispatcher核心控制器)
FilterDispatcher询问ActionMapper是否需要调用Action来处理,如果ActionMapper决定调用,FilterDispatcher就把对请求的处理交给了ActionProxy
ActionProxy通过Configuration Manager 询问框架的配置文件,找到需要调用的Action类
ActionProxy创建一个ActionInvocation实例,同时ActionInvocation通过代理模式调用Action,但在调用之前ActionInvocation会根据配置加载Action相关的拦截器,每执行完一个
拦截器,会调用invocation的invoke方法,把请求传给下个Interceptor,所有的Interceptor执行完以后,会执行Action
Action执行根据后,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果
这个返回结果可能是一个 需要表示为JSP或FreeMarker的模板,或者是另一个Action链
如果是前者,表示的过程中可以使用struts2的标签,生成动态网页后返回给用户
如果是后者,则再把上述过程执行一遍
推荐于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>
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>
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为struts2的Action就具备了struts1中ActionForm的功能;ActionForm的功能无非三个:初始化数据;封装数据;验证数据格式;对于struts2,都有相应的解决方式:通过Action实现Preparable接口,实现对数据初始化;Action继承ActionSupport,重写validate(),显示数据的验证,在Action中配置属性以及对应的getter和setter方法,实现数据封装。而且类型转换方面,struts2通过OGNL实现的效果要比ActionForm更灵活。
![](http://iknow-zhidao.bdimg.com/static/question-new/widget/value-comment/img/support_10.6efc748.gif?x-bce-process=image/format,f_auto/quality,q_80)
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询