1、Struts2框架在三层架构中哪部分进行的再优化?
表现层进行的再优化。
三层架构:
表现层 MVC
业务层 service
持久层 dao(data access object)
2、Struts1和Struts2的一个显著区别是什么?
Struts1的核心控制器是一个servlet。
Struts2的核心控制器是一个过滤器。
3、Struts2的编写步骤?
1.导入相关jar包
2.配置web.xml中的过滤器
3.编写struts.xml
4.开发action。
4、Struts2的执行过程?
tomcat启动的时候加载应用的web.xml,实例化并初始化过滤器,过滤器的初始化方法加载struts.xml。客户端发送请求,请求到达过滤器,截取请求的动作名称(没有或以action结尾),并从struts.xml中找,找到后,实例化动作类。调用对应的动作方法,方法有返回值,根据返回值,找到name取值对应的结果视图,找到jsp页面。
5、Struts2的配置文件加载时机和加载顺序?
当应用被tomcat加载的时候,struts2的配置文件就已经被加载过了。加载顺序:default.properties、struts-default.xml、struts-plugin.xml、struts.xml、web.xml
6、常量中struts.devMode是什么意思,如何配置?
开发模式。修改了struts.xml中的配置,你不必每次都重启服务器。
7、struts.xml配置文件中package的四个属性分别什么意思?
name:包名
extends:一般是继承struts-default包,但不是必须的。不过如果不继承的话,将无法使用struts2提供的核心功能。
abstract:把包声明为抽象包,抽象包就是用来被继承的。只要是没有
namespace:名称空间。
8、访问带有名称空间的动作时,是如何查找的? /user/abc/action1.action
先找user/abc,有action1就执行,没有再找user下面的action1,有就执行,最后找根目录。
9、action元素的三个属性什么意思
name:动作名称
class:动作类全名。默认的动作类是:com.opensymphony.xwork2.ActionSupport是在struts-default.xml中定义的。
method:动作类中的方法名称。默认是public String execute(){}
要求:
1.public的
2.返回值必须是String
3.没有参数
10、result元素的两个属性分别指的是什么?
name:逻辑视图的名称,对应着动作方法的返回值。默认值是success。
type:结果类型,指的就是用什么方式转到定义的页面。默认是dispatcher。
11、4个常用结果类型分别是什么?
dispatcher:(默认值)使用请求转发,转向一个页面。
redirect:使用重定向,转向一个页面。
redirectAction:注意:使用的是重定向。
a.重定向到另一个相同名称空间的动作。b.重定向到不同名称空间的动作
chain:注意:使用的是请求转发。
a.转发到另一个相同名称空间的动作。b.请求转发到不同名称空间的动作
12、访问ServletAPI的两种方式?
第一种方式:使用ServletActionContext类
第二种方式:使用实现接口的方式(ServletRequestAware、ServletResponseAware)
1、如何封装静态请求参数?
在struts.xml配置文件中,给动作类注入值。调用的是setter方法。
2、动作类和模型分开的动态封装请求参数,set和get方法是怎么调用的?
先get出来,判断存不存在,存在直接get第二次(给这个对象赋值),不存在(把这个对象创建出来,set回去,然后再get出来)
3、使用模型驱动动态封装请求参数的要求是什么?
实现ModelDriven接口,动作类和实体模型分开,创建模型对象并将其实例化,重写getModel方法,返回一个引用。
4、实际开发中类型转换的两种情况是什么?
转字符串,转其他类型。
写的时候,发送请求,经过过滤器,最后到数据库,字符串转其他类型。
读的时候,到页面,其他类型转成字符串
5、Struts2中提供的常用类型转换分几类?
a.基本数据类型自动转换。
b.日期类型:默认按照本地日期格式转换(yyyy-MM-dd)。
c.字符串数组:默认用逗号+空格,连接成一个字符串
6、自定义类型转换器是如何注册的?(两种情况)
局部类型转换器:只能指定javabean中的属性用
按照属性来注册。在属性所属的javabean的包下建立一个.properties文件。文件名称:javabean名称-conversion.properties
全局类型转换器:(推荐)
按照要转换的数据类型来注册。at the top op classpath,建立一个固定名称xwork-conversion.properties的属性文件。
7、如何解决编程式验证动作类中的全部动作方法都验证?
在动作类中覆盖public void validate()方法。
8、声明式验证的分别可以基于什么?
基于字段和验证器。
9、命名声明式验证xml文件名的两种方式,有什么不同?
a.针对动作类中的所有动作进行验证:在动作类所在的包中,建立一个ActionClassName-validation.xml的文件
b、针对动作类中的某个动作进行验证:在动作类所在的包中建立一个xml文件,名称为ActionClassName-ActionName-validation.xml。
1、国际化的消息资源文件如何命名?
一个资源包由多个文件组成,这些文件名都有命名规范:主要文件名_语言代码_国家代码.properties。
语言代码:由iso规定的。国家代码:有iso规定的当文件只有主要文件名.properties时,表明它是默认资源包。浏览器会根据不同的语言环境找对应语言环境的资源包,当没有时,找默认的。
每个资源包的内容都由相同的key和对应语言环境的value组成。
比如:
message_zh_CN.properties message_zh_HK.properties message_en_US.properties
2、 Struts2中全局,动作范围和包范围,哪个加载优先级高?页面上如何读取指定的消息资源包?
动作范围。
3、Struts2中拦截器的执行时机?
拦截动作方法之前,正序执行;拦截动作方法之后,倒序执行。
4、自定义拦截器的步骤是什么?
a、编写一个类,继承AbstractInterceptor类或者实现Interceptor接口。重写intercept方法。
b、配置拦截器:注意拦截器必须先声明再使用
5、多个拦截器如何确定执行顺序?
使用顺序。
6、自定义拦截器除了继承AbstractInterceptor还可以继承哪个?另一个有什么好处?
可以继承MethodFilterInterceptor并且重写doIntercept方法。
通过参数注入的方式,哪个拦截和不拦截。
7、文件上传是哪个拦截器为我们做的?如何限定上传文件的大小和类型?
fileupload拦截器
在struts.xml中改变default.properties文件中的常量。
给fileUpload拦截器注入参,数通过限制上传文件的MIME类型
8、struts2中文件下载是由哪个结果类型完成的?需要我们提供什么参数?
stream类型。输入流的字段名称(inputname)、文件类型(contentType)、响应消息头(contentDisposition)
9、OGNL是什么?使用它能否访问普通方法?能否直接访问静态方法?
OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个单独的开源项目。 Struts2框架使用OGNL作为默认的表达式语言。
可以直接访问普通方法。不能直接访问静态方法。需要在struts.xml中启用。
10、ActionContext和ValueStack什么时候创建?是否是线程安全的?
明确:动作类是多例的,每次动作访问,动作类都会实例化。所以是线程安全的。与Struts1的区别是,struts1的动作类是单例的。
在每次动作执行前,核心控制器StrutsPrepareAndExecuteFilter都会创建一个ActionContext和ValueStack对象。且每次动作访问都会创建。
这两个对象存储了整个动作访问期间用到的数据。并且把数据绑定到了线程局部变量(ThreadLocal)上了。所以是线程安全的。
11、ContextMap中的结构是什么样的?
除了value stack之外,全是map,而contextMap也是一个map。其实就是Map中又封装的Map。(很像dbutils中KeyedHandler封装数据的结构,只是封装数据的结构)