検索
連載

サーブレットとEJBの連携Java Servlet徹底解説(後編)(4/7 ページ)

PC用表示 関連情報
Share
Tweet
LINE
Hatena

表示系を実装する

表示系の実装(HTML、JSP、JavaScript、Bean)

 まず、テスト用Beanの作成、およびHTML、JSP、JavaScriptの作成部分から見ていこう。

 テスト用のBeanは、必要なメソッドを定義しただけの空のBeanを作成すればよい。Java ServletやJSPから呼び出したときにそれらしく動けばよいのである。すべての例外(xxxException)とメソッドが定義され、プロパティがアクセスできる程度になればよい。

 この後、EJBの開発ではVisualAge for Java使うので、これらのソースもVisualAge for Javaの上で開発しておく方が後々面倒でない。

 再度、下図を見てほしい。以下に図中に示された一連のソースコードを紹介する。ソースに対する説明は、前編「JSPとどう連携するか」ですでに解説した内容とだぶるので、ここでは説明を省く。まだ理解が不足していると感じる方は、是非前編を読み返していただきたい。

画面構成と関連するサーブレットとJSP
画面構成と関連するサーブレットとJSP
package atmarkit2;
public class UserinfoBean {
  private String userid = "";
  private String password = "";
  private String msg = "";
  public UserinfoBean(String userid, String password) {
    this.userid = userid;
    this.password = password;
  }
  public String getUserid() { return userid; }
  public String getPassword() { return password; }
  public String getMsg() { return msg; }
  public void setMsg(String msg) { this.msg = msg; }
  public void login(String userid, String password)
    throws InvPassException, UserAddedException {
    this.userid = userid;
    this.password = password;
    if(!userid.equals(password)){
      msg = "パスワードが違います";
      throw new InvPassException();
    }
    if(userid.equals("new")) throw new UserAddedException();
    msg = "ログインされました";
  }
  public void modPass(String password) {
    this.password = password;
    msg = "パスワードが変更されました";
  }
  public void delUser() {
    msg = "ユーザーが削除されました";
  }
}
リスト1 リソーステスト用のUserinfoBean.java
package atmarkit2;
public class InvPassException extends Exception {
}
リスト2 InvPassException.java
package atmarkit2;
public class UserAddedException extends Exception {
}
リスト3 UserAddedException.java
<html>
<head>
<jsp:useBean id="userinfo" class="atmarkit2.UserinfoBean" scope="session"/>
<script language="JavaScript" src="/atmarkit2/login.js"></script>
</head>
<body>
<H1><%=userinfo.getUserid() %>さん、ようこそ!</H1>
<%=userinfo.getMsg() %>
<FORM action='/servlet/atmarkit2.ModPass' method='POST'>
  新しいパスワード
  <INPUT type='password' name='password' /><BR />
  検査用パスワード
  <INPUT type='password' name='passcomp' /><BR />
  <INPUT type='submit' value='パスワード変更' onClick='return check()' />
  <INPUT type='button' value='ユーザーを削除' onclick='return delUser()' />
</FORM>
</body>
</html> 
リスト4 Login.htm
function check() {
  if(document.forms[0].password.value=="" ||
    document.forms[0].passcomp.value=="" ) {
      alert("パスワードを指定してください");
      return false;
  }
  if(document.forms[0].password.value !=
      document.forms[0].passcomp.value) {
    alert("2つのパスワードが違っています");
    return false;
  }
  return confirm("パスワードを変更してもよろしいですか");
}
function delUser() {
  if(confirm("ユーザーを削除してもよろしいですか") == false) return;
  document.forms[0].action="/servlet/atmarkit2.DelUser";
  document.forms[0].submit();
}
リスト5 Login.js
<html>
<head>
<jsp:useBean id="userinfo" class="atmarkit2.UserinfoBean" scope="session"/>
<script language="JavaScript" src="/atmarkit2/login.js"></script>
</head>
<body>
<H1><%=userinfo.getUserid() %>さん、ようこそ!</H1>
<%=userinfo.getMsg() %>
<FORM action='/servlet/atmarkit2.ModPass' method='POST'>
  新しいパスワード
  <INPUT type='password' name='password' /><BR />
  検査用パスワード
  <INPUT type='password' name='passcomp' /><BR />
  <INPUT type='submit' value='パスワード変更' onClick='return check()' />
<INPUT type='button' value='ユーザーを削除' onclick='return delUser()' />
</FORM>
<A HREF="/atmarkit2/login.htm">戻る</A>
</body>
</html>
リスト6 Login.jsp
<html>
<head>
<meta http-equiv="refresh", content="5; URL=/atmarkit2/Login.htm" />
<title>アットマークアイティ−2000年12月</title>
<jsp:useBean id="userinfo" class="atmarkit2.UserinfoBean" scope="session"/>
<body>
<H1><%=userinfo.getUserid() %>さん</H1>
<%=userinfo.getMsg() %>
</body>
</html>
リスト7 ModUser.jsp
<html>
<head>
<meta http-equiv="refresh", content="5; URL=/atmarkit2/Login.htm" />
<title>アットマークアイティ−2000年12月</title>
<jsp:useBean id="userinfo" class="atmarkit2.UserinfoBean" scope="session"/>
<body>
<H1><%=userinfo.getUserid() %>さん</H1>
<%=userinfo.getMsg() %>
</body>
</html>
リスト8 DelUser.jsp
<html>
<head>
<meta http-equiv="refresh", content="5; URL=/atmarkit2/Login.htm" />
<jsp:useBean id="userinfo" class="atmarkit2.UserinfoBean" scope="session"/>
</head>
<body>
<H1>ログインエラー</H1>
<%=userinfo.getMsg() %>
</body>
</html>
リスト9 InvPass.jsp
<html>
<head>
<meta http-equiv="refresh", content="5; URL=/atmarkit2/Login.htm" />
<jsp:useBean id="userinfo" class="atmarkit2.UserinfoBean" scope="session"/>
</head>
<body>
<H1><%=userinfo.getUserid() %>さん</H1>
次のエラーになりました<BR />
<%=userinfo.getMsg() %>
</body>
</html> 
リスト10 Error.jspp

サーブレットの実装

 次に、サーブレットの説明をしよう。サーブレットもほとんど前回と同じであるが、画面ごとに該当するメソッドをUserinfoBean上で呼び出すように作られている。UserinfoBeanは、使われたユーザーIDとパスワードを見て、InvPassException、UserAddedExceptionなどを返して来るので、それに対応して表示するページを変更している。

package atmarkit2;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class Login extends HttpServlet
{
  ServletContext ctx = null;   
    public void init(ServletConfig config) {
        synchronized(this) {
          if(ctx == null) {
            ctx = config.getServletContext();
        }
      }
    }
  public void service(HttpServletRequest request,
       HttpServletResponse response)
  throws IOException, ServletException {
  // ブラウザからの情報の読み取り
  String userid = request.getParameter("userid");
  String password = request.getParameter("password");
  // セッションオブジェクトに保管
  HttpSession session = request.getSession(true);
  UserinfoBean bean = new UserinfoBean(userid, password);
  session.putValue("userinfo", bean);
  RequestDispatcher rd = null;
  try {
    bean.login(userid, password);
    rd = ctx.getRequestDispatcher("/atmarkit2/Login.jsp");
  } catch(UserAddedException e) {
    bean.setMsg("ユーザーが追加されました");
    rd = ctx.getRequestDispatcher("/atmarkit2/Login.jsp");
  } catch(InvPassException e) {
    rd = ctx.getRequestDispatcher("/atmarkit2/InvPass.jsp");
  } catch(Exception e) {
    bean.setMsg(e.getMessage());
    rd = ctx.getRequestDispatcher("/atmarkit2/Error.jsp");
  }
  // 画面を表示
  rd.forward(request, response);
  }
}
リスト11 Login.java
 package atmarkit2;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class ModPass extends HttpServlet
{
  ServletContext ctx = null;
    public void init(ServletConfig config) {
      synchronized(this) {
        if(ctx == null) {
        ctx = config.getServletContext();
      }
    }
  }
  public void service(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException {
    // ブラウザからの情報の読み取り
    String password = request.getParameter("password");
    // セッションオブジェクトに保管
    HttpSession session = request.getSession(true);
    UserinfoBean bean = (UserinfoBean)session.getValue("userinfo");
    RequestDispatcher rd = null;
    try {
      bean.modPass(password);
      rd = ctx.getRequestDispatcher("/atmarkit2/ModPass.jsp");
    } catch(Exception e) {
      bean.setMsg(e.getMessage());
       rd = ctx.getRequestDispatcher("/atmarkit2/Error.jsp");
 }
  // 画面を表示
  rd.forward(request, response);
  }
}
リスト12 ModPass.java
package atmarkit2;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class DelUser extends HttpServlet
  {
    ServletContext ctx = null;
    public void init(ServletConfig config) {
        synchronized(this) {
          if(ctx == null) {
          ctx = config.getServletContext();
        }
      }
  }
  public void service(HttpServletRequest request, HttpServletResponse response)
  throws IOException, ServletException {
    // ブラウザからの情報の読み取り
    String password = request.getParameter("password");
    // セッションオブジェクトに保管
     HttpSession session = request.getSession(true);
    UserinfoBean bean = (UserinfoBean)session.getValue("userinfo");
    RequestDispatcher rd = null;
    try {
      bean.delUser();
      rd = ctx.getRequestDispatcher("/atmarkit2/DelUser.jsp");
      } catch(Exception e) {
      bean.setMsg(e.getMessage());
      rd = ctx.getRequestDispatcher("/atmarkit2/Error.jsp");
      }
  // 画面を表示
  rd.forward(request, response);
} 
リスト13 DelUser.java

 ここまでのファイルがすべて出来上がると、EJBなしの状態でとりあえず画面が動くようになる。こうすることで、EJB側の開発とは別に画面デザイン、JavaScriptのテストなどを平行して進めることができる。画面は後で紹介するのでここでは省く。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る