[JSP] 홈페이지 만들기 (2)

·2023년 10월 26일
0

jsp

목록 보기
2/18

1. JSP란?

jsp... java server pages 의 약자이다.
서버 프로그래밍용 자바인 것이다.
서버 측 스크립트 언어이며, 동적인 웹 페이지를 생성하는 데 사용된다. JSP 페이지는 HTML 코드 내에 java 코드를 포함할 수 있으며, 웹 애플리케이션 서버에서 실행되어 동적으로 웹 페이지를 생성하고 사용자에게 표시한다.

2. JSP가 구동되는 원리

jsp 파일을 만들면 Container가 알아서 java 파일로 변환하고, class 파일을 실행한다.
서버에서 실행되는 프로그램 : html
jsp : java + 웹 프로그램(html, css, javascript)

(1) jsp 내에서 자바 코드를 사용할 때

  1. <%! ~~ %> : 선언문
  2. <% %> : scriptlet
  3. <%= %> : 표현식

(2) <%! ~~ %> 선언문 : JSP 내 메서드 사용

내가 jsp 를 만들면 모든건 _ jspService 메서드 안에 들어간다. 그런데 내가 메서드를 새로 만들고 싶다? 메서드 안에 메서드는 들어가지 않으므로 만들 수 없다.
그런데 선언문으로 만든다면 에러가 사라진다.
선언문은 jsp 서비스 바깥에 만들어지기 때문이다.
이건 많이 사용되진 않고~ 특정 메서드를 오버라이드 하고 싶을 때 사용하는 것이다.

(3) <% %> Scriptlet

html 상에 java 변수나 식의 결과를 나타내고 싶을 때 사용한다.

(4) <%= %> 표현식

html 상에 java 변수의 식이나 결과를 나타내고 싶을 때

3. JSP에서 사용되는 지시어

(1) <% @page ~~~ %>

현재 페이지에 대한 속성 값을 지정한다.

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

서버가 response 값을 보내 줬을 때 그 값을 받는 type은? text/html 이라는 것이다.
ex) import : 모르는 클래스가 있다면 상속받아라

(2) <% @include ~~~ %>

template page 를 만들 때 사용
파일 이름을 적게 만들어서 ~~~ 에 있는 소스를 가져오게 만든다.

top.jsp 파일 소스가 다~ 가져와져서 index 파일은 온전한 파일로 만들 수 있게 한다.

그래서 나온 나의 myHome

(3) < %@taglib ~~~ %>

사용자 정의 태그를 등록해서 사용할 때

4. JSP에서 사용하는 주석

<!— —> : html 주석
<%— —%> : jsp 주석
// : scroptlet 안에서의 java 한줄 주석
/% ~ %/ : scriptlet 안에서의 java 한줄 주석






그렇다고 한다. JSP에서 html 을 배워 두니까 블로그 작성할 때도 편하고 좋다. 진작 단과 수업 시간에 열심히 들었어야 했다고 생각 중...

5. JSP로 myHome 에 학생 관리 프로그램 만들어 보기

(1) top, bottom, index, company 코드

top

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
    
   <!-- top.jsp -->
<html>
<head>
<meta charset="EUC-KR">
	<title>홈 페이지</title>
</head>
<body>
	<div align="center"> 
		<table border="1" width="70%" height="90%">
			<tr height="10%">
				<td colspan="2" align="center">
					<a href= "index.jsp">HOME</a> | 로그인 | 회원가입 | 
					<a href= "company.jsp">회사소개 </a>
				</td>
			</tr>
			
			<tr height="80%">
				<td width ="20%" align="center">tree/view</td>
				<td width="80%">

bottom

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!-- bottom.jsp -->

</td>
			</tr>
			<tr height="10%">
				<td colspan="2" align="center">
					KGITBANK 핀테크 개발 509호
				</td>
			</tr>
		</table>
	</div>
</body>
</html>

index

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

<%@ include file="top.jsp" %>
<h3>제 홈페이지에 온 것을 환영합니다</h3>
<ul>
	<li><a href="student.jsp">학생 관리 프로그램으로 가기</a></li>
</ul>
<%@ include file="bottom.jsp" %>

company

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

<!-- company.jsp -->

<%@ include file="top.jsp" %>
<h3>저희 회사는 일은 조금, 월급은 많은 회사입니다.</h3>
<%@ include file="bottom.jsp" %>

(2) java - jsp 연결

java 코드로 DB를 관리하고 그 객체를 jsp 에 불러와서 만들면 일일이 모든 jsp 에 DB 관련 명령어를 불러와 작성하는 것보다 편해진다. 그래서 myHome 에 자바 코드 StudentDAO, StudentDTO 를 만들어 DB를 관리한다.

참고로 ojdbc8.jar 파일은 이쪽에 넣어야 한다.


이건 java 파일이니까 java Resources 폴더 안에 만들어 주어야 한다. 이런 식으로.

DTO : Data Transfer Object

CRUD 작업을 만드는 클래스.
getMethod setMethod 를 관리하는 DTO 클래스 만들기.

package my.student;

// DTO : Data Transfer Object

public class StudentDTO {
	private String id;
	private String name;
	private String cname;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getCname() {
		return cname;
	}
	public void setCname(String cname) {
		this.cname = cname;
	}
}

DAO : Data Access Object

package my.student;

import java.sql.*;

// DAO : Data Access Object - CRUD 작업을 만드는 클래스
public class StudentDAO {
	Connection con;
	PreparedStatement ps;
	ResultSet rs;
	
	String url, user, pass;
	
	public StudentDAO() {	
		// 이때 제일 중요한 것이 생성자의 접근 제한자 : 반드시 public 으로 해 줘야 한다
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		}catch(ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		url = "jdbc:oracle:thin:@localhost:1521:xe";
		user = "fin01";
		pass = "fin01";
		
	}
	
	public int insertStudent(String id, String name, String cname) throws SQLException {
		try {
			Connection con = DriverManager.getConnection(url, user, pass);
			String sql = "insert into student values(?, ?, ?)";
			PreparedStatement ps = con.prepareStatement(sql);
			ps.setString(1, id);
			ps.setString(2, name);
			ps.setString(3, cname);
			// insert delete update => executeUpdate();		 : 반환형 int
			// select => executeQuery();					 : 반환형 ResultSet
			int res = ps.executeUpdate();
			return res;
			
		}finally {	
			// 멀티 스레드로 실행되는 finally : 실행에 영향을 주지 않는다
			// 닫는 건 따로 실행된다 닫혀지니까 메모리에 남지 않고 그러면 오버플로우가 나지 않는다.
			if (ps != null) ps.close();
			if (con != null) con.close();
		}
	}
	
	public int deleteStudent(String id) throws SQLException {
		try {
			Connection con = DriverManager.getConnection(url, user, pass);
			String sql = "delete from student where id = ?";
			PreparedStatement ps = con.prepareStatement(sql);
			ps.setString(1, id);
			
			int res = ps.executeUpdate();
			return res;
		}finally {
			if (ps != null) ps.close();
			if (con != null) ps.close();
		}
	}
	
}

학생 추가 코드

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR" %>
<jsp:useBean id="stdao" class="my.student.StudentDAO"/>
<!-- insert.jsp -->

<%
	// 1. 넘어온 데이터 받기
	request.setCharacterEncoding("EUC-KR");
	String id = request.getParameter("id");
	String name = request.getParameter("name");
	String cname = request.getParameter("cname");
	
	// 2. 받은 데이터 유효성 검사하기(받은 데이터가 null이면 이전 페이지로 이동)
	// str.trim() : 앞뒤 공백 제거 메서드
	if (id == null || name == null || cname == null || id.trim().equals("")
			|| name.trim().equals("") || cname.trim().equals("")){%>
		<script type="text/javascript">
			alert("아이디, 학생명, 학급명을 모두 입력해 주세요")
			history.back() <%-- 뒤로 가기 버튼과 같다 --%>
			
		</script>
<%		
	return;	// _jspService 메서드가 void이기 때문에 빠져 나가는 용으로 return 을 사용
	}
	/*
	// 3. DB와 연결하기
	// try catch 안 하는 이유 : 이미 jsp 파일에서  exception 부모로 다 받아 둠
    Class.forName("oracle.jdbc.driver.OracleDriver");
	Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "fin01", "fin01");
			
	// 4. 쿼리를 전송하여 실행시키지
	String sql = "insert into student values(?, ?, ?)";
	PreparedStatement ps = con.prepareStatement(sql);
	ps.setString(1, id);
	ps.setString(2, name);
	ps.setString(3, cname);
	// insert delete update => executeUpdate();		 : 반환형 int
	// select => executeQuery();					 : 반환형 ResultSet
	int res = ps.executeUpdate();
	// if res == 0 : 실패
	// if res == 1 : 성공
	*/
	
	int res = stdao.insertStudent(id, name, cname);
	
	if (res > 0){%>
		<script type="text/javascript">
		alert("학생 등록 성공 학생 목록 페이지로 이동합니다")
		location.href="list.jsp"
		</script>
<%	}else {%>
		<script type="text/javascript">
		alert("학생 등록 실패<br>학생 목록 페이지로 이동합니다")
		location.href="student.jsp"
		</script>
<%	}%>
			

학생 리스트 보기

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR" import="java.sql.*"%>

<!-- list.jsp -->
<html>
<head>
	<title>학생 목록</title>
</head>
	<body>
		<div align="center">
			<hr color="green" width="300">
			<h2>학 생 목 록 보 기</h2>
			<hr color="green" width="300">
			<table border="1" width="40%">
				<tr bgcolor="yellow">
					<th>아이디</th>
					<th>학생명</th>
					<th>학급명</th>
				</tr>

<%

    Class.forName("oracle.jdbc.driver.OracleDriver");
	Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "fin01", "fin01");
	String sql = "select * from student";
	
	PreparedStatement ps = con.prepareStatement(sql);
	ResultSet rs = ps.executeQuery();
	
	while(rs.next()){
		String id = rs.getString("id");
		String name = rs.getString("name");
		String cname = rs.getString("cname");%>
			<tr>
				<td><%=id%></td>
				<td><%=name%></td>
				<td><%=cname%></td>
			</tr>
		
<%	}%>
		</table>
	</div>
</body>
</html>

학생 삭제하기

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR" import="java.sql.*"%>
    
<jsp:useBean id ="stdao" class="my.student.StudentDAO"/>
<!-- delete.jsp -->
<%
	//1. 넘어온 데이터 받기
	String id = request.getParameter("id");
	//2. 받은 데이터 유효성 검사하기(데이터가 null이면 이전페이지로 이동시키자)
	if (id == null || id.trim().equals("")){%>
		<script type="text/javascript">
			alert("삭제할 학생의 아이디를 입력해 주세요")
			history.back()
		</script>	
<%		return;
	}
	/*
	//3. DB와 연결하기
	Class.forName("oracle.jdbc.driver.OracleDriver");
	Connection con = DriverManager.getConnection
			("jdbc:oracle:thin:@localhost:1521:xe", "fin01", "fin01");
	//4. 쿼리를 전송하여 실행시키기
	String sql = "delete from student where id = ?";
	PreparedStatement ps = con.prepareStatement(sql);
	ps.setString(1, id);
	//5. 결과를 받아서 처리하기
	int res = ps.executeUpdate();
	*/
	
	int res = stdao.deleteStudent(id);
	
	if (res>0){%>
		<script type="text/javascript">
			alert("학생삭제성공!! 학생목록페이지로 이동합니다.")
			location.href="list.jsp"
		</script>	
<%	}else {%>
		<script type="text/javascript">
			alert("학생삭제실패!! 학생등록페이지로 이동합니다.")
			location.href="student.jsp"
		</script>
<%	}%>

학생 찾기

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR" import="java.sql.*"%>
<!-- find.jsp -->
<html>
<head>
	<title>학생 목록</title>
</head>
	<body>
		<div align="center">
			<hr color="green" width="300">
			<h2>학 생 목 록 보 기</h2>
			<hr color="green" width="300">
			<table border="1" width="40%">
				<tr bgcolor="yellow">
					<th>아이디</th>
					<th>학생명</th>
					<th>학급명</th>
				</tr>

<%
	//1. 넘어온 데이터 받기
	request.setCharacterEncoding("EUC-KR");
	String name = request.getParameter("name");
	//2. 받은 데이터 유효성 검사하기(데이터가 null이면 이전페이지로 이동시키자)
	if (name == null || name.trim().equals("")){
		response.sendRedirect("student.jsp");
		return;
	}
	
	//3. DB와 연결하기
	Class.forName("oracle.jdbc.driver.OracleDriver");
	Connection con = DriverManager.getConnection
			("jdbc:oracle:thin:@localhost:1521:xe", "fin01", "fin01");
	String sql = "select count(*) from student where name = ?";
	PreparedStatement ps = con.prepareStatement(sql);
	ps.setString(1, name);
	ResultSet rs = ps.executeQuery();
	rs.next();
	int count = rs.getInt(1);
	if (count > 0) {
		sql = "select * from student where name = ?";
		ps = con.prepareStatement(sql);
		ps.setString(1, name);
		rs = ps.executeQuery();
		
	    while (rs.next()) {
	        String id = rs.getString("id");
	        // String studentName = rs.getString("name");
	        String className = rs.getString("cname");
	    %>
	        <tr>
	            <td><%= id %></td>
	            <td><%= name %></td>
	            <td><%= className %></td>
	        </tr>
			
	    <%
	    }%>
	


    <%
    }%>
    
    </table>
	</div>
</body>
</html>

학생 리스트 보기

학생 리스트를 보려면 새로운 list 를 생성해서 학생 dto의 객체를 담고, get 메서드를 통해 값을 불러오는 게 편하다.

그럼 우선 StudentDAO.class 에 list 를 생성하는 것부터 시작하자.

public List<StudentDTO> listStudent() throws SQLException {
		try {
			Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "fin01", "fin01");
			String sql = "select * from student";
			
			PreparedStatement ps = con.prepareStatement(sql); 	// sql 문의 결과를 가져옴
			ResultSet rs = ps.executeQuery();					// rs 쿼리 문의 결과를 담음
			List<StudentDTO> list = new ArrayList<>();			// 리스트 선언

			while(rs.next()){
				StudentDTO dto = new StudentDTO();
				
				dto.setId(rs.getString("id"));
				dto.setName(rs.getString("name"));
				dto.setCname(rs.getString("cname"));
				list.add(dto);
				
				/*		너무 길잖아? 조그맣게
				String id = rs.getString("id");
				String name = rs.getString("name");
				String cname = rs.getString("cname");
				StudentDTO dto = new StudentDTO();
				dto.setId(id);
				dto.setName(cname);
				dto.setCname(cname);
				list.add(dto);
				*/
			}
			
			return list;
		}finally {
			if (rs != null) rs.close();
			if (rs != null) ps.close();
			if (con != null) con.close();
		}
	}

리스트를 만들어서 list.jsp 고쳐주기

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR" import="java.util.*, my.book.*"%>

<jsp:useBean id="stdao" class="my.book.BookDAO"/>

<!-- list.jsp -->
<html>
<head>
	<title>도서 목록</title>
</head>
	<body>
		<div align="center">
			<hr color="green" width="300">
			<h2>도 서 목 록 보 기</h2>
			<hr color="green" width="300">
			<table border="1" width="50%">
				<tr bgcolor="yellow">
					<th align="center">제목</th>
					<th align="center">작가</th>
					<th align="center">출판사</th>
					<th align="center">가격</th>
					<th align="center">등록 일자</th>
				</tr>

<%/*
    Class.forName("oracle.jdbc.driver.OracleDriver");
	Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "fin01", "fin01");
	String sql = "select * from student";
	
	PreparedStatement ps = con.prepareStatement(sql);
	ResultSet rs = ps.executeQuery();
	
	while(rs.next()){
		String id = rs.getString("id");
		String name = rs.getString("name");
		String cname = rs.getString("cname");*/
		List<BookDTO> list = stdao.listBook();
		if (list == null || list.size() == 0){%>
			<tr>
				<td colspan="5">등록된 책이 없습니다.</td>
			</tr>
<%		}else{
			for (BookDTO dto : list){%>
			<tr>
				<td align="center"><%=dto.getBookname()%></td>
				<td align="center"><%=dto.getWriter()%></td>
				<td align="center"><%=dto.getPublisher()%></td>
				<td align="center"><%=dto.getPrice()%></td>
				<td align="center"><%=dto.getIndate()%></td>
			</tr>
<%			}
		}%>
		</table>
	</div>
</body>
</html>
profile
자바 백엔드 개발자 개인 위키

0개의 댓글

관련 채용 정보