struts2总结

来源:互联网 发布:陕师大网络远程教育 编辑:程序博客网 时间:2024/06/16 09:00

1.struts2拦截器与过滤器的区别?

2.struts2的Action是不是线程安全的?如果不是 有什么方式可以保证Action的线程安全?

3.struts2怎么实现上传功能

4.struts2的拦截器都有哪些,各有什么作用?

5.struts2的action为什么是非单例,而springmvc的servlet是单例?

6.struts2和springmvc的区别?

1.struts2拦截器与过滤器的区别?

①拦截器是基于Java的反射机制的,而过滤器是基于函数回调
②过滤器依赖于servlet容器,而拦截器不依赖于servlet容器
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器(服务器)初始化时被调用一次,只有当服务器停止时才会被销毁

注: 1.Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现。
     2. 拦截器栈(Interceptor Stack)。Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。


2.struts2的Action是不是线程安全的?如果不是 有什么方式可以保证Action的线程安全?
   答: 是线程安全的。非单例,在每个action上都要加@scope("prototype"),每一个请求都会产生一个新的action对象,不存在数据的共享


3.struts2怎么实现上传功能

之前的博客有详细代码

struts2中如何实现文件上传的:

    a、借助一个fileUpload拦截器完成的;

    b、最底层的还是借助的commons-fileupload这个组件

jsp:

文件上传三要素: 1.表单提交方式: post (get方式提交有大小限制,post没有)   2.表单的enctype属性:必须设置为multipart/form-data. 3.表单必须有文件上传项:file

action:

private File upload;//动作类上传的属性必须是file类型,upload为表单的nameprivate String uploadFileName; //上传的文件名称,固定写法:name+FileName;    private String uploadContentType; //上传文件的mime类型,固定写法: name+ContextType;

指定文件存放目录dir

调用FileUtils.moveFile(upload,new File(dir,uploadFileName));//剪切文件,推荐使用,无备份文件

配置文件:

<action name="uploadAction_*" class="uploadAction" method="{1}">              <interceptor-ref name="defaultStack">                  <!-- 允许上传的文件的扩展名,多个扩展名用逗号分隔 -->                  <param name="fileUpload.allowedExtensions">.doc,.txt</param>                  <!-- 语序上传的mime类型 -->                  <param name="fileUpload.allowedTypes">text/plain,application/msword</param>              </interceptor-ref>                            <result name="error">/error.jsp</result>              <result name="message">/success.jsp</result>   </action>  
4.struts2的拦截器都有哪些,各有什么作用?

我在这里列举几个有可能经常用到的

①.exception拦截器

                        <global-results><result name="syerror">/unauthorized.jsp</result></global-results><global-exception-mappings><exception-mapping result="syerror" exception="org.apache.shiro.authz.UnauthorizedException"/></global-exception-mappings>
主要是用来拦截异常信息,跳转到指定页面的,异常也均可以不处理(try/catch),直接配置接收,比如activiti中的方法授权的返回异常可以用上面的配置来接收.

②token:令牌:主要用来防止表单重复提交,此拦截器不是默认拦截器,需要自己配置

页面配置:<s:token/>

  1. <package name="student" namespace="/student" extends="struts-default">  
  2.     <interceptors> //配置拦截器  
  3.         <interceptor-stack name="tokenStack"> //命名拦截器栈,名字随便  
  4.             <interceptor-ref name="token"/> //此拦截器为token拦截器,struts已经实现  
  5.             <interceptor-ref name="defaultStack" /> //默认拦截器,注意顺序,默认拦截器放在最下面  
  6.         </interceptor-stack>  
  7.     </interceptors>  
  8.            
  9.     <default-interceptor-ref name="tokenStack" /> //让该包中所有action都是用我们配置的拦截器栈,名字和上面的对应  
  10.   
  11.     <action name="changeinfo" class="sChangeInfoAction">  
  12.         <result name="success">/WEB-INF/student/person_info.jsp</result>  
  13.         <result name="invalid.token">/WEB-INF/student/person_info.jsp</result> //这个结果是拦截后返回的页面,必须要配置  
  14.     </action>  
  15. </package> 


③.Params拦截器

  作用:将表单字段映射到值栈栈顶对象的各个属性中;如果某个字段在模型里没有匹配的属性,Param拦截器将尝试值栈中的下一个对象属性。


④.modelDriven拦截器

  作用:用户执行请求时,ModelDriven拦截器将调用对应Action对象的getModel()方法,并将返回的模型(对象实例)压入到值栈中。


⑤.paramsPrepareParams拦截器

  作用:Struts2.0中的modelDriven拦截器负责把Action类以外的一个对象压入到值栈栈顶,而prepare拦截器负责为getModel()方法准备model。

 具体作用:

  • 若Action类实现Preparable接口,则其需实现prepare()方法;
  • 该拦截器将调用prepareActionMethodName()方法、prepareDoActionMethodName()方法或prepare()方法;
  • 该拦截器根据firstCallPrepareDo属性值决定 prepareActionMethodName 和prepareDoActionMethodName的获取顺序;
  • 该拦截器会根据alwaysInvokePrepare属性值决定是否调用实现了Preparable接口的 Action类的prepare()方法。

⑥fileupload:文件上传:参见第三条总结

5.struts2的action为什么是非单例,而springmvc的servlet是单例?

对于struts2因为参数是以属性的形式存储到值栈中,供所有方法使用,如果为单例,很容易出现并发问题.

而springmvc是以方法形参的方式来传递参数,并不会出现安全问题,用单例性能当然要更好.

6.struts2和springmvc的区别?

①、 springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过滤器。

②、 springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例)struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。

③、 Struts采用值栈存储请求和响应的数据,通过OGNL存取数据,springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl


0 0
原创粉丝点击