응용 프로그래밍 및 화면 구현

마이바티스 연결시키기

황샐리 2022. 4. 27. 17:04

 

그 웹이랑 디비랑 연결시키는거랑 같다~~!

초기에는 안적어놔서 일단 다 적어볼게요.

 

무조건 javaee에서 해야하는거 알지??

먼저 라이브러리에 넣어주세요.

오라클8도 넣어줬어야하는거,, 알지,,?

 

-- 긁어오는 주소

https://mybatis.org/mybatis-3/getting-started.html

[리소스]

리스너에 넣을거 다 넣어주고 지울거 다 지워주교요

마이바티스에 들어가서 긁어와줍니다.

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory =
  new SqlSessionFactoryBuilder().build(inputStream);

이거를요. 여기서 리소스 옆에 있는것은 그냥예시이기 때문에 내가 무조건 주소를 변경해주어야합니다. 그런데 위에것을 어디다가 넣냐고요?

contextInitialized

여기에 넣고 트라이/캐치 다해줍니다.

package nowon.listener;

import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

@WebListener
public class NowonListener implements ServletContextListener {

    public void contextDestroyed(ServletContextEvent sce)  { 
        }

    public void contextInitialized(ServletContextEvent sce)  { 
    	String resource = "nowon/mybatis/mybatis-config.xml";
    	InputStream inputStream;
		try {
			inputStream = Resources.getResourceAsStream(resource);
			SqlSessionFactory sqlSessionFactory =
			    	  new SqlSessionFactoryBuilder().build(inputStream);
			//application scope
			ServletContext sc=sce.getServletContext();
			sc.setAttribute("sqlSessionFactory", sqlSessionFactory);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}   	
      }	
}

와~ 임포트 많다~~!

그리고 리소스를 변경해줍니다. 맨 위에서 보이듯이 mybatis아래로 파일을 만들어줬기 때문에 주소는 당연히 바뀝니다.

 

[config.xml]

이것도? 긁어줍니다. 어디서요? 마이바티스에서요. 왜요? 마이바티스 쓰려면 하래요;;;

<?xml version="1.0" encoding="UTF-8" ?>
http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <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="org/mybatis/example/BlogMapper.xml"/>
  </mappers>
</configuration>

근데 읽어보니까 프로퍼티즈를 읽어들이네요? 근데 우리는 없으니까 지금 만들어줍니다. 싱글태그로도 가능!

하고 프로퍼티즈를 확장자로 하는 파일을 만들어 줍니다.

뉴-아더-제너럴-file

파일 이름 :  dataSource.properties

driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:xe
username=hr
password=hr

띄어쓰기 없다고요!!! 공백 없어!!!!!

이렇게 하고 컨피그 파일중 프로퍼티즈에 넣어줍니다.

<configuration> //요 위치에 넣어줘
<properties resource="nowon/mybatis/dataSource.properties"/>

매퍼 태그도 살펴볼게요.

매퍼태그에 리소스에 있는 xml파일을 바꿔줘야지!

매퍼 패키지와 보드 클래스를 만들어줍니다.

저 보드-캐퍼안에는 일단 아무것도 없는데 여기에 뭘 써주냐?

<?xml version="1.0" encoding="UTF-8" ?>
http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
  <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

마이바티스에서 고대로 긁어온거를

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="board-mapper">

</mapper>

이렇게 바꾸어 줍니다. 그 후에

 

board-mapper 주소를 고대로 복사해어 컨피그 파일 중 매퍼에 넣어줍니다.

  <mappers>
    <mapper resource="nowon/mapper/boardMapper.xml"/>
  </mappers>

이렇게 까지 해서 실행하면? 당연히 404오류가 뜹니다. 당연함. 왜? 인덱스 안만들었자나,,

콘솔창에서는 오류가 없음을 확인 할 수 있습니다.

sqlSessionFactory--> ServletContext 저장

이 완료가 되었습니다.

주소를 공유할때 앞에거 다 빼고 NOWON부터 넣는이유는 와르로 할때 앞에거 다 삭제되기 때문입니다. war프일에 클래시스 안에 만들어져서 노원부터(패키지부터) 만들어지기 때문에 굳이굳이앞에거 경로가 필요하지 않습니다.

 

[인덱스]

파일 만들어보겠습니다. 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>
	<h1>저희 홈페이지에 오신 걸 환영합니다.</h1>
</body>
</html>

웰컴~~!

<body>
	<a href="board">게시판</a>
	<h1>저희 홈페이지에 오신 걸 환영합니다.</h1>
</body>

보드로 게시판까지 만들었는데 뭐,, 서블릿이 없으니 갈 수가 있나~~!

 

[서블릿]

매핑주소를 서브릿 옆에다 넣어줘야하니까 board를 넣어줍니다. 매핑주소가 일치해야해요. 일단 한번 볼게요.

@WebServlet("/board")
public class BoardController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("/board로 요청시 실행");
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

콘솔창 / 웹 창

웹에서 암것도 안나왔지만 그것이 맞습니다.

오브젝트로 넣으면 모든 데이터타입을 넣을 수 있지만 가지고 올때는 뭐로 리턴해주자고요? 오브젝트로요!

오픈하면 sql 세션개테를 만들어 준대요.

SqlSession sqlSession=sqlSessionFactory.openSession();

sqlSession.selectList("boardMapper"); //매퍼까지 접근했음,

매퍼 xml안에 있는 쿼리까지 접근합시다.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="boardMapper">
	<select id="all">
	 select * from board order by no desc //세미콜론직지말자구요
     </select>
</mapper>

짜잔

[dto]

sql디벨로퍼에 있는 데이터 그대로 선언해주고 캡슐화 합니다. 봐봐

package nowon.domain.dto;

import java.time.LocalDateTime;

public class BoardDTO {
	
	private int no;
	private String subject;
	private String content;
	private String writer;
	private int readCount;
	private LocalDateTime createdDate;
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	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 getWriter() {
		return writer;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
	public int getReadCount() {
		return readCount;
	}
	public void setReadCount(int readCount) {
		this.readCount = readCount;
	}
	public LocalDateTime getCreatedDate() {
		return createdDate;
	}
	public void setCreatedDate(LocalDateTime createdDate) {
		this.createdDate = createdDate;
	}
}

이렇게 디티오를 만들어줬다면, 패키지 이름까지 풀로 복사하여 보드 매퍼로 들어가게 해줍니다!

<mapper namespace="boardMapper">
	<select id="all" resultType="nowon/domain/dto/BoardDTO.java">
	 select * from board order by no desc
	 </select>
</mapper>

의미는? 보드 디티오 타입에 매핑 해주세요~ 라는 뜻

 

보드콘트롤러에서도 바꾸어 쥽니다. 리스트로요!

SqlSession sqlSession=sqlSessionFactory.openSession();
		
		List<BoardDTO> list=sqlSession.selectList("boardMapper.all");
		System.out.println(list.size());
		
		sqlSession.close();

임포트 등등 아주 당연함.

 

자 근데 여기서 dto에서 setNo를 지워볼게요.

실행결과 머 .. 없음....!!

마이바티스에서의 디비는 게터세터와 상관이..! 없다~~!

 

그런데 지금 오류남,,, 머여!!!

일단 계속 가볼게야

 

[list.jsp]

webapp잡고 만드는거여.

 

일단 만들고 보드콘트롤러에서 페이지 이동을 위하여 요청해줍니다.

//페이지 이동
		String path="list.jsp";
		request.getRequestDispatcher(path).forward(request, response);

아까 그 바로 위에서 한 거기 아래임. 두겟 맨 아래

리스트 jsp페이지에ㅓㅅ 불러오는 ㄴ리퀘스트 내장객체가 있으니까 확인이 가능하자나요.

위에다가 그거쓰라고요

request.setAttribute("list", list);
		//페이지 이동

자자 이제 드디어 list.jsp 페이지로 넘어가서 바꿔볼게요.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%
    List<BoardDTO> list=(List<BoardDTO>)request.getAttribute("list");
    System.out.print("jsp페이지에 전달되었나요? : "+list.size());
    %>

여기에는 없지만 무수한 임포트들과,, 캐스트 꼭 해주기!!

그러나 이제 우리는 안습니다. jsp로 할것이기 때문에!

그 태그 라이브러리 4개 다 넣으세요. .lib에다가요.

uri는 컨트롤 스페이스로 치삼.. 아니면 오류나니까

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<table>
		<tr>
			<td>NO</td>
			<td>제목</td>
			<td>조회수</td>
			<td>작성자</td>
			<td>작성일</td>
		</tr>
		<c:forEach var="dto" items="${list }">
			<tr>
				<td>${dto.no }</td>
				<td>${dto.subject }</td>
				<td>${dto.readCount }</td>
				<td>${dto.writer }</td>
				<td>${dto.createdDate }</td>
			</tr>
		</c:forEach>
	</table>
</body>
</html>

${ } 는 아까 그 콘트롤러에서 리스트.겟~~~ 그거와 같은 기능이라구요.

 

[오류]

근데 오류남ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ....

404 오류..

왜냐면

<mapper namespace="boardMapper">
	<select id="all" resultType="nowon.domain.dto.BoardDTO">
	 SELECT * FROM board order by no desc
	 </select>
</mapper>

여기에서 resultType을 잘못했거든요,,^^

자자 저기에 주소를 복사해서 넣어햐하는것은 저 자바파일이 아니라

BoardDTO입니다. 오키?!?!!?

오키. 위에 올라가면 내가 잘못 친거 찾을 수 있을것임.

++)) 덧붙여서

여기에서 이것도 확인하시길 바랍니다. 디비에서는 대문자로 써놓고 아까 내가 소문자로 써놔서 오류가 또 뜬것은 아닐지,, 잘 생각해 보시고요 디비에서 작성한것을 그대로 복붙하는 황샐리씨가 됩시다~!

 

+) 세팅 수정

작성일이 안나오는 오류가 있을 수 있습니다.

mybatis-config 에 세팅 태그를 추가할게요

<properties resource="nowon/mybatis/dataSource.properties"/>
 <settings>
 	<setting name="mapUnderscoreToCamelCase" value="true"/>
 </settings>
  <environments default="development">

야야 물론 서비스 실행했어야한단다.

왕 작성일까지 다나온다.

그리고 이왕한김에 소스까지 좀 수정할게요.

보드 콘트롤러에서 수정합니다. 오버라이드로 init요~!

@WebServlet("/board")
public class BoardController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private SqlSessionFactory sqlSessionFactory;
	
	@Override
	public void init() throws ServletException {
		sqlSessionFactory =
				(SqlSessionFactory) getServletContext().getAttribute("sqlSessionFactory");				
	}	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("/board로 요청시 실행");
	
		SqlSession sqlSession=sqlSessionFactory.openSession();
		
		List<BoardDTO> list=sqlSession.selectList("boardMapper.all");
		//System.out.println(list.size());		
		sqlSession.close();	
		request.setAttribute("list", list);
		//페이지 이동
		String path="list.jsp";
		request.getRequestDispatcher(path).forward(request, response);
		
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

오버라이드 해주고 지금 그 안으로 sql을 넣었습니다~!

언제나 오타조심!!

언제나 복붙 합시다~~!

 

그러면 이어서 write 페이지를 구현해볼게요.

인덱스 페이지 -> 리스트 -> 글쓰기 페이지 이렇게 구현할겁니다.

홈에서 목록 보기를 클릭하고 글쓰기를 클릭하도록요~!

그러니까 인덱스 페이지에서 건드리는것은 아무것도 없습니다.

그렇지만 리스트에서는 수정해주어야합니다~! href태그로요

<body>
	<a href="write.jsp">글쓰기</a>
	<hr>
	<table>

<hr>태그를 만들고 <a>태그를 이용하여 줍니다. 바디와 테이블 사이에 위치한다는 것을 알 수 있습니다.

 

 

인덱스, 리스트와 같은 위치에 write.jsp파일을 만듭니다.

<body>
	<a href="<%=request.getContextPath()%>">HOME</a>
	<a href="board">목록보기</a>
	<h1>글쓰기 페이지</h1>
</body>

이렇게 해주면 구현이 됩니다,, 오케이?

오켕!

와~~ 어렵다아~~~~

 

[key]

그러면 키라는것을 통해서 한번 구현해보도록 할게요~!@

연결시키는것은 어디다?

보드 컨트롤러다~!

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("/board로 요청시 실행");
		//
		
		String uri=request.getRequestURI();
		String[] strs=uri.split("/");
		String key=strs[strs.length-1];//uri주소 /거로 구분해서 마지막거
		System.out.println(key);
		
		if(key.equals("list")) {
		SqlSession sqlSession=sqlSessionFactory.openSession();
		
		List<BoardDTO> result=sqlSession.selectList("boardMapper.all");
		//System.out.println(list.size());		
		sqlSession.close();
		
		request.setAttribute("list", result);
		//페이지 이동
		String path="/WEB-INF/board/list.jsp";
		request.getRequestDispatcher(path).forward(request, response);
		
	}
	else if(key.equals("write")) {
				String path="/WEB-INF/board/write.jsp";
				request.getRequestDispatcher(path).forward(request, response);
				}
	}

저기 있는 key를 통해서 해볼게요

자자 키가 뭐냐~~

uri주소를 내가 / (루트)로 쪼갤거야~ 그리고 그 중에서 젤 마지막에 있는거로 찾을게~!

라는 뜻입니다.

list페이지의 uri는 

http://localhost:8080/DBConn/board/list

그러면 여기서 맨 마지막인 list와 같으면 오픈세션하겠다는것입니다. 그래서! key.equlals"list" 라고 한 것입니다~!

마찬가지로 else if로 write 를 찾겠다는것입니다~!

끝.

index 페이지 메뚜기월드에 오신것을 환영합니다~
list / write 페이지

그러면 이제 글을 써보자고요~!

가장먼저 보드 컨트롤러에서 맨 위에거 수정해줍니다.

@WebServlet(urlPatterns = {"/board/list","/board/write","/board/insert")
else if(key.equals("insert")) {
		request.setCharacterEncoding("utf-8");
		String subject=request.getParameter("subject");
		String content=request.getParameter("content");
		String writer=request.getParameter("writer");
		
		BoardInsertDTO dto=new BoardInsertDTO(subject,content,writer);
		
		SqlSession sqlSession=sqlSessionFactory.openSession(true);
		//쿼리실행
		int n=sqlSession.insert("boardMapper.save", dto); //데이터를 저장하는 쿼리를 실행해야함. 쿼리에도 당연히 데이터가 반영되어야하니까
		sqlSession.close();
		System.out.println(n+"개 저장완료!");
		//리스트 페이지로 이동
		response.sendRedirect("list");

보드 콘트롤러에 else if를 사용하여 만들어 줍니다. 저기서 보이듯이 dto파일을 또 생성했고, domain.dto패키지 아래에 있습니다. 

<body>
	<a href="<%=request.getContextPath() %>">HOME</a>
	<a href="list">목록보기</a>
	<h1>글쓰기 페이지</h1>
	<form action="insert" method="post">
		<p>
			<input type="text" name="subject">
		</p>
		<p>
			<textarea rows="5" cols="50" name="content"></textarea>
		</p>
		<p>
			<input type="hidden" name="writer" value="guest">
			<button type="submit">글쓰기</button>
		</p>
	</form>
</body>

이것은 라이트 페이지 입니다. 보면 알수 있듯이 라이트 페이지에서 바로 리스트 페이지로 가는 것과 홈으로 돌아가는 것을 모두 href로 만들어 주었습니다. 그러면? 글을 쓸 수가 있다~~!

 

아니 근데 이렇게 하면 글쓰기를 보고 그 안에 게시글까지 확인해야하는것이 국룰 아니겟습니가?

보드 인서트 디티오 생성

	private String subject;
	private String content;
	private String writer;

우리가 작성해야하는것은 모다? 저 위에 저것들 밖에는 없습니다.

그 아래에 컨트롤+스페이스를 눌러서 생성자를 생성하여 줍니다.

그리고 그 아래에 게터세터 구현해주고요, 제너레이터 컨스트럭터 유징 필드까지!

public BoardInsertDTO() {
	}
	//생성자
	public BoardInsertDTO(String subject, String content, String writer) {
		super();
		this.subject = subject;
		this.content = content;
		this.writer = writer;
	}
	//제너레이터
	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 getWriter() {
		return writer;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	} //게터세터

 

 

리스트도 바꾸어 줍니다. 왜냐면 리스트페이지에서 클릭을 해야 거기로 갈거아니에요;;;;

근데 생각해보니 리스트 페이지 코드를 안 넣어놨네... 지금 전체 코드를 볼게요.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<a href="write">글쓰기</a>
	<hr>
	<table>
		<tr>
			<td>NO</td>
			<td>제목</td>
			<td>조회수</td>
			<td>작성자</td>
			<td>작성일</td>
		</tr>
		<c:forEach var="dto" items="${list }">
			<tr>
				<td>${dto.no }</td>
				<td><a href="detail?no=${dto.no }">${dto.subject }</a></td>
				<td>${dto.readCount }</td>
				<td>${dto.writer }</td>
				<td>${dto.createdDate }</td>
			</tr>
		</c:forEach>
	</table>
</body>
</html>

<td><a href="detail?no=${dto.no }">${dto.subject }</a></td>

이 코드가 말하는바는?

글 제목에 href를 추가해서 글 제목을 누르면 그 글 속으로 들어ㅏ게 할거야~!

그런데 들어가는 것은 글 번호를 이용해서 할거야~! 라는 뜻입니다.

 

 

보드 디테일을 추가해주어야겠죠?

else if(key.equals("detail")) {
		String no=request.getParameter("no");
		System.out.println(no);

맨 아래쪽 엘스이프임을 잊지마십시오.

자자 겟 파라미터는 무조건 스트링으로밖에 안한다. 아니면 널값!!!1 숫자여도 인트는 리턴이 안됨. 스트링스세요

그런데 DB의 no는 숫자임. 그러니까 숫자로 바꾸어 주어야해. 여기서는 문자자나여파싱할게오~

int no=Integer.parseInt(_no);

이거 추가하세오.

no값을 이용해서 들어갈거에요. 파일에서 보이시죠? 주소에서 넘버 보여주게합니다.

마치 라잌디스

이러고 이제 디비에서 조회를 해볼게요.

//db에서 조회
		SqlSession sqlSession=sqlSessionFactory.openSession(); //셀렉트이니까 트루필요없음
		BoardDTO result=sqlSession.selectOne("boardMapper.detail",no);
		sqlSession.close();
		request.setAttribute("detail", result);
		path="/WEB-INF/board/detail.jsp";

자 여기서 내용을 정리해보겟습니다. 정신차리고 읽어라.

위에서 다 저장해주었고요 이 정보들을 제가 "detail"이라고 정의하였습니다.

그리고 그것들을 이제 디테일 ㅊ창에서 불러와야겠죠? 저장한 정보의 이름인 디테일과 디테일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>
	<table>
	<a href="<%=request.getContextPath() %>">HOME</a>
	<a href="list">목록보기</a>
	<hr>
	<tr>
			<td>NO</td>
			<td>제목</td>
			<td>조회수</td>
			<td>내용</td>
			<td>작성자</td>
			<td>작성일</td>
		</tr>
		<hr>
			<tr>
				<td>${detail.no }</td>
				<td>${detail.subject }</td>
				<td>${detail.readCount }</td>
				<td>${detail.content }</td>
				<td>${detail.writer }</td>
				<td>${detail.createdDate }</td>
			</tr>
            </table>
</body>
</html>

 

아까 무슨 이름으로 정보들을 저장했다구요?? detail이라고~!!!

그래서 정보를 불러올 때 detail.이름

이렇게 저장을 했습니다~!!

마치 빨간머리 앤,, 예쁘지는 않지만 사랑스러워,,,
tr, td 태그들을 다시 정렬하여 만들었습니다~!

끝 악 너무 어려워 눈물이 다 나는군요. 역시 홈페이지는 아무나 만드는것이 아님을,,

 

이제 딜리트 페이지도 생성할게요.

딜리트는 어디서 구현하느냐!

디테일 페이지에서 글을 삭제할거에요.

저 위에 두번째 구현했던것도 같이 볼게요.

<%@ 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>
	<a href="<%=request.getContextPath() %>">HOME</a>
	<a href="list">목록보기</a>
	<h1>상세정보</h1>
	<table>
	<hr>
	<tr>
			<td>NO</td>
			<td>${detail.no }</td>
	</tr>
	<tr>
			<td>제목 </td>
			<td>${detail.subject }</td>
	</tr>
	<tr>
			<td>조회수</td>
			<td>${detail.readCount }</td>
	</tr>
	<tr>
			<td>내용</td>
			<td>${detail.content }</td>
	</tr>
	<tr>
			<td>작성자</td>
			<td>${detail.writer }</td>
	</tr>
	<tr>
			<td>작성일</td>
			<td>${detail.createdDate }</td>
	</tr>
    <tr>
    <td colspan="2">
       <a href="delete?no=${detail.no }"><button type="button">삭제</button></a>
       <button type="submit">수정</button>
		<hr>
			</table>
</body>
</html>

어우 길다;;;

 

먼저 보드매퍼바꿔야합니다.~~~보드-매퍼.xml페이지로 가줍니다.

아차참 위에 디테일을 생성할때도 이거 매퍼 바꿔주어야한다~!

<delete id="delete">
	 delete from board
	 where no=#{no}
	 </delete>

이거 보니까 sql문이다~!!

사실 sql문을 안 써도 삭제는 됩니다. 그런데 sql문을 왜써요?

우리 DB 쓰잖아요~~!!

SQL 디벨로퍼에서도 삭제되어야 하니까~~!!!

동기화를 위해서 꼭 구현해주자구요!

 

이제 보드 컨트롤러에서 바꿀게요.

@WebServlet(urlPatterns = {"/board/list","/board/write","/board/insert","/board/detail","/board/delete"})

보드컨트롤러에서 맨 위에 서블릿속 url패턴을 바꾸어줍니다.

그리고요?!?!?

아래볼게요

else if(key.equals("delete")) {
		String _no=request.getParameter("no");
		int no=Integer.parseInt(_no);
		System.out.println(no);
		SqlSession sqlSession=sqlSessionFactory.openSession(true);
		BoardDTO result=sqlSession.selectOne("boardMapper.delete",no);
		sqlSession.close();
		request.setAttribute("delete", result);	
		response.sendRedirect("list");
else if(key.equals("delete")) {
			//1.파리미터 받기
			String _no=request.getParameter("no");
			int no=Integer.parseInt(_no);
			//2.DB접속
			SqlSession sqlSession=sqlSessionFactory.openSession(true);
			//3.삭제작업
			sqlSession.delete("boardMapper.del", no);
			sqlSession.close();
			//4.list로 이동
			response.sendRedirect("list");
		}

이거는 쌤 버전

보드-매퍼xml에서 바꾸어준 아이디를 넣습니다. 그리고 삭제하면 jsp는 ? 필요없어. 페이지를 넘어갈 필요가 없음.

그래서 리스폰즈!! 다시 응답해줍니다. 어디로요? 리스트로요~!

 

 

그러면 완성데스

리스트 - 상세정보 - 삭제된 것을 확인!

-- 정리

1. 기능을 구현할 곳에 버튼이든 href든 만들어주기

2. 보드매퍼에서 sql문으로 기능 구현하기

3. 보드 콘트롤러(서블릿 페이지)로 가서

- uri패턴 바꾸어주기

- (오늘 여기에서는) elseif 를 활용하여 키 값, 파라미터, 파싱(자바와sql데이터 형식이 안 맞을때만), 세션오픈, 리퀘스트 해주기

-path 또는 response를 통하여 다른 페이지로 넘어가도록 마무리.

 

이제 수정을 해보도록 하겠습니다~!

먼저 디테일 페이지에서 할거에요

제이쿼리 긁어오고요. 헤드에다가 넣어줍니다.

<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
</head>

아까 삭제버튼이랑 같이 만들어준 수정버튼을 수정합니다.

			<td colspan="2">
		      	 <a href="delete?no=${detail.no }"><button type="button">삭제</button></a>
		       	 <button type="button" id="btn-edit">수정</button>
			</td>

이제 테이블을 벗어나 스크립트를 넣어줍니다~!

자바 스크립트는 모든 아이디앞에 # 넣어주어야합니다

나 안넣어가지고 오류났자나~~~~ 지지배

<script type="text/javascript">
	$(function() {
		$("#btn-edit").click(function(){
			$("#detail").hide();
			$("#edit-form").show();
		});
		//취소버튼 누를때
		$("#btn-cancel").click(function(){
			$("#edit-form").hide();
			$("#detail").show();
			});
	});
	</script>
		<form action="update" method="post" id="edit-form" style="display: none;">
			<table>
				<tr>
					<td>NO</td>
					<td>${detail.no }</td>
				</tr>
				<tr>
					<td>작성자</td>
					<td>${detail.writer }</td>
				</tr>
				<tr>
					<td>작성일</td>
					<td>${detail.createdDate }</td>
				</tr>
				<tr>
					<td>조회수</td>
					<td>${detail.readCount }</td>
				</tr>
				<tr>
					<td>제목 </td>
					<td><input type="text" name="subject" value="${detail.subject }"></td>
				</tr>
				<tr>
					<td>내용</td>
					<td>
						<textarea name="content" rows="5" cols="50">${detail.content }</textarea>
					</td>
				</tr>
				<tr>
				    <td colspan="2">
					     <input type="hidden" name="no" value="${detail.no }">
					     <button type="submit">수정완료</button>
					     <button type="button" id="btn-cancel">취소</button>
					</td>		
				</tr>
			</table>
		</form>

스크립트와 폼태그를 이용하여 구현하여 줍니다. 그리고 보드 컨트롤러에서 서블릿옆에 uri패턴 넣어주었어요~!

일단 결과 먼저 볼게요.

수정 전 / 수정 중 / 수정 후

와 진짜 어렵다.... 

보드 콘트롤러 볼게요..

else if(key.equals("update")) {
		request.setCharacterEncoding("utf-8");
		String _no=request.getParameter("no");
		int no=Integer.parseInt(_no);
		String subject=request.getParameter("subject");
		String content=request.getParameter("content");
		
		UpdateDTO dto=new UpdateDTO(no, subject, content);
		
		SqlSession sqlSession=sqlSessionFactory.openSession(true);
		sqlSession.update("boardMapper.btnEdit", dto);
		sqlSession.close();
		response.sendRedirect("detail?no="+no);
		
	}

여기에서 보시다싶이 dto 클래스를 새로 생성하여 주었습니다.

updatedto 안에 

	private int no;
	private String subject;
	private String content;

이거만 치고 생성자 만들고 게터세터 만들고 제너레이터 유징 필드까지도요.

 

보드 매퍼도 수정하여 줍니다.

<update id="btnEdit" >
	   update board
	   set subject=#{subject}, content=#{content}
	    where no=#{no}
	 </update>

짠 그러면 이제 위에서 본 실행결과가 나오게 됩니다. 아주 어렵죠?

 

 

 

와 끝이다 진짜 제발 이제 끝났다 아아아악

'응용 프로그래밍 및 화면 구현' 카테고리의 다른 글

InnerClass  (0) 2022.05.20
스프링부트 초기 설정  (0) 2022.05.13
컬렉션 리스트- Map / Hash Table / Properties  (0) 2022.04.27
SET - Hash / Tree  (0) 2022.04.26
list -Array / Vector / Linked  (0) 2022.04.26