struts2总结


struts2
1.Struts2跟Struts1的区别?
action层对比: struts1必须继承, struts2可以继承也可以不继承
线程方面对比: struts1单例模式(所有的请求共享同一个类的实例), struts2是原型模式(对每一个的请求都创建一个新的实例)
依赖方面对比: struts1依赖servlet-api; struts2不依赖servlet-api;
测试方面对比: struts1的action单元测试很困难; strtus2单元测试非常容易;
封装方面对比: strtus1使用ActionForm对象获取jsp传递的参数; struts2有多种方式获取请求的数据;
表达式的对比: struts1使用jstl表达式; struts2使用jstl,ognl等表达式;
类型转换对比: struts1使用commons-beanutils进行类型转换; struts2使用OGNL表达式进行类型转换;


2.Struts2的运行原理(执行流程)?
1.客户端浏览器发出HTTP请求;
2.根据web.xml配置,该请求被StrutsPrepareAndExecuteFilte(过滤器)接收;
3.根据struts.xml配置,找到需要调用的Action类和方法,通过IoC方式或者是非IoC方式,将值注入Action;
4.Action调用业务逻辑组件处理业务逻辑;
5.Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转相应页面;
6.返回HTTP响应客户端浏览器。

3.浅谈struts2拦截器, 你使用过哪些内置拦截器?
1.conversionError(转换器错误拦截器):负责处理类型转换错误的拦截器;
2.createSession(创建Session拦截器):负责创建一个HttpSession对象;
3.clearSession (清除Session拦截器):负责销毁HttpSession对象;
4.fileUpload(文件上传拦截器):主要用于文件上传;
5.i18n(国际化拦截器):主要负责把用户所选的语言、区域放入用户Session中;
6.logger(日志拦截器):主要是输出Action的名字,提供简单的日志输出;
7.modelDriven(模型驱动拦截器):用于模型驱动的拦截器;
8.params(参数过滤拦截器):负责解析HTTP请求中的参数,并将参数值设置成Action对应的属性值;
9.workflow (验证拦截器) :负责调用Action类中的validate方法


4.如何使用struts2中的validate方法验证数据;
1.action类通过继承ActionSupport类来重写validate方法; //(这个方法是 validateable接口的,ActionSupport实现了这个接口)
2.validate方法在execute方法之前执行,仅当数据合法时,才执行execute方法;
若数据不合法时,通过addfielderror方法将错误信息添加到fieldError作用域中;
3.判断是否存在fieldError,若存在则跳转到input所指向的jsp页面,否则执行execuute方法。

5.struts2中validate的执行过程是怎么样的? jsp页面数据-->将请求参数转换为bean的属性-->
是否出现异常(如类型转换异常)-->
-- 是 ---> 将其保存到ActionContext对象-->conversionError拦截器将其加入到fieldError-->通过反射调用validateXxx()方法
-- 否 ---> 通过反射调用validateXxx()方法(Xxx方法与execute的方法名要一致)
-->调用validate()方法-->
是否存在fieldError-->
-- 是 ---> 跳转到你input指向的jsp页面,执行完毕
-- 否 ---> 调用Action类的execute方法 --> 跳转到相应页面,执行完毕。
6.如何在Action中使用request,response,session等对象? 有哪些方式? (2种方式)
一、非IoC方式:
HttpServletRequest request = ServletActionContext.getRequest();
 HttpServletResponse response = ServletActionContext.getResponse();
 HttpSession session = request.getSession();
ServletContext application = session.getServletContext();

二、IoC方式:
需要实现 ServletRequestAware, ServletResponseAware, SessionAware, ServletContextAware这几个接口, 然后set注入从而间接实现servlet-api对象。
public class BaseAction implements ServletRequestAware, ServletResponseAware, SessionAware, ServletContextAware {
protected HttpServletRequest request;
protected HttpServletResponse response;
protected ServletContext application;
protected Map session;
public void setServletRequest(HttpServletRequest arg0) {
this.request =arg0;
}
@Override
public void setServletContext(ServletContext arg0) {
this.application = arg0;

}
@Override
public void setSession(Map<String, Object> arg0) {
this.session = arg0;
}
@Override
public void setServletResponse(HttpServletResponse arg0) {
this.response = arg0;
}
}

7.Struts2上传文件,如何设置上传文件格式和上传文件大小? 如何修改Struts默认的上传文件大小? 设置上传文件格式:在struts.xml中的action标签下配置以下标签 <interceptor-ref name="fileUploadStack" />
<interceptor-ref name="fileUpload">
<param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param>
</interceptor-ref>

修改Struts默认的上传文件大小:在struts.xml中struts标签下配置 以下标签,value为文件上传的最大值
<constant name="struts.multipart.maxSize" value="20971520"></constant>
value为文件上传的最小值
<constant name="struts.multipart.minSize" value="20971520"></constant>

8.如何实现Struts2自定义拦截器;
1.实现Interceptor 接口, 实现接口里面的方法
2.继承AbstractInterceptor 抽象类, 重写里面的方法
需要在struts.xml文件中配置interceptor 标签及 interceptor-stack拦截器链(栈)标签; 然后在每个action标签中引用即可


9.Struts2 如何实现国际化
需要struts.xml文件中定义<constant name="struts.custom.i18n.resources" value="message" />
需要给不同的语言地区配置不同的资源文件; message_zh_CN.properties, message_en_US.properties, zh_TW, zh_HK, en_UK,

在jsp页面使用s:text标签实现获取国际化中的数据;
在action中使用getText方法实现获取国际化中的数据(前提是action必须继承ActionSupport);


10.struts-default.xml 文件的作用
struts-default.xml文件是struts2框架默认加载的配置文件。
它定义struts2一些核心的bean和拦截器


11.Struts 有哪些标签; 你使用过哪些?
<s:textfield> 文本输入框,<s:textarea> 文本域输入框,<s:password> 密码输入框,<s:radio> 单选按钮,
<s:form/> 表单标签 ,<s:submit/> 提交标签,<s:checkbox/> 多选框,<s:checkboxlist/> 复选框,
<s:if>、<s:elseif>、<s:else> 判断标签,<s:select/> 下拉框。

12.Struts支持哪些表达式? OGNL有什么特点?
Struts支持的表达式:
1.JSP表达式:格式为<%=key%>;
2.EL表达式:格式为${key};
3.OGNL表达式(Struts2特有:格式为 #key.a;


OGNL的特点:
1.支持对象方法调用,形式如:objName.methodName();
2.支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括路径)]@[方法名 | 值名];
3.支持赋值操作和表达式串联;
4.访问OGNL上下文(OGNL context)和ActionContext;
5.操作集合对象。


13.OGNL表达式中’#’, ‘%’, ’$’ 三个符号有哪些作用?
#有三种用途:
1.访问非根对象;
2.用于过滤和投影(projecting)集合,如: books.{?#this.price>35};
3.构造Map,如: #{'foo1':'bar1', 'foo2':'bar2'}。

%符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。

$有两种用途:
1.在国际化资源文件中,引用OGNL表达式;
2.在Struts2配置文件中,引用OGNL表达式 。

14.Struts2中返回结果类型(struts-default.xml)中的dispatcher, redirect,stream 和redirect-action的区别?
dispatcher 和 redirect 跳转到 view(jsp页面等);
redirectAction 跳转到 action;
stream 将原始数据作为流传递回浏览器端,对下载的内容和图片非常有用;

dispatcher 服务器间的跳转,浏览器的url不变;redirect 和 redirectAction 是客户端间的跳转,浏览器的URL改变。
15.ActionSupport类的作用?
ActionSupport类是一个工具类,它已经实现了Action接口。
除此之外,它还实现了Validateable接口,提供了数据校验功能。
通过继承该ActionSupport类,此类中实现了很多的实用接口,提供了很多默认方法,简化Struts 2的Action开发。

16.Struts2 拦截器有哪些用处? 你在项目中是如何使用的?
拦截器是对调用的Action起作用,它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,
也可以在一个action执行前阻止其执行。

根据业务需求在struts.xml文件中配置interceptor 标签及 interceptor-stack拦截器链(栈)标签;
然后在每个action标签中引用即可


17.Struts2 有哪些核心类? 说说他们在框架中的作用?
1.ActionSupport,自定义action都可以继承,简化Struts 2的Action开发
2.AbstractInterceptor,自定义拦截器都继承于它,可以根据需求自定义拦截器类
3.RequestAware,SessionAware,ApplicationAware,
ServletRequestAware,ServletResponseAware,ServletContextAware,提供IcO方式注入的action的核心类;


20.Struts2中解决重复提交的token 思想是什么?
需要在jsp的页面使用s:token标签;
需要在struts.xml文件的action中配置<interceptor-ref name="token" />
需要配置一个返回invalid.token结果对应的页面 <result name="invalid.token">/reg.jsp </result>


22.struts2的四个主题simple,xhtml(默认主题),css_xhtml和ajax的区别?
1.simple主题是最简单的主题,它是最底层的结构,主要用于构建附加的功能或者行为;
2.xhtml主题是Struts2的默认主题,它对simple主题进行扩展;
3.css_xhtml主题则对原有的xhtml主题进行了扩展,在xhtml主题基础上加入了CSS样式控制;
4.ajax主题在xhtml主题基础上增加了如下特性:
1.支持Ajax方式的客户端校验。
2.支持远程表单的异步提交(最好和submit标签一起使用)。
3.提供高级的div标签,允许实现局部更新部分HTML的功能。
4.提供高级的a标签,允许动态加载并执行远端的javaScript代码。
5.提供支持ajax的tabbedPanel。
6.提供"富客户端"模型的pub-sub事件模型。


23.FilterDispatcher(StrutsPrepareAndExecuteFilter)核心控制器的作用?

FilterDispatcher是Struts2框架的核心控制器,该控制器作为一个Filter运行在Web应用中,
它负责拦截所有的用户请求,当用户请求到达时,该Filter会过滤用户请求。
如果用户请求以action结尾,该请求将被转入Struts2框架处理。

原文地址:https://www.cnblogs.com/zlazm/p/7898584.html