◆追記 1/24
UpdateUserCheck を作成しました。
ページを離れた事の判定ですが、
現在は、ListServletに戻った時点で、mapからremoveする処理を追加しました。
恐らく、これで対応できると思いますが、
一点、編集中の画面をブラウザの閉じるボタンを実施したときの対応について悩んでおります。
引き続き、知恵を貸していただけないでしょうか。
よろしくお願いします。
◆追記 1/23
Mapを利用した、ソースを書いてみました。UpdateUserCheck_N
(まだ、動かしてません)
引き続き、良い方法がないか知恵を貸していただきたいです。
◆追記
UpdateUserCheckを編集しました。
最初にページに入ったログインユーザIDとページネームをtmpに格納して、比較しようと考えています。
途中の段階ですが、引き続き知恵を貸していただけないでしょうか。
現在、ServletとJSPで掲示板を作成しています。
◆実現したいこと
ログイン後に既存ページを更新中に、別のユーザーから更新ページにアクセスがあった場合に、更新ページに入らせない。
ユーザーIDはsessionで保持。
一覧ページから編集したい項目の名前を押して、編集を押すと、パラメータをUsercheckServletに渡し、同一ユーザーかチェックし、同一ユーザーであれば、更新ページ(update.jsp)に飛ぶという流れにしようと思っています。
同時アクセス時の編集したい項目の名前(name)とユーザーID(id)を比較するロジックに関して、知恵を拝借したいです.
よろしくお願いします。
※UsercheckServletは編集中のものです。
<h1>${wikiPage.name}</h1> ${wikiPage.formatedContent} <hr> <c:if test="${login == 'OK' && wikiPage.name != 'welcome'}"> <a href="/wiki/UpdateUserCheck?id=${account.id}&name=${wikiPage.name}&content=${wikiPage.content}">このページを更新</a> </c:if>
JSP
1<h1>${param.name}の編集</h1> 2<form action="/wiki/update"> 3 <input type="hidden" name="cmd" value="update"> 4 <input type="hidden" name="name" value="${param.name}"> 5 <textarea rows="15" cols="60" name="content">${param.content}</textarea> 6 ※200文字以内 7 <br> 8 <input type="submit" value="更新"> 9 <input type="submit" value="削除" onclick="cmd.value='delete'"> 10 <input type="button" value="キャンセル" onclick="location.href='list?name=${param.name}&id=${param.id}'"> 11</form> 12 13``` 14```Servlet 15package wiki; 16 17import java.io.IOException; 18import java.util.List; 19import java.util.Map; 20 21import javax.servlet.ServletContext; 22import javax.servlet.ServletException; 23import javax.servlet.http.HttpServlet; 24import javax.servlet.http.HttpServletRequest; 25import javax.servlet.http.HttpServletResponse; 26 27public class ListServlet extends HttpServlet { 28 29 @Override 30 public void doGet(HttpServletRequest request, HttpServletResponse response) 31 throws ServletException, IOException { 32 33 ServletContext sc = getServletContext(); // アプリケーションスコープの取得 34 String name = request.getParameter("name"); 35 36 /* リストページアクセス時に編集ページにアクセスの履歴があれば、処理を実施 */ 37 if (sc.getAttribute("tmpMap") != null) { 38 int id = 0; 39 if (request.getParameter("id") == null || request.getParameter("id").isEmpty()) { 40 id = -1; 41 } else { 42 id = Integer.parseInt(request.getParameter("id")); 43 } 44 45 Map<String, Integer> map = autoCast(sc.getAttribute("tmpMap")); 46 if (map.containsKey(name)) { 47 if (map.get(name) == id) { 48 map.remove(name); 49 sc.setAttribute("tmpMap", map); 50 } 51 } 52 } 53 54 try { 55 List<WikiBean> list = WikiPageDAO.getInstance().findAll(); 56 request.setAttribute("list", list); 57 } catch (Exception e) { 58 throw new ServletException(e); 59 } 60 61 request.getRequestDispatcher("/wikiView/list.jsp").forward(request, response); 62 } 63 64 /* 戻り値の型に合わせてキャスト */ 65 @SuppressWarnings("unchecked") 66 public static <T> T autoCast(Object obj) { 67 T castedObject = (T) obj; 68 return castedObject; 69 } 70} 71``` 72 73```Servlet 74package wiki; 75 76import java.io.IOException; 77import java.util.HashMap; 78 79import javax.servlet.ServletContext; 80import javax.servlet.ServletException; 81import javax.servlet.http.HttpServlet; 82import javax.servlet.http.HttpServletRequest; 83import javax.servlet.http.HttpServletResponse; 84import javax.servlet.http.HttpSession; 85 86import Account.AccountBean; 87 88public class UpdateUserCheck extends HttpServlet { 89 90 @Override 91 public synchronized void doGet(HttpServletRequest request, HttpServletResponse response) 92 throws ServletException, IOException { 93 94 HttpSession session = request.getSession(false); 95 ServletContext sc = getServletContext(); // アプリケーションスコープの取得 96 97 String name = request.getParameter("name"); // 編集中のページ名を取得 98 AccountBean account = (AccountBean) session.getAttribute("account"); 99 100 /* アプリケーションスコープがnullであれば、新しくMapを取得する */ 101 HashMap<String, Integer> map = null; 102 if (sc.getAttribute("tmpMap") == null) { 103 map = new HashMap<String, Integer>(); 104 } else { 105 map = autoCast(sc.getAttribute("tmpMap")); // メソッドでキャスト 106 } 107 108 String message = null; 109 if (map.containsKey(name)) { 110 if (map.get(name) != account.getId()) { 111 message = "他のユーザーにて編集中です"; 112 request.setAttribute("message", message); 113 request.getRequestDispatcher("list").forward(request, response); 114 } else { 115 map.put(name, account.getId()); 116 sc.setAttribute("tmpMap", map); 117 request.getRequestDispatcher("/wikiView/update.jsp").forward(request, response); 118 } 119 } else { 120 map.put(name, account.getId()); 121 sc.setAttribute("tmpMap", map); 122 request.getRequestDispatcher("/wikiView/update.jsp").forward(request, response); 123 } 124 } 125 126 /* 戻り値の型に合わせてキャスト */ 127 @SuppressWarnings("unchecked") 128 public static <T> T autoCast(Object obj) { 129 T castedObject = (T) obj; 130 return castedObject; 131 } 132} 133```
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/22 11:53
2017/01/27 05:09