Struts2+Hibernate+Spring项目小结――Struts2部分

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}&amp;prap=${prap}</result> 
          注 viewPost?postid=${postid}  不能写成 viewPost.action?postid=${postid}         
          使用"&amp;"代替"&",原理和HTML中的转义相同。
  (2)Redirect Result
      方案一:使用标签配置。例
                <action name="blahblahAction" class="blahAction" method="blah">
                    <result name="success" type="redirect">
                        <param name="location">/some.action?field1=${field1}&amp;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}&amp;field2=${field2}</result>
            </action>       
          使用"&amp;"代替"&",原理和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

你可能感兴趣的:(spring,UI,Hibernate,struts,正则表达式)