day25_day27_Struts2_学习回顾
day25_01_学习回顾
答:
2、Struts1和Struts2的一个显著区别是什么?
答:
Struts2的核心控制器是一个过滤器。
3、Struts2的编写步骤?
答:
2、at the top of classpath(在最顶层的构建路径),建立一个默认名称为struts.xml的配置文件。在struts.xml文件中进行配置。
3、在web.xml中配置控制器。
4、建立动作类和动作方法。
5、建立一个访问视图的.jsp文件和结果视图页面。
4、Struts2的执行过程?
答:
客户浏览器发送请求:hello.action –> 请求到达过滤器 –> 截取请求的动作名称hello,并从struts.xml中查找 –>
找到后,实例化HelloAction动作类,每次都会创建新的实例 –> 调用对应的sayHello()动作方法,方法有返回值 –> 根据返回值找对应的结果视图 –> 找到结果jsp页面 –> 响应浏览器,展示结果
5、Struts2的配置文件加载时机和加载顺序?
答:
Struts2的配置文件的加载顺序:default.properties –> struts-default.xml –> struts-plugin.xml –> struts.xml –> struts.properties –> web.xml
存的是常量 拦截器、结果视图、默认的动作类 插件 我们自己写的 一般不用它 我们自己写的
加载文件的顺序必须是web.xml文件先加载的,读到了里面配置了一个Struts的核心控制器–过滤器,
然后该过滤器的init方法才去执行,它在执行的时候会初始化一些常量、拦截器、结果视图、默认的动作类、插件、配置的属性,给对应的属性赋值。
6、常量中struts.devMode是什么意思,如何配置?
答:
<constant name=”struts.devMode” value=”true”><constant/>
7、struts.xml配置文件中package的四个属性分别什么意思?
答:
extends属性:指定当前包的父包。
abstract属性:把包声明为一个抽象包。抽象包就是用来被继承的。只有没有<action>元素的包,才能被定义为抽象包。
namespace属性:名称空间。当指定了名称空间之后,访问路径就变成了:访问路径 = 名称空间 + 动作名称
8、访问带有名称空间的动作时,是如何查找的?例如: /user/abc/action1.action
答:
有 /user/abc ,再在当前包找动作名称,找不到,就找默认的名称空间中的动作名称,找不到,就报错,其余以此类推
找到了,就执行。
9、action元素的三个属性什么意思?
答:
class属性:指定动作类,即动作类全名。
method属性:指定要执行的动作方法,即动作类中的方法名称。
10、result元素的两个属性分别指的是什么?
答:
type属性:结果视图类型。
11、4个常用结果类型分别是什么?
答:
redirect:请求重定向(本动作下)
chain:请求转发到另一个动作
redirectAction:请求重定向到另一个动作
12、访问ServletAPI的两种方式?
答:
第二种方式:使用的是 依赖注入 的形式,把我们想要的对象注入进来,是由一个 ServletConfigInterceptor的拦截器 为我们做的。需要实现3个接口,实现其中的方法。
day25_02_学习回顾
答:
是由默认的 拦截器栈 中的一个 拦截器staticParams 来完成参数注入的。
示例: <param name=”username”>张三</param>
2、动作类和模型分开的动态封装请求参数,set和get方法是怎么调用的?
答:
setXxx
getXxx
或者
getXxx
getXxx
3、使用模型驱动,动态封装请求参数的要求是什么?
答:
1、动作类需要实现一个ModelDriver的接口,注意:该接口需要写泛型。
2、实现接口中的抽象方法getmodel()。
3、在使用模型驱动的时候,数据模型必须由我们自己来实例化。
4、实际开发中类型转换的两种情况是什么?
答:
写数据:(增、删、改)是String或String[]转换为其他类型。
读数据:(查)是其他类型转换为String。
5、Struts2中提供的常用类型转换分几类?
答:
1、基本数据类型 自动转换
2、日期类型:默认按照 本地日期格式 转换成(yyyy-MM–dd)
3、字符串数组:默认用 逗号+空格 ,连接成一个字符串
6、自定义类型转换器是如何注册的?(两种情况)
答:
在属性所属的javabean包下新建:
javabean名称-conversion.properties 文件
要转换的属性名称=类型装换器的全类名
示例:birthday=com.itheima.web.converter.MyTypeConverter
2、全局类型转换器,按照 要转换的数据类型 来注册的。
在顶层目录下新建:
xwork-conversion.properties 文件
要转换的数据类型=类型转换器的全类名
示例:java.util.Date=com.itheima.converter.MyTypeConverter
7、如何解决编程式验证使得动作类中的全部动作方法都验证?
答:
2、重新定义验证方法的名称,格式为:validate+动作名称,动作名称的首字母要大写哦!
8、声明式验证的分别可以基于什么?
答:
2、基于验证器的声明式验证:怎么验证 –> 验证谁 –> 验证结果
9、命名声明式验证xml文件名的两种方式,有什么不同?
答:
1、针对动作类中的 所有动作方法 进行验证:
在动作类所在的包中,建立一个 ActionClassName-validation.xml 的文件
示例:UserAction-validation.xml
2、针对动作类中的 某个动作方法 进行验证:
在动作类所在的包中建立一个 xml文件 ,名称为 ActionClassName-ActionName-validation.xml 注意:是动作名称,不是动作方法名称
示例:UserAction-register-validation.xml
day26_学习回顾
答:
主要文件名.properties(默认资源包)
2、Struts2中全局范围的资源包、包范围的资源包和动作类范围的资源包,哪个加载优先级高?页面上如何读取指定的消息资源包?
答:
包范围的资源包:package_zh_CN.properties
动作范围的资源包:Demo1Action_zh_CN.properties
动作类范围的资源包的优先级最高。
页面上使用标签 <s:text name=”xxx” /> 读取指定的消息资源包。
3、Struts2中拦截器的执行时机?
答:
执行结果视图之后,到序执行拦截器。
4、自定义拦截器的步骤是什么?
答:
b、在struts.xml中配置拦截器,注意拦截器必须先声明、再使用。
5、多个拦截器如何确定执行顺序?
答:
当有多个拦截器的时候,是由使用顺序决定执行顺序,与声明顺序无关。
6、自定义拦截器除了继承AbstractInterceptor还可以继承哪个?另一个有什么好处?
答:
好处:在struts的配置文件中,通过参数注入的方式,配置需要拦截哪些方法,和需要放过哪些方法。
7、文件上传是哪个拦截器为我们做的?如何限定上传文件的大小和类型?
答:
限定上传文件的大小:
1、在struts.xml中改变default.properties文件中的常量。常量是:maxSize
2、给Struts2默认的拦截器栈中的fileUpload拦截器注入参数。(此法行不通)
8、struts2中文件下载是由哪个结果类型完成的?需要我们提供什么参数?
答:
我们需要给Stream结果类型注入的参数是:
1、contextType:文件的MIME类型
2、contextDisposition:文件的下载方式
3、inputName:字节输入流
9、OGNL是什么?使用它能否访问普通方法?能否直接访问静态方法?
答:
能访问。
不能直接访问,需要开启允许静态方法访问的开关。开关名为:allowStaticMethodAccess
10、ActionContext和ValueStack什么时候创建?是否是线程安全的?
答:
因为每次把数据绑定到了线程局部变量(ThreadLocal)上。
11、ContextMap中的结构是什么样的?
答:
是一个Map集合中封装多个Map结合。
day27_学习回顾
1、ActionContext是什么结构?里面都有哪些数据?
2、ActionContext是如何保证数据线程安全的?
3、ValueStack是什么结构?
4、默认栈顶元素是什么?
5、ValueStack的setValue和set方法分别什么意思?
6、Struts2中,EL表达式是如何查找数据的?
7、iterator标签中var属性有什么作用?
8、#,$,%分别都有什么作用?
9、使用url标签中添加param标签是什么意思?
10、模型驱动是如何帮我们封装请求参数的?
11、在struts2中,如何防止表单重复提交?