PRGパターンに対応したActionクラスの作り方 - じゅんいち☆かとうの技術日誌
で,PRGパターンのサンプルを公開していますが,不必要にセッションを肥大化させない方法を検討してみました.
前回のサンプルだとリダイレクト先のアクションに渡すDTOに,検索結果などがリダイレクト完了後も残ってしまいます.検索結果が多いと不必要にメモリを食い続けることになるのでこれは避けたい.
そこで,リダイレクト先のアクションでセッションからリクエストにスコープを変更する処理を入れて,メモリを解放する処理を考えてみました.
EmployeeAction#resultメソッドでは,EmployeeAction#employeeItemsにセッションで渡されたemployeeViewDto.employeeItemsをEmployeeAction#employeeItemsに代入します.また,employeeViewDto.employeeItemsは再度newして新しいListを用意します.これで,リダイレクト完了後に無駄なメモリを食わなくてよいはず.
public class EmployeeAction { @Resource protected JdbcManager jdbcManager; @ActionForm @Resource public EmployeeForm employeeForm; @Resource public EmployeeViewDto employeeViewDto; public List<BeanMap> employeeItems; // 出力系のメソッド名はjspのファイル名に合わせる. @Execute(validator = false) public String index(){ employeeForm.initialize(); employeeViewDto.initialize(); return "index.jsp"; } // 入力系処理はメソッド名をdoから始める. // 遷移先は出力系のアクションメソッドをリダイレクトで呼び出す. @Execute(validator = false, redirect=true) public String doSearch(){ employeeViewDto.initialize(); List<Employee> employeeList = jdbcManager.from(Employee.class).where(new SimpleWhere().eq("prefId", employeeForm.prefId)).getResultList(); for(Employee employee : employeeList){ employeeViewDto.employeeItems.add(Beans.createAndCopy(BeanMap.class, employee).execute()); } return "result"; } @Execute(validator = false) public String result(){ // リクエストのスコープのプロパティに代入. employeeItems = employeeViewDto.employeeItems; // DTOには新たなemployeeItemsをnewする. employeeViewDto.employeeItems = CollectionsUtil.newArrayList(); return "result.jsp"; } }
以下のクラスは前回と同じ.
@SuppressWarnings("serial") @Component(instance = InstanceType.SESSION) public class EmployeeViewDto implements Serializable { public void initialize(){ employeeItems.clear(); } public List<BeanMap> employeeItems = CollectionsUtil.newArrayList(); } @SuppressWarnings("serial") @Component(instance = InstanceType.SESSION) public class EmployeeForm implements Serializable { public void initialize(){ prefId = null; } public Integer prefId; }