Teedaおさわり

ども、toshinonoです。
はじめて日記を書くのですがちょっと緊張しますな〜

まずは、Teedaについて。
Teedaについてのブログはいろんなところで目にしますが
今回は、自動ログイン画面遷移機能を実装してみました。

いろんなところで目にするのは、システム内の画面にログイン画面を介さず
アクセスされた場合、ログイン認証させてその画面に戻るといった処理ですが
クエリストリングを考慮されたものを見たことなかったので作ってみました。

http://localhost:8080/session-app/view/dept/deptEdit.html?crudType=2&id=1&versionNo=1
赤色のところも考慮したわけです。

A画面(クエリストリング付)

インタセプタ
 ・ログイン情報がなかったら、ログイン画面に遷移
 ・A画面URL+クエリストリングをセッション情報に保持

ログイン画面
 ・ログイン認証
 ・ログイン情報をセッションに保持
 ・呼び出し元画面(この場合、A画面ね)情報があればそこにGetで送信
 ・なければ、最初にログイン画面がよばれたということで、通常通りメニュー画面に遷移

メニュー画面 or 呼び出し元画面(この場合、A画面ね)

ここまで
 
環境
Teeda Extenshon-1.3.13-sp4
JDK 1.5.0.11
Tomcat5.5.27

  • app.dicon










カスタマイザを追加

  • customizer.dicon

pageCustomizerにloginInterceptorを追加






"loginInterceptor"

"prerender"



↓ログインページクラスはインターセプタ対象外という意味↓

"app.session.web.login"
".*Page"

  • LoginInterceptor.java

ここでの肝は、sessionDtoにユーザ情報と、どの画面からログイン画面がよびだされたかのnextPageにURL+クエリストリングを保持すること!!


package example.interceptor;

import javax.servlet.http.HttpServletRequest;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.log4j.Logger;
import org.seasar.framework.aop.interceptors.AbstractInterceptor;
import example.dto.SessionDto;

public class LoginInterceptor extends AbstractInterceptor{

private static final long serialVersionUID = 1L;

public SessionDto sessionDto;

public HttpServletRequest httpServletRequest;

Logger logger = Logger.getLogger(this.getClass());

public Object invoke(MethodInvocation methodInvocation) throws Throwable {

//URLを取得
String url = httpServletRequest.getRequestURL().toString();
//URLのクエリストリング(引数)を取得
String queryString = httpServletRequest.getQueryString();

// ログイン情報がない場合、ログイン画面に遷移
if (StringHelper.isEmpty(sessionDto.userInfoDto.loginId)) {
sessionDto.nextPage = StringHelper.isEmpty(queryString) ? url : url + "?" + queryString;

return "login_login";
}
logger.debug("遷移先 = " + sessionDto.nextPage);

return methodInvocation.proceed();
}
}

  • SessionDto

セッションDtoにはアノテーションで、こいつはセッションスコープだぞと宣言


package example.dto;

import java.io.Serializable;
import org.seasar.framework.container.annotation.tiger.Component;
import org.seasar.framework.container.annotation.tiger.InstanceType;

@Component(instance=InstanceType.SESSION)
public class SessionDto implements Serializable{

private static final long serialVersionUID = 1L;

public String nextPage;

public UserInfoDto userInfoDto;

}

  • UserInfoDto


package example.dto;

import java.io.Serializable;
import java.util.Date;

public class UserInfoDto implements Serializable{

private static final long serialVersionUID = 1L;

public String loginId;

public String password;

public String mailAddress;

public Integer kengen;

public Date torokuDate;
}

  • LoginPage


public String doLogin() throws IOException {
String nextPage = null;

//ログイン認証失敗
if(!userInfoDao.checkLogin(loginId, password)){
Object[] args = {"loginId", "password"};
FacesMessageUtil.addErrorMessage("E0000002", args);
}
else{
//セッション情報に追加
sessionDto.userInfoDto = userInfoDxo.convert(userInfoDao.selectById(loginId));
nextPage = sessionDto.nextPage;

//直接ログイン画面がよばれた場合、メニュー画面に飛ぶ
if(nextPage == null || "".equals(nextPage)){
nextPage = "menu_menu";
}
else{
//ここが肝!!
//下記2行なしの場合、returnで指定されているnextPageに遷移するが
//クエリストリング付のURLでRedirectする場合に使用する。
httpServletResponse.sendRedirect(nextPage);
facesContext.responseComplete();
}
}

return nextPage;
}

  • あとがき

おっしゃ、動いた〜〜ってことで
いや〜何がはまったかって、通常、TeedaのPageクラス内のボタン等でsubmitするdoXXXX系の戻り値は、"menu_menu"みたいに記述するのが普通で、じゃあどうやってクエリストリングをバインドするか非常になやんでますた。

したら、よくよくteeda-exampleのサンプル内にredirectがあって
こ、こ、これだーと思い試したらうまくいった次第です。