RichFaces - Xử lý lỗi
Trong chương này, chúng ta sẽ tìm hiểu về các phương pháp xử lý lỗi khác nhau có thể được thực hiện trong RichFaces.
Xử lý lỗi phía máy chủ & phía máy khách
Chúng ta cần sử dụng kỹ thuật Java khá cũ (try / Catch) để xử lý các ngoại lệ dựa trên lớp hành động. Đối với phía máy khách, chúng tôi có thể thêm một tệp bổ sung, tệp này sẽ hiển thị thông báo lỗi bất cứ khi nào xảy ra lỗi ở phía máy khách.
Đoạn mã sau có thể được thêm vào web.xml để xử lý lỗi ở phía máy khách.
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error.xhtml</location>
</error-page>
Lưu ý, ngoại lệ trên sẽ chỉ cung cấp các thông báo ngoại lệ tĩnh và chúng ta có thể phải sử dụng lớp JSF “ExceptionHandler” để sử dụng thuộc tính ngoại lệ động. Trong thời gian chạy, RichFaces cung cấp một số tính năng để xác thực các trường đầu vào, có thể được sử dụng như một khối xây dựng chính của ngoại lệ trong ứng dụng.
Tạo một tệp mới và đặt mã sau vào đó.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE html>
<html xmlns = "http://www.w3.org/1999/xhtml"
xmlns:h = "http://java.sun.com/jsf/html"
xmlns:f = "http://java.sun.com/jsf/core"
xmlns:ui = "http://java.sun.com/jsf/facelets"
xmlns:a4j = "http://richfaces.org/a4j"
xmlns:rich = "http://richfaces.org/rich">
<h:head>
<title>Error handling</title>
<meta name = "viewport" content = "width = device-width, initial-scale = 1.0"/>
</h:head>
<h:body>
<h:form id = "form">
<rich:panel>
<f:facet name = "header">
<h:panelGroup>
<h:outputText value = "Student Registration" />
<a4j:status>
<f:facet name = "start">
<h:graphicImage value = "/images/ai.gif" style = "height:12px;width:12px;" alt = "ai" />
</f:facet>
</a4j:status>
</h:panelGroup>
</f:facet>
<h:panelGrid columns = "3">
<h:outputText value = "Name:" />
<h:inputText value = "#{student.name}" id = "name" label = "name">
<f:validateLength minimum = "3" maximum = "8" />
<f:validateRequired />
<rich:validator />
</h:inputText>
<rich:message for = "name" />
<h:outputText value = "Email" />
<h:inputText value = "#{student.email}" id = "email"
validatorMessage = "Ivalid email address">
<f:validateRegex
pattern =
"^(([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)
\.([a-zAZ]{2,5}){1,25})+([;.](([a-zA-Z0-9_\-\.]+)
@([a-zA-Z0-9_\-\.]+)\.([a-zAZ]{2,5}){1,25})+)*$" />
<rich:validator />
</h:inputText>
<rich:message for = "email" />
<h:outputText value = "Age" />
<h:inputText value = "#{student.age}" id = "age" label = "age">
<f:validateLongRange minimum = "18" maximum = "99" />
<rich:validator />
</h:inputText>
<rich:message for = "age" />
</h:panelGrid>
</rich:panel>
</h:form>
</h:body>
</html>
Lớp java tương ứng sẽ là một lớp bean bình thường như sau.
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@ManagedBean
@RequestScoped
public class Student {
private String name;
private String email;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Ví dụ trên sẽ tạo ra kết quả sau trong trình duyệt, bất cứ khi nào có lỗi trong <h: form>.
Đang tải tài nguyên
RichFaces cải thiện quy trình xử lý tài nguyên tiêu chuẩn trong ứng dụng JSF. Điều này có thể được thực hiện bằng cách cấu hình ResourceServlet hoặc bằng cách tối ưu hóa tài nguyên. Để cấu hình ResourceServlet, chúng ta cần thêm đoạn mã sau vào web.xml.
<servlet>
<servlet-name>Resource Servlet</servlet-name>
<servlet-class>org.richfaces.webapp.ResourceServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Resource Servlet</servlet-name>
<url-pattern>/org.richfaces.resources/*</url-pattern>
</servlet-mapping>
Chúng tôi cũng có thể kích hoạt tính năng tối ưu hóa trong ứng dụng JSF, ứng dụng này sẽ tối ưu hóa các tệp JavaScript và CSS khác nhau. Chúng tôi cần thêm đoạn mã sau để đạt được tối ưu hóa trong ứng dụng.
<context-param>
<param-name>org.richfaces.resourceOptimization.enabled</param-name>
<param-value>true</param-value>
</context-param>