1、关于表单校验配置文件的正确使用。
(1)JSP设置
a、 action中只写请求action的名字,不写.action后缀。
如:<s:form action="addCompany">
如果有.action后缀,则不生成客户端校验
b、 请求的action名称一般和实现方法同名
如:<action name="addCompany" method="addCompany" class="companyAction">
c、表单的validate属性设置为true
<s:form action="addCompany" validate="true">
(2)XML配置文件
a、命名格式
如果Action只有默认的execute()处理方法,命名格式为:ActionName-validation.xml
如:CompanyAction-validation.xml
如果请求的action只是Action处理类的某个方法,命名格式为:ActionName-methodName-validation.xml
如:CompanyAction-addCompany-validation.xml
b、存储路径
与相应的Action存放路径相同。
c、如果配置不能满足校验,可以在action中启用validate验证方法。如:
public void validateAddEducation() {
// 判断日期输入格式是否正确
String dateStar = "";
String dateS = "";
if (education.getStartDate() != null) {
dateStar = DateUtils.formatDate(education.getStartDate());
if (dateStar.equals(Constant.DATE_FOMART_ERROR_DEFAULT)) {
addFieldError("education.startDate", "开始日期格式输入有误!格式“yyyy-MM”");
education.setStartDate(null);
}
}
......
// 判断是否有错误信息
if (hasFieldErrors()) {
// 获取教育类型下拉列表信息
if (educationSelectItemInfos == null) {
educationSelectItemInfos = educationBaseModel.getTypeInfos();
}
}
}
2、服务端校验失败,返回请求页面时页面默认值的获取问题?
分析:服务端校验失败,返回请求页面的设置:如果设置页面,则带下拉列表等初始信息全部丢失;如果设置为action,则请求错误信息全部丢失。
解决方法一:(推荐使用)
采用相应action中的public void validateActionName() {}方法,在方法中获取将要显示的参数即可。
public void validateAddEducation() {
// 判断是否有错误信息
if (hasFieldErrors()) {
// 获取教育类型下拉列表信息
//只要先判断存在与否,再确定是否查询,否则在iso-8859-1字符集数据库的相关中文数据会被更新为乱码的。
if (educationSelectItemInfos == null) {
educationSelectItemInfos = educationBaseModel.getTypeInfos();
}
}
}
方法二:初始信息在加载时动态生成
a、调用Ajax技术(可行)
b、使用s:action标签来显示下拉列表(Map返回值解析出现异常)
<s:action name="showEducationSelect" id="eduSelect" ></s:action>
<s:select label="教育类别" list="#eduSelect.educationSelectItemMap"
name="statusId" listKey="key" listValue="value"
emptyOption="false" />
c、使用s:action标签来显示下拉列表(List返回值显示不出下拉信息)
<s:action name="showEducationSelect" id="eduSelect" ></s:action>
<s:select label="教育类别" list="#eduSelect.educationSelectItemList"
name="statusId" listKey="id" listValue="status.statusDesc"
emptyOption="false" />
3、关于校验相关的几个问题
A、Struts2的数据校验问题:在s:datetimepicker录入框为空时,校验起作用,
但再次输入字符后,总提交不成功,报输入为空的校验错误。此时访问其它action,报以下异常
No result defined for action ....action.CompanyAction and result input - action - file:/D:/apache-tomcat-5.5.23/.../struts-company.xml:11:26
经过分析发现,spring配置文件配置bean时缺少设置范围属性,更改为如下
<bean name="companyAction" class="....action.CompanyAction" scope="request"/>
即可顺利提交,异常同时消失。 当为prototype时,也可以顺利提交,根据项目综合比较采用 request。
bean属性scope的选取(prototype、request、session、global session),详见Spring总结部分。
B、日期类型的不能使用requiredstring值,否则不能提交。
<field-validator type="required">
<message>成立日期不能为空</message>
</field-validator>
C、怎样用正则表达式对文本输入框的不输入字符作判断?
没有找到合适的,只好先用(\s)?代替了。(\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。 )
增加(\s)?后,正则表达式会在服务器端进行。
4、Struts2+Spring中的配置问题
A、依赖注入配置文件:不能配置相同的实体名称,如果相同,即使包名不同,也会不能正常加载。
B、struts.xml相关配置文件:包名的设置,在一个项目中不允许有相同的包名。
5、中文乱码问题
(1)在web.xml中配置以下信息,并且配置在struts2的所有过滤器之前。这样页面通过Button提交请求,中文没有问题。
<!-- Character Encoding filter -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
(2)通过Url提交,中文乱码的处理
a、在tomcat的server.xml文件中设置URIEncoding="UTF-8"信息。如:
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8"/>
b、如果是在java中生成url信息,则对中问参数进行处理。
如:java.net.URLEncoder.encode(employeeName, "UTF-8") employeeName为中文参数
c、如果在js中生成url信息,对中问参数进行处理。(js的encodeURIComponent()函数)
如:var url="findJobsByJobName.action?nameParameter="+encodeURIComponent(value);
6、Struts.xml配置文件中的参数传递
参考:
http://wiki.javascud.org/display/ww2cndoc/Result+Types
(1)Redirect Action Result
方案一:使用标签配置。例
<package name="public" extends="webwork-default">
<action name="login" class="...">
<!-- Redirect to another namespace -->
<result type="redirect-action">
<param name="actionName">dashboard</param>
<param name="namespace">/secure</param>
</result>
</action>
</package>
<package name="secure" extends="webwork-default" namespace="/secure">
<-- Redirect to an action in the same namespace -->
<action name="dashboard" class="...">
<result>dashboard.jsp</result>
<result name="error" type="redirect-action>error</result>
</action>
<action name="error" class="...">
<result>error.jsp</result>
</action>
</package>
多个参数示例:
<result name="success" type="redirect-action">
<param name="actionName">generateBarcode</param>
<param name="namespace"></param>
<param name="getTichetSource">${getTichetSource}</param>
<param name="companyId">${companyId}</param>
<param name="serviceId">${serviceId}</param>
</result>
方案二:直接拼url字符串。例:
<result type="redirect-action">viewPost?postid=${postid}&prap=${prap}</result>
注 viewPost?postid=${postid} 不能写成 viewPost.action?postid=${postid}
使用"&"代替"&",原理和HTML中的转义相同。
(2)Redirect Result
方案一:使用标签配置。例
<action name="blahblahAction" class="blahAction" method="blah">
<result name="success" type="redirect">
<param name="location">/some.action?field1=${field1}&field2=${field2}</param>
<param name="parse">true</param>
</result>
</action>
因为type="reirect"的result只接受location和parse两个参数,不支持自定义的param,这是个限制。
location (默认) - action执行后跳转的地址.
parse - 默认为true. 如果设置为false, location参数不会被当作Ognl表达式解析.
方案二:直接拼url字符串。例:
<action name="blahblahAction" class="blahAction" method="blah">
<result name="success" type="redirect">/some.action?field1=${field1}&field2=${field2}</result>
</action>
使用"&"代替"&",原理和HTML中的转义相同。
7、怎样更改Struts2的表单css配置?
在struts-core-2.06.jar的包中包含了一些默认的模版文件,它们位于$ {struts-core-2.06.jar}/template下,其中有ajax,simple,xhtml等。
查看一下struts.properties,如果没有可以查看$ {struts-core-2.06.jar}/org/apache/struts2/default.properties文件,其中有如下配置:
struts.ui.theme=xhtml
struts.ui.templateDir=template
struts.ui.templateSuffix=ftl
这一段就是关于struts2模版的配置信息,我们可以修改struts.properties文件,将其改成
struts.ui.theme=mytheme
struts.ui.templateDir=template
struts.ui.templateSuffix=ftl
同时在"WebRoot/template/mytheme/"目录下建立相应的模板文件及其相关文件,文件内容参照更改css前的模板内容。
最后建立css样式文件,这样就更改了Struts2的表单css配置。
(参阅信息:
http://xianglg.iteye.com/blog/88171)
8、Struts2中类型转换器的应用
参阅:
http://aumy2008.iteye.com/admin/blogs/150202
9、Struts2中拦截器的应用
参阅:
http://aumy2008.iteye.com/admin/blogs/146952