그 웹이랑 디비랑 연결시키는거랑 같다~~!
초기에는 안적어놔서 일단 다 적어볼게요.
무조건 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 를 찾겠다는것입니다~!
끝.
그러면 이제 글을 써보자고요~!
가장먼저 보드 컨트롤러에서 맨 위에거 수정해줍니다.
@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.이름
이렇게 저장을 했습니다~!!
끝 악 너무 어려워 눈물이 다 나는군요. 역시 홈페이지는 아무나 만드는것이 아님을,,
이제 딜리트 페이지도 생성할게요.
딜리트는 어디서 구현하느냐!
디테일 페이지에서 글을 삭제할거에요.
저 위에 두번째 구현했던것도 같이 볼게요.
<%@ 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 |