jsp... java server pages 의 약자이다.
서버 프로그래밍용 자바인 것이다.
서버 측 스크립트 언어이며, 동적인 웹 페이지를 생성하는 데 사용된다. JSP 페이지는 HTML 코드 내에 java 코드를 포함할 수 있으며, 웹 애플리케이션 서버에서 실행되어 동적으로 웹 페이지를 생성하고 사용자에게 표시한다.
jsp 파일을 만들면 Container가 알아서 java 파일로 변환하고, class 파일을 실행한다.
서버에서 실행되는 프로그램 : html
jsp : java + 웹 프로그램(html, css, javascript)
내가 jsp 를 만들면 모든건 _ jspService 메서드 안에 들어간다. 그런데 내가 메서드를 새로 만들고 싶다? 메서드 안에 메서드는 들어가지 않으므로 만들 수 없다.
그런데 선언문으로 만든다면 에러가 사라진다.
선언문은 jsp 서비스 바깥에 만들어지기 때문이다.
이건 많이 사용되진 않고~ 특정 메서드를 오버라이드 하고 싶을 때 사용하는 것이다.
html 상에 java 변수나 식의 결과를 나타내고 싶을 때 사용한다.
html 상에 java 변수의 식이나 결과를 나타내고 싶을 때
현재 페이지에 대한 속성 값을 지정한다.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
서버가 response 값을 보내 줬을 때 그 값을 받는 type은? text/html 이라는 것이다.
ex) import : 모르는 클래스가 있다면 상속받아라
template page 를 만들 때 사용
파일 이름을 적게 만들어서 ~~~ 에 있는 소스를 가져오게 만든다.
top.jsp 파일 소스가 다~ 가져와져서 index 파일은 온전한 파일로 만들 수 있게 한다.
그래서 나온 나의 myHome
사용자 정의 태그를 등록해서 사용할 때
<!— —> : html 주석
<%— —%> : jsp 주석
// : scroptlet 안에서의 java 한줄 주석
/% ~ %/ : scriptlet 안에서의 java 한줄 주석
<%@ 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%">
<%@ 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>
<%@ 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" %>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!-- company.jsp -->
<%@ include file="top.jsp" %>
<h3>저희 회사는 일은 조금, 월급은 많은 회사입니다.</h3>
<%@ include file="bottom.jsp" %>
java 코드로 DB를 관리하고 그 객체를 jsp 에 불러와서 만들면 일일이 모든 jsp 에 DB 관련 명령어를 불러와 작성하는 것보다 편해진다. 그래서 myHome 에 자바 코드 StudentDAO, StudentDTO 를 만들어 DB를 관리한다.
참고로 ojdbc8.jar 파일은 이쪽에 넣어야 한다.
이건 java 파일이니까 java Resources 폴더 안에 만들어 주어야 한다. 이런 식으로.
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;
}
}
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>