作者:微信小助手
发布时间:2018-11-25T10:43:41
MVC模式:
web应用程序启动时
就会加载并初始化ActionServler。
用户提交表单时,
一个配置好的ActionForm对象被创建,
并被填入表单相应的数据,
ActionServler根据Struts-config.xml文件
配置好的设置决定是否需要表单验证,
如果需要就调用ActionForm的Validate()
验证后选择将请求发送到哪个Action,
如果Action不存在,
ActionServlet会先创建这个对象,
然后调用Action的execute()方法。
Execute()从ActionForm对象中获取数据,
完成业务逻辑,
返回一个ActionForward对象,
ActionServlet再把客户请求
转发给ActionForward对象指定的jsp组件,
ActionForward对象指定的jsp生
成动态的网页,返回给客户。
1、拦截器是基于java反射机制的,
而过滤器是基于函数回调的。
2、过滤器依赖于servlet容器,
而拦截器不依赖于servlet容器。
3、拦截器只能对Action请求起作用,
而过滤器则可以对几乎所有请求起作用。
4、拦截器可以访问Action上下文、
值栈里的对象,而过滤器不能。
5、在Action的生命周期中,
拦截器可以多次调用,
而过滤器只能在容器初始化时被调用一次。
1)Struts2框架的核心控制器是
StrutsPrepareAndExecuteFilter。
2)作用:
负责拦截由<url-pattern>/*</url-pattern>
指定的所有用户请求,
当用户请求到达时,
该Filter会过滤用户的请求。
默认情况下,
如果用户请求的路径
不带后缀或者后缀以.action结尾,
这时请求将被转入struts2框架处理,
否则struts2框架将略过该请求的处理。
可以通过常量"struts.action.extension"修改action的后缀,
如:
<constant name="struts.action.extension" value="do"/>
如果用户需要指定多个请求后缀,
则多个后缀之间以英文逗号(,)隔开。
<constant name="struts.action.extension" value="do,go"/>
方案一:
HttpServletRequest request =
ServletActionContext.getRequest();
HttpServletResponse response =
ServletActionContext.getResponse();
HttpSession session=
request.getSession();
ServletContext servletContext=
ServletActionContext.getServletContext();
方案二:
类 implements ServletRequestAware,ServletResponseAware,SessionAware,ServletContextAware
注意:框架自动传入对应的域对象
1)ActionContext是当前的Action的上下文环境,
通过ActionContext可以
获取到request、session、ServletContext等
与Action有关的对象的引用;
2)ServletContext是域对象,
一个web应用中只有一个ServletContext,
生命周期伴随整个web应用;
3)pageContext是JSP中的最重要的一个内置对象,
可以通过pageContext获取其他域对象的应用,
同时它是一个域对象,
作用范围只针对当前页面,
当前页面结束时,
pageContext销毁,
生命周期是JSP四个域对象中最小的。
客户端发送请求--》
请求经过一系列过滤器->
FilterDispatcher通过
ActionMapper来决定这个Reques
t需要调用哪个Action ->
FilterDispatcher把请求的处理交给ActionProxy->
通过ConfigurationManager询问
Struts配置文件(Struts.xml)
找到需要调用的Action类->
ActionProxy创建一个ActionInvocation的实例 ->
调用Action->执行完毕,
返回结果
一共10种:
dispatcher
struts默认的结果类型,
把控制权转发给应用程序里的
某个资源不能把控制权
转发给一个外部资源,
若需要把控制权重定向到
一个外部资源, 应该使用
redirect结果类型
redirect
把响应重定向到另一个资源(包括一个外部资源)
redirectAction
把响应重定向到另一个 Action
freemarker、
velocity、
chain、
httpheader、
xslt、
plainText、
stream
1)每个拦截器都是实现了I
nterceptor接口的 Java 类;
2)init(): 该方法将在拦截器被创建后立即被调用,
它在拦截器的生命周期内只被调用一次.
可以在该方法中对相关资源
进行必要的初始化;
3)intercept(ActionInvocation invocation):
每拦截一个动作请求,
该方法就会被调用一次;
4)destroy:
该方法将在拦截器被销毁之前被调用,&n