보라코딩
Day68_230404_JSP, MyBatis 방명록 본문
list에 객체 c:forEach로 가져오기
forEach varStatus
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title> forEach varStatus </title>
</head>
<body>
<%
List<String> list = new ArrayList<>();
list.add("싼쵸1");
list.add("싼쵸2");
list.add("싼쵸3");
list.add("싼쵸4");
System.out.println("> list : " + list);
System.out.println("> list size : " + list.size());
pageContext.setAttribute("alist", list);
%>
</body>
<h2>forEach List 데이터 표시</h2>
<c:forEach var="listData" items="${alist}" >
${listData}
</c:forEach>
<hr>
<h2>forEach varStatus 속성 사용</h2>
<c:forEach var="listData" items="${alist}" varStatus="status"
begin="2" end="${alist.size() }" step="1">
<li>
var값 : ${listData } <br>
status : ${status } <br>
status.current : ${status.current } <br> <%-- 현재 처리중 데이터 --%>
status.count : ${status.count } <br> <%-- 처리되는 데이터 건수 --%>
status.count : ${status.index } <br> <%-- 인덱스 번호 --%>
status.first : ${status.first } <br> <%-- 첫번째 데이터 여부 --%>
status.last : ${status.last } <br> <%-- 마지막 데이터 여부 --%>
status.begin : ${status.begin } <br>
status.end : ${status.end } <br>
status.step : ${status.step } <br>
</li>
</c:forEach>
<hr>
</html>
MyBatis
MyBatis(마이바티스) 이용한 데이타베이스 연동 프로그램 작성 순서
0. JDBC 라이브러리 등록(사용할 DB)
-WebContent > WEB-INF > lib > ojdbc6.jar 또는 ojdbc8.jar
1. MyBatis 라이브러리 등록(사용할 버전)
-WebContent > WEB-INF > lib > mybatis-3.5.13.jar
2. MyBatis 환경설정(config) XML 파일 작성
-DB연결정보, 매핑파일 위치정보, MyBatis 설정정보 등
3. MyBatis 매핑 XML 파일 작성(매퍼: Mapper)
-프로그램상에서 사용하는 SQL 문장 작성
4. MyBatis 설정 정보(config)를 읽어서 사용할
SqlSessionFactory 객체 생성하는 소스 작성
- 실제 사용은 SqlSession 객체를 사용
- SqlSession 객체를 생성해주는 역할은 SqlSessionFactory 가 한다.
5. Mapper에 등록된 SQL문을 호출해서 사용
5-1. Mapper 파일에 사용할 SQL문 작성
5-2. Mapper에 등록한 SQL 문을 호출 사용
- SqlSession 객체 생성
- SqlSession 객체에 있는 메소드 호출
(selectOne, selectList, insert, update, delete ..)
- SQL문 실행 결과에 대한 처리
1. MyBatis 라이브러리 등록(사용할 버전)
-WebContent > WEB-INF > lib > mybatis-3.5.13.jar
2. MyBatis 환경설정(config) XML 파일 작성
-DB연결정보, 매핑파일 위치정보, MyBatis 설정정보 등
driver
url
username
password
우리가 사용할 것으로 변경한다.
config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="username" value="mystudy"/>
<property name="password" value="mystudypw"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/mystudy/mybatis/mapper.xml"/>
</mappers>
</configuration>
3. MyBatis 매핑 XML 파일 작성(매퍼: Mapper)
-프로그램상에서 사용하는 SQL 문장 작성
mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="">
</mapper>
4. MyBatis 설정 정보(config)를 읽어서 사용할
SqlSessionFactory 객체 생성하는 소스 작성
- 실제 사용은 SqlSession 객체를 사용
- SqlSession 객체를 생성해주는 역할은 SqlSessionFactory 가 한다.
DBService.java
package com.mystudy.mybatis;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
// MyBatis 사용해서 작업할 SqlSession 을 만들어줄
// SqlSessionFactory 객체 생성을 위한 클래스
public class DBService {
private static SqlSessionFactory factory;
// static 초기화 구문
static {
try {
String config = "com/mystudy/mybatis/config.xml";
//SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
//Reader reader = Resources.getResourceAsReader(config);
//factoryBuilder.build(reader);
factory = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsReader(config));
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getFactory() {
return factory;
}
}
DB파일도 sql폴더 만들어서 txt 파일로 관리
CREATE TABLE GUESTBOOK (
IDX NUMBER(4) PRIMARY KEY,
NAME VARCHAR2(30),
SUBJECT VARCHAR2(150),
CONTENT VARCHAR2(4000),
EMAIL VARCHAR2(100),
PWD VARCHAR2(30),
REGDATE DATE DEFAULT SYSDATE
);
-- DROP SEQUENCE GUESTBOOK_SEQ;
CREATE SEQUENCE GUESTBOOK_SEQ NOCACHE;
INSERT INTO GUESTBOOK
(IDX, NAME, SUBJECT, CONTENT, EMAIL, PWD, REGDATE)
VALUES (GUESTBOOK_SEQ.NEXTVAL, '싼쵸1', '제목1', '내용1',
'lee1@test.com', '1111', SYSDATE - 3);
INSERT INTO GUESTBOOK
(IDX, NAME, SUBJECT, CONTENT, EMAIL, PWD, REGDATE)
VALUES (GUESTBOOK_SEQ.NEXTVAL, '싼쵸2', '제목2', '내용2',
'lee2@test.com', '2222', SYSDATE - 2);
INSERT INTO GUESTBOOK
(IDX, NAME, SUBJECT, CONTENT, EMAIL, PWD, REGDATE)
VALUES (GUESTBOOK_SEQ.NEXTVAL, '싼쵸3', '제목3', '내용3',
'lee3@test.com', '3333', SYSDATE - 1);
COMMIT;
SELECT * FROM GUESTBOOK;
5. Mapper에 등록된 SQL문을 호출해서 사용
5-1. Mapper 파일에 사용할 SQL문 작성
5-2. Mapper에 등록한 SQL 문을 호출 사용
- SqlSession 객체 생성
- SqlSession 객체에 있는 메소드 호출
(selectOne, selectList, insert, update, delete ..)
- SQL문 실행 결과에 대한 처리
mapper.xml 수정
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="guestbook">
<!-- select 태그 3개 속성 : id, resultType, parameterType
id : 사용할 명칭(필수항목 / sql 가리킬때), 현재 매퍼에서 유일한 이름 사용
resultType : 조회 결과값 저장하기 위한 데이터 타입(1개에 대한)
parameterType : 전달 받은 파라미터 데이터의 타입 지정(선택적) -->
<select id="all" resultType="com.mystudy.mybatis.GuestbookVO">
SELECT IDX, NAME, SUBJECT, CONTENT, EMAIL, PWD, REGDATE
FROM GUESTBOOK
ORDER BY IDX DESC
</select>
</mapper>
GuestbookVO.java
package com.mystudy.mybatis;
import java.sql.Date;
public class GuestbookVO {
private int idx;
private String name, subject, content, email, pwd;
private Date regdate;
public int getIdx() {
return idx;
}
public void setIdx(int idx) {
this.idx = idx;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public Date getRegdate() {
return regdate;
}
public void setRegdate(Date regdate) {
this.regdate = regdate;
}
@Override
public String toString() {
return "GuestbookVO [idx=" + idx + ", name=" + name + ", subject=" + subject + ", content=" + content
+ ", email=" + email + ", pwd=" + pwd + ", regdate=" + regdate + "]";
}
}
list.jsp
<%@page import="com.mystudy.mybatis.GuestbookVO"%>
<%@page import="java.util.List"%>
<%@page import="org.apache.ibatis.session.SqlSession"%>
<%@page import="org.apache.ibatis.session.SqlSessionFactory"%>
<%@page import="com.mystudy.mybatis.DBService"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="
http://java.sun.com/jsp/jstl/core
"%>
<%-- DB에서 전체 데이터 조회 후 화면 출력 --%>
<%
//DB에서 전체데이터 조회 후 화면 출력
/*
openSession(), openSession(false) : Auto commit 해제상태(트랜잭션처리 필수)
openSession(true) : 자동커밋 상태로 세션객체 생성(SQL 실행 후 자동커밋)
*/
//1. SqlSession 객체 생성
//SqlSessionFactory factory = DBService.getFactory();
//SqlSession ss = factory.openSession();
SqlSession ss = DBService.getFactory().openSession();
//2. 매퍼(Mapper)의 SQL 실행해서 데이터 가져오기
// SqlSession selectList(매퍼id) : select 결과를 List 형태로 받기
// SqlSession selectOne(매퍼id) : select 결과가 하나인(1,0) 경우
List<GuestbookVO> list = ss.selectList("guestbook.all"); //mapper의 namespace의 all
ss.close();
System.out.println(list);
//3. SQL문 실행 후 받은 데이터 화면출력
// EL, JSTL 사용할 수 있도록 scope에 저장
pageContext.setAttribute("attr_list", list);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>전체목록</title>
<style>
#container {
width : 512px; margin : auto;
border : 2px solid pink;
}
#container h2,
#container p
{
text-align : center;
}
#container table {
width : 100%;
border-collapse : collapse;
}
#container th {
background-color: thistle;
}
#container th,
#container td {
border : 1px solid black;
}
.center {
text-align: center;
}
</style>
</head>
<body>
<div id="container">
<h2>방명록</h2>
<hr>
<p><a href="write.jsp">[방명록쓰기]</a></p>
<table>
<colgroup>
<col width="10%">
<col width="50%">
<col width="20%">
</colgroup>
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>작성자</th>
<th>작성일</th>
</tr>
</thead>
<tbody>
<%-- SQL 실행후 결과 list 사용 tr태그 만들기 (EL, JSTL) 사용 --%>
<c:if test="${not empty attr_list}">
<c:forEach var="vo" items="${attr_list }">
<tr>
<td>${vo.idx}</td>
<td><a href="onelist.jsp?idx=${vo.idx}">${vo.subject }</a></td>
<td>${vo.name }</td>
<td>${vo.regdate }</td>
</tr>
</c:forEach>
</c:if>
<c:if test="${empty attr_list }">
<tr>
<td colspan="4">검색된 데이터 없습니다</td>
</tr>
</c:if>
</tbody>
</table>
</div>
</body>
</html>
write.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>입력화면</title>
<style>
#container {
width : 512px; margin : auto;
border : 2px solid pink;
}
#container h2,
#container p
{
text-align : center;
}
#container table {
width : 100%;
border-collapse : collapse;
}
#container th {
background-color: thistle;
}
#container th,
#container td {
border : 1px solid black;
}
.center {
text-align: center;
}
#container tfoot {
text-align: center;
}
</style>
</head>
<body>
<div id="container">
<h2>방명록 : 입력화면</h2>
<hr>
<p><a href="list.jsp">[목록으로 이동]</a></p>
<form action="write_ok.jsp" method="post">
<table>
<tbody>
<tr>
<th>작성자</th>
<td><input type="text" name="name"></td>
</tr>
<tr>
<th>제목</th>
<td><input type="text" name="subject"></td>
</tr>
<tr>
<th>이메일</th>
<td><input type="email" name="email"></td>
</tr>
<tr>
<th>비밀번호</th>
<td><input type="password" name="pwd"></td>
</tr>
<tr>
<td colspan="2">
<textarea name="content" rows="5" cols="60"></textarea>
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="2">
<input type="submit" value="저 장">
<input type="reset" value="다시작성">
</td>
</tr>
</tfoot>
</table>
</form>
</div>
</body>
</html>
이번엔 post 방식 사용 (get이 디폴트)
그럼 주소에 표시되지 않음
write_ok.jsp
(insert DB 진행)
<%@page import="org.apache.ibatis.session.SqlSession"%>
<%@page import="com.mystudy.mybatis.DBService"%>
<%@page import="com.mystudy.mybatis.GuestbookVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- 전달받은 데이터 DB에 insert
입력성공 : 목록페이지로 이동(list.jsp)
입력실패(예외) : 메시지 표시 후 이전화면(입력페이지) 이동
--%>
<%
//전달받은 데이터 한글처리(UTF-8) 포스트방식일때!!!!
request.setCharacterEncoding("UTF-8");
//1. 파라미터값 추출해서 VO에 저장
%>
<jsp:useBean id="vo" class="com.mystudy.mybatis.GuestbookVO" />
<jsp:setProperty property="*" name="vo" />
<%
System.out.println(vo);
//2. DB 연동작업 - 입력처리
//2-1. SqlSession 객체 생성
SqlSession ss = DBService.getFactory().openSession(true); //자동커밋상태로 세션객체 생성
//2-2. SqlSession 객체 사용 DB에 입력
try {
ss.insert("guestbook.insert", vo);
//ss.commit(); 명시적 커밋처리
System.out.println(">> 입력성공");
//3. 화면 전환(페이지전환) 입력 성공 : list.jsp
%>
<script>
alert("정상입력 되었습니다.\n목록페이지로 이동합니다");
location.href = "list.jsp";
</script>
<%
} catch(Exception e){
//ss.rollback(); 명시적 롤백처리
System.out.println(">> 예외발생");
e.printStackTrace();
//3. 화면 전환(페이지전환) 입력 실패 : 이전 페이지로 이동
%>
<script>
alert("[예외발생] 입력작업 중 오류발생\n담당자(8282)에게 연락바람\n이전페이지로 이동합니다.");
history.back();
</script>
<%
} finally {
ss.close();
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>write_ok.jsp</title>
</head>
<body>
</body>
</html>
mapper.xml (insert sql 추가)
<insert id="insert" parameterType="com.mystudy.mybatis.GuestbookVO">
INSERT INTO GUESTBOOK
(IDX, NAME, SUBJECT, CONTENT, EMAIL,
PWD, REGDATE)
VALUES (GUESTBOOK_SEQ.NEXTVAL, #{name}, #{subject}, #{content}, #{email},
#{pwd}, SYSDATE)
</insert>
mapper.xml (select한개 sql 추가)
<!-- int : Integer타입, _int : int타입 -->
<select id="one" parameterType="_int"
resultType="com.mystudy.mybatis.GuestbookVO">
SELECT IDX, NAME, SUBJECT, CONTENT, EMAIL, PWD, REGDATE
FROM GUESTBOOK
WHERE IDX = #{idx}
</select>
config.xml 에 alias 지정
<typeAliases>
<typeAlias type="com.mystudy.mybatis.GuestbookVO" alias="guestbookVO"/>
</typeAliases>
onelist.jsp (select 한개)
<%@page import="com.mystudy.mybatis.GuestbookVO"%>
<%@page import="com.mystudy.mybatis.DBService"%>
<%@page import="org.apache.ibatis.session.SqlSession"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%-- 전달받은 데이터(idx)로 DB 데이터 조회 후 화면출력 (select로 하나의 데이터 조회)
--%>
<%
//1. 전달받은 데이터 확인(추출)
int idx = Integer.parseInt(request.getParameter("idx"));
//2. DB연동작업 - idx값으로 DB데이터 가져오기
//2-1. SqlSession 객체 생성
SqlSession ss = DBService.getFactory().openSession(true);
//2-2. idx값 전달해서 DB Select 작업
GuestbookVO vo = ss.selectOne("guestbook.one", idx);
System.out.println("vo : " + vo);
//3. 전달받은 데이터 화면 표시
//3-1. EL, JSTL 사용 + session에 등록(수정, 삭제 페이지에서도 사용할 수 있게!!)
session.setAttribute("guestbookVO", vo);
System.out.println("> onelist.jsp guestbookVO : "
+ pageContext.getAttribute("guestbookVO"));
//3-2. 화면에 표시 - HTML 태그에 EL 사용해서 출력
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상세화면</title>
<style>
#container {
width : 512px; margin : auto;
border : 2px solid pink;
}
#container h2,
#container p
{
text-align : center;
}
#container table {
width : 100%;
border-collapse : collapse;
}
#container th {
background-color: thistle;
}
#container th,
#container td {
border : 1px solid black;
}
.center {
text-align: center;
}
#container tfoot {
text-align: center;
}
</style>
<script>
function update_go() {
location.href = "update.jsp"; //수정(폼) 작업페이지
}
function delete_go() {
location.href = "delete.jsp"; //삭제(폼) 작업페이지
}
</script>
</head>
<body>
<div id="container">
<h2>방명록 : 상세화면</h2>
<hr>
<p><a href="list.jsp">[목록으로 이동]</a></p>
<table>
<tbody>
<tr>
<th>작성자</th>
<td>${guestbookVO.name }</td>
</tr>
<tr>
<th>제목</th>
<td>${guestbookVO.subject }</td>
</tr>
<tr>
<th>이메일</th>
<td>${guestbookVO.email }</td>
</tr>
<tr>
<td colspan="2">${guestbookVO.content } </td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="2">
<button onclick="update_go()">수 정</button>
<button onclick="delete_go()">삭 제</button>
</td>
</tr>
</tfoot>
</table>
</div>
</body>
</html>
update.jsp
delete.jsp
내일
'코딩 > Servlet, JSP, MyBatis' 카테고리의 다른 글
Day70_230406_ JSP, MyBatis 방명록, Shop (0) | 2023.04.06 |
---|---|
Day69_230405_ JSP, MyBatis 방명록 (0) | 2023.04.05 |
Day67_230403_ JSP (EL, JSTL) (0) | 2023.04.03 |
Day66_230331_ JSP (action tag, EL tag, useBean, setProperty) (0) | 2023.03.31 |
Day65_230330_ JSP (CRUD_회원정보) (0) | 2023.03.30 |