mybatis 사용하여 web 구성

ezzange·2022년 10월 4일
0

web

목록 보기
2/3
post-thumbnail

web생성 및 설정

Dynamic web project생성

/web06Mybatis/src/main/webapp/WEB-INF/lib안에 오라클드라이버및 마이바티스 넣어주기

/web06Mybatis/src/main/java에 mybatis패키지만들고 그안에 mybatis-config.xml 생성

mybatis-config.xml

mybatis패키지안에 dataSource.properties.file 생성

properties주소를 매번 쓸 필요없이 파일을 이용하여 SQL에 접속
dataSource.properties.file

mybatis-config.xml

mybatis패키지안에 MybatisConfig.java 생성

1.필드에 sqlSessionFactory 변수선언
2.퍼블릭(외부에서도 사용할 수 있도록 퍼블릭) 메서드 생성
첫번째로 메서드를 호출하면(외부에서 값을 받으면) sqlSessionFactory의 값이 디폴트 null이니까 생성자를 통해 mybatisConfig.getInstance()로 sqlSessionFactory객체가 생성되고 두번째부터는 이미 만들어진 객체의 값을 리턴값으로 주는 로직만들기.
(매번 새로운 객체를 생성하지 않고 1번만 생성 하도록 if문 적용함 )
(변수와 생성자에 private가 붙은 이유 : 외부에서 생성자를 생성못하게하고 객체 또한 직접 접근하지 못하게하기 위해)
public static 메서드를 이용해서만 하나의 객체를 호출할 수 있게끔 함
이를 싱글톤이라고 함

MybatisConfig.java

-생성자에서 초기화하는 것이 아닌 스테틱 필드로 SqlSessionFactory 객체를 초기화하면 if문 안써도됌 (처음에 한번 생성되니) 하지만 생성자에 private 설정을 해주어야 하기 때문에 생성자에서 초기화 하는 방법을 선호

web-app 에 index.jsp 생성

<&SqlSessionFactory ssf mybatisConfig.getInstance();&>-메서드 호출 하여 웹에서 리턴을 받음

스크립트에서 데이터표현하기

mybatis.MybatisConfig를 import해주고 body에 SqlSessionFactory: <%=MybatisConfig.getInstance()%> 작성하면 웹페이지에서 새로고침할때마다 같은 세션코드를 확인할 수 있음(하나의 세션코드가 유지 )

<%@page import="mybatis.MybatisConfig"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
//ServletContext application
application.setAttribute("root", request.getContextPath());
%>       
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	SqlSessionFactory: <%=MybatisConfig.getInstance()%> 
<h1>인덱스페이지</h1>
</body>
</html>

index.jsp 삭제

웰컴 페이지 변경하기

프로젝트 파일 우클릭-java ee tools - Generate Deplo어쩌구 클릭 ->web.xml자동으로 생성됌


파란색 줄을 바꾸면 웰컴 페이지를 변경할 수 있음

web.xml삭제

web 화면 만들기

WEB-INF에 view폴더 생성 안에board 폴더 생성 안에 index.jsp과 list.jsp생성

index.jsp
절대경로 쓸거면 컨텍스패스어쩌구 넣어줘야함
<a href=<%=request.getContextPath() %>"board/list">게시글</a>
상대경로
<a href="board/list">게시글2</a>

String root=request.getContextPath();
application.setAttribute(arg0, arg1);
어플리케이션은 서블릿컨텍스트 미리 만들어졌다고 생각하면 됌 
서버가 실행되고 끝낳때까지 유지하는 객체 
<%
String root=request.getContextPath();
//ServletContext application
application.setAttribute("root", root);
%>  

"root" 를 자동으로 읽어온다~

<body>
	<a href=${root }"board/list">게시글</a>
	<a href="board/list">게시글2</a>
	<h1>인덱스 페이지</h1>
</body>

패키지는 controller로 하고BoardContoller.Servlet 생성


주석지우고

BoardContoller.servlet 완성

web에서 읽어올 데이터만들기

sql에서 테이블과 시퀀스 생성

mybatis-config.xml에서 configuration안에 세팅추가

주의점! - properties 뒤에 와야 오류가 안남!

<settings>
	<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>


다시 sql디벨로퍼에서 테이블에 행 추가 (세번)

insert쿼리작성후 3번실행하고 커밋

insert into board2(bno, title, content, writer, updated_date)
VALUES(seq_bo2.NEXTVAL , '제목'||seq_bo2.NEXTVAL , '내용'||seq_bo2.NEXTVAL , '테스트' , systimestamp);


)

web에서 데이터를 읽고 업데이트할 수 있는 기능 추가하기

boardController클래스에 sqlSession선언후 다중행 조희쿼리추가 및 요청, 응답로직추가

Mybatis package에mapper package만들고 그 안에 board-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="boardMapper">
  </mapper>

package domain.dto.board2생성하고 안에 클래스 Board2DTO 생성

getter setter 추가하기

board-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="boardMapper">
<!-- 조회결과를 매핑할 클래스 정보 등록 resultType="경로등록"-->
  <select id="findAll" resultType="domain.dto.board2.Board2DTO">
  	select * from board2
  	order by bno desc
  </select>
</mapper>

다중행쿼리

package controller;
import java.io.IOException;
import java.util.List;
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 org.apache.ibatis.session.SqlSession;
import domain.dto.board2.Board2DTO;
import mybatis.MybatisConfig;
@WebServlet(urlPatterns = {"/board/list"})
public class BoardContoller extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//request.getWriter().print("<h1>board list page</h1>");
		///board/list 로직처리
		SqlSession sqlSession=MybatisConfig.getInstance().openSession();
		//다중행 조회쿼리       //"namespace(매퍼이름).id"
		//다중행 처리결과를 List< 행의 결과를 매핑하는 클래스>
		List<Board2DTO> result=sqlSession.selectList("boardMapper.findAll");
		System.out.println("result 개수 : "+result.size());
		sqlSession.close();//실행하면 닫아주기 꼭!
		//응답할 페이지정보는 JSP파일로 지정할 수 있어서 굳이 이렇게 할 필요가 없다.
		String path="/WEB-INF/view/board/list.jsp";
		//경로는webapp부터 
		//내가 지정한 디스패서는 리스트 요청이 들어오면 리스트 알려주는거임
		//requestScope 저장소에 "list"이름으로 쿼리의 결과를 저장 -->result : 리스트로 받은 Board2DTO임
		request.setAttribute("list", result);		
        request.getRequestDispatcher(path).forward(request, response);
	}	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {	
		doGet(request, response);
	}
}

게시글페이지 만들기

list.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>
<style type="text/css"></style>
</head>
<body>
	<h1>게시글페이지입니ek</h1>
	<ul>
		<li>글번호</li>
		<li>제목</li>
		<li>조회수</li>
		<li>작성자</li>
		<li>작성일</li>	
	</ul>
</body>
</html>




!!컨트롤 + 쉬프트 + R = 강력 새로고침!!

<style type="text/css">
	*{padding: 0;margin: 0}
	ul{
		WIDHT: 800px;
		margin:0 auto;(상하여백)
		display: grid;
		grid-template-columns:150px 300px 100px 150px auto;(각 여백)
		border-bottom: 1px solid(실선) #000;(검정색) //#fff(빛 제일쎄게 흰색)
	    (모퉁이-아래쪽)(원래 두개표현하는데 똑같으면 하나만표기)
	}
	li{
		list-style: none;(태그)
		padding: 0.5em 1em;(좌우여백)
	}
</style>

최종

<%@page import="java.util.List"%>
<%@page import="domain.dto.board2.Board2DTO"%>
<%@ 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>
	<style type="text/css">
		*{padding : 0;margin: 0}
		h1{
			width:800px;
			margin: 40px auto;
		}
		ul{
			width: 800px;
			margin:0 auto;
			display: grid;
			grid-template-columns: 100px 300px 100px auto auto;
			border-bottom: 1px solid #222222; 
		}
		li{
			list-style: none;
			padding: 0.5em 1em;
		}
	</style>
</head>
<body>
	<h1>게시글 페이지입니다.</h1>
	<ul>
		<li>글번호</li>
		<li>제목</li>
		<li>조회수</li>
		<li>작성자</li>
		<li>작성일</li>
	</ul>
	<%
		for(Board2DTO dto: (List<Board2DTO>)request.getAttribute("list")){
	%>
	<ul>
		<li><%=dto.getBno() %></li>
		<li><%=dto.getTitle() %></li>
		<li><%=dto.getReadCount() %></li>
		<li><%=dto.getWriter() %></li>
		<li><%=dto.getUpdatedDate() %></li>
	</ul>
	<%
		}
	%>
</body>
</html>
![](https://velog.velcdn.com/images/ezzang2/post/d888a707-9c56-4d26-b973-01c36989a149/image.PNG)

글쓰기 페이지 추가하기

드라이브추가

WEB-INF에서write.jsp생성

write.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>
	<style type="text/css">
		section{
			width:600px;
			margin:0,auto;
		}
	</style>
</head>
<body>
	<section>
	<h1>글쓰기 페이지</h1>
		<div>
			<a href="${root }">HOME</a>
			<form action="write-proc" method="post">
				<p>
					<input type="text" name="writer" placeholder="작성자">
				</p>
				<p>
					<input type="text" name="title" placeholder="제목">
				</p>
				<p>
					<textarea rows="10" cols="50" name="content" placeholder="내용을 입력하세요"></textarea>
				</p>
				<p>
					<button type="submit">등록</button>
				</p>
			</form>
		</div>
	</section>
</body>
</html>

boardController에 글쓰기 처리를 위한로직추가

}else if(uri.contains("write")) {
		path="/WEB-INF/view/board/write.jsp";
		}else if(uri.contains("proc")){
			//글쓰기 처리 하기 위한 uri
			System.out.println("글쓰기 처리!");
			//응답객체 response uri정보를 재요청함
			response.sendRedirect("list");
		}//End if
		if(path!=null)	request.getRequestDispatcher(path).forward(request, response);
}

list.jsp에 링크추가

	<h1>게시글 페이지입니다.</h1>
	<a href="write">글쓰기</a>

적용 결과

글쓰기 페이지에서 내용 작성 후 등록하면 게시글페이지에 업데이트하기

write.jsp

BoardContoller.java 에 로직추가 한글인코딩까지

board-mapper.xml에 insert쿼리추가

적용결과

게시글쓰는 web화면

등록버튼 클릭

~~

0개의 댓글