banq大哥、各位好心的大哥大姐們!求教一個關於Sturts+Spring中ActionForm的問題

yame83215發表於2007-08-04
在一次很偶然的,也忘記是什麼時候的事,找到了J道這個網站,被這裡的討論的問題深深的吸引,於是養成了每天都會到J道來逛逛,總會有不少收穫,也是透過這個網站知道了什麼叫DDD,深入瞭解了OO思想,對我實在是非常大的幫助(正在朝這方面拼命努力加油ing),非常佩服banq大哥的淵博知識和熱心為道友門解決很多困惑、為中國軟體業的發展孜孜不倦的貢獻的精神!!!!

經常看別人的提問和熱心道友們的熱情參與,受益非淺,今天終於有機會向banq大哥和熱心的道友們請教了,希望大哥們指點小弟一下!

我遇到的問題是這樣的:在一個main.jsp頁面上點選一個連結
<a href="addStudent_listClasses.do">新生註冊</a>後,跳轉到學生註冊的addStu.jsp頁面上,該頁面中的登錄檔單中有一個要學生選擇班級的下拉框

<html:select property="classesNo">
  <html:option value="0">請選擇班級</html:option>
  <html:options property="value" labelProperty="label"               collection="classOptions" />
</html:select>
而我的目標是:當跳轉到學生註冊這個頁面時,班級下拉框裡供選擇的班級資訊是從資料庫的班級表中讀取的而不是在JSP頁面上寫死的,根據自己對Struts機制的理解,我於是採用下面的做法:
1、<a href="addStudent_listClasses.do">中的addStudent_listClasses.do對應的Action的作用是用來在跳轉到學生註冊頁面之前先獲得ActionForm的一個例項,並顯式呼叫ActionForm的reset()方法來初始化學生註冊頁面下拉框中的內容,而這個Action中我是透過Spring把ActionForm注入的,程式碼如下:
public class AddStudent_listClassesAction extends Action {
private ActionForm addStudentForm = null;

public void setAddStudentForm(ActionForm addStudentForm) {
this.addStudentForm = addStudentForm;
}

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
addStudentForm.reset(mapping, request);
request.getSession().setAttribute("addStudentForm", addStudentForm);
return mapping.findForward("showAddStudentPage");
}
}
2、我在學生註冊頁面對應的那個ActionForm的reset()方法中這樣寫:
public class AddStudentForm extends ActionForm {
// 省略其它屬性和setter、getter方法
private Integer classesNo;
 // 透過Spring注入
private IClassesService classService = null;

public void setClassService(IClassesService classService) {
this.classService = classService;
}

......

public void reset(ActionMapping mapping, HttpServletRequest request) {
// 從資料庫的classes表中讀取資料設定 班級 下拉選單供選擇
ArrayList classOptions = newArrayList();
Classes classes = null;
  // 透過IClassesService介面呼叫相應DAO中的方法查出所有的班級資訊
List<Classes> list=classService.queryAll();
Iterator i=list.iterator();
while(i.hasNext()){
classes=(Classes)i.next();
LabelValueBean option = new LabelValueBean(classes.getClassesName(),classes.getClassesNo().toString());
classOptions.add(option);
 }
  request.setAttribute("classOptions", classOptions);
  }
}
這樣做是達到了功能的實現,可是老師最後說這樣的做法不太好,原因大概是這樣說的:

沒見過在Action裡面注入ActionForm的,不是傳統的做法(我學Java沒幾個月也不太清楚,banq大哥是這樣的嗎?),沒有經過實踐驗證,不知道是否會有潛在的問題。


而老師推薦瞭如下的做法:

在<a href="addStudent_listClasses.do">中的addStudent_listClasses.do對應的Action中不注入ActionForm,而只是在Action中把addStu.jsp中下拉框<html:options property="value" labelProperty="label"               collection="classOptions" />中需要的collection的資料準備好,存到request範圍中,也就是把原來我在ActionForm中的reset()做的事搬到這個跳轉的Action中來做,程式碼如下:
public class AddStudent_listClassesAction extends Action {
// 透過Spring注入
private IClassesService classService = null;

public void setClassService(IClassesService classService) {
this.classService = classService;
}

public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {
  // 從資料庫的classes表中讀取資料設定 班級 下拉選單供選擇
ArrayList classOptions = newArrayList();
Classes classes = null;
  // 透過IClassesService介面呼叫相應DAO中的方法查出所有的班級資訊
List<Classes> list=classService.queryAll();
Iterator i=list.iterator();
while(i.hasNext()){
classes=(Classes)i.next();
LabelValueBean option = new LabelValueBean(classes.getClassesName(),classes.getClassesNo().toString());
classOptions.add(option);
 }
  request.setAttribute("classOptions", classOptions);
  return mapping.findForward("showAddStudentPage");
}

上面說的兩種做法都是可以達到目的的,我的疑惑是:]用哪一種方法好?好在什麼地方?不好的做法不好在什麼地方?希望banq大哥能抽空幫我解釋一下,感激不盡!!!!

但是我覺得註冊頁面的表單裡的資料應該是由ActionForm來提供的,像我的老師這樣把表單的資料透過其它的途徑提供,有沒有破壞Struts的什麼結構或是什麼的?(我也不太清楚,但總覺得怪怪的,請老大指教!)

[該貼被yame83215於2007年08月04日 10:12修改過]

[該貼被yame83215於2007年08月04日 10:14修改過]

相關文章