struts2

1、Struts2Struts1的联系与区别,为什么要用Struts2Struts1Struts2都是MVC框架的经典实现模式。Struts2不是由Struts1升级而来,而是由webwork改名而来,而webwork只是xwork加了很多web拦截器而已。

区别:核心控制器改成了过滤器(过滤器比servlet的级别要高,因为程序运行时是先进入过滤器再进入servlet);Struts1要求业务类必须继承actiondispatchActionStruts2不强制这么做,只需要提供一个pojo;绑定值到业务时Struts1是通过actionFormStruts2是通过模型或属性驱动直接绑定到action属性;Struts1严重依赖servlet(因为太过于依赖于apiHttpServletRequestHttpServletResponse两个参数),Struts2则脱离了servletAPI;管理actionStruts1时单例模式,Struts2则每个请求产生一个实例;在表达式的支持上Struts2不仅有jstl,还有功能更强大的ongl表达式;Struts1的类型转换是单向的(页面到ActionForm,Struts2是双向的(页面到action再到页面回显);校验,Struts1没有针对具体方法的校验,Struts2提供了指定某个方法进行效验,还有框架效验;Struts2提供拦截器,利用拦截器可以在访问action之前或之后增加如权限拦截等功能;Struts2提供了全局范围,包范围,action范围的国际化资源文件管理实现;Struts2支持多种视图类型,如jsp,freemaker等。

2、Struts2的核心是什么,体现了什么思想?Struts2的核心是拦截器,基本上核心功能都是由拦截器完成的,拦截器的实现体现了AOP(面向切面编程)思想。

3、为何继承actionsupport?因为actionsupport实现了action接口,提供了国际化,校验功能;它提供了一个getTextString key)方法实现国际化,该方法从资源文件上获取国际化信息。Action接口提供了五个常量:successerrorlogininputnone

4、Struts2如何定位action中的方法?感叹号定位法;通配符匹配法;在xml配置文件中通过配置多个action,使用actionmethod指定方法。

5、模型驱动与属性驱动是什么?模型驱动使用时应该注意什么问题?模型驱动与属性驱动都是用来封装数据的。模型驱动在实现类中实现ModelDriven<T>接口使用泛型把属性封装起来,重写getModel()方法,然后在实现类里创建一个属性类的实例,通过这个实例拿到封装进来值,拿返回值的时候使用工具拷贝;属性驱动:在实现类里定义属性,生成get/set方法,通过属性来拿值。注意:模型驱动使用时注意是在使用前先把属性实例化,否则会出现空指针错误,拿返回对象的值需要用拷贝内存因为地址发生改变;模型驱动不可以使用局部类型转换器。

6、Struts2是怎样进行值封装的?Struts2的值封装实际上采用了ongl表达式,struts2的拦截器经过模型驱动时会先判断action是否实现了ModelDriven,如果是则拿到模型的实例放在栈顶,到属性驱动的时候会从栈顶把实例拿出来,从页面传进来的值放在一个map集合中,通过map集合进行迭代会通过ongl技术把值封装到实例中。

7、Struts2如何进行校验?编程校验:继承actionsupport,重写validate方法;validateXXX方法;如果有错误就把错误信息放在FieldError中,并且跳转到指定的错误业务类,没有就会进行action方法调用;校验框架:每个action类都有一个校验文件,命名action类名-validation.xml,且与action类同目录,这是对action里面所有的方法进行校验;对action里面指定方法做校验使用action类名-访问路径_方法名-validation.xml,在校验文件里又分为两种:字段校验:字段用什么校验器来校验;非字段校验是用什么校验器来校验字段。

8、谈谈Struts2的国际化?分为三部分:action范围,这种范围是用action的实现类的类名来作为前缀_语言名称_国家地区.properties;包范围,是用package作为前缀_语言名称_国家地区名.properties;全局范围,默认前缀是application,可以通过xml配置文件配置常量来指定前缀

国际化实现的原理:通过i18n拦截器获得请求参数request--locale的值并把当前的值转化为locale对象,把locale对象存在ww_trans_i18n_localesession作用域中,根据Struts2的请求处理流程,拦截器只会进入action才会调用,所以我们一般吧对jsp的访问转化为对action的访问。

9、OGNL是什么?你在项目中如何使用它?OGNL是对象图形导航语言,原ognl是单个对象的,在Struts2的的应用是多个对象的,Struts2的类型转换也是通过ognl实现的,Struts2中默认的表达式语言就ognl,相对于jstl或其他表达式语言,它有如下优势:能够调用对象实例方法;能够调用类的静态方法;操作集合对象;访问OGNL上下文。

10、Struts2如何访问servletAPI?通过actionContext可以获得requestapplicationsession三个作用域;通过servletactionContext获得原始的API;可以通过实现servletRequestaAware接口,重写里面的setServletRequest方法获得request,实际上是通过set的依赖注入。

11、什么是拦截器,说说Struts2用拦截器来干什么,说出6个拦截器?在访问类的某个方法或属性之前执行,拦截的是action的请求,进行拦截后在方法的执行前或之后加入某些操作,如国际化,权限,校验等与源代码无关的操作。国际化,表单重复提交,类型转换,自动装配,数据封装,异常处理,模型驱动,请求参数,处理类型装换错误,日志拦截器。

12、如何自定义拦截器?可以继承MethodFilterInterceptor重写doInterceptor方法指定某个方法进行拦截,或者继承AbstractInterceptor,重写intercept方法,在xml配置文件中定义自定义拦截器,然后注入拦截器栈时配置<param>标签,使用name属性配置,excludeMethods表示不拦截指定方法。在配置文件中配置includeMethods指定拦截某个方法。可以配置到某个action单独使用,也可以配置到包下面的所有action使用。

13、ActionContext是用来干什么的?ActionContextAction的上下文。通过ActionContext这个类可以获得requestsessionapplicationlocalevaluestackconversionError;可以获得servletAPI;可以进行国际化:获得语言环境locale;收集错误信息ConversessionErrors;有个值栈来装action实例与模型驱动的实例valuestackActionContext是线程安全的,用本地线程实现的;

14、Struts2是如何实现MVC的?M(模型):除核心控制器外都属于模型,实现业务的类(service层与dao层),V(视图):result,type,dispatcher默认的(jspfreemakervelocity,源代码等);C(控制器):核心控制器与业务控制器

15、MVC解决什么问题?解决了数据封装,类型转换,数据校验,国际化,异常处理等问题。

16、标签<s:property>el表达式有什么区别?他们都可以从值栈里面取值,但是el表达式只能取属性有getset方法的简单数据类型,如果要取得数组的一些方法等复杂数据对象类型,那么就要用s:property标签.

posted @ 2018-09-04 17:57  一个骄傲的少年  阅读(300)  评论(0编辑  收藏  举报