mybatis-config.xml
properties주소를 매번 쓸 필요없이 파일을 이용하여 SQL에 접속
dataSource.properties.file
mybatis-config.xml
1.필드에 sqlSessionFactory 변수선언
2.퍼블릭(외부에서도 사용할 수 있도록 퍼블릭) 메서드 생성
첫번째로 메서드를 호출하면(외부에서 값을 받으면) sqlSessionFactory의 값이 디폴트 null이니까 생성자를 통해 mybatisConfig.getInstance()로 sqlSessionFactory객체가 생성되고 두번째부터는 이미 만들어진 객체의 값을 리턴값으로 주는 로직만들기.
(매번 새로운 객체를 생성하지 않고 1번만 생성 하도록 if문 적용함 )
(변수와 생성자에 private가 붙은 이유 : 외부에서 생성자를 생성못하게하고 객체 또한 직접 접근하지 못하게하기 위해)
public static 메서드를 이용해서만 하나의 객체를 호출할 수 있게끔 함
이를 싱글톤이라고 함
MybatisConfig.java
-생성자에서 초기화하는 것이 아닌 스테틱 필드로 SqlSessionFactory 객체를 초기화하면 if문 안써도됌 (처음에 한번 생성되니) 하지만 생성자에 private 설정을 해주어야 하기 때문에 생성자에서 초기화 하는 방법을 선호
<&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 완성
주의점! - 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);
)
주의점! 매퍼안에 세미콜론 찍으면 오류남!
<?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화면
끝~~