Back-end/기타 (BE)

뉴렉쳐 Servlet & JSP [51 ~ 60강]

philo0407 2020. 10. 7. 02:09

강의 51 - JSP를 이용해서 자바 웹 프로그램 만들기 시작

 

list.jsp 가 깨짐..

이 화면에서 file - property나,

alt+enter

 

하지만 이게 끝이 아님

 

아래와 같은 jsp 페이지 지시자를 넣으면 된다.

이클립스 jsp파일 생성시 기본으로 생김!

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

 

 

 

 

52 - JDBC를 이용해 글 목록 구현하기

쉽게 임포트하기 : 글자 맨 끝 ctrl + space, 저장

 

 

이곳에 포함 시키는게 아니다!!!!!

 

이곳이다!!

 

WAS가 배포하는데, 이 곳의 lib 환경에 동봉시켜주어야 한다.. (자세한건 8분쯤을 참고)

 

 

data가 두개만 추출되는 문제 발생

 

 

빼박인듯..

 

 

commit을 안하면 오라클섭에 반영이 안됀다!

내 pc에 클라와 서버가 둘다 있는셈..

 

 

끼얏호

 

강의 53 - 자세한 페이지 구현하기

int id = Integer.parseInt(request.getParameter("id"));

String url = "jdbc:oracle:thin:@localhost:1521:xe"; 
String login_id = "c##philz"; // 앞에 .. 망할 c##을 붙여줘야 함 ㅠㅠ
String login_pw = "1234";

// 권한을 부여해도,, SYNONYM을 주어도 테이블이 보이지 않는다 함..
/* String sql = "SELECT * FROM NOTICE WHERE ID=?";
String sql = "SELECT * FROM NOTICE WHERE ID="+id; */
String sql = "SELECT * FROM NOTICE WHERE ID=?";

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection con = DriverManager.getConnection(url, login_id, login_pw);
System.out.println(con.isClosed() ? "접속 종료" : "접속 중");

// 쿼리문을 미리 준비한다.
PreparedStatement st = con.prepareStatement(sql);
// 1번째 물음표에 id를 꽂아 넣겟다
st.setInt(1, id);
ResultSet rs = st.executeQuery();

rs.next();

 

참고로 날짜는 getDate이다

 

<table class="table">
	<tbody>
		<tr>
			<th>제목</th>
			<td class="text-align-left text-indent text-strong text-orange" colspan="3">
				<%= rs.getString("TITLE") %>
			</td>
		</tr>
		<tr>
		<th>작성일</th>
			<td class="text-align-left text-indent" colspan="3"><%= rs.getDate("REGDATE") %></td>
		</tr>
		<tr>
			<th>작성자</th>
			<td><%= rs.getString("WRTIER_ID") %></td>
			<th>조회수</th>
			<td><%= rs.getInt("HIT") %></td>
		</tr>
		<tr>
			<th>첨부파일</th>
			<td colspan="3"><%= rs.getString("FILES") %></td>
        </tr>
		<tr class="content">
			<td colspan="4"><%= rs.getString("CONTENT") %></td>
		</tr>
	</tbody>
</table>

 

54 - 자세한 페이지 MVC model1으로 변경하기

 

 

ResultSet rs = st.executeQuery();

rs.next();

String title = rs.getString("TITLE"); 
Date regdate = rs.getDate("REGDATE"); 
String writerId = rs.getString("WRTIER_ID"); 
int hit = rs.getInt("HIT"); 
String files = rs.getString("FILES");
String content = rs.getString("CONTENT"); 


rs.close();
st.close();
con.close();

 

강의 55 - MVC model2 방식으로 변경하기

 

컨트롤러보다 뷰가 먼제 보이면

 

에러나 빈껍데기가 보일거야,,

 

package com.newlecture.web.controller;

...

@WebServlet("/notice/detail")
public class NoticeDetailController extends HttpServlet{
		@Override
		protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
			
			int id = Integer.parseInt(request.getParameter("id"));

			String url = "jdbc:oracle:thin:@localhost:1521:xe"; 
			String login_id = "c##philz"; // 앞에 .. 망할 c##을 붙여줘야 함 ㅠㅠ
			String login_pw = "1234";

			// 권한을 부여해도,, SYNONYM을 주어도 테이블이 보이지 않는다 함..
			/* String sql = "SELECT * FROM NOTICE WHERE ID=?";
			String sql = "SELECT * FROM NOTICE WHERE ID="+id; */
			String sql = "SELECT * FROM NOTICE WHERE ID=?";

			try {
				Class.forName("oracle.jdbc.driver.OracleDriver");
				Connection con = DriverManager.getConnection(url, login_id, login_pw);
				System.out.println(con.isClosed() ? "접속 종료" : "접속 중");

				// 쿼리문을 미리 준비한다.
				PreparedStatement st = con.prepareStatement(sql);
				// 1번째 물음표에 id를 꽂아 넣겟다
				st.setInt(1, id);
				ResultSet rs = st.executeQuery();

				rs.next();

				String title = rs.getString("TITLE"); 
				Date regdate = rs.getDate("REGDATE"); 
				String writerId = rs.getString("WRTIER_ID"); 
				int hit = rs.getInt("HIT"); 
				String files = rs.getString("FILES");
				String content = rs.getString("CONTENT"); 

				// request는 저장소로도 사용 가능해
				request.setAttribute("title", title);
				request.setAttribute("regdate", regdate);
				request.setAttribute("writerId", writerId);
				request.setAttribute("hit", hit);
				request.setAttribute("files", files);
				request.setAttribute("content", content);
				
				rs.close();
				st.close();
				con.close();
			} catch (ClassNotFoundException | SQLException e) {
				e.printStackTrace();
			}
			
			
			// redirect
			// forward
			request
			.getRequestDispatcher("/notice/detail.jsp")
			.forward(request, response);

		}
}

 

detail.jsp

 

<!-- point -->
<div class="margin-top first">
	<h3 class="hidden">공지사항 내용</h3>
	<table class="table">
		<tbody>
			<tr>
				<th>제목</th>
				<td class="text-align-left text-indent text-strong text-orange" colspan="3">
					<%= request.getAttribute("title") %>											
				</td>
			</tr>
			<tr>
				<th>작성일</th>
				<td class="text-align-left text-indent" colspan="3">
					<%= request.getAttribute("regdate") %>
				</td>
			</tr>
			<tr>
				<th>작성자</th>
				<td>
					<%= request.getAttribute("writerId") %>
				</td>
				<th>조회수</th>
				<td>
					<%= request.getAttribute("hit") %>
				</td>
			</tr>
			<tr>
				<th>첨부파일</th>
				<td colspan="3">
					<%= request.getAttribute("files") %>
				</td>
			</tr>
			<tr class="content">
				<td colspan="4">
					<%= request.getAttribute("content") %>
				</td>
			</tr>
		</tbody>
	</table>
</div>

 

강의 56 - Model 데이터를 구조화하기

el 태그 규칙

getId가 있으면 ${notice.id}는

그것에 맞게 네이밍을 수정하여 꺼내줌. get을 제거하여 I는 소문자로...

entity 생성 및 EL 태그 만들기

 

소스 우클릭하여 get, set 생성

 

public class Notice {
	private String title; 
	private Date regdate;
	private String writerId; 
	private int hit; 
	private String files;
	private String content;
	
	public Notice() {
		// TODO Auto-generated constructor stub
	}
	
	public Notice(String title, Date regdate, String writerId, int hit,
			String files, String content) {
		this.title = title;
		this.regdate = regdate;
		this.writerId = writerId;
		this.hit = hit;
		this.files = files;
		this.content = content;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public Date getRegdate() {
		return regdate;
	}

	public void setRegdate(Date regdate) {
		this.regdate = regdate;
	}

	public String getWriterId() {
		return writerId;
	}

	public void setWriterId(String writerId) {
		this.writerId = writerId;
	}

	public int getHit() {
		return hit;
	}

	public void setHit(int hit) {
		this.hit = hit;
	}

	public String getFiles() {
		return files;
	}

	public void setFiles(String files) {
		this.files = files;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	@Override
	public String toString() {
		return "Notice [title=" + title + ", regdate=" + regdate + ", writerId="
				+ writerId + ", hit=" + hit + ", files=" + files + ", content="
				+ content + "]";
	} 
}

 

request.getAttribute("title") 요런거 ${n.title} 로 바꾸기..

 

강의 57 - 목록 페이지도 MVC model2로 수정하기

이왕이면 스터디의 saffy Lee의 dbUtil도 활용해보자!!

 

 

강의 58 - View 페이지 은닉하기

list.jsp와 같이 사용자가 직접적으로 jsp파일에 접근할 수 있는데, 이렇게 되면

컨트롤러를 거치지 않기 때문에 요청 데이터를 볼 수 없다.

따라서 이 페이지를 은닉할 필요가 있는데,

 

이것을 WEB-INF 폴더에 넣도록 하자!

 

강의 59 - View(list.jsp)에서 반복문 제거하기

jsp 내의 모든 자바 코드를 없애서 스파게티 소스를 없애자

 

 

강의 60 - Tag 라이브러리와 JSTL

 

태그 lib를 직접만들수 이따