1,MVC模式的回顾:
①对于浏览器的每一个请求,服务器端都要编写一个什么样的程序来处理?
·Web容器会根据请求的URL交给一个Servlet进行处理。Servlet处理完了之后会送一个结果给浏览器,我们可以在Servlet内部通过Java代码拼凑出浏览器所要显示的代码,Servlet不是直接将结果返回给浏览器而是返回给Web容器,因为是Web容器调用Servlet,Web容器传给Servlet一些相应的API(request/response)类,Servlet的操作是针对Web容器进行操作的,Servlet调用response对象,往Web容器的response里写东西,web容器拿到这些东西的时候,再把她变成html内容送给浏览器。Servlet可以生成送给客户端的html代码,但是这种编程有很大的局限,因为修改页面时,需要到Servlet的Java源代码进行修改,将Java代码和html混合在一起不便于修改和维护。所以不要将Servlet处理后的数据直接交给Web容器,而是通过一个值对象(VO)进行保存,也就是JavaBean,不需要Servlet生成浏览器所需要html内容,而是通过jsp把JavaBean里的值提取出来嵌套在html里,这样的话修改html的时候,就不要修改Servlet的java代码。只需要修改jsp,这样就使得java代码与html分离了。这就是MVC。
②Servlet生成的JavaBean数据是如何传递给jsp页面的呢?
通过把数据存在request的作用域里面,jsp就从request里的作用域里面取。
2,什么是Struts?
Struts是根据MVC模式设计出来的Web层框架,
其实就是一个大大的Servlet(ActionServlet),我们就可以在web.xml文件中将符合某种特征的所有请求交给这Servlet处理,这Servlet再参照一个配置文件
(通常为/WEB-INF/struts-config.xml)将各个请求分别分配给不同的action进行处理
在一个程序里面可能使用许多的web层框架,这个地址是什么进行处理的,在web.xml文件里查看映射是什么。
为了防止Struts配置文件臃肿,在web.xml配置多Struts配置文件,也可以通过*通配符进行配置,也可以使用DispatchAction
3,我们以前不用Struts时候,对于一个请求,我们必须通过编写一个Servlet来接受和处理请求,现在使用Struts,对于每一个请求我们需要action类,这样有什么好处?
ActionServlet把请求交给action去处理前,会将请求参数封装成formBean对象(即一个java类,一个请求参数对应一个java类的属性),然后把formBean对象交给action。在交给action之前,有可能会调用formBean对象的validate方法进行校验,如果校验失败则返回错误页面由input属性指定,如果成功就把formBean对象交给action的execute方法(该方法的返回值为ActionForward),如果不想进行校验,在配置action是有一个属性validate默认为true,需要校验。
4,Action类里的execute方法返回值为什么是ActionForward,而不是jsp的名称?
ActionForward对象通过struts-config.xml中的配置关联到jsp的逻辑名称,这样有助于解耦,如果想换一个jsp只需要修改配置文件。
5路径:
如在配置action的时候path="/xxxAction"和href="/projectName/xxx.do".path相当于是给自己家里看的,所以不要projectName而href相当于是给浏览器用的所以要用projectName。
6,【注意】标签是在标签jar文件里META-INF下tlds里配置的。可以在那里找到标签的引用路径。
7,【注意】链接的3中用法:
①<a href = "/projectName/ResUser.do">注册(太差)</a>
②<a href = "${pageContext.request.contextpath}/ResUser.do">注册(一般)</a>
③<html:link action="/ResUserUI">注册(很好)</html> struts标签。可以动态修改*.do,如可以把do改成html
<html:link action="/ResUserUI">注册(很好)</html>的好处:
·不用关心web的路径和ActionServlet映射的路径。
·自动附加jsessionid参数进行URI重写。
·可以参数信息进行URL编码,
8,【注意】什么是web变量:就是放在4个作用域(page,request,session,application)的变量。
9,标签:
<html:link>
<logic:forward>
<logic:redirect>
<html:rewrite>
<bean:message key ,bundle的用法>
<html:link>和<html:rewrite>的区别:<html:link>生成完整的超链接(其链接为绝对路径)如:<a href="/xxx/aaa.do"></a>,<html:rewrite>生成相对路径如:/xxx/aaa.do
10,【注意】forward和redirect两种跳转的区别(转发和重定向):
forward是转发,比如一个请求访问我,而我没有他要的结果,我就到别的页面把他要的内容拿过来给他,
redirect是重定向,比如一个请求访问我,而我没有他要的结果,我就告诉他我没有,别的地方有,所以他要请求两次才能得到结果。
11,注意事项:struts-config.xml文件中的<action>元素的path属性必须以/开头,forward也是如此,
总之,在web应用程序中记住路径都要以/开头。
12,【注意】在Action类中能不能用response(response.getWriter())对象输出数据?
能,但是不能在执行execute方法返回ActionForward对象,要返回一个空(Null)。
13,在修改了代码后,都要都要重启一下服务,我们可以修改一下web.xml文件(最好的方法),再保存。
也可以在WebRoot目录下的META-INF建立context.xml文件(只会对修改Action类起作用),再在此文件里写<Context reloadable="true"></Context>
14,【注意】如果一个Action关联了一个FormBean那么,那么当浏览器请求这个Action时候,Struts框架将创建这个FormBean保存在web作用域里面,并且把提交的参数填充给FormBean对象。为什么把FormBean对象存放在web作用域里面?
(因为以便在jsp里可以使用,通过Action的attribute属性指定作用域的key,value为FormBean对象,如果没有配置attribute属性,则attribute的属性默认为aciton是name属性值,在jsp可以这样访问,attribute的值.FormBean对象的属性)
【注意】在配置aciton时候,FormBean默认是保存在:session里面。怎么查看?EL表达式遍历。
15,【注意】什么时候使用Serializable接口?
当需要把内容保存在硬盘上的时候,我们也可以编写自己的java代码来保存和还原,也可以让java的OutputStream的writerObject()帮我们做,这时候就需要实现Serializable接口。这样javac编译时候就会对它进行特殊处理,编译的类才会被writerObject方法操作。只要是要将一个对象向外序列化出去,如复制到其他的网络计算机上去,存储到硬盘上去,就需要实现Serializable接口。(ActionForm类实现了Serializable接口)
如果在FormBean里面有复杂的属性(属性的返回值为类(User)),那么那个类必须实例化,且在编写那个类的时候的时候实现Serializable接口。并且在编写表单的时候如果文本框对应的是复杂的属性需要用name="user.username"。
【快捷键:】ctrl+t列出类的继承(实现)关系图。ctrl+shift+t打开类的信息。ctrl+o打开类的大纲。
16,表单校验(要掌握<html:error>的property、prefix、suffix、header、footer属性的用法,还要明白validate方法返回的ActionErrors对象保存在request作用域)和业务逻辑校验的流程:
表单校验:请求参数--->ActionForm--->ActionForm.validate()--->如果表单错误则返回errors--->input页面--->显示错误信息。
业务逻辑校验:请求参数--->ActionForm--->ActionForm.validate()--->表单校验成功则调用Action.execute()--->逻辑校验错误--->产生errors--->返回input页面显示错误信息
17,【(ActionMessages类的设计思想)】ActionErrors和ActionMessages的区别:
好比程序需要一个好人和一个坏人,最初设计了一个好人和一个坏人类,后来发现只需要设计一个类就可以了,只是把一个人贴上好人的标签另一个贴上坏人的标签,完全没有必须设计两个类,错误提示信息和普通信息都是ActionMessages,它可以表示错误信息也可以表示普通信息,如果想在jsp页面显示普通信息不是使用<html:error>而是使用<html:message>
18,基于上面的解释,那么FormBean的validate方法的返回值是ActionErrors,为什么不是ActionMessages呢?
因为作为一个接口的方法一旦对外公布,及时后来发现不妥,也不能修改这个方法
,否则将引起以前调用该方法的程序就会出现问题。
19,【注意】<html:checkbox></html:checkbox>
①复选框如果没有勾上,说明这个标签等于没有。
如果我第一次把复选框勾上,通过了校验,成功了。第二次不把复选框勾上,并且没有通过校验回到输入页面,此时候复选框却勾上了,为什么?
因为第一次提交的时候<html:checkbox>的属性值对应的FormBean属性存放在session范围内(此时已勾上),第二次没有通过验证回到input页面,又重新把session中的FormBean对象的值重新设置到文本框(复选框)。也许有人会说,第二次提交的时候,没有勾上,把false传给FormBean属性,其实是错误的(什么也没有传过去),解释:①
解决方案:
可以在FormBean重写reset方法,把<html:checkbox>的属性值对应的FormBean属性设置为false。
reset方法会在提交请求前把存在session中FormBean的属性(指定的属性)值清空
【注意】 FormBean默认放在session,但是应用时一般放在request内,
因为放在session内太浪费了,但是什么时候用session呢?
假如有一个FormBean有id,name,age,birthday,username,password属性,
如果第一次请求填写id,name,age,birthday字段,
第二次请求填写username,password字段,
如果FormBean存放在request中For只有username和Password属性的值,因为第一次请求的FormBean属性值被销毁了,
如果想保存完整的FormBean就需要放在session中保存。
20,【注意】:<html:form></html:form>表单的3个作用:
㈠:生成html文档的form标签,其中focus属性,还可以生成javascript代码。
㈡:获取action属性关联的session域中的FormBean,存在则获取,不存在则会新创建一个,再把他以一个特殊关键字存放在request作用域。以便<html:xxx>标签使用。所以使用Struts1的<html:form>表单一定要在配置action时关联相应的FormBean
㈢:检查session中是否存在Token,是则生成隐藏字段,以防止表单重复提交(要明白其原理)。
21,【注意】plugin(插件,需要实现PluGin接口)的作用:将自己的一些程序代码插入进ActionServlet的生命周期,即在ActionServlet启动和停止的过程中加入自己的代码,但不需要编写ActionServlet的子类,相比ContextListener的好处在于可以获得Struts内部的一些特定的信息。 插件可以用来注册转换器等。
也可以继承ActionServlet,注册转换器。
22,定制自己的【RequestProcessor】类,当一个请求交给ActionServlet进行处理,其实就是交给RequestProcessor进行处理的。可用于代替filter处理乱码问题。
23,隐形异常:RunTimeException的子类即系统异常,不用声明,
说说系统异常和普通异常的区别:系统异常是RunTimeException的子类,这些异常不用在方法的后面声明,
24,struts1异常处理最佳模式,模板方法设计模式。
25,DispatchAtion不能覆盖execute方法,为什么?因为如果覆写了,execute方法就不会去找哪些自定义的方法,
比如我们对某个对象有增删改查的操作,不想所定义那么多Action类,就可以使用DispatchAction类,我们把n个请求放在一个Action里,那么当我们访问他的时候是访问哪个方法呢?由struts-config.xml的action的parameter指定。
【注意】当一个请求来了DispatchAction首先调用execute方法,虽然没有,但是DispatchAction的父类有,再由execute方法再找到对应的操作。
DispatchAction这个类,是抽象的然而他的方法全不是抽象的。为什么?
这是一种思想,这个类定义成抽象的就是告诉用户这个类是给他的子类用的不是直接使用的。
【注意当需要form表单需要校验的时候,在配置的时候一定要配置input属性】
【注意】DispatchAction类当需要form表单校验的时候,那么他所有的方法都需要校验,然而在有的情况不需要校验,
所以把需要校验的方法的放在一个需要校验的DispatchAction的子类中,把不需要校验的方法放在定一个不需要校验的DispatchAction子类中。
26,ForwardAction类,当需要一个action只用于跳转页面,那么我们不需要去编写,可以直接用ForwardAction类就可以。
通过parameter属性指定页面路径(需要type属性),如果用forward指定页面路径,就不需要type属性。
27,【注意】当我们在xxx.java文件里写上磁盘的路径时,需要双斜杠(//),在配置文件里写磁盘路径时用单斜杠(/)为什么?
因为在xxx.java文件里的//是给javac看的,而配置文件里的/不是给javac看的。
28,如果上传文件时候,文件超过限定,那么表单提交给FormBean的数据全是空。最好立马回到input页面。
29,如果在xxx.properties中写了中文,如username=张三..... password=.....,那么需要把xxx.properties文件进行gbk编码,我们可以在cmd.exe中,进入xxx.properties所在的位置,然后输入:native2ascii -encoding gbk xxx.properties xxx_zh_CN.properties(编译后的文件名称)
【注意】如果native2ascii不是有效命令,需要配置ClassPath路劲:set path=E:\Java\jdk1.6.0_22\bin;%path%
30,ValidatorForm、ValidatorActionForm、DynaValidatorForm、DynaValidatorActionForm类的区别?
如果两个Action关联的是同一个ActionForm,但是他们的校验规则可能不一样,例如增加用户和修改用户可以使用统一个Action,但是修改用户不要校验密码.这时候就需要使用ValidatorActionForm类,在配置validation.xml文件时候把orm的name属性为action的path属性值。但是他到底是怎么知道调用哪个规则呢?在内部ValidatorActionForm是通过:
public String getValidationKey(ActionMapping mapping,
HttpServletRequest request) {
return mapping.getPath();
}得知的。
在使用ValidatorForm时候,在配置validation.xml文件时候把form的name属性为action的attribute(Web作用域的)属性值,但是他到底是怎么知道调用哪个FormBean呢?在内部是通过:
public String getValidationKey(ActionMapping mapping,
HttpServletRequest request) {
return mapping.getAttribute();
}得知的。
我们知道DynaActionForm类没有校验功能,因为没有他没有validate方法,而DynaValidatorForm是他的子类,他有validate方法,所以她有校验功能。DynaValidatorForm和DynaValidatorActionForm类的区别就像ValidatorForm和ValidatorActionForm类的区别一样。
①对于浏览器的每一个请求,服务器端都要编写一个什么样的程序来处理?
·Web容器会根据请求的URL交给一个Servlet进行处理。Servlet处理完了之后会送一个结果给浏览器,我们可以在Servlet内部通过Java代码拼凑出浏览器所要显示的代码,Servlet不是直接将结果返回给浏览器而是返回给Web容器,因为是Web容器调用Servlet,Web容器传给Servlet一些相应的API(request/response)类,Servlet的操作是针对Web容器进行操作的,Servlet调用response对象,往Web容器的response里写东西,web容器拿到这些东西的时候,再把她变成html内容送给浏览器。Servlet可以生成送给客户端的html代码,但是这种编程有很大的局限,因为修改页面时,需要到Servlet的Java源代码进行修改,将Java代码和html混合在一起不便于修改和维护。所以不要将Servlet处理后的数据直接交给Web容器,而是通过一个值对象(VO)进行保存,也就是JavaBean,不需要Servlet生成浏览器所需要html内容,而是通过jsp把JavaBean里的值提取出来嵌套在html里,这样的话修改html的时候,就不要修改Servlet的java代码。只需要修改jsp,这样就使得java代码与html分离了。这就是MVC。
②Servlet生成的JavaBean数据是如何传递给jsp页面的呢?
通过把数据存在request的作用域里面,jsp就从request里的作用域里面取。
2,什么是Struts?
Struts是根据MVC模式设计出来的Web层框架,
其实就是一个大大的Servlet(ActionServlet),我们就可以在web.xml文件中将符合某种特征的所有请求交给这Servlet处理,这Servlet再参照一个配置文件
(通常为/WEB-INF/struts-config.xml)将各个请求分别分配给不同的action进行处理
在一个程序里面可能使用许多的web层框架,这个地址是什么进行处理的,在web.xml文件里查看映射是什么。
为了防止Struts配置文件臃肿,在web.xml配置多Struts配置文件,也可以通过*通配符进行配置,也可以使用DispatchAction
3,我们以前不用Struts时候,对于一个请求,我们必须通过编写一个Servlet来接受和处理请求,现在使用Struts,对于每一个请求我们需要action类,这样有什么好处?
ActionServlet把请求交给action去处理前,会将请求参数封装成formBean对象(即一个java类,一个请求参数对应一个java类的属性),然后把formBean对象交给action。在交给action之前,有可能会调用formBean对象的validate方法进行校验,如果校验失败则返回错误页面由input属性指定,如果成功就把formBean对象交给action的execute方法(该方法的返回值为ActionForward),如果不想进行校验,在配置action是有一个属性validate默认为true,需要校验。
4,Action类里的execute方法返回值为什么是ActionForward,而不是jsp的名称?
ActionForward对象通过struts-config.xml中的配置关联到jsp的逻辑名称,这样有助于解耦,如果想换一个jsp只需要修改配置文件。
5路径:
如在配置action的时候path="/xxxAction"和href="/projectName/xxx.do".path相当于是给自己家里看的,所以不要projectName而href相当于是给浏览器用的所以要用projectName。
6,【注意】标签是在标签jar文件里META-INF下tlds里配置的。可以在那里找到标签的引用路径。
7,【注意】链接的3中用法:
①<a href = "/projectName/ResUser.do">注册(太差)</a>
②<a href = "${pageContext.request.contextpath}/ResUser.do">注册(一般)</a>
③<html:link action="/ResUserUI">注册(很好)</html> struts标签。可以动态修改*.do,如可以把do改成html
<html:link action="/ResUserUI">注册(很好)</html>的好处:
·不用关心web的路径和ActionServlet映射的路径。
·自动附加jsessionid参数进行URI重写。
·可以参数信息进行URL编码,
8,【注意】什么是web变量:就是放在4个作用域(page,request,session,application)的变量。
9,标签:
<html:link>
<logic:forward>
<logic:redirect>
<html:rewrite>
<bean:message key ,bundle的用法>
<html:link>和<html:rewrite>的区别:<html:link>生成完整的超链接(其链接为绝对路径)如:<a href="/xxx/aaa.do"></a>,<html:rewrite>生成相对路径如:/xxx/aaa.do
10,【注意】forward和redirect两种跳转的区别(转发和重定向):
forward是转发,比如一个请求访问我,而我没有他要的结果,我就到别的页面把他要的内容拿过来给他,
redirect是重定向,比如一个请求访问我,而我没有他要的结果,我就告诉他我没有,别的地方有,所以他要请求两次才能得到结果。
11,注意事项:struts-config.xml文件中的<action>元素的path属性必须以/开头,forward也是如此,
总之,在web应用程序中记住路径都要以/开头。
12,【注意】在Action类中能不能用response(response.getWriter())对象输出数据?
能,但是不能在执行execute方法返回ActionForward对象,要返回一个空(Null)。
13,在修改了代码后,都要都要重启一下服务,我们可以修改一下web.xml文件(最好的方法),再保存。
也可以在WebRoot目录下的META-INF建立context.xml文件(只会对修改Action类起作用),再在此文件里写<Context reloadable="true"></Context>
14,【注意】如果一个Action关联了一个FormBean那么,那么当浏览器请求这个Action时候,Struts框架将创建这个FormBean保存在web作用域里面,并且把提交的参数填充给FormBean对象。为什么把FormBean对象存放在web作用域里面?
(因为以便在jsp里可以使用,通过Action的attribute属性指定作用域的key,value为FormBean对象,如果没有配置attribute属性,则attribute的属性默认为aciton是name属性值,在jsp可以这样访问,attribute的值.FormBean对象的属性)
【注意】在配置aciton时候,FormBean默认是保存在:session里面。怎么查看?EL表达式遍历。
15,【注意】什么时候使用Serializable接口?
当需要把内容保存在硬盘上的时候,我们也可以编写自己的java代码来保存和还原,也可以让java的OutputStream的writerObject()帮我们做,这时候就需要实现Serializable接口。这样javac编译时候就会对它进行特殊处理,编译的类才会被writerObject方法操作。只要是要将一个对象向外序列化出去,如复制到其他的网络计算机上去,存储到硬盘上去,就需要实现Serializable接口。(ActionForm类实现了Serializable接口)
如果在FormBean里面有复杂的属性(属性的返回值为类(User)),那么那个类必须实例化,且在编写那个类的时候的时候实现Serializable接口。并且在编写表单的时候如果文本框对应的是复杂的属性需要用name="user.username"。
【快捷键:】ctrl+t列出类的继承(实现)关系图。ctrl+shift+t打开类的信息。ctrl+o打开类的大纲。
16,表单校验(要掌握<html:error>的property、prefix、suffix、header、footer属性的用法,还要明白validate方法返回的ActionErrors对象保存在request作用域)和业务逻辑校验的流程:
表单校验:请求参数--->ActionForm--->ActionForm.validate()--->如果表单错误则返回errors--->input页面--->显示错误信息。
业务逻辑校验:请求参数--->ActionForm--->ActionForm.validate()--->表单校验成功则调用Action.execute()--->逻辑校验错误--->产生errors--->返回input页面显示错误信息
17,【(ActionMessages类的设计思想)】ActionErrors和ActionMessages的区别:
好比程序需要一个好人和一个坏人,最初设计了一个好人和一个坏人类,后来发现只需要设计一个类就可以了,只是把一个人贴上好人的标签另一个贴上坏人的标签,完全没有必须设计两个类,错误提示信息和普通信息都是ActionMessages,它可以表示错误信息也可以表示普通信息,如果想在jsp页面显示普通信息不是使用<html:error>而是使用<html:message>
18,基于上面的解释,那么FormBean的validate方法的返回值是ActionErrors,为什么不是ActionMessages呢?
因为作为一个接口的方法一旦对外公布,及时后来发现不妥,也不能修改这个方法
,否则将引起以前调用该方法的程序就会出现问题。
19,【注意】<html:checkbox></html:checkbox>
①复选框如果没有勾上,说明这个标签等于没有。
如果我第一次把复选框勾上,通过了校验,成功了。第二次不把复选框勾上,并且没有通过校验回到输入页面,此时候复选框却勾上了,为什么?
因为第一次提交的时候<html:checkbox>的属性值对应的FormBean属性存放在session范围内(此时已勾上),第二次没有通过验证回到input页面,又重新把session中的FormBean对象的值重新设置到文本框(复选框)。也许有人会说,第二次提交的时候,没有勾上,把false传给FormBean属性,其实是错误的(什么也没有传过去),解释:①
解决方案:
可以在FormBean重写reset方法,把<html:checkbox>的属性值对应的FormBean属性设置为false。
reset方法会在提交请求前把存在session中FormBean的属性(指定的属性)值清空
【注意】 FormBean默认放在session,但是应用时一般放在request内,
因为放在session内太浪费了,但是什么时候用session呢?
假如有一个FormBean有id,name,age,birthday,username,password属性,
如果第一次请求填写id,name,age,birthday字段,
第二次请求填写username,password字段,
如果FormBean存放在request中For只有username和Password属性的值,因为第一次请求的FormBean属性值被销毁了,
如果想保存完整的FormBean就需要放在session中保存。
20,【注意】:<html:form></html:form>表单的3个作用:
㈠:生成html文档的form标签,其中focus属性,还可以生成javascript代码。
㈡:获取action属性关联的session域中的FormBean,存在则获取,不存在则会新创建一个,再把他以一个特殊关键字存放在request作用域。以便<html:xxx>标签使用。所以使用Struts1的<html:form>表单一定要在配置action时关联相应的FormBean
㈢:检查session中是否存在Token,是则生成隐藏字段,以防止表单重复提交(要明白其原理)。
21,【注意】plugin(插件,需要实现PluGin接口)的作用:将自己的一些程序代码插入进ActionServlet的生命周期,即在ActionServlet启动和停止的过程中加入自己的代码,但不需要编写ActionServlet的子类,相比ContextListener的好处在于可以获得Struts内部的一些特定的信息。 插件可以用来注册转换器等。
也可以继承ActionServlet,注册转换器。
22,定制自己的【RequestProcessor】类,当一个请求交给ActionServlet进行处理,其实就是交给RequestProcessor进行处理的。可用于代替filter处理乱码问题。
23,隐形异常:RunTimeException的子类即系统异常,不用声明,
说说系统异常和普通异常的区别:系统异常是RunTimeException的子类,这些异常不用在方法的后面声明,
24,struts1异常处理最佳模式,模板方法设计模式。
25,DispatchAtion不能覆盖execute方法,为什么?因为如果覆写了,execute方法就不会去找哪些自定义的方法,
比如我们对某个对象有增删改查的操作,不想所定义那么多Action类,就可以使用DispatchAction类,我们把n个请求放在一个Action里,那么当我们访问他的时候是访问哪个方法呢?由struts-config.xml的action的parameter指定。
【注意】当一个请求来了DispatchAction首先调用execute方法,虽然没有,但是DispatchAction的父类有,再由execute方法再找到对应的操作。
DispatchAction这个类,是抽象的然而他的方法全不是抽象的。为什么?
这是一种思想,这个类定义成抽象的就是告诉用户这个类是给他的子类用的不是直接使用的。
【注意当需要form表单需要校验的时候,在配置的时候一定要配置input属性】
【注意】DispatchAction类当需要form表单校验的时候,那么他所有的方法都需要校验,然而在有的情况不需要校验,
所以把需要校验的方法的放在一个需要校验的DispatchAction的子类中,把不需要校验的方法放在定一个不需要校验的DispatchAction子类中。
26,ForwardAction类,当需要一个action只用于跳转页面,那么我们不需要去编写,可以直接用ForwardAction类就可以。
通过parameter属性指定页面路径(需要type属性),如果用forward指定页面路径,就不需要type属性。
27,【注意】当我们在xxx.java文件里写上磁盘的路径时,需要双斜杠(//),在配置文件里写磁盘路径时用单斜杠(/)为什么?
因为在xxx.java文件里的//是给javac看的,而配置文件里的/不是给javac看的。
28,如果上传文件时候,文件超过限定,那么表单提交给FormBean的数据全是空。最好立马回到input页面。
29,如果在xxx.properties中写了中文,如username=张三..... password=.....,那么需要把xxx.properties文件进行gbk编码,我们可以在cmd.exe中,进入xxx.properties所在的位置,然后输入:native2ascii -encoding gbk xxx.properties xxx_zh_CN.properties(编译后的文件名称)
【注意】如果native2ascii不是有效命令,需要配置ClassPath路劲:set path=E:\Java\jdk1.6.0_22\bin;%path%
30,ValidatorForm、ValidatorActionForm、DynaValidatorForm、DynaValidatorActionForm类的区别?
如果两个Action关联的是同一个ActionForm,但是他们的校验规则可能不一样,例如增加用户和修改用户可以使用统一个Action,但是修改用户不要校验密码.这时候就需要使用ValidatorActionForm类,在配置validation.xml文件时候把orm的name属性为action的path属性值。但是他到底是怎么知道调用哪个规则呢?在内部ValidatorActionForm是通过:
public String getValidationKey(ActionMapping mapping,
HttpServletRequest request) {
return mapping.getPath();
}得知的。
在使用ValidatorForm时候,在配置validation.xml文件时候把form的name属性为action的attribute(Web作用域的)属性值,但是他到底是怎么知道调用哪个FormBean呢?在内部是通过:
public String getValidationKey(ActionMapping mapping,
HttpServletRequest request) {
return mapping.getAttribute();
}得知的。
我们知道DynaActionForm类没有校验功能,因为没有他没有validate方法,而DynaValidatorForm是他的子类,他有validate方法,所以她有校验功能。DynaValidatorForm和DynaValidatorActionForm类的区别就像ValidatorForm和ValidatorActionForm类的区别一样。