Web programming

(22.11.24)Web ํ”„๋กœ๊ทธ๋ž˜๋ฐ: JSTL,EL / JSP๊ฐœ๋ฐœ๋ชจ๋ธ1์—์„œ ๊ฐœ๋ฐœ๋ชจ๋ธ2๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

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

โ—โ—EL(Expression Language)โ—โ—

 

EL(Expression Language)์€ ์ž๋ฐ” ๋นˆ์˜ ํ”„๋กœํผํ‹ฐ, ๊ฐ’์„ JSP์˜ ํ‘œํ˜„์‹ <%= %>์ด๋‚˜ ์•ก์…˜ ํƒœ๊ทธ <jsp:useBean>๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ ๋ณด๋‹ค ์‰ฝ๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๊บผ๋‚ผ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

๋˜ํ•œ static ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ JSP์—์„œ๋Š” ์ฃผ๋กœ ์„œ๋ธ”๋ฆฟ ๋ณด๊ด€์†Œ(JspContext, ServletRequest, HttpSession, ServletContext)์—์„œ ๊ฐ’์„ ๊บผ๋‚ผ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

jsp์—์„œ๋งŒ ์“ธ์ˆ˜ ์žˆ๋Š” ์ถœ๋ ฅ์–ธ์–ด(ํ™•์žฅ์ž๊ฐ€ jsp๋กœ ๋˜์–ด ์žˆ๋Š” ๊ณณ์—์„œ๋งŒ ๊ฐ€๋Šฅ)

-๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๊ฒƒ์„ ๊ฒ‰์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์–ธ์–ด(์ฆ‰ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.)
scope ๊ฐ์ฒด ์•ˆ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๊ธฐ์— ์œ ์šฉํ•˜๋‹ค.

 

ex)

session.setAttribute("data","hello");


์œ„ ์ฝ”๋“œ๋ฅผ ์ถœ๋ ฅํ• ๋ ค๋ฉด ๊ธฐ์กด ๋ฐฉ์‹์œผ๋กœ๋Š” 

String data =(String)session.getAttribute("data");
<%=data%>


๋ผ๊ณ  ํ•ด์•ผํ•˜๋Š”๋ฐ EL๋ฅผ ์“ฐ๋ฉด

${data}

์ด๋ ‡๊ฒŒ๋งŒ ํ•ด์ค˜๋„ ๋œ๋‹ค.


์˜ˆ์‹œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<%@ page contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%
    pageContext.setAttribute("data1""page scope data");
    request.setAttribute("data2""request scope data");
    session.setAttribute("data3""session scope data");
    application.setAttribute("data4""application scope data");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title> </title>
</head>
<body>
<%
    String data1 = (String)pageContext.getAttribute("data1");
    out.println("data1:"+ data1);
%>
<p>
${data1}<br>
${data3}
</body>
</html>
cs

 

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


โ—โ—EL์‹ค์Šตโ—โ—

boardDetailForm.jsp ํŽ˜์ด์ง€์—์„œ ํ™”๋ฉด ์ถœ๋ ฅ์šฉ์œผ๋กœ ์‚ฌ์šฉ๋œ ํ‘œํ˜„์‹<%= %>๋“ค์„ ๋ชจ๋‘ ELํ‘œํ˜„์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋‚˜ํƒ€๋‚ด๊ธฐ

 


โ—โ—JSTL (JSP Standard Tag Library)โ—โ—

 

 

pageContext.setAttribute("board", b);

์ด ์ž๋ฐ” ์ฝ”๋“œ๋„ jsp ํƒœ๊ทธ๋กœ ๋ณ€ํ™˜ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด๋•Œ ์“ฐ๋Š” ๊ฒƒ์ด JSTL (JSP Standard Tag Library)

 

์ด๋•Œ JSTL๋ฅผ ๋‹ค์šด ๋ฐ›์•„์ค˜์•ผํ•œ๋‹ค.

๋‹ค์šด๋งํฌ

https://mvnrepository.com/artifact/javax.servlet/jstl/1.2

 

 

์ €์žฅ ๋ฐ›์€ ํŒŒ์ผ์„ [WEB-INF]-[lib]์— ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐํ•œ๋‹ค.

 

<%@ taglib %>์“ฐ๋Š” ๋ฒ•

prefix์™€ uri๋ฅผ ์ •ํ•ด์ค˜์•ผํ•œ๋‹ค.

 

์†์„ฑ๋“ค

 


jstl_test.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
<%@page import="java.util.*"%>
<%@ page contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JSTL ํ…Œ์ŠคํŠธ</title>
</head>
<body>
<%
    String str = "๊ฐ’์— Expression ์‚ฌ์šฉํ•˜๊ธฐ";
%>
    <p>
        <c:set var="name" value="JSTL TEST" scope="page"/>
        ${name}
    </p>
    <P>
        <c:set var="msg" value="<%=str%>"/>
        ${msg}
    </p>
    
    <%
    List<String> list = new ArrayList<>();
    list.add("์†ํฅ๋ฏผ");
    list.add("๊น€๋ฏผ์žฌ");
    list.add("ํ™ฉ์ธ๋ฒ”");
    list.add("์ด๊ฐ•์ธ");
    
    %>
    <c:set var="list" value="<%=list%>"/>
    <%
        for(int i=0;i<list.size();i++){
            String s = list.get(i);
            out.println(s+"<br>");
        }
    %>
    <p>
    <c:forEach var="item" items="${list}" varStatus="status">
        <div>${status.index +1}. ${item}</div>
    </c:forEach>
    <p>
    <ol>
    <c:forEach var="item" items="${list}" varStatus="status">
        <li>${item}</li>
    </c:forEach>
    </ol>
    <%
    Map<String,String> map = new HashMap<>();
    map.put("ํ•˜๋‚˜","์ฐจ๋ฒ”๊ทผ");
    map.put("๋‘˜","๋ฐ•์ง€์„ฑ");
    map.put("์…‹","์†ํฅ๋ฏผ");
    map.put("๋„ท","๊น€๋ฏผ์žฌ");
    
    %>    
    <p>
    <ol>
    <c:forEach var="item" items="<%=map %>">
        <li>${item.key } : ${item.value}</li>
    </c:forEach>
    </ol>
    <c:set var="map" value="<%=map %>"/>
    <p>
    <ul>
    <c:forEach var="item" items="${map }">
        <li>${item.key } : ${map[item.key]}</li>
    </c:forEach>
    </ul>
</body>
</html>
cs

 

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

Map์€ ์ˆœ์„œ๋Š” ์ง€์ผœ์ง€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋žœ๋ค์œผ๋กœ ๋‚˜์˜จ๋‹ค. ์›๋ž˜ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” Map์„ Set์œผ๋กœ ๋ฐ”๊ฟ”์„œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์จ์ค˜์•ผ ํ•˜์ง€๋งŒ JSTL๊ณผ EL์„ ์“ฐ๋ฉด ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค.


JSP ๊ฐœ๋ฐœ๋ฐฉ๋ฒ•๋ก  ๋ชจ๋ธ 1๋กœ ๋งŒ๋“  ๊ฒŒ์‹œํŒ์„ ์„œ๋ธ”๋ฆฟ์„ ์‚ฌ์šฉํ•œ ๋ชจ๋ธ 2๋กœ ๋ณ€ํ™˜ํ•ด ๋ณด๊ธฐ

 

ํŠนํžˆ๋‚˜ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„ ์›Œํฌ์™€ ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์„œ๋ธ”๋ฆฟ์„ ๋งŒ๋“ค์–ด ๋ณด๊ธฐ

์„œ๋ธ”๋ฆฟ์—์„œ๋Š” ์ดˆ๊ธฐ์— ์š”์ฒญ๋งŒ ๋ฐ›์•„์„œ ์„œ๋น„์Šค ์ž๋ฐ”ํด๋ž˜์Šค๋กœ ๋ณด๋‚ด๊ณ  ์„œ๋น„์Šค ์ž๋ฐ” ํด๋ž˜์Šค์—์„œ ์„œ๋ธ”๋ฆฟ์„ ํ†ตํ•ด ๋ทฐ๋ฅผ ๋ณด์—ฌ์ฃผ์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ๋ทฐ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ

์Šคํ”„๋ง์˜ ์„œ๋ธ”๋ฆฟ์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์š”์ฒญ์ด ์˜ค๋ฉด ์ตœ์ดˆ๋กœ ๋ฐ›์•„์„œ ์ž๋ฐ”์˜ ์„œ๋น„์Šค ํ˜น์€ ์ปจํŠธ๋กค๋Ÿฌ  ๋ ˆ์ด์–ด๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

BoardServlet.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
 
@WebServlet("/board")
public class BoardServlet extends HttpServlet {
    
    protected void service(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException 
    {
        request.setCharacterEncoding("utf-8");
        String viewPath = new BoardService(request).exec();
        if(viewPath!=null) {
            getServletContext().getRequestDispatcher(viewPath).forward(request, response);
        }
    }
}
//์„œ๋ธŒ๋ฆฟ์˜ ์ฝ”๋“œ๊ฐ€ ๋งŽ๋‹ค๋ฉด ์ฝ”๋“œ์˜ ์žฌํ™œ์šฉ์ด ์–ด๋ ค์›Œ์ง ์ฆ‰ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํž˜๋“ค์–ด์ง„๋‹ค.
cs

์„œ๋ธ”๋ฆฟ์—์„  cmd์— ๋”ฐ๋ผ ํ•ด๋‹น jsp๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฐ›์•„์˜จ ์š”์ฒญ์„ BoardService ํด๋ž˜์Šค์— ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฃผ์–ด์„œ ๋ชจ๋“  ๋กœ์ง์€ ๋ณด๋“œ์„œ๋น„์Šค์—์„œ ์ด๋ฃจ์–ด์ง€๊ฒŒ ๋” ํ•œ๋‹ค.

 

 

BoardService.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
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import java.io.*;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import com.ezen.web.hello.Board;
 
public class BoardService 
{
    private HttpServletRequest request;
    private HttpSession session;
    private String viewPath = "/WEB-INF/jsp/model2";
    private String fpath = "D:/java_test/boardList.ser";
    public BoardService() {}
    
    public BoardService(HttpServletRequest request) {
        this.request = request;
    }
    
    public String exec() {
        // ์š”์ฒญ ์ฒ˜๋ฆฌ
        String cmd = request.getParameter("cmd");
        if(cmd==null || cmd.equals("list")) {
            List<Board> list = getList();
            request.setAttribute("list", list);
            return viewPath+"/boardList.jsp";
        }
        // ๋ฐ์ดํ„ฐ๋ฅผ request์— ์ €์žฅ
        // ์‘๋‹ต์šฉ View ๋ฆฌํ„ด
        return null;
    }
    public List<Board> getList()
    {
        return deserialize();
    }
    
    public Board find(Board key)
    {
        List<Board> list = deserialize();
        if(list.contains(key)) {
            return list.get(list.indexOf(key));
        }
        return null;
    }
    
    public Board read(Board key)
    {
        String cmd = request.getParameter("cmd");
        Board found = find(key);
        
        if(cmd.equals("FIND")){
            return found;
        }
        
        found.setHit(found.getHit()+1);
        List<Board> list = deserialize();
        list.get(list.indexOf(found)).setHit(found.getHit());
        serialize(list);
        return found;
    }
    public boolean update(Board newBoard) {
        List<Board> list = deserialize();
        if(list.contains(newBoard)) {
            Board b = list.get(list.indexOf(newBoard));
            b.setTitle(newBoard.getTitle());
            b.setContents(newBoard.getContents());
            return serialize(list);
        }
        return false;
    }
    public boolean deleteBoard(Board key)
    {
        List<Board> list = deserialize();
        if(list.contains(key)) {
            list.remove(list.indexOf(key));
            return serialize(list);
        }
        return false;
    }
    
    private boolean serialize(List<Board> list)
    {
        File f = new File(fpath);
        try {
            ObjectOutputStream oout = new ObjectOutputStream(new FileOutputStream(f));
            oout.writeObject(list);
            oout.close();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
    
    private List<Board> deserialize()
    {
        File f = new File(fpath);
        List<Board> list = null;
        if(!f.exists()) {
            list = new ArrayList<Board>();
        }else {
            try {
                ObjectInputStream oin = new ObjectInputStream(new FileInputStream(f));
                list = (List<Board>)oin.readObject();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }    
        return list;
    }
 
    public HttpServletRequest getRequest() {
        return request;
    }
 
    public void setRequest(HttpServletRequest request) {
        this.request = request;
    }
 
    public HttpSession getSession() {
        return session;
    }
 
    public void setSession(HttpSession session) {
        this.session = session;
    }
}
cs

19ํ–‰~25ํ–‰ : cmd์— ๋”ฐ๋ผ์„œ ๋ณด๋“œ ์„œ๋น„์Šค ํด๋ž˜์Šค์—์„œ ์„œ๋ธ”๋ฆฟ์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ๋ทฐ๋กœ ๋ฆฌํ„ดํ•ด์ค€๋‹ค.

 

 

boardList.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
<%@page import="com.ezen.web.hello.*"%>
<%@page import="java.util.List"%>
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!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>
<c:forEach var="b" items="${list}" >
 
        <tr>
            <td>${b.num}</td>
            <td>
                <a href="boardController.jsp?cmd=READ&num=${b.num}">
                    ${b.title}</a>
            </td>
            <td>${b.author}</td>
            <td>${b.regDate}</td>
            <td>${b.contents}</td>
        </tr>
</c:forEach>
</table>
<div class="links">
    [<a href="boardController.jsp?cmd=ADD_FORM">๊ธ€์“ฐ๊ธฐ</a>]
</div>
</main>
</body>
</html>
cs

JSTL ๊ณผ EL์„ ์จ์„œ ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ๋ฆฟ ํƒœ๊ทธ๋ฅผ ์จ์„œ ์ฝ”๋”ฉํ–ˆ๋˜ ๋ชจ๋“  ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์ง€์šธ ์ˆ˜ ์žˆ๊ฒŒ ๋๋‹ค.

 

 

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

๋Œ“๊ธ€