최근 학원에서 jsp의 파라미터(값)를 보내고 받는 내용에 대해서 배우고 있다.
보통 CRUD에서 많이 쓰기이 때문에 값이 어디서 어디로 가는지 편지처럼 흐름을
모르면 끝도없이 어려워지는 내용이다.
원래 학원커리큘럼 순서상 get/set parameter로 시작해서
EL태그 useBean 을 거쳐서 JSTL을 배우지만 오늘은 까먹기 전에 JSTL부터 정리해 보려고 한다.
우선 jstl을 사용하기 위해서는 프로젝트의 WEB-INF > lib폴더에 ojdbc.jar파일과 jstl.jar이라는 파일이 필요하다.
아래 코드는 상품을 등록, 목록확인, 상품쪽에 있는 버튼을 누르면 색이 변하여
판매여부를 보여주는간단해 보이지만 쉽진 않은 코드이다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import ="crud.*"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="cpath" value="${pageContext.request.contextPath}" />
<c:set var="dao" value="<%=new SalesDAO() %>" />
<c:set var="dto" value="<%=new SalesDTO() %>" />
<style>
.normal {
background-color:blue;
}
.cancel {
background-color:red;
}
</style>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<a href="list.jsp">목록</a>
<上 header.jsp>
위 코드는 header로 각각의 jsp코드에 공통되는 내용들을 여기서 넣어두고
다른 jsp코드에서 바로 불러올 수 있게 만든 것이다.
그중 중요한 것은 taglib부분으로 jstl을 사용하기 위해 필요한 코드이다.
나머지는 DAO와 DTO를 불러오는 부분이며
PageContext.request.contextPath는 EL태그로 값을 전달할 때 아래와 같이 값을 전달할 때 사용되는 코드이다.
위 css는 색을 바꿀 때 필요한 코드이다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<% request.setCharacterEncoding("UTF-8"); %>
<c:set var="list" value="${dao.SelectALL()}" />
<table border="1" cellpadding="10" cellspacing="0">
<tr>
<td>고유번호</td>
<td>상품명</td>
<td>가격</td>
<td>수량</td>
<td>판매여부</td>
</tr>
<c:forEach var="dto" items="${list }">
<tr>
<td>${dto.idx}</td>
<td>${dto.name}</td>
<td>${dto.price}</td>
<td>${dto.cnt}</td>
<td><a href="${cpath}/changeStatus.jsp?idx=${dto.idx}">
<button class="${dto.status == 1 ? 'normal' : 'cancel'}">
판매중</button></a>
</td>
</tr>
</c:forEach>
</table>
<上 list.jsp>

// 가장 위 <%@ include file> 부분이 header의 내용을 공유하기 위해 사용하는 코드이다 //
현재 db는 이렇게 들어있다.
위 코드를 보면 테이블을 만들고 forEach를 사용하는데 조금 다른 점이 있을 것이다.
jstl에서는 <c:forEach>를 사용하는데 forEach(dto : list){ 이 코드와 같다고 생각하면 편할 것이다.
forEach로 list의 값을 생성된 dto에 반복해서 넣으면서 그 값을 dto에서 가져온다.
왜 dto인가 하면 DAO를 보면 db에서 값을 받아 각각의 변수에 넣어주고
그 값을 setter에 넣어주고 그 값들을 Arraylist에 추가시켜 준다.
getter와 setter의 개념에 대에서 간단히 설명하자면
Setter는 값을 dto에 있는 각각의 변수에 저장하고
Getter를 사용하면 그 값을 호출할 수 있다.
사용용도는 클래스끼리 값을 주고받고 싶을 때 주로 사용한다고 보면 된다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file = "header.jsp" %>
<c:set var="result" value="${dao.status(param.idx)}" />
<c:redirect url="list.jsp" />
</body>
</html>
<上 changeStatus.jsp>
위 코드는 버튼을 눌렸을 때 list.jsp의 버튼 부분에서 <a href="${cpath}/changeStatus.jsp? idx=${dto.idx}">
이렇게 EL태그를 사용하여 changeStatus.jsp로 값을 전달하고 버튼에 이동좌표도 지정해 준다.
값이 이동되어 dao의 함수인 status에 idx값을 보내서 누르는 버튼(idx로 파악)의 status값이 0,1,0 이런 식으로 반전된다.
이렇게 바뀌어 list.jsp를 보면 삼항연산으로 status의 값이 1이면 normal 아니면 cancel을 반환하게 한다.
이렇게 클래스가 변하면 header의 css가 적용되어 색이 바뀌는 것이다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file = "header.jsp" %>
<% request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<form action="register_result.jsp" method="POST">
<input type="text" name="name" placeholder="상품명" /><br>
<input type="number" name="price" placeholder="가격" /><br>
<input type="number" name="cnt" placeholder="수량" />
<input type="submit" />
<a href="list.jsp"><button>목록</button></a>
</form>
<上 register.jsp>
등록은 값을 form태그로 묶어주고 submit타입의 버튼을 누르면
값(파라미터)이 action으로 지정한 좌표로 넘어간다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file ="header.jsp" %>
<% request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<jsp:useBean id="dto" class="crud.SalesDTO" />
<jsp:setProperty property="*" name="dto"/>
<c:set var = "row" value = "${dao.register(dto)}" />
<上 register_result.jsp>
위에서 보낸 값을 원래는 request.getAttribute로 받아야 하지만
간편하게 usrBean으로 바로 받을 수 있다.
이렇게 받은 값은 DTO로 보낸 다음 모든 값은 dto라는 객체를 만들어서 묶는다.
아래에 있는 c:set var부분은 row라는 정수타입의 변수를 만들고 dao의 register함수에 위에서 묶은 모든 값을
register함수로 보내버린다.
아래부터는 자바파일
package crud;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class SalesDAO {
private Connection conn;
private PreparedStatement pstmt;
private ResultSet rs;
private String url = "jdbc:oracle:thin:@o2:xe";
private String user = "c##";
private String password = "a";
private SalesDTO dto = new SalesDTO();
public SalesDAO() throws ClassNotFoundException {
Class.forName("oracle.jdbc.driver.OracleDriver");
}
public int register (SalesDTO dto) throws SQLException{
int row = 0;
String sql = "insert into sales (name,price,cnt) values (?,?,?)" ;
conn = DriverManager.getConnection(url,user,password);
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, dto.getName());
pstmt.setInt(2, dto.getPrice());
pstmt.setInt(3, dto.getCnt());
pstmt.executeUpdate();
pstmt.close();
conn.close();
return row;
}
public ArrayList<SalesDTO> SelectALL () throws SQLException, ClassNotFoundException {
ArrayList<SalesDTO> list = new ArrayList<SalesDTO>();
String sql = "select * from sales order by idx";
conn = DriverManager.getConnection(url, user, password);
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next()) {
String idx = rs.getString("idx");
String name = rs.getString("name");
int price = rs.getInt("price");
int cnt = rs.getInt("cnt");
int status = rs.getInt("status");
dto = new SalesDTO();
dto.setIdx(idx);
dto.setName(name);
dto.setPrice(price);
dto.setCnt(cnt);
dto.setStatus(status);
list.add(dto);
}
rs.close();
pstmt.close();
conn.close();
return list;
}
public int status (String idx) throws SQLException {
int row = 0;
String sql = "update sales set status = decode(status, 1, 0, 0, 1) where idx = '%s'";
sql = String.format(sql, idx);
conn = DriverManager.getConnection(url, user, password);
pstmt = conn.prepareStatement(sql);
row = pstmt.executeUpdate();
return row;
}
}
DAO에서는 기능을 한 곳에 모아서 구현한다.
register는 위 jsp파일에서 보낸 dto값을 받아서
getter로 받은 모든 값들을(register.jsp에서 보낸 값)을 위 sql에 있는 각각의? 에 값을 넣어주기 위해서
PreparedStatement 타입의 setString을 사용한다
나머지는 register메서드와 비슷한 내용이기에 패스하겠다.
status는 sql문만 설명하자면 값을 수정해야 하기 때문에 update로 status테이블을 수정한다.
decode는 case문을 생각하면 간단하다.
status의 값이 1이면 0을 1이면 0을 반환한다는 단순한 코드이다.
위에서 중요한 점은 where idx = '% s'인데 list.jsp에서 버튼을 누르면 그 값이 status함수로 넘어와서
sql = String.format(sql, idx) 이렇게 사용하여 % s가 idx라는 것을 formatting 해줘야 한다.
package crud;
public class SalesDTO {
private String idx;
private String name;
private int price;
private int cnt;
private int status;
public String getIdx() {
return idx;
}
public void setIdx(String idx) {
this.idx = idx;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getCnt() {
return cnt;
}
public void setCnt(int cnt) {
this.cnt = cnt;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
}
DTO는 설명을 생략하겠다.
최근 스터디공부, 정처기 실기공부, 코딩공부등 할 것은 많은데 다 하려니 정신이 없다.
우선순위를 정해야 할 것 같은데 무엇을 1위로 두어야 할지 감도 잡히지 않는다.
jsp도 어느 정도 흐름이 보이기 시작하고 함수의 사용도 처음에 비해서는 훨씬 나아졌다고 생각한다.
프로그래머스를 집중적으로 해야 할 때가 된 만큼 다른 사람들과 너무 뒤떨어지지 않기 위해서라도
서버도 깔끔하게 구축했으니 집중해 보려고 한다.
그럼 오늘은 여기서 마치도록 하겠다.
'JSP' 카테고리의 다른 글
JSP 파일입출력 (싱글톤내용) (0) | 2023.06.07 |
---|---|
JSP 파라미터의 이동 - 심화내용 (0) | 2023.05.29 |
JSP기초 - 자바코드 페이지 출력방법 (0) | 2023.05.17 |