Spring-MVC用archeTypeプラグインによって生成されるファイルについて説明します。
example.test.domainパッケージには、モデルとなるクラスをセットします。
モデルクラスは、必ずprivate Integer id;のフィールドを定義する必要があります。
Member.javaの内容は、完全なPOJOです。
package example.test.domain; /** * Member * */ public class Member { private Integer id; private String name; private String address; // Eclipse で自動生成されたgetter/setter public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
example.test.serviceパッケージには各種サービスを定義します。 IMember.javaは、MemberDaoのインタフェースが定義されています。
IMember.javaの定義は以下の通りです。通常のDaoと違うところはprintメソッドを 定義しているところです。これがあるとテストの時にオブジェクトの比較が簡単に なるので、重宝しています。
package example.test.service; import example.test.domain.Member; public interface IMember { void saveOrUpdate(Member member); void delete(Member member); Member findById(Integer id); Member[] findAll(); String print(Member member); }
MemberManager.javaは、MemberDaoのサブクラスとして定義してあり、Dao以外のサービスを定義するために生成してあります。このファイルは、GenMVCプラグインでは更新されません。
MemberManager.javaの定義は以下の通りです。
package example.test.service; import example.test.service.stub.MemberDao; public class MemberManager extends MemberDao { }
IMemberを実装したDaoです。printメソッドのために、DbHelper を使っています。
MemberDao.javaの定義は以下の通りです。HibernateDaoSupportを使っているため、非常にシンプルになっています。
package example.test.service.stub; import java.util.List; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import jp.co.pwv.utils.DbHelper; import example.test.domain.Member; import example.test.service.IMember; public class MemberDao extends HibernateDaoSupport implements IMember { private DbHelper helper = new DbHelper(Member.class); public void saveOrUpdate(Member member) { getHibernateTemplate().saveOrUpdate(member); } public void delete(Member member) { getHibernateTemplate().delete(member); } public Member findById(Integer id) { return (Member)getHibernateTemplate().get(Member.class, id); } public Member[] findAll() { List list = getHibernateTemplate().loadAll(Member.class); return (Member[])list.toArray(new Member[list.size()]); } public String print(Member member) { return (helper.toString(member)); } }
example.test.webパッケージにはSpringのWebコントローラを定義します。
EditMemberController.javaは、SimpleFormControllerのサブクラスで、編集画面へのデータをセットしたり、DBに値を保存する処理をします。一カ所だけトリッキーなことをしているのが、addリンクを押したときにidなしの要求をだします、この時 MissingServletRequestParameterException 例外が発生するのでそのタイミングで新規オブジェクトを生成し、DBに登録しています。
EditMemberController.javaの定義は以下の通りです。
package example.test.web; import javax.servlet.http.HttpServletRequest; import example.test.domain.Member; import example.test.service.MemberManager; import org.springframework.web.bind.MissingServletRequestParameterException; import org.springframework.web.bind.ServletRequestUtils; import org.springframework.web.servlet.mvc.SimpleFormController; public class EditMemberController extends SimpleFormController { private MemberManager manager; public void setManager(MemberManager manager) { this.manager = manager; } protected Object formBackingObject(HttpServletRequest request) throws Exception { try { int id = ServletRequestUtils.getRequiredIntParameter(request, "id"); Member member = manager.findById(new Integer(id)); return member; } catch (MissingServletRequestParameterException e) { // idが無い場合には新しいRecipeを生成し、idを割り付ける Member member = new Member(); manager.saveOrUpdate(member); return member; } } protected void doSubmitAction(Object object) throws Exception { Member member = (Member) object; manager.saveOrUpdate(member); } }
MemberOpsControllerは、MultiActionControllerのサブクラスとして定義されています。 Memberに対する新しいWeb要求を定義するときにその名前のメソッドを定義するだけでWeb要求を 提供することができます。MemberOpsControllerでは、list, add, deleteを定義しています。
MemberOpsController.javaの定義を以下に示します。
package example.test.web; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import example.test.domain.Member; import example.test.service.MemberManager; import org.springframework.web.bind.ServletRequestUtils; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.multiaction.MultiActionController; public class MemberOpsController extends MultiActionController { private MemberManager manager; public void setManager(MemberManager manager) { this.manager = manager; } public ModelAndView list(HttpServletRequest request, HttpServletResponse response) throws Exception { return new ModelAndView().addObject(manager.findAll()); } public ModelAndView add(HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("editMemmber.htm"); return modelAndView; } public ModelAndView delete(HttpServletRequest request, HttpServletResponse response) throws Exception { int id = ServletRequestUtils.getRequiredIntParameter(request, "id"); Member member = manager.findById(new Integer(id)); manager.delete(member); ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject(manager.findAll()); modelAndView.setViewName("memberops/list"); return modelAndView; } }