cetia4学习笔记(4)

tou3921 2008-09-18
http://our.bizairshop.com/note/post/cetia4-4.html

处理验证异常的3种情况:
(1) 传统web和web service请求的render方法,验证异常都把执行forward到错误view页面,
所有的验证异常处理页面都是一个view。
   如:/forum/topics/INVALID  抛出Validation Exception,
      web访问 转到 /WEB-INF/html/error.jsp
      web service 访问 转到 /WEB-INF/html/error.jsp
    只有通过自定义映射能够改变这种验证异常的处理方式 (//@TODO)

(2) 相反,在传统web请求的action方法中,验证异常会引发前一个render view的重新刷新载入,
多半都是触发验证异常的表单。这种情况下,验证异常处理跟其他异常不同。
例如:
   POST请求 /forum/topics 含_method=insert参数, TopicsServlet用
    public String insert(ActionContext, TopicDTO) {
      return "topics";
    }
   来处理,但是抛出ValidationException,
   则sendRedirect() --> GET /forum/topics?_method=insertForm
   然后用  public String renderInsertForm(RenderContext) 来处理
  
   作者称这种redirection比其他程序的处理都好,但需要session或相当的scope
处理, A   careful   attribute   management   can   be   used   to
minimize the scalation-related impact of using session data this way. (这里指什么?)

    Web service请求因为是完全无状态,不知道上一个render view是什么,因此这些方法不会
引发验证异常到错误页面,而是forward响应到影响view。这个view有责任去检测是否有校验异常。
    例如:  web service请求 /forum/topics/INVALID
    处理函数是 public String update( ActionContext, int id )
    引发ValidationException 转到 /WEB-INF/xml/topics/update.jspx
   
    在所有情况下,验证异常都被存储到requst scope中,使用 "_validation_exception"属性key。
验证异常也是一组可能国际化的验证事务(validation issues) 能用<cetia:forEachIssue>自定义标签打印。
   jsp中:
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <%@ taglib uri="http://acsinet-solutions.com/cetia" prefix="cetia"%>
    <c:if test="${ _validation_exception != null }">
      <div align=left class="message">
        <br>
        ${ _validation_exception.message }
        <ul>
          <cetia:forEachIssue var="issue">
            <li>${ issue }
          </cetia:forEachIssue>
        </ul>
      </div>
    </c:if>
   
    jspx中:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <jsp:root version="2.0" xmlns:jsp="http://java.sun.com/JSP/Page"
            xmlns:c="http://java.sun.com/jsp/jstl/core"
            xmlns:cetia="http://acsinet-solutions.com/cetia">
      <jsp:directive.page contentType="application/xml" session="false"/>
      <error>
        <c:if test="${ _validation_exception != null }">
          <validation>
             <cetia:forEachIssue var="issue">
               <issue>${ issue }</issue>
             </cetia:forEachIssue>
           </validation>
         </c:if>
         <c:if test="${ _system_exception != null }">
           <exception>
             <object>${ _system_exception }</object>
             <message>${ _system_exception.message }</message>
           </exception>
         </c:if>
         <c:if test="${ pageContext.exception != null }">
           <exception>
             <object>${ pageContext.exception }</object>
             <message>${ pageContext.exception.message }</message>
           </exception>
         </c:if>
       </error>
    </jsp:root>

6.3 嵌套的默认映射 (Nested Default Mappings)
   默认嵌套最多支持3层。例如:UserDTO->AddressDTO->StreetDTO
多余层次嵌套需要自定义映射。
   默认嵌套的Bean必须不能为null,目前版本不会自动实例化嵌套bean。

   还可以使用 "property[index].prop2"这样的bean。但是必须使用范型例如:List<UserDTO>


   


7. navigation   
配置国际化
<context-param>
  <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
  <param-value>web_messages</param-value>
</context-param>
<context-param>
  <param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
  <param-value>en_US</param-value>
</context-param>


7.6 <cetia:link>自定义标签
<a href=
"${ pageContext.request.contextPath }/topics/${ topic.id }?_method=updateForm"
>Update This Topic</a>
等于
<%@ taglib uri="http://acsinet-solutions.com/cetia" prefix="cetia"%>
<cetia:link action="topics/${ topic.id }?_method=updateForm">
   Update This Topic
</cetia:link>
注意action值不能用/开头,会自动处理contextPath
参数这样写也可以:
<%@ taglib uri="http://acsinet-solutions.com/cetia" prefix="cetia"%>
<cetia:link action="topics/${ topic.id }?_method=updateForm">
   Update This Topic
</cetia:link>

7.7 Text信息
RenderContext和ActionContext有一个setMessage()方法,把消息存储在session中
打印信息
  <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  <c:if test="${ _message != null }">
    <br>
    <div align="center">
       <table border="1" cellpadding="20">
        <tr>
          <td class="message">
            ${ _message }
          </td>
        </tr>
      </table>
    </div>
    <br>
  </c:if>

Global site tag (gtag.js) - Google Analytics