struts2总结


struts2在mvc中的体现。

 

struts2的常用标签有哪些:

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


action获取请求传递的数据的方式:
1、通过request获取
2、每个属性set、get获取
3、别名.属性,在action中对属性bean进行set、get
4、实现ModelDrive接口;

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

struts2验证:
1、js前端校验;
2、业务方法中直接校验;
3、validate方法或validateXXx方法进行校验;
4、validation外部xml框架校验;

struts2 国际化;

struts2文件上传;

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配置,该请求被FilterDispatcher接收。

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

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

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

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

 


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

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

一、params拦截器

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

二、staticParams拦截器

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

三、servletConfig拦截器

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

四、fileUpload拦截器

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

五、validation拦截器

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

六、workflow拦截器

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

七、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有什么特点:

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

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)核心控制器的作用?

 

posted @ 2017-06-07 20:26  hdsfakjhf  阅读(233)  评论(0编辑  收藏  举报