struts2总结

来源:互联网 发布:上瘾网络剧发布会视频 编辑:程序博客网 时间:2024/05/17 08:38

3 为何继承ActionSupport
答:
因为ActionSupport实现了Action接口,提供了国际化,校验功能。
ActionSupport
实现了国际化功能:因为它提供了一个getText(String key)方法实现国际化,该方法从资源文件上获取国际化信息。
Action
接口提供了五个常量(success,error,login,input,none)
4 Struts2
如何定位action中的方法
答:
1
感叹号定位方法(动态方法)。
2
在xml配置文件中通过配置多个action,使用action的method指定方法。
3
使用通配符(*)匹配方法。
5
模型驱动与属性驱动是什么 模型驱动使用时注意什么问题
答:模型驱动与属性驱动都是用来封装数据的。
1.
模型驱动:在实现类中实现ModelDriven<T>接口使用泛型把属性类封装起来,重写getModel()方法,然后在实现类里创建一个属性类的实例,
通过这个实例拿到封装进来的值,拿返回值的时候使用工具进行值拷贝。
2.
属性驱动:在实现类里定义属性,生成get与set方法,通过属性来拿值。
注意:模型驱动使用时注意的是在使用前先把属性类实例化,否则会出现空指针错误,拿返回对象的值需要用拷贝内存因为地址发生改变。
模型驱动不可以使用局部类型转换器。
3.Struts2
是怎样进行值封装的?
struts2
的值封装实际上是采用了ognl表达式.
struts2
的拦截器经过模型驱动时会先判断action是否实现了ModelDriven,如果是则拿到模型的实例放在了栈的顶部,
到属性驱动的时候会从栈里面把栈顶的实例给取出来,从页面传进来的值放在一个map集合当中,
通过map集合进行迭代会通过ognl技术把值封装到实例中。
6 Struts2
如何进行校验
编程校验
1
继承ActionSupport,重写validate方法(针对所有方法)(服务器端编程,不推荐)。
2 validateXxx
方法(Xxx代表的是方法名,针对某个方法进行效验)。
3
如果有错误就把错误信息放在FieldError中,并且跳转到指定的错误业务类,没有就会进行action方法的调用。
2
校验框架
每个Action类有一个校验文件,命名 Action类名-validation.xml,且与Action类同目录,这是对action里面所有的方法进行校验。
对Action里面的指定方法做校验使用Action的类名-访问路径_方法名-validation.xml。
如:StudentAction-student_add-validation.xml
在效验文件里又分为两种:
字段校验:字段用什么校验器来校验。
非字段校验:是用校验器校验什么字段。
通俗点讲:字段校验:校验谁,用什么方法。
非字段校验:用什么校验,校验谁。



9 Strust2
如何访问Servlet API
答:
1
:通过ActionContext可以获得request,application,session三个作用域(struts2实际上是通过适配器来把servlet的api转换为一个map,
并把这些map放在ActionContext里面)。
2
:通过ActionContext的子类ServletActionContext去获取原滋原味的API。
3
:可以通过实现ServletRequestAware接口,重写里面的setServletRequest方法可以获得request,实际上是通过set的依赖注入。
10
什么是拦截器 说说Struts2用拦截器来干什么说出6个拦截器来
答:
在访问类的某个方法或者属性之前执行,拦截的是Action的请求,进行拦截然后在方法的执行前或者之后加入某些操作,
如:国际化,权限,效验等与源代码无关的操作。
国际化,表单重复提交,类型转换,自动装配,数据封装,异常处理,模型驱动,请求参数,处理类型转换错误,日志拦截器。
如何实现自定义拦截器?


答:可以继承MethodFilterInterceptor重写doIntercept方法指定某个方法进行拦截,或者继承AbstractInterceptor,重写intercept方法,
在xml配置文件中定义自定义拦截器,然后注入到拦截器栈中,再把拦截器引用到action中。
在把拦截器注入拦截器栈时配置<param>标签,使用name属性配置excludeMethods表示不拦截指定方法。
在配置文件中配置includeMethods指定拦截某个方法。
可以配置到某个action单独使用,也可以配置到包下面的所有action使用。
需要注意什么?
答:注意要把默认的拦截器栈重新引用,否则会被覆盖。
11
项目中遇到什么问题
答:
1.
表单重复提交。
在页面使用标签<s:token/>(令牌机制),使用检验表单从复提交的拦截器tokenSession。。
2.
国际化必须经过Action
原因:因为国际化是通过i18拦截器来实现的,而拦截器是在访问Action的时候才执行。
解决方式:在对jsp的访问之前进行对action的访问。
3.
使用模型驱动拿返回值的时候地址内存不一样,会拿不到值。
原因:因为struts2最开始是把创建action的实例放到ActionContext的栈顶,后来把创建模型驱动的实例放到栈顶,
而通过struts2的标签去取值会取栈顶的实例,而此时拿到的还是最开始的创建的那个实例,所以为空。
解决方式:利用原型进行对象拷贝,使用拷贝工具,BeanUtils或者是propertyUtils。
4.
在页面使用转发会报404错。
原因:struts2使用的是filter机制,<jsp:forward/>的机制是servlet。
解决方式:可以通过过滤器改变请求地址,
5.
用字符串的时候需要用双引号而不是单引号,单引号在外,双引号在内。
7.
当效验出错时,要跳转到相应的页面。
解决方式:使用通配符来解决。
......
这些问题都可以自己根据实际情况总结
12 ActionContext
是用来干什么的
答:ActionContext是Action的上下文。
通过ActionContext这个类来可以获得:request,application,session,Locale、ValueStack,ConversionErrors
1
可以获得servlet的api:request,application,session。
2
进行国际化:获得语言环境 Locale
3
收集错误信息:ConversionErrors
4
有个值栈来装action实例与创建的模型驱动的实例:ValueStack。
5 ActionContext
是线程安全的-用本地线程实现的。
13 Struts2
是如何实现mvc的:struts2的底层视图默认是freemaker。
什么mvc
M
:模型,V:视图,C:控制器
在struts2中分别对应什么?
M(
模型):除核心控制器外都属于模型,实现业务的类(service层与dao层)。
V(
视图):result,type,dispatcher默认的(jsp,freemaker,velocity,源代码等)。
C(
控制器):核心控制器与业务控制器。
mvc
解决什么问题?
解决了数据封装,类型转换,数据效验,国际化,异常处理等问题。
14.
为什么要继承默认的包?
? ? ?
因为在Strtus2里面默认有很多的常量,拦截器,还有一些bean,如果继承默认的包,这些默认值和常量就会继承过来,?
15 .
常见的有那些有十几种结果集类型,
常见的结果集类型有dispatcher,redirect,redirectAction,stream
默认的是dispatcher,值得是转发
redirect
指重定向,
redirectAction
是重定向到一个Action
stream
是返回一个流,一般用在文件下载上面
16
开发项目时struts2在页面怎样拿值?
从值栈中或者是ognl的上下文下载用了resust为stream的类型,然后在action定义四个属性,默认的有个是InputStream 的类型叫inputStream的,从硬盘上面读取文件到这个流赋值即可.
18.
简单讲下struts里面的标签,说不少于5个
s:iterater ?s:property s:form s:url s:if
等等
19.
默认struts2里面的标签取值都是从那里取值的
默认都是从OGNL值栈里面取值的?
21.ValueStack
分为那两部分,组成部分是什么,分别怎么访问
?
分为对象栈和ContextMap ,对象栈里面放入的是Action及其用户定义的对象,在前台可以直接访问,在contextMap里面放入的是Servlet对象转化后map,譬如requestMap,sessionMap,访问的时候前面加#即可.?
22.
标签<s:property>和el表达式有什么区别,
它们都可以从值栈里面取值,但是el表达式只能取属性有getset方法的简单数据类型,如果要取得数组的一些方法等复杂数据对象类型,那么就要用s:property标签


 

 

1. 简述 Struts2的工作流程:

 

. 请求发送给StrutsPrepareAndExecuteFilter

. StrutsPrepareAndExecuteFilter判定该请求是否是一个 Struts2 请求

. 若该请求是一个 Struts2请求,则 StrutsPrepareAndExecuteFilter 把请求的处理交给ActionProxy

. ActionProxy 创建一个ActionInvocation 的实例,并进行初始化

. ActionInvocation实例在调用Action 的过程前后,涉及到相关拦截器(Intercepter)的调用。

. Action 执行完毕,ActionInvocation负责根据 struts.xml 中的配置找到对应的返回结果。调用结果的 execute 方法,渲染结果。

. 执行各个拦截器invocation.invoke()之后的代码

. 把结果发送到客户端

5. Struts2 中的默认包 struts-default有什么作用?

 

. struts-default包是struts2 内置的,它定义了 struts2 内部的众多拦截器和 Result 类型,而 Struts2 很多核心的功能都是通过这些内置的拦截器实现,如:从请求中把请求参数封装到action、文件上传和数据验证等等都是通过拦截器实现的。当包继承了struts-default包才能使用struts2为我们提供的这些功能。

.struts-default包是在struts-default.xml 中定义,struts-default.xml 也是 Struts2 默认配置文件。Struts2 每次都会自动加载 struts-default.xml文件。

. 通常每个包都应该继承struts-default包。

 

6. 说出 struts2中至少 5 个的默认拦截器

 

exception;fileUpload;i18n;modelDriven;params;prepare;token;tokenSession;validation 等

 

7. 谈谈 ValueStack

 

. ValueStack 贯穿整个Action 的生命周期,保存在 request 域中,所以ValueStack 和 request 的生命周期一样. 当 Struts2 接受一个请求时,会迅速创建 ActionContext,ValueStack,Action. 然后把 Action 存放进 ValueStack,所以 Action 的实例变量可以被 OGNL 访问。请求来的时候,Action、ValueStack 的生命开始;请求结束,Action、ValueStack的生命结束

. 值栈是多实例的,因为Action是多例的(和 Servlet 不一样,Servelt是单例的),而每个 Action 都有一个对应的值栈,Action 对象默认保存在栈顶;

. ValueStack 本质上就是一个 ArrayList(查看源代码得到);

. 使用 OGNL访问值栈的内容时,不需要#号,而访问 request、session、application、attr 时,需要加#号;

. Struts2 重写了 request 的 getAttribute 方法,所以可以使用 EL 直接访问值栈中的内容

 

 

9. Struts2 有哪几种结果类型 ?

 

参看 struts-default.xml 中的相关配置:dispatcher、chain、redirect 等.

 

 

11. 如何在 Struts2中使用 Ajax 功能 ?

 

. JSON plugin

. DOJO plugin

.DWR plugin

.使用 Stream结果类型.

2.Struts2中的拦截器有什么用?列举框架提供的拦截器名称?(至少3种,可用中文名)

答:拦截器是struts2核心组成部分,它提供了一种机制,使得开发者可以定义一个特定的功能模块,这个模块会在Action执行之前或者之后执行,也可以在Action执行之前阻止Action执行。

常用的拦截器有:chain:在不同请求之间将请求参数在不同名字件转换,请求内容不变fileUpload:提供文件上传。

i18n:记录用户选择的区域环境   logger:输出Action的名字  params:将请求中的参数设置到Action中去。

3.什么是OGNL,有什么用途?如何访问存放在session中叫user的对象的username属性

答:OGNL是Object-GraphNavigation Language的缩写,也叫对象导航语言。它是Struts的一种功能强大的表达式语言

列如:访问session中的user对象的username属性:

注意的是:使用前需要在页面头部导入taglibprefix="s" uri="/struts-tags"

5.JSON的全称是什么?用JavaScript代码描述一个json数组,并进行解析。

答:JSON的全称是”JavaScript Object Notation”,它是一种独立于语言的轻量级数据交换格式。

比如:

[{

 "id":"1",

 "text":"所有班级",

 "Children":[

 {"id":"11",

 "text:"Y2T01"

}

]

}]

Struts2 拦截器 和 过滤器的区别

•      ①、过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器

•      ②、Struts2 拦截器只能对 Action 请求起作用,而过滤器则可以对几乎所有请求起作用。

•      ③、拦截器可以访问 Action 上下文(ActionContext)、值栈里的对象(ValueStack),而过滤器不能.

•      ④、在 Action 的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。

为什么要使用 Struts2 & Struts2 的优点:

•      ①. 基于 MVC 架构,框架结构清晰。

•      ②. 使用 OGNL: OGNL 可以快捷的访问值栈中的数据、调用值栈中对象的方法

•      ③. 拦截器: Struts2 的拦截器是一个 Action 级别的 AOP, Struts2 中的许多特性都是通过拦截器来实现的, 例如异常处理,文件上传,验证等。拦截器是可配置与重用的

•      ④. 多种表现层技术. 如:JSP、FreeMarker、Velocity 等

Struts2 如何访问 HttpServletRequest、HttpSession、ServletContext 三个域对象

•      ①. 与 Servlet API 解耦的访问方式

•         > 通过 ActionContext 访问域对象对应的 Map 对象

•         > 通过实现 Aware 接口使 Struts2 注入对应的 Map 对象

•      ②.  与Servlet API 耦合的访问方式

•         > 通过 ServletActionContext 直接获取 Servlet API 对象

•         > 通过实现 ServletXxxAware 接口的方式使 Struts2 注入对应的对象

拦截器的生命周期与工作过程

•      每个拦截器都是需要实现 Interceptor 接口 

•         > init():在拦截器被创建后立即被调用, 它在拦截器的生命周期内只被调用一次. 可以在该方法中对相关资源进行必要的初始化; 

•         > intercept(ActionInvocation invocation):每拦截一个动作请求,该方法就会被调用一次; 

•         > destroy:该方法将在拦截器被销毁之前被调用, 它在拦截器的生命周期内也只被调用一次; 

struts2是如何启动的?

 

 struts2框架是通过Filter启动的,即StrutsPrepareAndExecuteFilter,此过滤器为struts2的核心过滤器;  

StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。struts2读取到struts.xml的内容后,是将内容封装进javabean对象然后存放在内存中,以后用户的每次请求处理将使用内存中的数据,而不是每次请求都读取struts.xml文件。

struts2框架的核心控制器是什么?它有什么作用?  

1)Struts2框架的核心控制器是StrutsPrepareAndExecuteFilter。  

2)作用:  

 负责拦截由<url-pattern>/*</url-pattern>指定的所有用户请求,当用户请求到达时,该Filter会过滤用户的请求。默认情况下,如果用户请求的路径  

不带后缀或者后缀以.action结尾,这时请求将被转入struts2框架处理,否则struts2框架将略过该请求的处理。  

可以通过常量"struts.action.extension"修改action的后缀,如:  

<constant name="struts.action.extension" value="do"/>  

如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。

<constant name="struts.action.extension" value="do,go"/>  

struts2是如何管理action的?这种管理方式有什么好处?  

struts2框架中使用包来管理Action,包的作用和java中的类包是非常类似的。  

主要用于管理一组业务功能相关的action。在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。  

   

ActionContext、ServletContext、pageContext的区别?  

1)ActionContext是当前的Action的上下文环境,通过ActionContext可以获取到request、session、ServletContext等与Action有关的对象的引用;  

2)ServletContext是域对象,一个web应用中只有一个ServletContext,生命周期伴随整个web应用;  

3)pageContext是JSP中的最重要的一个内置对象,可以通过pageContext获取其他域对象的应用,同时它是一个域对象,作用范围只针对当前页面,当前页面结束时,pageContext销毁,  

生命周期是JSP四个域对象中最小的。  

为何继承ActionSupport

 

因为ActionSupport实现了Action接口,提供了国际化,校验的功能。

 

ActionSupport实现了国际化功能:因为它提供了一个getText(String key)方法实现国际化,该方法从资源文件上获取国际化信息。

 

Action接口提供了五个常量(success,error,login,input,none)。

 

0 0
原创粉丝点击