116.说下Struts的设计模式
MVC模式:
web应用程序启动时
就会加载并初始化ActionServler。
用户提交表单时,
一个配置好的ActionForm对象被创建,
并被填入表单相应的数据,
ActionServler根据Struts-config.xml文件
配置好的设置决定是否需要表单验证,
如果需要就调用ActionForm的Validate()
验证后选择将请求发送到哪个Action,
如果Action不存在,
ActionServlet会先创建这个对象,
然后调用Action的execute()方法。
Execute()从ActionForm对象中获取数据,
完成业务逻辑,
返回一个ActionForward对象,
ActionServlet再把客户请求
转发给ActionForward对象指定的jsp组件,
ActionForward对象指定的jsp生
成动态的网页,返回给客户。
117.拦截器和过滤器的区别?
1、拦截器是基于java反射机制的,
而过滤器是基于函数回调的。
2、过滤器依赖于servlet容器,
而拦截器不依赖于servlet容器。
3、拦截器只能对Action请求起作用,
而过滤器则可以对几乎所有请求起作用。
4、拦截器可以访问Action上下文、
值栈里的对象,而过滤器不能。
5、在Action的生命周期中,
拦截器可以多次调用,
而过滤器只能在容器初始化时被调用一次。
118.struts2框架的核心控制器是什么?它有什么作用?
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"/>
119.struts2如何访问HttpServletRequest、HttpSession、ServletContext三个域对象
方案一:
HttpServletRequest request =
ServletActionContext.getRequest();
HttpServletResponse response =
ServletActionContext.getResponse();
HttpSession session=
request.getSession();
ServletContext servletContext=
ServletActionContext.getServletContext();
方案二:
类 implements ServletRequestAware,ServletResponseAware,SessionAware,ServletContextAware
注意:框架自动传入对应的域对象
120.ActionContext、ServletContext、pageContext的区别?
1)ActionContext是当前的Action的上下文环境,
通过ActionContext可以
获取到request、session、ServletContext等
与Action有关的对象的引用;
2)ServletContext是域对象,
一个web应用中只有一个ServletContext,
生命周期伴随整个web应用;
3)pageContext是JSP中的最重要的一个内置对象,
可以通过pageContext获取其他域对象的应用,
同时它是一个域对象,
作用范围只针对当前页面,
当前页面结束时,
pageContext销毁,
生命周期是JSP四个域对象中最小的。
121.描述Struts2的工作原理
客户端发送请求--》
请求经过一系列过滤器->
FilterDispatcher通过
ActionMapper来决定这个Reques
t需要调用哪个Action ->
FilterDispatcher把请求的处理交给ActionProxy->
通过ConfigurationManager询问
Struts配置文件(Struts.xml)
找到需要调用的Action类->
ActionProxy创建一个ActionInvocation的实例 ->
调用Action->执行完毕,
返回结果
122.result的type属性中有哪几种结果类型?
一共10种:
dispatcher
struts默认的结果类型,
把控制权转发给应用程序里的
某个资源不能把控制权
转发给一个外部资源,
若需要把控制权重定向到
一个外部资源, 应该使用
redirect结果类型
redirect
把响应重定向到另一个资源(包括一个外部资源)
redirectAction
把响应重定向到另一个 Action
freemarker、
velocity、
chain、
httpheader、
xslt、
plainText、
stream
123.拦截器的生命周期与工作过程?
1)每个拦截器都是实现了
Interceptor接口的 Java 类;
2)init(): 该方法将在拦截器被创建后立即被调用,
它在拦截器的生命周期内只被调用一次.
可以在该方法中对相关资源
进行必要的初始化;
3)intercept(ActionInvocation invocation):
每拦截一个动作请求,
该方法就会被调用一次;
4)destroy:
该方法将在拦截器被销毁之前被调用,
它在拦截器的生命周期内也只被调用一次;
5)struts2中有内置了18个拦截器。
124.struts2如何完成文件的上传?
1、JSP页面:
1)JSP页面的上传文件的组件:
<s: file name=”upload” />,
如果需要一次上传多个文件,
就必须使用多个 file 标签,
但它们的名字必须是相同的,
即: name=“xxx”的值必须一样;
2)必须把表单的enctype属性设置为:
multipart/form-data;
3)表单的方法必须为post,
因为post提交的数据在消息体中,
而无大小限制。
2、对应的action:
1)在 Action 中新添加 3 个
和文件上传相关的属性;
2)如果是上传单个文件,
uploadImage属性的类型就是
java.io.File, 它代表被上传的文件,
第二个和第三个属性的类型是 String,
它们分别代表上传文 件的文件名和文件类型,
定义方式是分别是:
jsp页面file组件的名称+ContentType,
jsp页面file组件的名称+FileName
3)如果上上传多个文件,
可以使用数组或 List
125.值栈ValueStack的原理与生命周期?
1)ValueStack贯穿整个 Action 的生命周期,
保存在request域中,
所以ValueStack和request的生命周期一样。
当Struts2接受一个请求时,
会迅速创建ActionContext, ValueStack,action。
然后把action存放进ValueStack,
所以action的实例变量可以被OGNL访问。
请求来的时候,action、ValueStack的生命开始,
请求结束,action、ValueStack的生命结束;
2)action是多例的,和Servlet不一样,Servelt是单例的;
3)每个action的都有一个对应的值栈,
值栈存放的数据类型是该action的实例,
以及该action中的实例变量,
Action对象默认保存在栈顶;
4)ValueStack本质上就是一个ArrayList;
5)关于ContextMap,
Struts 会把下面这些映射压入 ContextMap 中:
parameters :
该 Map 中包含当前请求的请求参数
request :
该 Map 中包含当前 request 对象中的
所有属性 session :
该 Map 中包含当前 session 对象中的所有属性
application :
该 Map 中包含当前
application 对象中的所有属性
attr:该 Map 按如下顺序来检索某个属性:
request, session, application
6)使用OGNL访问值栈的内容时,
不需要#号,
而访问request、session、application、attr时,
需要加#号;
7)注意: Struts2中,
OGNL表达式需要配合Struts标签才可以使用。
如:<s:property value="name"/>
8)在struts2配置文件中引用ognl表达式 ,
引用值栈的值 ,此时使用的"$",而不是#或者%;