STRUTS חלק ב' – תהליך המיפוי
STRUTS מכיל בתוכו תהליך הגדרת זרימה – טופס מתורגם לאובייקט זיכרון נשלח במיפוי לוגי לפעולה עם רשימת דפי JSP אפשריים להצגה בהמשך לסיום הפעולה.
בקוד הפעולה לפני הסיום להתייעץ ברשימה זו ולהחזיר אחד מהאפשריות על פי הלוגיקה של הפעולה. כאן נראה שני מקרים: באחד על פי הפעולה נבחר מה להציג והשניה על פי סוג הטופס נלך להצגת הטופס המסוים.
בוא נסתכל על struts-config.xml הנמצא תחת WEB-INF. תפקידו לציין אלו אובייקטי זיכרון קיימים ובאיזה מחלקה הם ממומשים (form-bean) – אלו אובייקטים שנוצרים בעת משלוח טופס HTML אל כיוון הACTION המטפל בו.
הרשימה השניה ממפה שמות URL לACTION כאשר path זה המסלול הרלטיבי בURL (עם .do*(. name ממפה לאיזה אובייקט יש ליצר בזיכרון . type מציין איזה מחלקה היא הACTION שממש אותו, validate=true האם להפעיל את פונקצית validate במחלקה זו.
נוסף יש רשימהforward המקשרת שם לוגי לדף JSP – השם הלוגי בדוגמא הנ"ל או סוג פעולה בראשון וסוג טופס בשני. נוסף יש קישור לדף שגיאה במקרה שלשגיאות failure
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">
<struts-config>
<form-beans>
<form-bean name="MyToDo" type="com.adi.forms.MyToDoForm">
</form-bean>
<form-bean name="MyContact" type="com.adi.forms.MyContactForm">
</form-bean>
<form-bean name="MyAccount" type="com.adi.forms.MyAccountForm">
</form-bean>
<form-bean name="BaseForm" type="com.adi.forms.BaseForm">
</form-bean>
</form-beans>
<action-mappings>
<action path="/manageForm" name="MyToDo” type="com.adi.ManageFormAction" validate=”true”>
<forward name="insert" path="/jsp/showToDo.jsp">
</forward>
<forward name="update" path="/jsp/showToDo.jsp">
</forward>
<forward name="delete" path="/jsp/showMyPage.jsp">
</forward>
<forward name="failure" path="/jsp/showError.jsp">
</forward>
</action>
<action path="/getForm" name="BaseForm" type="com.adi.actions.GetFormAction">
<forward name="MyToDo" path="/jsp/showToDo.jsp">
</forward>
<forward name="MyAccount" path="/jsp/showAccount.jsp">
</forward>
<forward name="MyContact" path="/jsp/showContact.jsp">
</forward>
<forward name="MyPage" path="/jsp/showMyPage.jsp">
</forward>
<forward name="failure" path="/jsp/showError.jsp">
</forward>
</action>
</action-mappings>
</struts-config>
הוגדרו שני פעולות – אחד לטעינה של אובייקטי הזיכרון ולפי שמם לעבור לדף ההצגה המתאים והשני לעדכון עריכה ומחיקה של אובייקט קיים.
בוא נסתכל על קוד המחלקה שמבצעת עדכון טופס TODO – כאן נטען לform אובייקט זיכרון מסוג MyToDo שזה MyToDoForm לפי המיפוי למעלה.
public class ManageFormAction extends org.apache.struts.action.Action{
…
public ActionForward perform(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
ActionErrors errors = new ActionErrors();
ActionForward forward = new ActionForward();
String action=request.getParameter(“action”);
if(action==null) action=insert;
String formType=request.getParameter(“formType”);
if(formType==null) formType=”MyToDo”;
try{
DAO dao=DaoFactory.getInstance(formType);
if(action.equals(“insert”)) form=dao.insert(form);
else if(action.equals(“update”) form=dao.update(form);
else if(action.equals(“delete”) dao.delete(form);
request.setAttribute(formType,form);
forward = mapping.findForward(action);
} catch(Exception e){
mapping.findForward(“failure”);
errors.add("MyAction", new ActionError(acion +”fail “+e.toString()));
}
if (!errors.empty))) saveErrors(request, errors);
return forward;
}
בקוד רואים את תהליך עדכון של אובייקט זיכרון תוך שימוש בDAO. שימו לב שאת תוצאת העדכון שומרים חזרה על הREQUEST כדי לקבל מבט מעודכן (למשל ID בהוספה)
פה על הבקשה שמים שני פרמטרים – שם סוג האובייקט והפעולה – בהתאם לשניהם מבצעים את הפעולה.
בJSP של showToDo יש לדאוג להגדיר קשר לאוביקט שהושם על הREQUEST על פי שמו וסוגו תופיע בדף עם ערכי אובייקט הזיכרון.
<html:form name=”MyToDo” type=”com.adi.form.MyToDoBean”>
למה להגדיר שני מחלקות לאותו אוביקט: Bean וForm
אובייקט הזיכרון שמיצר הDAO לא צריך בדיקה ולא צריך לבצע פעולות המרה.
אובייקט שנוצר במשלוח הFORM מבצע הרחבה לאובייקט הזיכרון ומבצע פעולות כמו
המרה של עברית לUNICODE אם בסיס הנתונים בUNICODE או בדיקת תאריכים וכולי…
דוגמא:
class BaseForm extends ActionForm;
public int getID(){…};
public void setID(int id){..};
public String getTitle(){…};
public void setTitle(String title){…}
}
class MyToDoBean extends BaseForm {
public String getTime(){…}
public void setTime(String time){…}
public String getBody(){…}
public void setBody(String body){…}
}
classs MyToDoForm extends MyToDoBean {
public void setTitle(String title){
super.setTitle(StrUtil.toUnicode(title));
}
public void setBody(String body){
super.setBody(StrUtil.toUnicode(body));
}
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request){
… do validation
return new ActionErrors();
}
}
בוא נסתכל על המחלקה שתפקידה לטעון ולהביא את הטופס המתאים לפי סוג מסמך
class GetFormAction extends Action{
public ActionForward perform(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
ActionErrors errors = new ActionErrors();
ActionForward forward = new ActionForward();
try
{
String id=request.getParameter(“id”);
String formType=request.getParameter(“formType”);
if(formType==null) formType=”MyToDo”;
DAO dao=DaoFactory.getInstance(formType);
form=dao.fetch(id);
request.setAttribute(formType,form);
forward = mapping.findForward(formType);
…
}
return forward;
…..
כאן יש טעינה לפי id של אובייקט זכרון מתאים על פי סוגו formType
שימו לב שהפעם הדף JSP הבא לתצוגה מופנה לפי סוג טופס כדי להציגו . כאן רואים את STRUTS במיטבו!
חלק ג– יסביר את הטיפול בשגיאות, עם הרחבות לדפי JSP , סוגי טפסים מתקדמים ומערכים של נתונים וכן על השוני בין הדורות השונים של STRUTS
תגובות בפייסבוק