2012-11-24(Sat)
JDBC Struts DriverManager.getConnectionを使う方法
Strutsを使ってMySQLへアクセスする際、様々な手法がある。
今回は、DriverManagerを使ったアクセス方法をメモっておく。
対象:s2dao1.0.51
処理
ソースコード
DAO
selectByEmailのexecuteQuery結果が1件しかないにもかかわらずrs.next()している理由は
これがないと、以下のようなエラーが発生してしまう。
Action
参考:
JDBCManagerを使う方法
Struts と MySQL による Web アプリケーション
今回は、DriverManagerを使ったアクセス方法をメモっておく。
対象:s2dao1.0.51
処理
シーケンスとしては以下の通り。
ユーザーログイン画面からemail, passwordを入力しDBのデータと一致すれば
セッション登録する。
(1).email, passwordを入力しログインボタン画面からActionクラスへ遷移
(2).ActionクラスではStrutsのアノテーション(@Execute)が示すメソッドへ遷移
(3).ActionクラスのメソッドでDaoをコールしSELECT文を実行。
(4).DBのemail, passwordが一致すればseasarのセッション保持機能を活用する
(5).セッションタイムアウトはweb.xmlで設定。
ソースコード
DAO
@S2Dao(bean=User.class)
public class UserDao {
static private Connection conn;
static private PreparedStatement stmt;
static {
try {
Class. forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/jtestdb" , "username" , "password");
stmt = conn .prepareStatement("SELECT email, password FROM USER WHERE email = ? and password = ?");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public User selectByEmail(String email, String password) {
ResultSet rs = null;
User retUser= null;
try {
stmt.setString(1, email);
stmt.setString(2, password);
rs = stmt.executeQuery();
while(rs.next())
{
String r_email = rs.getString( "email");
String r_password = rs.getString( "password");
retUser = new User(
r_email,
r_password
);
break;
}
} catch (SQLException e) {
e.printStackTrace();
}
return retUser;
}
public int insert(String email, String password){
try {
stmt = conn .prepareStatement("INSERT INTO USER (email, password) VALUES (?,?)");
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
int rs = 0;
try {
stmt.setString(1, email);
stmt.setString(2, password);
rs = stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
// public int update(User user);
// public int delete(User user);
}
selectByEmailのexecuteQuery結果が1件しかないにもかかわらずrs.next()している理由は
これがないと、以下のようなエラーが発生してしまう。
java.sql.SQLException: Before start of result set
S1000
Action
public class LoginAction {
protected Log log = LogFactory.getLog( this.getClass());
private UserDao userDao;
@Resource
@ActionForm
public UserForm userForm;
private UserDto userDto;
public LoginAction(){
this.setUserDao(new UserDao());
}
public void setUserDto(UserDto userDto){
this.userDto = userDto;
}
public UserDto getUserDto(){
return this .userDto ;
}
@Execute(validator = true, input = "/login/index.jsp" )
public String index() {
log.debug("email get start" );
User user = userDao.selectByEmail(userForm .email , userForm.password );
if (null != user){
System. out.println("email: " + user.email);
// セッションへの保存処理
// userDtoに値を入れるだけでSessionに保存される
Beans. copy(this. userForm, this .userDto ).execute();
return "/mypage/?redirect=true" ;
} else{
userDao.insert(userForm .email , userForm .password );
return "/mypage/error.jsp" ;
}
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public UserDao getUserDao() {
return userDao ;
}
}
参考:
JDBCManagerを使う方法
Struts と MySQL による Web アプリケーション
スポンサーサイト