12月10日

今後の予定について

12月17日まで

基本機能が動作するようにがんばりましょう!
機能の単位はロバストネス図で考えること。

12月17日

発表用のパワポ作成の課題を誰かに割り当てる
(テンプレートを用意するので必要事項を記入する)
発表する機能の動作確認。

1月7日

1現目はチーム内でパワポの確認とデモ内容の確認。
2現目は発表。

基本機能の確認

新規登録

  1. トップページを表示する
  2. 「新規登録」などのリンクをクリック
  3. 新規登録の画面を表示する
  4. 新規登録の画面で入力する
    1. 問題なければ新規登録する
    2. 不足があればエラー表示する

ログイン

  1. トップページを表示する
  2. 「ログイン」などのリンクをクリック
  3. ログインの画面を表示する
  4. IDとパスワードを入力する
    1. 一致すればホーム画面に進む
    2. 不一致ならエラー表示する

Webアプリの基本機能

  1. ホーム画面にWebアプリ特有の情報を表示する?
  2. ホーム画面からデータを送信する
  3. 送信したデータがDBに登録される(はず?)
  4. 送信したデータが画面上に表示される(?)

12月3日

ログアウトの設定

ログアウトを実行したい場合、spring-security.xml に以下の設定をする。

<sec:http auto-config="true">
    <intercept-url pattern="/**" access="ROLE_USER" />
    <sec:form-login login-page="/login.jsp"
        default-target-url="/home"
        authentication-failure-handler-ref="authenticationFailureHandler" />
    <sec:logout
        logout-url="/logout"
        logout-success-url="/"
        invalidate-session="true"
        delete-cookies="JSESSIONID" />
</sec:http>
 
<beans:bean id="authenticationFailureHandler"
    class="org.springframework.security.web.authentication.ExceptionMappingAuthenticationFailureHandler">
    <beans:property name="defaultFailureUrl" value="/login.jsp?error=true"/>
    <beans:property name="useForward" value="true"/>
</beans:bean>

ログインしたユーザー情報の取得

ログインしたユーザーを取得するには、コントローラの引数に Principal を追加する。
ここでは、追加した Princical から getName()メソッドでユーザー名を取得し、addAttribute() で name に値を設定している。

@RequestMapping(value = "/home", method = RequestMethod.GET)
public String home(Model model, Principal p) {
    model.addAttribute("name", p.getName());
    return "home";
}

Userインスタンスの取得

Principal から取得できるのは名前だけなので、詳細な情報を取得するには、名前をキーにしてUsersテーブルから取得する必要がある。
Usersテーブルから名前をキーにして取得するために、DAOにメソッド定義 findByName() を追加する。

UserDao.java

public interface UserDao<T> {
    public List<T> getAll();
    public T findById(long id);
    public T findByName(String name);
    public void add(T data);
    public void update(T data);
    public void delete(T data);
    public void delete(long id);
}

UserDaoImpl で、検索機能を実装する。

UserDaoImpl.java

public class UserDaoImpl implements UserDao<User> {
    private static EntityManagerFactory factory = Persistence.createEntityManagerFactory("persistenceUnit");
 
    public List<User> getAll() {
        EntityManager manager = factory.createEntityManager();
        CriteriaBuilder builder = manager.getCriteriaBuilder();
        CriteriaQuery<User> query = builder.createQuery(User.class);
        Root<User> root = query.from(User.class);
        query.select(root);
        List<User> list = null;
        try {
            list = manager.createQuery(query).getResultList();
        } catch (NoResultException e) {
            //
        }
        return list;
    }
 
    public User findById(long id) {
        EntityManager manager = factory.createEntityManager();
        CriteriaBuilder builder = manager.getCriteriaBuilder();
        CriteriaQuery<User> query = builder.createQuery(User.class);
        Root<User> root = query.from(User.class);
        query.select(root).where(builder.equal(root.get("id"), id));
        User u = null;
        try {
            u = manager.createQuery(query).getSingleResult();
        } catch (NoResultException e) {
            //
        }
        return u;
    }
 
    public User findByName(String name) {
        EntityManager manager = factory.createEntityManager();
        CriteriaBuilder builder = manager.getCriteriaBuilder();
        CriteriaQuery<User> query = builder.createQuery(User.class);
        Root<User> root = query.from(User.class);
        query.select(root).where(builder.equal(root.get("name"), name));
        User u = null;
        try {
            u = manager.createQuery(query).getSingleResult();
        } catch (NoResultException e) {
            //
        }
        return u;
    }
 
    public void add(User user) {
        EntityManager manager = factory.createEntityManager();
        EntityTransaction transaction = manager.getTransaction();
        transaction.begin();
        User u = findById(user.getId());
        if (u == null) {
            try {
                manager.persist(user);
                transaction.commit();
            } catch (PersistenceException e) {
                transaction.rollback();
            }
            manager.close();
        } else {
            throw new PersistenceException("Duplicate user-id : " + u.getId());
        }
    }
 
    public void update(User user) {
        EntityManager manager = factory.createEntityManager();
        EntityTransaction transaction = manager.getTransaction();
        transaction.begin();
        try {
            manager.merge(user);
            transaction.commit();
        } catch (PersistenceException e) {
            transaction.rollback();
        }
        manager.close();
    }
 
    public void delete(User user) {
        EntityManager manager = factory.createEntityManager();
        EntityTransaction transaction = manager.getTransaction();
        transaction.begin();
        try {
            manager.remove(user);
            transaction.commit();
        } catch (PersistenceException e) {
            transaction.rollback();
        }
        manager.close();
    }
 
    public void delete(long id) {
        delete(findById(id));
    }
 
}