טיפול בחריגות ב-JSP
לפעמים קודם כן כתבתי פוסט על טיפול בחריגות ב-Servlet ולמה אנו זקוקים לזה. ההסבר הזה נכון גם לדפי JSP ולכן Java EE מספקת גישה ברורה לטיפול בחריגות ב-JSP באמצעות דפי שגיאה ב-JSP. כדי לטפל בחריגות שנזרקות על ידי דף ה-JSP, כל שאנו זקוקים הוא דף שגיאה והגדרת הדף ב-JSP באמצעות הפקודה jsp page.
דף שגיאה ב-JSP
כדי ליצור דף שגיאה ב-JSP, אנו צריכים להגדיר את הערך של התכונה isErrorPage של הפקודה page ל-true, ואז נוכל לגשת לחריגה כאובייקט רמז מובנה ב-JSP ולהשתמש בה לשליחת הודעת שגיאה מותאמת אישית ללקוח.
תצורת דף שגיאה JSP
אנו צריכים להגדיר את ההפניה לדף בדיקה errorPage כדי להגדיר את ה-JSP שיטפל בכל חריגה שיושלפת על ידי שיטת השירות JSP. כאשר דף השגיאה של JSP מתורגם לקוד סרבל, הוא מרחיב את org.apache.jasper.runtime.HttpJspBase
ב-Tomcat.
תצורת מחוון תיאור הפקודות שגיאה
לעיתים רבות, יש לנו דף שגיאה משותף שברצוננו להשתמש בו עבור כל ה-JSPים, כך שבמקום להגדיר אותו בכל JSP בנפרד, אנו יכולים להגדיר דף שגיאה ב-web.xml עם הרכיב error-page. ניתן להגדיר את דף השגיאה של JSP כך שיטפל גם בקודי שגיאה אחרים כמו 404. בואו נראה איך כל אלה מתאימים יחד ביישום web. ניצור יישום web פשוט בשם JSPExceptionHandling שלו מבנה פרויקט ייראה כמו התמונה למטה. נקודת הכניסה של היישום היא
index.jsp
שקודו מופיע למטה.
<%@ page language="java" contentType="text/html; charset=US-ASCII"
pageEncoding="US-ASCII"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Login Page</title>
</head>
<body>
<form action="login.jsp" method="post">
<strong>User ID</strong>:<input type="text" name="id"><br>
<strong>Password</strong>:<input type="password" name="password"><br>
<input type="submit" value="Login">
</form>
</body>
</html>
כאשר אנו שולחים את הטופס, הבקשה תישלח אל login.jsp
, הקוד דומה למטה.
<%@ page language="java" contentType="text/html; charset=US-ASCII"
pageEncoding="US-ASCII" errorPage="error.jsp"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>User Home Page</title>
</head>
<body>
<%
String user = request.getParameter("id");
String pwd = request.getParameter("password");
if(user == null || "".equals(user) || pwd == null || "".equals(pwd)){
throw new ServletException("Mandatory Parameter missing");
}
%>
<%-- do some DB processing, not doing anything for simplicity --%>
Hi <%=user %>
</body>
</html>
שימו לב שאם הפרמטרים הקלטיים הם ריקים או null, זה מפיל ServletException
עם הודעה מתאימה ו-errorPage
מוגדר כ-error.jsp
שקודו נראה כך.
<%@ page language="java" contentType="text/html; charset=US-ASCII"
pageEncoding="US-ASCII" isErrorPage="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Error Page</title>
</head>
<body>
<% if(response.getStatus() == 500){ %>
<font color="red">Error: <%=exception.getMessage() %></font><br>
<%-- include login page --%>
<%@ include file="index.jsp"%>
<%}else {%>
Hi There, error code is <%=response.getStatus() %><br>
Please go to <a href="/index.jsp">home page</a>
<%} %>
</body>
</html>
שימו לב שערך התכונה של ההפניה לדף הוא true
. כאשר משאבי היישום זורקים חריגות, קוד השגיאה הוא 500, הקוד נכתב כך שיטפל בשני סוגי החריגות – חריגות ברמת היישום ושגיאות כמו 404 – הדף לא נמצא. שימו לב גם לשימוש בהפניה כדי להציג למשתמש את דף ההתחברות במקרה של חריגה. הנה ה- web.xml שבו אנו מגדירים את דף השגיאה עבור היישום.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://java.sun.com/xml/ns/javaee" xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>JSPExceptionHandling</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error.jsp</location>
</error-page>
</web-app>
כעת כאשר אנו מפעילים את היישום לעיל, אנו מקבלים את הדפים הבאים כתגובה. דף התחברות דף שגיאת JSP עבור חריגה
דף שגיאת JSP עבור קוד שגיאה 404
זהו כל הקטע בניהול חריגות בדפי JSP, זה קל מאוד ליישם ואנו צריכים להשתמש בו כדי לוודא שאנו מטפלים בכל החריגות ובקודי שגיאה ושולחים תגובה שימושית ללקוח במקום דף השגיאה המוגדר כברירת מחדל של המעטפת.
Source:
https://www.digitalocean.com/community/tutorials/jsp-exception-handling-jsp-error-page