[Controoler - View의 형태일때]
request.setAttribute("cnt",30) - request.getAttribute("cnt")
이런 식으로 데이터를 꺼내야하는데
EL을 사용하면 View에서는 JAVA코드를 사용하지 않을 수 있다
[사용법]
JSP 파일에서 → ${cnt}
이렇게 되면 java 파일의 request.setAttribute("cnt",30)으로 저장 된 cnt에 들어있는 값을 불러온다 = 30출력
그렇다면 List 같은 여러가지 데이터가 들어있다면 어떻게 출력될까??
1. List list = new ArrayList( ){"1", "test", ..., ...};
request.setAttrivute("list",list); 로 저장
2. ((List)request.getAttribute("list")).get(0)으로 출력
을 해야 했지만
EL을 사용하게 되면 ${list[0]}으로 순서대로 출력이 가능해진다는 장점이 있다
다음은 Map의 경우는 어떨까??
Map n = new HashMap("key", value)의 형태를 띄게 되는데
Map은 항상 key값과 value 값이 함께 저장되어야 한다
((Map)request.getAttribute("n")).get("key")로 출력을 하게 된다
하지만 EL을 사용하면
${n.key}으로 출력할 수 있게 된다
page 객체 : pageContext.setAttribute("aa", "hello")로 해당 페이지에서 사용할 수 있는 EL 데이터 객체 이다, ${aa}로 해당 JSP에서 pageContext를 선언 후 사용 할 수 있다
예를 들어 JAVA 페이지에서 request.setAttribute("result", "bye") 로 값을 저장해두고 JSP 파일에서 pageContext.setAttribute("result", "hello")라는 값을 저장해보자
그렇게 되면 둘 다 result라는 값에 저장을 해뒀기 때문에
EL문으로 데이터를 출력하려고 ${result}라고 출력하게 되면 해당 페이지에 있는 데이터가 우선 순위가 높아서 hello라는 출력 문을 출력하게 된다
이럴 경우에는 어떻게 해야될까??
${requestScope.result }라고 출력하게 되면 requestScope가 해당 request에 있는 저장소의 데이터를 불러와서 출력해주게 되고 그렇게 되면 JAVA 페이지의 result를 출력해서 bye가 출력되는 것을 확인 해볼 수 있다
그 외의 내장 객체
https://codedragon.tistory.com/6009
해당 블로그를 참조하자 대부분의 연산자는 비슷하다
JSP는 HTML과 다르게 반드시 UTF-8로 인코딩을 해줘야만 한글이 깨지지 않는다
1. ALT + ENTER 옵션 중 Text File옵션 Other의 UTF-8 변경
2. 지시어 추가 - <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
String url = "jdbc:oracle:thin:@localhost:1521/xe";
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(url,"jsp", "tigar");
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(sql);
라는 셋팅과 ojdbc8을 라이브러리에 추가해주면 자동으로 연결 되는 것을 확인할 수 있다
각각의 기능 정리
영상 참조
JAVA 파일
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List<Notice> list = new ArrayList<>();
String url = "jdbc:oracle:thin:@localhost:1521/xe";
String sql = "select * from notice";
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(url,"jsp", "tigar");
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(sql);
while(rs.next()){
int id = rs.getInt("ID");
String title = rs.getString("TITLE") ;
Date regdate = rs.getDate("REGDATE") ;
String writerId =rs.getString("WRITER_ID") ;
String hit = rs.getString("HIT") ;
String files = rs.getString("FILES") ;
String content = rs.getString("CONTENT") ;
Notice notice = new Notice(
id,
title,
regdate,
writerId,
hit,
files,
content
);
list.add(notice);
}
rs.close();
st.close();
con.close();
}catch(Exception e)
{
e.printStackTrace();
}
request.setAttribute("list", list);
request.getRequestDispatcher("/notice/list.jsp").forward(request, response);
}
JAVA 파일에서 주목해야 할 점은 아래의 VO 클래스를 활용해서 각 데이터를 저장한 뒤 List에 추가한다. 그리고 난 뒤 해당 List를 forward를 통해 해당 jsp파일로 보내준다
VO 클래스
public class Notice {
private int id;
private String title;
private Date regdate;
private String writerId;
private String hit;
private String files;
private String content;
public Notice(int id, String title, Date regdate,
String writerId, String hit, String files, String content) {
this.id = id;
this.title = title;
this.regdate = regdate;
this.writerId = writerId;
this.hit = hit;
this.files = files;
this.content = content;
}}
JSP 파일
<%
List<Notice> list = (List)request.getAttribute("list");
for(Notice n : list){
pageContext.setAttribute("n", n);
%>
<tr>
<td>${n.id }</td>
<td class="title indent text-align-left">
<a href="detail?id=${n.id }">${n.title }</a></td>
<td>${n.writerId }</td>
<td>
${n.regdate }
</td>
<td>${n.hit }</td>
</tr>
<%} %>
그러고 난뒤 해당 코드를 보자
1. List객체에 request.getAttribute("list")로 JAVA파일에서 온 데이터를 저장
단, List는 request로 넘어올 시 형변환이 필요하다
2. for(Notice n : list)의 의미는 Notice의 n이라는 변수를 가진 객체를 만들고 그곳에 아까 가져온 List를 넣어준다
3. 그리고 나서 바로 변수 n을 사용해서 해당 데이터를 하나씩 꺼낼 수 있으면 좋겠으나 그렇게편하게 사용할 수 없다. 페이지 저장소중 하나인 pageContext를 사용해서 해당 변수를 다시 한 번 해당 페이지에 저장해준 뒤 사용해야한다
4. ${n.title}과 같이 EL을 사용해서 출력할 수 있다