1.strut2的类型转换
对于8个原生数据类型以及Date,String等常见类型,Struts2可以使用内建的类型转换器实现自动的转换,
但对于自定义的对象类型来说,就需要我们指定类型转换的方式了。
2自定义类型转换器
对于自定义的类型转换器来说需要提供3个信息:Action的名字、Action中待转换的属性名以及该属性对应的
类型转换器。
3.局部转换器
可以使用struts2框架自带的类型转换器StrutsTypeConverter简化类型转换代码的编写,StrutsTypeConverter
继承于DefaultConverter父类,且提供了两个抽象方法:converFromString和converterToString,分别表示
从页面的字符串转换为后台对象以及从后台对象转换为页面的字符串,我们只需实现这两个抽象方法。
4.全局类型转换
在src目录下新建xwork-conversion.properties,该文件的内容是待转换的类=转换器的名字。如:
com.shengsiyuan.bean.User=com.shengsiyuan.converter.UserConverter.
5.struts2也支持自定义方法
在struts.xml的action元素内定义method属性,属性值即为待执行的方法。注意:该方法的声明要和execute
一致,但不推荐使用这种方式,它容易导致Action代码混乱。
6.执行流程
a)首先执行类型转换
b)然后进行输入效验(执行validate方法)
c)如果在上述过程中出现任何错误,都不会再继续执行execute方法,会转向strut.xml中该action的名为
input的result所对应的页面。
7.ActionSupport类的addActionError()方法的实现:首先创建一个ArrayList对象,然后将错误信息添加
到ArrayList对象中。
8.当调用getActionErrors()方式返回Action级别的错误信息时,返回的实际上是集合的一个副本而不是
本身,因此对集合副本调用clear()方法清除的依旧是副本中的元素而非原集合中的元素,此时原集合中
的内容没有收到任何影响。
9.当在Action()方法中指定了自定义的execute()方法时,首先会执行自定义的execute方法所对应的输入
效验方法,然后再去执行validate()方式,执行完毕后出现任何错误都不在执行自定义的execute()方法,
流程转向input这个名字对应的页面上。
10.自定义field级别的错误提示消息(类型转换错误)
a)新建一个以action类名命名properties文件,如LoginAction.properties
b)然后在该文件属性中指定每一个出错字段的错误消息.如:invalid.fieldvalue.age=age convertfail
11.struts2的效验框架(有效的xml文件)。
具体分为字段优先效验器和效验器优先效验器
12.对于国际化的资源文件,其命名规则是:package_语言名_国家名。如:package_zh_CN,package_en_US
13.struts2校验框架执行的先后顺序(在这之前先执行类型转换)
a)首先执行校验框架(xml文件)
b)自定义的校验方法
c)执行validate方法
14.对于struts.xml文件的结果配置来说,局部高于全局
15.我们可以再action中定义异常和结果,也可以定义全局的异常和结果,局部总是高于全局,如果定义为全局,可以
被所有action所共有,而局部的异常和结果只能被当前的action所独享,不能被其他action所共享
16.属性驱动和模型驱动的比较
a)属性驱动灵活,准确;模型驱动不灵活,应为很多时候,页面所传过来的参数并不属于模型中的属性。
b)模型驱动更符合面向对象的编程风格,使得我们获得的是对象而不是一个个离散的值。
小结:推荐使用属性驱动
17.服务器端代码的单元测试有两种模式:
1)容器内测试(Jetty)
2)Mock测试(继承HttpServletRequest、HttpServletResponse、HttpSesson等ServletAPI)
18.Preparable接口的作用是让Action完成一些初始化工作,这些初始化工作是放在Preparable接口的Prepare()
方法中完成的,该方法在execute之前执行得到调用。
18.防止表单重复提交的两种方式
1)通过重定向
2)通过Session Token(Session令牌)
19.定义拦截器时可以直接继承AbstractInterceptor抽象类(该类实现了Interceptor接口,并且对init和destroy
方法进行了空实现),然后实现其抽象方法intercept即可。
20.方法拦截器(可以对指定方法进行拦截的拦截器)
如果既没有指定includeMethods参数,也没有指定excludeMethods参数,那么所有的方法都会被拦截,如果仅仅指定
了includeMethods参数,那么只会拦截指定了的方法。
21.package元素的abstract属性表示包是抽象的,不能直接使用,需要由子包继承才可以使用。struts-default这个
package就是abstract的,因此需要我们继承这个包来使用。
22.package元素的namespace属性起到命名空间分割的作用,通常用namesoace的属性值定义成页面所在的目录名。
23.进行文件上传时,必须将表单的method属性设为post,将enctype属性设为multipart/form-data。
24.struts2在进行文件上传时,实际上是通过两个步骤实现的:
1)首先将客户端上传的文件保存到struts.multipart.saveDir键所指的目录中,如果该键所对应的目录不存在,
那么就保存到javax.servlet.context.tempdir环境变量所指定的目录中。
2)Action中所定义的File类型变量file实际上指向的是临时目录中的临时文件,然后服务器通过IO的方式将临时
文件写入指定的服务端目录中。
25.struts2的文件上传实际上是通过拦截器完成的。
对于8个原生数据类型以及Date,String等常见类型,Struts2可以使用内建的类型转换器实现自动的转换,
但对于自定义的对象类型来说,就需要我们指定类型转换的方式了。
2自定义类型转换器
对于自定义的类型转换器来说需要提供3个信息:Action的名字、Action中待转换的属性名以及该属性对应的
类型转换器。
3.局部转换器
可以使用struts2框架自带的类型转换器StrutsTypeConverter简化类型转换代码的编写,StrutsTypeConverter
继承于DefaultConverter父类,且提供了两个抽象方法:converFromString和converterToString,分别表示
从页面的字符串转换为后台对象以及从后台对象转换为页面的字符串,我们只需实现这两个抽象方法。
4.全局类型转换
在src目录下新建xwork-conversion.properties,该文件的内容是待转换的类=转换器的名字。如:
com.shengsiyuan.bean.User=com.shengsiyuan.converter.UserConverter.
5.struts2也支持自定义方法
在struts.xml的action元素内定义method属性,属性值即为待执行的方法。注意:该方法的声明要和execute
一致,但不推荐使用这种方式,它容易导致Action代码混乱。
6.执行流程
a)首先执行类型转换
b)然后进行输入效验(执行validate方法)
c)如果在上述过程中出现任何错误,都不会再继续执行execute方法,会转向strut.xml中该action的名为
input的result所对应的页面。
7.ActionSupport类的addActionError()方法的实现:首先创建一个ArrayList对象,然后将错误信息添加
到ArrayList对象中。
8.当调用getActionErrors()方式返回Action级别的错误信息时,返回的实际上是集合的一个副本而不是
本身,因此对集合副本调用clear()方法清除的依旧是副本中的元素而非原集合中的元素,此时原集合中
的内容没有收到任何影响。
9.当在Action()方法中指定了自定义的execute()方法时,首先会执行自定义的execute方法所对应的输入
效验方法,然后再去执行validate()方式,执行完毕后出现任何错误都不在执行自定义的execute()方法,
流程转向input这个名字对应的页面上。
10.自定义field级别的错误提示消息(类型转换错误)
a)新建一个以action类名命名properties文件,如LoginAction.properties
b)然后在该文件属性中指定每一个出错字段的错误消息.如:invalid.fieldvalue.age=age convertfail
11.struts2的效验框架(有效的xml文件)。
具体分为字段优先效验器和效验器优先效验器
12.对于国际化的资源文件,其命名规则是:package_语言名_国家名。如:package_zh_CN,package_en_US
13.struts2校验框架执行的先后顺序(在这之前先执行类型转换)
a)首先执行校验框架(xml文件)
b)自定义的校验方法
c)执行validate方法
14.对于struts.xml文件的结果配置来说,局部高于全局
15.我们可以再action中定义异常和结果,也可以定义全局的异常和结果,局部总是高于全局,如果定义为全局,可以
被所有action所共有,而局部的异常和结果只能被当前的action所独享,不能被其他action所共享
16.属性驱动和模型驱动的比较
a)属性驱动灵活,准确;模型驱动不灵活,应为很多时候,页面所传过来的参数并不属于模型中的属性。
b)模型驱动更符合面向对象的编程风格,使得我们获得的是对象而不是一个个离散的值。
小结:推荐使用属性驱动
17.服务器端代码的单元测试有两种模式:
1)容器内测试(Jetty)
2)Mock测试(继承HttpServletRequest、HttpServletResponse、HttpSesson等ServletAPI)
18.Preparable接口的作用是让Action完成一些初始化工作,这些初始化工作是放在Preparable接口的Prepare()
方法中完成的,该方法在execute之前执行得到调用。
18.防止表单重复提交的两种方式
1)通过重定向
2)通过Session Token(Session令牌)
19.定义拦截器时可以直接继承AbstractInterceptor抽象类(该类实现了Interceptor接口,并且对init和destroy
方法进行了空实现),然后实现其抽象方法intercept即可。
20.方法拦截器(可以对指定方法进行拦截的拦截器)
如果既没有指定includeMethods参数,也没有指定excludeMethods参数,那么所有的方法都会被拦截,如果仅仅指定
了includeMethods参数,那么只会拦截指定了的方法。
21.package元素的abstract属性表示包是抽象的,不能直接使用,需要由子包继承才可以使用。struts-default这个
package就是abstract的,因此需要我们继承这个包来使用。
22.package元素的namespace属性起到命名空间分割的作用,通常用namesoace的属性值定义成页面所在的目录名。
23.进行文件上传时,必须将表单的method属性设为post,将enctype属性设为multipart/form-data。
24.struts2在进行文件上传时,实际上是通过两个步骤实现的:
1)首先将客户端上传的文件保存到struts.multipart.saveDir键所指的目录中,如果该键所对应的目录不存在,
那么就保存到javax.servlet.context.tempdir环境变量所指定的目录中。
2)Action中所定义的File类型变量file实际上指向的是临时目录中的临时文件,然后服务器通过IO的方式将临时
文件写入指定的服务端目录中。
25.struts2的文件上传实际上是通过拦截器完成的。