Web programming

(22.11.23)Web ํ”„๋กœ๊ทธ๋ž˜๋ฐ: JSP ๊ฐœ๋ฐœ๋ชจ๋ธ1(MVC๋ฐฉ์‹)-๊ฒŒ์‹œํŒ ๋กœ๊ทธ์•„์›ƒ๊ธฐ๋Šฅ, ์ž‘์„ฑ์ž๋งŒ ์ˆ˜์ •/์‚ญ์ œ ๊ธฐ๋Šฅ๋งŒ๋“ค๊ธฐ

ํ”„๋กœ๊ทธ๋ž˜๋จธ ์˜ค์›” 2022. 11. 23.

(22.11.22)์— ์ž‘์„ฑํ•œ ํ”„๋กœ๊ทธ๋žจ์— ์ถ”๊ฐ€๋กœ ๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ ์ž‘์„ฑ

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น uid์˜ ์ž‘์„ฑ์ž๋งŒ ์ž์‹ ์˜ ๊ธ€์„ ์‚ญ์ œ, ์ˆ˜์ • ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์œผ๋กœ ๋กœ๊ทธ์ธํ•˜๋ฉด ๊ธ€ ์ฝ๊ธฐ๋Š” ๊ฐ€๋Šฅํ•˜๋”๋ผ๋„ ์‚ญ์ œ ์ˆ˜์ •์€ ๋ถˆ๊ฐ€๋Šฅ ํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ

 

โ—โ—logout Partโ—โ—

 

loginController.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%
    String cmd = request.getParameter("cmd");
    if (cmd==null) cmd = "loginform";
    
    if(cmd.equals("loginform")){ %>
        <jsp:forward page="../WEB-INF/jsp/loginForm.jsp"/>
<%    }else if(cmd.equals("login")){ %>
        <jsp:forward page="../WEB-INF/jsp/loginProc.jsp"/>
<%    }else if(cmd.equals("logout")){ %>
        <jsp:forward page="../WEB-INF/jsp/logoutProc.jsp"/>
<%    }
%>
cs

๋กœ๊ทธ์ธ ์ปจํŠธ๋กค๋กœ cmd์˜ ๊ฐ’์— ๋”ฐ๋ผ ํ•ด๋‹น jsp๋กœ forwardํ•ด์ค€๋‹ค.

 

UserService.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
 
public class UserService 
{
    private HttpSession session;
    private static Map<String,String> userMap = new HashMap<>();
    static { //static ๋ธ”๋Ÿญ : ํด๋ž˜์Šค๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ์ž๋™์œผ๋กœ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋Š” ๋ธ”๋Ÿญ (๊ธฐ๋Šฅ์€DB๋ผ ์ƒ๊ฐํ•˜๋ฉด ๋จ)
        userMap.put("smith""1111");
        userMap.put("bob""2222");
    }
    
    public UserService() {}
    
    public boolean login(User user)
    {
        Set<String> keyset =userMap.keySet();
        Iterator<String> it = keyset.iterator();
        while(it.hasNext()) {
            String uid = it.next();
            String pwd = userMap.get(uid);
            if(user.getUid().equals(uid) && user.getPwd().equals(pwd))
            {
                session.setAttribute("uid", user.getUid());
                return true;
            }
        }
        return false;
    }
    public void setSession(HttpSession session) {
        this.session = session;
    }
    public void logout()
    {
        session.invalidate();
    }
}
cs

hashMap์„ ์ด์šฉํ•˜์—ฌ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์Œ์œผ๋กœ ์ €์žฅํ•œ๋‹ค.

16ํ–‰: ์ž๋ฃŒ๊ตฌ์กฐ map์€ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ ค์ฃผ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— Set ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๋ฐ”๊ฟ”์„œ Iterator๋ฅผ ํ†ตํ•ด hasNext()๋ฉ”์†Œ๋“œ๋ฅผ ์จ์„œ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฆฐ๋‹ค.

34ํ–‰ : logout ๋ฉ”์†Œ๋“œ 

session.removeAttribute("uid"); (๋กœ๊ทธ์•„์›ƒ ๋งํฌ ํด๋ฆญ์‹œ ์„œ๋ฒ„์ธก session์— ์ €์žฅ๋œ ์ด์šฉ์ž์˜ id์ œ๊ฑฐ)

session.invalidate();(์„ธ์…˜์— ์ €์žฅ๋œ ๋ชจ๋“  ๊ฐ’๋“ค์„ ์ „๋ถ€ ์‚ญ์ œ)

 

user_inc.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<%@ page contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%
   String uid = (String)session.getAttribute("uid");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title> ๋กœ๊ทธ์•„์›ƒ </title>
</head>
<script src="https://code.jquery.com/jquery-3.6.1.min.js" 
integrity="sha256-o88AwQnZB+VDvE9tvIXrMQaPlFFSUTR+nldQm1LuPXQ=" crossorigin="anonymous">
</script>
<script type="text/javascript">
function logout()
{    
    $.ajax({
        url : '/JavaWeb/login/loginController.jsp',
        method: 'post',
        data:{"cmd":"logout"},
        cache : false,
        dataType:'json',
        success:function(res){
            alert(res.logout ? '๋กœ๊ทธ์•„์›ƒ ์„ฑ๊ณต' : '๋กœ๊ทธ์•„์›ƒ ์‹คํŒจ');
            location.href='/JavaWeb/login/loginController.jsp';
        },
        error : function(xhr,status,err){
            alert('์—๋Ÿฌ:' + err);
        }
    });
}
</script>
<style>
   a#logout_link {margin-left:1em; background-color:rgb(255,200,200); font-size: small;}
</style>
<body>
<span><%=uid %></span>
<a id="logout_link"href="javascript:logout();">๋กœ๊ทธ์•„์›ƒ</a>
</body>
</html>
cs

๋กœ๊ทธ์•„์›ƒ ๋งํฌ๋ฅผ ๋ˆ„๋ฅด๋ฉด logout()ํ•จ์ˆ˜๊ฐ€ ๋Œ์•„๊ฐ„๋‹ค. ๋กœ๊ทธ์ธ์ปจํŠธ๋กค๋Ÿฌ์— cmd์— logout์„ ์ค€๋‹ค. logoutProc.jsp์—์„œ ๋„˜์–ด์˜จ ์‘๋‹ต์ด ์ฐธ์ด๋ฉด ๋กœ๊ทธ์•„์›ƒ ์„ฑ๊ณต์„ ๊ฑฐ์ง“์ด๋ฉด ๋กœ๊ทธ์•„์›ƒ ์‹คํŒจ๋ฅผ alert์ฐฝ์— ๋„์šด๋‹ค.

 

 

logoutProc.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@page import="org.json.simple.JSONObject"%>
<%@ page contentType="application/json; charset=utf-8" pageEncoding="utf-8"%>
 
<jsp:useBean id="login_svc" class="com.ezen.web.user.UserService" scope="session">
    <jsp:setProperty name="login_svc" property="session" value="<%=session%>" />
</jsp:useBean>
 
<%
    login_svc.logout();
    JSONObject jsObj = new JSONObject();
    jsObj.put("logout"true);
    out.print(jsObj.toJSONString());
    out.flush();
%>
cs

logout()๋ฉ”์†Œ๋“œ๋ฅผ ๋Œ๋ ค ์ฐธ์ด ๋‚˜์˜จ๋‹ค๋ฉด json๊ฐ์ฒด์— logout์„ ์ฐธ์ด๋ผ ์„ค์ •ํ•ด์„œ user_inc.jsp์— ๋„˜๊ฒจ์ค€๋‹ค.

 

 


โ—โ—Board Partโ—โ—

boardController.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%
    String uid = (String)session.getAttribute("uid");
    if(uid==null) {
        session.setAttribute("url", request.getRequestURL().toString());
        response.sendRedirect("../login/loginController.jsp?cmd=loginform");
        return;
    }
    
    String cmd = request.getParameter("cmd");
    if (cmd==null) cmd="LIST";
    
    switch(cmd)
    {
    case "ADD_FORM":
%>
        <jsp:forward page="../WEB-INF/jsp/boardAddForm.jsp"/>
<%
        break;
    case "ADD":
%>
        <jsp:forward page="../WEB-INF/boardAddProc.jsp"/>
<%    
        break;
    case "LIST":
%>
        <jsp:forward page="../WEB-INF/jsp/boardListForm.jsp"/>
<%        break;
    case "READ":
%>
        <jsp:forward page="../WEB-INF/jsp/boardDetailForm.jsp"/>
 
<%        break;
    case "FIND":
%>
        <jsp:forward page="../WEB-INF/jsp/boardDetailForm.jsp"/>
 
<%        break;    
    case "EDIT":
%>
        <jsp:forward page="../WEB-INF/jsp/boardEditForm.jsp"/>
<%        break;
    case "UPDATE":
%>
        <jsp:forward page="../WEB-INF/boardUpdateForm.jsp"/>
<%        break;    
    case "DELETE":
%>
        <jsp:forward page="../WEB-INF/boardDeleteForm.jsp"/>
<%        break;    
    }
%>
cs

 

์ด์šฉ์ž๊ฐ€ ๋งŒ์•ฝ ์ˆ˜์ •/์‚ญ์ œ์˜ ์š”์ฒญ ๊ฒฝ๋กœ๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ๊ทธ ์ฃผ์†Œ๋ฅผ ์ฃผ์†Œ์ฐฝ์— ์ž…๋ ฅํ•˜๊ณ  ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์ ‘์†ํ•˜๋Š” ๊ฑธ ๋ง‰๊ธฐ ์œ„ํ•˜์—ฌ ๋ทฐ์— ํ•ด๋‹น๋˜๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€๋“ค์€ ์ด์šฉ์ž๊ฐ€ ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก ๊ฐ์ถฐ์•ผํ•œ๋‹ค.
์ฝ˜ํŠธ๋กค๋Ÿฌ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  url๋กœ ์ ‘์†ํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฝ˜ํŠธ๋กค๋Ÿฌ๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ๋ทฐ,๋กœ์ง jsp๋“ค์„ ๋ชจ๋‘ WEB-INF ์•ˆ์— ์ €์žฅํ•˜์—ฌ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค.
WEB-INF/ ์•„๋ž˜์— JSPํŒŒ์ผ์„ ๋‘๋ฉด ์ด์šฉ์ž๊ฐ€ ์›น๋ธŒ๋ผ์šฐ์ €๋กœ ์ง์ ‘ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์—†๋‹ค.
forward ์‹œ์— page์†์„ฑ์œผ๋กœ WEB-INF/.... ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


boardListForm.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<%@page import="com.ezen.web.hello.*"%>
<%@page import="java.util.List"%>
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<jsp:useBean id="board_svc" class="com.ezen.web.hello.BoardService" scope="session"/>
<%
    List<Board> list = board_svc.getList(); 
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก</title>
<style type="text/css">
    main { width:fit-content; margin:1em auto; }
    main h3{ text-align: center; }
    table { border:1px solid black; border-spacing:0; border-collapse: collapse; 
        padding:0.5em;
    }
    td,th { border-bottom:1px dashed black; padding:0.3em 1em; 
        border-right: 1px solid black;
    }
    th { background-color:rgb(210,210, 255);}
    a {text-decoration: none;}
    div.links { width:fit-content; margin:1em auto; }
</style>
</head>
<body>
<main>
<%@ include file="/WEB-INF/jsp/user_inc.jsp"  %>
<h3>๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก</h3>
<table>
<tr><th>๋ฒˆํ˜ธ</th><th>์ œ๋ชฉ</th><th>์ž‘์„ฑ์ž</th><th>์ž‘์„ฑ์ผ</th><th>ํžˆํŠธ์ˆ˜</th></tr>
<%
    for(int i=0;i<list.size();i++) {
        Board board = list.get(i); 
%>
        <tr>
            <td><%=board.getNum()%></td>
            <td>
                <a href="boardController.jsp?cmd=READ&num=<%=board.getNum()%>">
                    <%=board.getTitle()%></a>
            </td>
            <td><%=board.getAuthor()%></td>
            <td><%=board.getRegDate()%></td>
            <td><%=board.getHit()%></td>
        </tr>
<%    }
%>
</table>
<div class="links">
    [<a href="boardController.jsp?cmd=ADD_FORM">๊ธ€์“ฐ๊ธฐ</a>]
</div>
</main>
</body>
</html>
cs

29ํ–‰ : ์ง€์‹œ์ž ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•˜์—ฌ include ์ง€์‹œ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ํŽ˜์ด์ง€(๋กœ๊ทธ์•„์›ƒ ๋งํฌ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๋Š” user_inc.jsp)๋ฅผ ํ˜„์žฌ ํŽ˜์ด์ง€์— ์‚ฝ์ž…ํ•œ๋‹ค.

 

 

boardDetailForm.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<%@page import="com.ezen.web.hello.Board"%>
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<jsp:useBean id="board_svc" class="com.ezen.web.hello.BoardService" scope="session"/>
    <jsp:setProperty name="board_svc" property="request" value="<%=request %>" />
<jsp:useBean id="board" class="com.ezen.web.hello.Board">
    <jsp:setProperty name="board" property="*"  />
</jsp:useBean>
<%
    Board b = board_svc.read(board);
 
    String thisuid = (String)session.getAttribute("uid");
    String author = b.getAuthor();
    boolean owned = thisuid.equals(author);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>๊ฒŒ์‹œ๊ธ€ ์ฝ๊ธฐ</title>
<style type="text/css">
    main{width:fit-content; margin:1em auto; }
    main h3{text-align: center;}
    label { display:inline-block; padding:0.2em 1em; border-bottom:1px solid black;
        text-align: right; width:3em; margin-right:1em;
    }
</style>
</head>
<script src="https://code.jquery.com/jquery-3.6.1.min.js" 
integrity="sha256-o88AwQnZB+VDvE9tvIXrMQaPlFFSUTR+nldQm1LuPXQ=" crossorigin="anonymous">
</script>
<script type="text/javascript">
$(function(){
    var owned = <%=owned %>
    if(!owned){
        $('#owner_only').css('display','none');
    }        
});
</script>
<script type="text/javascript">
    function deleteBoard(num)
    {
        if(!confirm("์ •๋ง๋กœ ํ˜„์žฌ ๊ฒŒ์‹œ๊ธ€์„ ์‚ญ์ œํ•˜๊ฒ ์Šต๋‹ˆ๊นŒ?")) return;
 
        var obj ={};
        obj.cmd='DELETE'//={"cmd":"DELETE"}
        obj.num=<%=b.getNum()%>;
        $.ajax({
            url:'boardController.jsp'
            method:'post',
            data: obj,
            cache : false,
            dataType: 'json',
            success: function(res){ 
                if(res.deleted){
                    alert(res.deleted ? '์‚ญ์ œ ์„ฑ๊ณต':'์—๋Ÿฌ'); 
                    location.href ='boardController.jsp?cmd=LIST';
                }
            },
            error : function(xhr,status,err){
                alert(err);
            }
        });
        return false;
    }
</script>
<body>
<main>
<%@ include file="/WEB-INF/jsp/user_inc.jsp"  %>
<h3>๊ฒŒ์‹œ๊ธ€ ์ฝ๊ธฐ</h3>
<div><label>๊ธ€๋ฒˆํ˜ธ</label> <%=b.getNum()%></div>
<div><label>์ œ ๋ชฉ</label> <%=b.getTitle()%></div>
<div><label>์ž‘์„ฑ์ž</label> <%=b.getAuthor()%></div>
<div><label>์ž‘์„ฑ์ผ</label> <%=b.getRegDate()%></div>
<div><label>ํžˆํŠธ์ˆ˜</label> <%=b.getHit()%></div>
<div><label>๊ธ€๋‚ด์šฉ</label> <%=b.getContents()%></div>
[<a href="boardController.jsp?cmd=ADD_FORM"> ๊ฒŒ์‹œ๊ธ€ ๋“ฑ๋ก ํŽ˜์ด์ง€ ๊ฐ€๊ธฐ </a>]
<span id="owner_only">
[<a href="boardController.jsp?cmd=EDIT&num=<%=b.getNum()%>"> ์ˆ˜์ • </a>]
[<a href="javascript:deleteBoard(<%=b.getNum()%>);">์‚ญ์ œ</a>]
</span>
[<a href="boardController.jsp?cmd=LIST"> ๋ชฉ๋ก ๊ฐ€๊ธฐ</a>]
</main>
</body>
</html>
cs

18ํ–‰ : ์ž‘์„ฑ์ž์™€ ํ˜„์žฌ ์„ธ์…˜ ๊ฐ์ฒด์— ์žˆ๋Š” uid๊ฐ€ ๊ฐ™์ง€ ์•Š๋‹ค๋ฉด ์‚ญ์ œ์™€ ์ˆ˜์ • ๋งํฌ๋ฅผ ์™„์ „ํžˆ ์—†์• ๊ธฐ

$('#btn').css('visibility','hidden'); btn ํƒœ๊ทธ๋ฅผ ์•ˆ๋ณด์ด๊ฒŒ ํ•จ
$('#btn').css('visibility','hidden');  btn ํƒœ๊ทธ๋ฅผ ๋ณด์ด๊ฒŒ ํ•จ
$('#btn').css('display','none');  btn ํƒœ๊ทธ๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐํ•จ

 

 

์‹คํ–‰ ๊ฒฐ๊ณผ : 

์ฒซ ์‹คํ–‰ ํ™”๋ฉด

 

 

bob์œผ๋กœ ๋กœ๊ทธ์ธ ์„ฑ๊ณต

 

 

<%@ include file %> ๋•Œ๋ฌธ์— ์ƒ๊ธด ์ขŒ์ธก ์ƒ๋‹จ ์•„์ด๋””์™€ ๋กœ๊ทธ์•„์›ƒ ๋งํฌ

 

 

bob ์•„์ด๋””๋กœ bob์ด ์ ์€ ๊ฒŒ์‹œ๊ธ€ ์ฝ๊ธฐ ์ˆ˜์ •๊ณผ ์‚ญ์ œ ๋งํฌ๊ฐ€ ์ œ๋Œ€๋กœ ๋‚˜์˜ค๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค

 

 

bob ์•„์ด๋””๋กœ smith๊ฐ€ ์ ์€ ๊ฒŒ์‹œ๊ธ€์„ ๋ณด๋ฉด ์ˆ˜์ •๊ณผ ์‚ญ์ œ ๋งํฌ๊ฐ€ ์‚ฌ๋ผ์ ธ์„œ ์ˆ˜์ • ๋ฐ ์‚ญ์ œ๋ฅผ ํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค

 

 

๋กœ๊ทธ์•„์›ƒ ํ•˜๊ธฐ

 

 

๋กœ๊ทธ์•„์›ƒ ํ•˜๋ฉด ์ดˆ๊ธฐ์˜ ๋กœ๊ทธ์ธ ํผ์ด ๋œจ๊ฒŒ ๋œ๋‹ค.

๋Œ“๊ธ€