struts2总结


struts2在mvc中的体现。css

 

struts2的经常使用标签有哪些: html

ui:form,textfiled,textarea,password,select,radio, checkbox...
非ui标签: if,elseif, else, iterator, text, i18n, property....前端


action获取请求传递的数据的方式:
一、经过request获取
二、每一个属性set、get获取
三、别名.属性,在action中对属性bean进行set、get
四、实现ModelDrive接口;

struts2获取servlet-api的方式:
一、ioc方式,实现接口;                                                                          
二、非ioc方式, 使用类ServletActionContext类进行获取;     ??

struts2验证:
一、js前端校验;
二、业务方法中直接校验;
三、validate方法或validateXXx方法进行校验;
四、validation外部xml框架校验;

struts2 国际化;

struts2文件上传;java

struts2 拦截器, 自定义拦截器;web


总结:ajax


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表达式进行类型转换;apache

 

2.Struts2的运行原理(执行流程)?api

一、客户端浏览器发出HTTP请求。浏览器

二、根据web.xml配置,该请求被FilterDispatcher接收。服务器

三、根据struts.xml配置,找到须要调用的Action类和方法, 并经过IoC方式,将值注入给Aciton。

四、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。

五、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。

六、返回HTTP响应到客户端浏览器。

 


3.浅谈struts2拦截器, 你使用过哪些内置拦截器?

拦截器的做用:每个Action请求都包装在一系列的拦截器的内部。拦截器能够在Action执行前作类似的操做也能够在Action执行直后作回收操做。

1、params拦截器

params 拦截器提供了框架必不可少的功能,将请求中的数据设置到Action中的属性上。

2、staticParams拦截器

staticParams拦截器是将配置文件经过action元素的子元素params设置的参数设置到对应的Action的属性中。

3、servletConfig拦截器

servletConfig拦截器提供了一种将源于servlet API的各类对象注入Action当中的简洁方法。Action必须实现相对应的接口,servletConfig拦截器才能将对应的servlet对象注入Action中。

4、fileUpload拦截器

ileUpload拦截器将文件和元数据从多重请求(multipart/from-data)转换为常规的请求数据,以便将他们设置在对应的Action属性中。

5、validation拦截器

validation拦截器用于执行数据效验。

6、workflow拦截器

workflow拦截器提供当数据效验错误时终止执行流程的功能。

7、exception拦截器

exception拦截器捕获异常,而且可以根据类型将捕获的异常映射到用户自定义的错误页面。该拦截器应该位于所定义的全部拦截器中的一个。

struts2框架定义了许多有用的拦截器,这里我就介绍了这七种,若是在实际开发中有须要,咱们就能够查看struts-default.xml文件。去了解更多struts2自带对的拦截器。

 

4.如何使用struts2中的validate方法验证数据;
validate()方法是对全部的请求都执行
validateAdd()只对add()请求的方法执行.


5.struts2中validate的执行过程是怎么样的?

1.类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性

 

2.若是在执行类型转换的过程当中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息添加到fieldErrors里。无论类型转换是否出现异常,都将进入第三步。

 

3.系统经过反射技术先调用action中的validateXxx()方法

 

4.再调用action中的validate()方法

 

5.通过上面4步,若是系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发到名称为input的视图。若是系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法

 

注:如发送请求后进入input视图,并不必定是验证失败,若是类型转换出现异常,也将进入input视图


fieldError 有值的问题, input指明的页面

 

6.如何在Action中使用request,response,session等对象? 有哪些方式? (2种方式)

方法一:使用import org.apache.struts2.interceptor包下的ServletResponseAware和ServletRequestAware方法,须要Action类实现该方法!

public class TestAction implements ServletRequestAware,ServletResponseAware { private HttpServletRequest request; private HttpServletResponse response; @Override public void setServletResponse(HttpServletResponse response) { this.response=response; } @Override public void setServletRequest(HttpServletRequest request) { this.request=request; } }

方法二:使用org.apache.struts2.ActionContext类的get方法获得request和response还有session对象

import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.opensymphony.xwork2.ActionContext; public class TestAction { public String getObject() { HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_REQUEST); HttpServletResponse response = (HttpServletResponse) ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE); Map<String, Object> session = ActionContext.getContext().getSession(); return null; } }

方法三:Struts2为咱们提供了最简单的方式,使用org.apache.struts2.ServletActionContext类,能够直接获得request,response和session方法

public class TestAction { public String getObject() { HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); HttpSession session = ServletActionContext.getRequest().getSession(); return null; } }

 


7.Struts2上传文件,如何设置上传文件格式和上传文件大小? 如何修改Struts默认的上传文件大小?

复制代码
<action name="fileupload" class="uploasAction">
            <interceptor-ref name="defaultStack">
                <param name="fileUpload.allowedTypes">
                    image/png,image/gif,image/jpeg,image/jpg,image/x-png
                </param>
                <param name="fileUpload.maximumSize">102400000</param>
        </interceptor-ref>
</action>
复制代码

 

原来上网查了一下,还要加入这个东西

在struts.xml中加入  <constant name="struts.multipart.maxSize" value="10000000"/> ,大约10M

才能使拦截器起到做用

  struts.multipart.maxSize掌控整个项目所上传文件的最大的Size
  struts.multipart.maxSize和fileUpload拦截器的maximumSize属性分工不一样,总结以下:


  1.struts.multipart.maxSize掌控整个项目所上传文件的最大的Size。超过了这个size,后台报错,程序处理不了如此大的文件。fielderror里面会有以下的提示:
    the request was rejected because its size (16272982) exceeds the configured maximum (9000000)
  2.fileUpload拦截器的maximumSize属性必须小于struts.multipart.maxSize的值。
    struts.multipart.maxSize默认2M,当maximumSize大于2M时,必须设置struts.multipart.maxSize的值大于maximumSize。
  3.当上传的文件大于struts.multipart.maxSize时,系统报错
    当上传的文件在struts.multipart.maxSize和maximumSize之间时,系统提示:
    File too large: file "MSF的概念.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104 
    当上传的文件小于maximumSize,上传成功。

 


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);
在jsp页面中使用i18n标签获取国际化中的数据。

 

10.struts-default.xml 文件的做用

struts-default.xml文件是struts2框架默认加载的配置文件。它定义struts2一些核心的bean和拦截器。  
这些拦截器是以 key-value 对的形式配置在struts-default.xml中,
其中 name 是拦截器名字,就是后面使用该拦截器的引用点,value则指定拦截器的实现类。


11.Struts 有哪些标签; 你使用过哪些?

12.Struts支持哪些表达式? OGNL有什么特色?

                el、jstl表达式

   OGNL有什么特色:

            一、支持对象方法调用,形式如:objName.methodName();   
  
            二、支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路)]@[方法名 | 值名],例如:   
  
                      @java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME;   
  
            三、支持赋值操做和表达式串联,例如:   
  
                      price=100, discount=0.8, calculatePrice(),这个表达式会返回80;   
   
            四、访问OGNL上下文(OGNL context)和ActionContext;   
  
            五、操做集合对象。
 
 

13.OGNL表达式中’#’, ‘%’, ’$’ 三个符号有哪些做用?

      OGNL表达式很是强大~其中#、%、$这三个符号在OGNL表达式中常常出现,而这三种符号也是开发者不容易掌握和理解的部分,要认真区分。
     1.#符号的用途通常有三种。

   1)访问非根对象属性,例如示例中的#session.msg表达式,因为Struts 2中值栈被视为根对象,因此访问其余非根对象时,须要加#前缀。实际上,#至关于ActionContext. getContext();#session.msg表达式至关于ActionContext.getContext().getSession(). getAttribute(”msg”) 。

    2)用于过滤和投影(projecting)集合,如示例中的persons.{?#this.age>20}。

    3)用来构造Map,例如示例中的#{’foo1′:’bar1′, ’foo2′:’bar2′}。

     2.%符号

%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。以下面的代码所示: 构造Map <s:set name=”foobar” value=”#{’foo1′:’bar1′, ‘foo2′:’bar2′}” />

The value of key “foo1″ is <s:property value=”#foobar['foo1']” />

不使用%:<s:url value=”#foobar['foo1']” />

使用%:<s:url value=”%{#foobar['foo1']}” />

        3.$符号

$符号主要有两个方面的用途。

   在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间。

    在Struts 2框架的配置文件中引用OGNL表达式,例以下面的代码片段所示:

<validators>

    <field name=”intb”>

            <field-validator type=”int”>

            <param name=”min”>10</param>

            <param name=”max”>100</param>

            <message>BAction-test校验:数字必须为${min}为${max}之间!</message>

        </field-validator>

    </field>

</validators>

 

 

 

14.Struts2中返回结果类型(struts-default.xml)中的dispatcher, redirect,stream 和redirect-action的区别?

       在默认时, <result>标签的type属性值是“dispatcher”(实际上就是转发,forward)。开发人员能够根据本身的须要指定不一样的类型,如redirect、stream等。以下面代码所示: <result name="save" type="redirect"> /result.jsp </result>
这时result-type能够在struts2-core-2.0.11.1.jar包或struts2源代码中的 struts-default.xml文件中找到,在这个文件中找到<result-types>标签,全部的result-type都在里面定义了。
 
dispatcher org.apache.struts2.dispatcher.
ServletDispatcherResult  
默认结果类型,用来呈现JSP页面
chain com.opensymphony.xwork2.
ActionChainResult
将action和另一个action连接起来
freemarker org.apache.struts2.views.freemarker.
FreemarkerResult
呈现Freemarker模板
httpheader org.apache.struts2.dispatcher.
HttpHeaderResult
返回一个已配置好的HTTP头信息响应
redirect org.apache.struts2.dispatcher.
ServletRedirectResult
将用户重定向到一个已配置好的URL
redirectAction org.apache.struts2.dispatcher.
ServletActionRedirectResult
将用户重定向到一个已定义好的action
stream org.apache.struts2.dispatcher.
StreamResult
将原始数据做为流传递回浏览器端,
该结果类型对下载的内容和图片很是有用
velocity org.apache.struts2.dispatcher.
VelocityResult
呈现Velocity模板
xslt org.apache.struts2.views.xslt.
XSLTResult
呈现XML到浏览器,
该XML能够经过XSL模板进行转换
plaintext org.apache.struts2.dispatcher.
PlainTextResult
返回普通文本类容
    dispatcher:用于页面转发,页面跳转过程一直是同一个线程,Action中的数据一直保存在。
    redirect:可用于返回一个页面、一个action、连接到一个网址
       缺点:redirect把一个http返回码(SUCCESS)以及返回的页面位置一块儿从新发给web服务器,容纳后由web服务器产生一个新的HTTP请求,就会产生一个新的线程,保存在原来Action执行的线程中的数据就没法访问。 因此,result须要包含Action的数据,那么redirect不是一个可行的办法。由于新的HTTP请求时在Servlet容器的新的线程中处理的,ActionContext中的全部状态都不会存在。
chain:功能与redirect的action转发相似,不过与redirectaction转发功能不一样的是它能够将Action中的数据一直保存在同一个HTTP请求中。
 


15.ActionSupport类的做用?
验证, 获取资源文件的数据, action

16.Struts2 拦截器有哪些用处? 你在项目中是如何使用的?

    在调用action方法前执行,通常用在权限控制

拦截器(interceptor)是Struts2最强大的特性之一,也能够说是struts2的核心,拦截器可让你在Action和result被执行以前或以后进行一些处理。同时,拦截器也可让你将通用的代码模块化并做为可重用的类。
Struts2中的不少特性都是由拦截器来完成的。拦截是AOP的一种实现策略。拦截器是动态拦截Action调用的对象。它提供了一种机制可使开发者能够定义在一个action执行的先后执行的代码,也能够在一个action执行前阻止其执行。同时也是提供了一种能够提取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主题是最简单的主题,它是最底层的结构,主要用于构建附加的功能或者行为(例如在此主题基础上进行扩展),
使用simple主题时,每一个UI标签只生成一个简单的HTML元素,不会生成其余额外的内容。
 
Struts2的xhtml, css_xhtml主题都是对simple主题的包装和扩展。
 
2.xhtml主题是Struts2的默认主题,它对simple主题进行扩展,在该主题的基础上增长了以下附加的特性:
 
1,针对HTML标签(如textfield和select标签)使用标准的两列表格布局。
 
2,每一个HTML标签的Label,便可以出如今HTML元素的左边,也能够出如今上边,这取决于labelposition属性的设置。
 
3,自动输出校验错误信息。
 
4,输出JavaScript的客户端校验。
 
3.css_xhtml主题则对原有的xhtml主题进行了扩展,在xhtml主题基础上加入了CSS样式控制。
 
ajax主题目对xhtml主题目进行了扩展,在xhtml主题上为每一个标签提供了额外的Ajax支持。
ajax主题的Ajax支持是以Dojo和DWR为基础的。
 
4.ajax主题在xhtml主题基础上增长了以下特性:
 
1,支持Ajax方式的客户端校验。
 
2,支持远程表单的异步提交(最好和submit标签一块儿使用)。
 
3,提供高级的div标签,容许实现局部更新部分HTML的功能。
 
4,提供高级的a标签,容许动态加载并执行远端的javaScript代码。
 
5,提供支持ajax的tabbedPanel。
 
6,提供"富客户端"模型的pub-sub事件模型。
 
5,Struts2的表单标签

 

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

相关文章
相关标签/搜索