보라코딩

Day68_230404_JSP, MyBatis 방명록 본문

코딩/Servlet, JSP, MyBatis

Day68_230404_JSP, MyBatis 방명록

new 보라 2023. 4. 4. 18:10

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} &nbsp;
</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

내일