ORACLE 연결)
또는
entity
DTO)
package entity;
import java.util.Date;
public class Board {
private int num;
private String title;
private String content;
private String writer;
private Date indate;
private int count;
public Board() { }
public Board(int num, String title, String content, String writer, Date indate, int count) {
super();
this.num = num;
this.title = title;
this.content = content;
this.writer = writer;
this.indate = indate;
this.count = count;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public Date getIndate() {
return indate;
}
public void setIndate(Date indate) {
this.indate = indate;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
oracle에 연동시켜 테이블 생성, 내용 insert하는 방법)
entity
sql)
create table board(
num number not null,
title varchar2(100) not null,
content varchar2(2000) not null,
writer varchar2(50) not null,
indate date default sysdate,
count number default 0,
primary key (num)
);
--틀리면,
--drop table board;
--하고 다시 실행해보면 됨.
create sequence board_seq;
insert into board(num, title, content, writer)
values(board_seq.nextval, 'MVC게시판 연습', 'MVC게시판 연습', '관리자');
insert into board(num, title, content, writer)
values(board_seq.nextval, 'MVC게시판 연습', 'MVC게시판 연습', '이수모킹');
insert into board(num, title, content, writer)
values(board_seq.nextval, 'MVC게시판 연습', 'MVC게시판 연습', '알콜탱크');
select * from BOARD order by num desc;
MyBatis에서 SQL Mapped 샘플 가져오기)
이클립스에선 file을 만들어 이용하기.
DAO
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="DAO.BoardMapper">
<select id="getLists" resultType="entity.Board">
select * from board
</select>
</mapper>
driver, url 확인하는 법) 공백있으면 오류남!
DAO
db의 properties
driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:XE
username=service
password=12345
MyBatis에서 환경설정 샘플 가져오기)
이클립스에선 file을 만들어 이용하기.
DAO
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>
<properties resource="DAO/db.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="DAO/BoardMapper.xml"/>
</mappers>
</configuration>
DB와 실제적으로 커넥팅)
커넥션 풀 이란 최초 사용자의 요청이 있을때 DB에 연결하여 명령을 실행하고,
명령이 종료되어도 연결을 종료하지 않고 pool에 저장하여 요청이 올때마다 pool에서 커넥션을 꺼내 재사용하는것이다.
또한 재사용할 커넥션이 없을경우 새로운 커넥션을 생성하여 사용자는 해당 커넥션을 이용한다
// 3. 설정 파일을 읽어서 처리하기
// = 을 기준으로 오른쪽부터 해석하기
// SqlSessionFactoryBuilder 클래스에서 build 메소드를 불러왔다.
// build가 mybatis-config.xml에 있는 데이터베이스 연결정보를 읽어서
// Connection POOL만들어 준다.
// Connection POOL -> 재활용이 가능한 메모리 (connection이 모여있음)
// JDBC에서는 connection이라고 부르지만 MyBatis에서는 SqlSession이라고 부름
// SqlSession이 모여있는 걸 SqlSessionFactory 라고 한다.
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
// ********* 기능 구현 하기 **********
// 1. 게시판 전체 리스트 가져오기 메소드 정의
public List<Board> getLists() {
// Connection(SqlSession) 필요하다.
// sqlSessionFactory가 SqlSession을 가지고 있는데 지역 변수라 전역 변수로 바꿔줘야함.
// SqlSession = (Connection+Statement)
// SqlSession이 SQL을 전송하려면 SQL이 어디에 있는지 알아야 함
// (mybatis-config.xml에 SQL 파일을 가지고 있는 경로를 걸어놨기 때문에
// SqlSession은 SQL이 어디에 있는지 알고 있다.)
// SQL = select * from board
SqlSession session = sqlSessionFactory.openSession();
// selectList -> 1. SQL이 어디에 있는지 알아야 함
// BoardMapper에 있는 id 이름을 적어준다. (메소드 이름과 동일)
// BoardMapper에 있는 namespace.id로 해주면 더 정확하다.
// (kr.board.dao.BoardMapper.getLists)
// List<Board>에 다시 저장해서 return 해주기
List<Board> list = session.selectList("getLists");
// Connection POOL 반납 (반드시 해줘야 함)
session.close();
return list;
}
MyBatis API 다운로드_수동적인 방법)
해당 파일을 다운로드 후,
eclipse에서 프로젝트 src->main->webapp->WEB-INF->lib 에 복사 붙혀넣기
driver 파일도 lib에 복사 붙혀넣기
MyBatis API 다운로드_자동적인 방법)
Maven 이나 Gradle을 이용하여 자동적으로 다운로드하는 방법.
MyBatis에서 샘플 가져오기
DAO
package DAO;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import entity.Board;
//JDBC(Java+SQL) 단점
// 1. 생산성이 떨어진다. => MyBatis Framework 도입
// 2. 유지보수가 어렵다. http://mybatis.org
public class BoardDAO {
private static SqlSessionFactory sqlSessionFactory;
// 데이터베이스 연결(MyBatis API 다운로드)
// 초기화 블럭 =>> new BoardDAO()
static {
try {
// 1. 설정파일의 경로를 저장
String resource = "DAO/mybatis-config.xml";
// 2. 설정파일을 읽기위해서 입력스트림(빨대)을 만들기
InputStream inputStream = Resources.getResourceAsStream(resource);
// 3. 설정파일을 읽어서 처리하기(Connection만들기)
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
// 1. 게시판 전체 리스트 가져오기 메소드 정의
public List<Board> getLists() {
// Connection(SqlSession) 필요
// SqlSession = Connection + Statement
// SqlSession이 SQL을 전송하려면 SQL이 어디에 있는지 알아야한다.
// SQL=select * from board
SqlSession session = sqlSessionFactory.openSession();
List<Board> list = session.selectList("getLists");
session.close();
return list;
}
}
Controller
package Controller;
import java.io.IOException;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import DAO.BoardDAO;
import entity.Board;
@WebServlet("/list")
public class BoardListController extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 전체 게시판 리스트를 보여주라는 요청을 처리하는 컨트롤러
// List<Board>
BoardDAO dao = new BoardDAO();
List<Board> list = dao.getLists();
// Controller와<--forward--> View(list jsp)를 연동
// 1. 요청을 의뢰할 대상(View => list.jsp)을 선택한다.
// 2. 요청의뢰 객체를 만든다.
// 객체바인딩(*************************)
request.setAttribute("list", list);
// "list"->문자열/list-> arrayList
// "list"에는 번지가 들어있음(문자열), list(arrayList의 번지값이 들어있음)
// "list"가 list에 있는 번지를 꺼내간다는 말
request.setAttribute("list", list);
RequestDispatcher rd = request.getRequestDispatcher("board/list.jsp");
// 3. 요청의뢰를 실행한다.
rd.forward(request, response);
}
}
포워딩할때 request가 넘어가기 때문에 jsp가 요청객체에 있는 걸 꺼내갈 수 있다(setattribute)
<jsp도 내부에 request, response 객체를 가지고 있어서 포워딩할 때 주소를 알려주면 요청객체(HttpServletRequest)에서 꺼내갈 수 있음>
객체바인딩을 해줘야한다 --> 포워딩 전에 해야함
jsp 파일로 View 만들기)
style 꾸미기
jsp
jsp예시)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- JSP는 HTML 코드 안에서 JAVA코드를 사용할 수 있다. -->
<%
// 스크립트릿
// JSP파일 내에서 JAVA코드를 사용하기 위한 공간
// JSP => Servlet => class => HTML
int a = 10;
%>
<!-- 표현식 : 지정한 자바 변수 또는 식을 HTML코드 사이에 출력 -->
<p><%=a %></p> <!-- 출력 : <p>10</p> -->
<p>p태그-<%=a %></p> <!-- <p>p태그-10</p> -->
<p class="<%=a%>">a</p>
<a>페이지 이동</a>
</body>
</html>
list.jsp
<%@page import="java.util.List"%>
<%@page import="entity.Board"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// HttpServletrequest 객체에 저장된 "list"를 꺼내오기
List<Board> list = (List<Board>)request.getAttribute("list");
%>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Bootstrap Example</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
<script
src="https://cdn.jsdelivr.net/npm/jquery@3.6.3/dist/jquery.slim.min.js"></script>
<script
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script
src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="card">
<div class="card-header">
<div class="jumbotron jumbotron-fluid">
<div class="container">
<h1>MVC(Servlet, JSP, Oracle, jQuery, Ajax, JSON, MVC)</h1>
<p>Bootstrap is the most popular HTML, CSS...</p>
</div>
</div>
</div>
<div class="card-body">
<div class="row">
<div class="col-2"><jsp:include page="left.jsp" />로그인
</div>
<div class="col-7">
<div class="card-body">
<h4 class="card-title">BOARD</h4>
<p class="card-text">게시판 리스트</p>
<!-- 여기에 게시판 리스트 화면 구성 -->
<table class="table table-bordered table-hover">
<thead>
<tr>
<th>번호</th>
<th>내용</th>
<th>작성자</th>
<th>작성일</th>
<th>조회수</th>
</tr>
</thead>
<tbody>
<% for(Board vo : list) { %>
<tr>
<td><%=vo.getNum()%></td>
<td><%=vo.getTitle()%></td>
<td><%=vo.getWriter()%></td>
<td><%=vo.getIndate()%></td>
<td><%=vo.getCount()%></td>
</tr>
<% } %>
</tbody>
</table>
<button class="btn btn-primary btn-sm" onclick="location.href='register'">글쓰기</button>
</div>
</div>
<div class="col-3"><jsp:include page="right.jsp" />검색
</div>
</div>
</div>
<div class="card-footer">빅데이터 분석서비스 개발자 과정</div>
</div>
</body>
</html>
left.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<div class="card" style="min-height: 500px;max-height: 1000px">
<div class="card-body">
<h4 class="card-title">GUEST</h4>
<p class="card-text">회원님 Welcome!</p>
여기에 로그인 화면 디자인
</div>
</div>
right.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<div class="card" style="min-height: 500px;max-height: 1000px">
<div class="card-body">
<h4 class="card-title">SEARCH</h4>
<p class="card-text">검색어를 입력 : </p>
여기에 검색 화면 디자인
</div>
</div>
+) list.jsp에 '버튼'을 추가하여 새 창으로 이동하고 싶을 땐,
해당 jsp와 이를 연결해줄 controller를 작성해줘야 함.
register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Bootstrap Example</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
<script
src="https://cdn.jsdelivr.net/npm/jquery@3.6.3/dist/jquery.slim.min.js"></script>
<script
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script
src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="card">
<div class="card-header">
<div class="jumbotron jumbotron-fluid">
<div class="container">
<h1>MVC(Servlet, JSP, Oracle, jQuery, Ajax, JSON, MVC)</h1>
<p>Bootstrap is the most popular HTML, CSS...</p>
</div>
</div>
</div>
<div class="card-body">
<div class="row">
<div class="col-2"><jsp:include page="left.jsp" />로그인
</div>
<div class="col-7">
<div class="card-body">
<h4 class="card-title">BOARD</h4>
<p class="card-text">게시판 리스트</p>
<!-- 여기에 게시판 리스트 화면 구성 -->
<table class="table table-bordered table-hover">
<tr>
<td>제목</td>
<td><input type="text" name="title"></td>
</tr>
<tr>
<td>내용</td>
<td><textarea rows="10" cols="50" name="content"></textarea></td>
</tr>
<tr>
<td>작성자</td>
<td><input type="text" name="writer"></td>
</tr>
<tr>
<td colspan="2">
<button class="btn btn-sm btn-primary">등록</button>
<button class="btn btn-sm btn-primary">취소</button>
</td>
</tr>
</table>
</div>
</div>
<div class="col-3"><jsp:include page="right.jsp" />검색
</div>
</div>
</div>
<div class="card-footer">빅데이터 분석서비스 개발자 과정</div>
</div>
</body>
</html>
controller
package Controller;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/register")
public class BoardRegisterController extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 글쓰기 화면으로 forward 해야된다.
RequestDispatcher rd = request.getRequestDispatcher("board/register.jsp");
rd.forward(request, response);
}
}
게시판에 글을 쓴 후, 게시판 리스트에 저장되는 MVC 작성
jsp파일)
regist.jsp에 저장할 form 입력)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Bootstrap Example</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
<script
src="https://cdn.jsdelivr.net/npm/jquery@3.6.3/dist/jquery.slim.min.js"></script>
<script
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script
src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="card">
<div class="card-header">
<div class="jumbotron jumbotron-fluid">
<div class="container">
<h1>MVC(Servlet, JSP, Oracle, jQuery, Ajax, JSON, MVC)</h1>
<p>Bootstrap is the most popular HTML, CSS...</p>
</div>
</div>
</div>
<div class="card-body">
<div class="row">
<div class="col-2"><jsp:include page="left.jsp" />로그인
</div>
<div class="col-7">
<div class="card-body">
<h4 class="card-title">BOARD</h4>
<p class="card-text">게시판 글쓰기</p>
<!-- 여기에 게시판 글쓰기 화면 구성 -->
<!--
요청 종류(Request Methods)
데이터를 어디에 담아주느냐가 핵심관건!
GET => 주소창(URL)
데이터가 URL 뒤에 붙여서 전달이 된다.
보안 취약 / 2048byte
POST => 패킷의 body에 데이터를 담아서 전달
데이터가 눈에 보이지 않음
전송 데이터의 용량 한계 X
사실상 기본값
-->
<form action="regi" method="post">
<table class="table">
<tr>
<td>제목</td>
<td><input type="text" name="title" class="form-control"></td>
</tr>
<tr>
<td>내용</td>
<td><textarea rows="10" cols="50" name="content" class="form-control"></textarea></td>
</tr>
<tr>
<td>작성자</td>
<td><input type="text" name="writer" class="form-control"></td>
</tr>
<tr>
<td colspan="2">
<!--
input type="submit" == button
변화가 없는 button은 type을 생략할 수 있다.
but, '취소'같이 기능이 필요한 button에는 type 작성 필수!
-->
<button class="btn btn-sm btn-primary">등록</button>
<button type="reset" class="btn btn-sm btn-primary">취소</button>
</td>
</tr>
</table>
</form>
</div>
</div>
<div class="col-3"><jsp:include page="right.jsp" />검색
</div>
</div>
</div>
<div class="card-footer">빅데이터 분석서비스 개발자 과정</div>
</div>
</body>
</html>
controller_게시글 저장할 컨트롤러)
package Controller;
import java.io.IOException;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import DAO.BoardDAO;
import entity.Board;
@WebServlet("/list")
public class BoardListController extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 전체 게시판 리스트를 보여주라는 요청을 처리하는 컨트롤러
// List<Board>
BoardDAO dao = new BoardDAO();
List<Board> list = dao.getLists();
// Controller와<--forward--> View(list jsp)를 연동
// 1. 요청을 의뢰할 대상(View => list.jsp)을 선택한다.
// 2. 요청의뢰 객체를 만든다.
// 객체바인딩(*************************)
request.setAttribute("list", list);
// "list"->문자열/list-> arrayList
// "list"에는 번지가 들어있음(문자열), list(arrayList의 번지값이 들어있음)
// "list"가 list에 있는 번지를 꺼내간다는 말
request.setAttribute("list", list);
RequestDispatcher rd = request.getRequestDispatcher("board/list.jsp");
// 3. 요청의뢰를 실행한다.
rd.forward(request, response);
}
}
DAO에 게시글 저장하는 메소드 생성)
package DAO;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import entity.Board;
//JDBC(Java+SQL) 단점
// 1. 생산성이 떨어진다. => MyBatis Framework 도입
// 2. 유지보수가 어렵다. http://mybatis.org
public class BoardDAO<Sqlsession> {
private static SqlSessionFactory sqlSessionFactory;
// 데이터베이스 연결(MyBatis API 다운로드)
// 초기화 블럭 =>> new BoardDAO()
static {
try {
// 1. 설정파일의 경로를 저장
String resource = "DAO/mybatis-config.xml";
// 2. 설정파일을 읽기위해서 입력스트림(빨대)을 만들기
InputStream inputStream = Resources.getResourceAsStream(resource);
// 3. 설정파일을 읽어서 처리하기(Connection만들기)
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
// 1. 게시판 전체 리스트 가져오기 메소드 정의
public List<Board> getLists() {
// Connection(SqlSession) 필요
// SqlSession = Connection + Statement
// SqlSession이 SQL을 전송하려면 SQL이 어디에 있는지 알아야한다.
// SQL=select * from board
SqlSession session = sqlSessionFactory.openSession();
List<Board> list = session.selectList("getLists");
session.close();
return list;
}
// 2. 게시글을 저장하는 메소드 정의
public int insert(Board vo) {
// 1. SqlSession(Connection)을 빌려오기
// openSession(AutoCommit을 활성화할지??)
SqlSession session = sqlSessionFactory.openSession(true);
// 2. 준비해놓은 SQL문을 실행
// insert/delete/update > 사용하고자 하는 SQL문 키워드(DML)
// select > selectOne : 하나만 가져올 때
// > selectList : 여러 개를 가져올 때
// psmt.executeUpdate();; => int(몇 행 변경되었는가)
int row = session.insert("insert", vo);
// 3. 빌려온 session을 반환
session.close();
// 4. sql문을 실행한 결과 리턴
return row;
}
}
DAO_mapper 추가)
<?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="DAO.BoardMapper">
<select id="getLists" resultType="entity.Board">
select * from board
</select>
<!-- 기능에 사용할 SQL문을 정의 -->
<!-- MyBatis 바인드 변수 => #{변수명} : 해당하는 자리에 변수값을 집어넣어줌 -->
<!-- 기존 jdbc
sql = "..?..?..?"
pstm.setString(1, title);
-->
<!-- parameterType : 우리가 넣어줄 데이터의 데이터 타입
Class 이름 넣어줄 때, 반드시 패키지까지 나열
-->
<insert id="insert" parameterType="entity.Board">
insert into BOARD(num, title, content, writer)
values(board_seq.nextval, #{title}, #{content}, #{writer})
</insert>
</mapper>
결과값)
'Web > JSP_Servlet' 카테고리의 다른 글
forward & redirect (0) | 2023.04.18 |
---|---|
JSP 객체_html코드 안에서 Java코드 사용 (0) | 2023.04.18 |
MVC 기초_총합 구하기 (0) | 2023.04.11 |
MVC를 위한 Dynamic web project 생성 (0) | 2023.04.10 |
Form (0) | 2023.04.09 |
댓글