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> |