Spring(2)


インタフェースにメソッドを追加します.Xmlではクエリー文、テストコードの作成順に繰り返し、クエリー、削除、修正、読み取りなどで作成
BoardMapperTests.Javaのメソッドの追加

	@Test
	public void testInsertSelectKey() {
		BoardVO board = new BoardVO();
		board.setTitle("새로 작성하는글selectkey");
		board.setContent("새로 작성하는 내용SelectKey");
		board.setWriter("새로운 작성자SelectKey");
		
		mapper.insertSelectKey(board);
		log.info("1");
		
	}
settitle、setContent、setWriterでboardに追加
MapperはBoardMapperですxml呼び出しSQL用に設計されたインタフェース
BoardMapper.Javaインタフェースは次のとおりです.

追加
BoardMapper.xmlにsqlクエリー文を追加する
<insert id="insertSelectKey">
	<selectKey keyProperty="bno" order="BEFORE" resultType="Long">
	select seq_board.nextval from dual
	</selectKey>
	
	insert into tbl_board(bno, title,content,writer)
	values (#{bno}, #{title}, #{content}, #{writer})
</insert>
selectkeyはbnoの値を1増加させる
他のinsert、read、delete、updateメソッドもインタフェースに追加されます

BoardMapper.xmlにもsqlクエリー文を追加

<insert id="insert">
		insert into tbl_board(bno,title,content,writer)
		values (seq_board.nextval, #{title},#{content},
		#{writer})
	</insert>
	<insert id="insertSelectKey">
		<selectKey keyProperty="bno" order="BEFORE"
			resultType="long">
			select seq_board.nextval from dual
		</selectKey>
		insert into tbl_board(bno, title, content, writer)
		values (#{bno}, #{title}, #{content}, #{writer})
	</insert>
	<select id="read" resultType="kr.icia.domain.BoardVO">
		select * from tbl_board where bno=#{bno}
	</select>
	<delete id="delete">
		delete tbl_board where bno=#{bno}
	</delete>
	<update id="update">
		update tbl_board
		set title=#{title},
		content=#{content},
		writer=#{writer},
		updateDate=sysdate
		where bno=#{bno}
	</update>



BoardServiceインタフェースの作成

public void register(BoardVO board);// 등록.

	public BoardVO get(Long bno);// 읽기

	public boolean modify(BoardVO board);// 수정

	public boolean remove(Long bno);// 삭제

	public List<BoardVO> getList();// 목록

以上のメソッドを追加
crudに相当する方法
上記インタフェースを実装するBoardServiceImplクラスを生成

package kr.board.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import kr.board.domain.BoardVO;
import kr.board.mapper.BoardMapper;
import lombok.AllArgsConstructor;
import lombok.Setter;
import lombok.extern.log4j.Log4j;

@Log4j // lombok 로그 이용.
@Service // 이 클래스가 서비스 계층을 맡는다고 알림.
@AllArgsConstructor // 모든 매개변수에 대한 생성자 생성.(생성자 여러개 아님)
public class BoardServiceImp implements BoardService {

	@Setter(onMethod_ = @Autowired)
	private BoardMapper mapper;

	@Override
	public void register(BoardVO board) {
		log.info("register......" + board);
		mapper.insertSelectKey(board);
	}

	@Override
	public BoardVO get(Long bno) {
		log.info("get......" + bno);
		return mapper.read(bno);
	}

	@Override
	public boolean modify(BoardVO board) {
		log.info("modify......" + board);
		return mapper.update(board) == 1;
	}

	@Override
	public boolean remove(Long bno) {
		log.info("remove......" + bno);
		return (mapper.delete(bno)) == 1;
	}

	@Override
	public List<BoardVO> getList() {
		log.info("getList......");
		return mapper.getList();
	}

}

以上のメソッドを追加
root-context.xmlに、Mybatis-sping:scanの下に次のコードを追加します.(作成したばかりのサービスクラスをオブジェクト化)

<context:component-scan
base-package="kr.icia.service">
</context:component-scan>
<!-- 스프링 프레임워크에서 해당 패키지를 살펴보고, 컴포넌트와 관련
어노테이션을 만나면 그 부분을 자동 객체화 처리 -->



コントローラの作成
パッケージの名前を変更しました

package kr.board.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import kr.board.service.BoardService;
import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j;

/* @Controller : 스프링 컴파일러에 controller 라고 알림.
- 위 어노테이션이 있으면 자동으로 메모리에 등록.
- 생성, 초기화, 할당을 모두 자동으로 처리.
@RequestMapping : url 요청에 대한 처리를 명시.
- jsp 게시판에서 @WebServlet 역할과 비슷. */
@Log4j
@Controller
@RequestMapping("/board/*")
@AllArgsConstructor
public class BoardController {
	private BoardService service;

	/*
	 * @GetMapping : 페이지 요청 방식이 get일 경우.
	 * 
	 * @PostMapping : 페이지 요청 방식이 post일 경우.
	 */
	@GetMapping("/list")
	public void list(Model model) {
		log.info("list");
		model.addAttribute("list", service.getList());
// 과거 jsp에서는 request.setAttribute로 ArrayList를 전달했지만
// , 같은 역할을 model이 대신.
// 컨트롤러 >> 서비스 >> 매퍼 >> mybatis
	}
}
BoardController.Javaに上記の方法を入力します
board/listもあります.jspを作成します.

実行時

上記のようにdbのすべてのコンテンツが出力されます
ライティングコントローラも実現


	@PostMapping("/register")
	public String register(BoardVO board, RedirectAttributes rttr) {
	// @Controller 어노테이션이 붙고,
	// 컴포넌트 스캔에 패키지가 지정되어 있다면,
	// 매개변수 인자들은 스프링이 자동으로 생성 할당 함.
	log.info("register : " + board);
	service.register(board);
	rttr.addFlashAttribute("result", board.getBno());
	// 리다이렉트 시키면서 1회용 값을 전달.
	return "redirect:/board/list";
	}


// 제목 링크를 클릭하여 글 상세보기 - get 방식.
	@GetMapping("/get")
	public void get(@RequestParam("bno") Long bno, Model model) {
		// @RequestParam : 요청 전달값으로 글번호 이용.
		log.info("/get");
		model.addAttribute("board", service.get(bno));
		// jsp에서 request.setAttribute 하던 것과 비슷.
		// 전달값으로 명시만 하면 스프링이 자동 처리.
		// 사용하는 부분만 추가 구현.
	}

	// 글 수정 컨트롤러 구현.
	// post 요청으로 /modify 가 온다면, 아래 메소드 수행.
	@PostMapping("/modify")
	public String modify(BoardVO board, RedirectAttributes rttr) {
		log.info("modify:" + board);
		if (service.modify(board)) {
			rttr.addFlashAttribute("result", "success");
		}
		// 수정이 성공하면 success 메세지가 포함되어 이동.
		// 실패해도 메세지 빼고 이동.
		return "redirect:/board/list";
	}

	// 글 삭제 컨트롤러 구현
	@PostMapping("/remove")
	public String remove(@RequestParam("bno") Long bno, RedirectAttributes rttr) {
		log.info("remove..." + bno);
		if (service.remove(bno)) {
			rttr.addFlashAttribute("result", "success");
		}
		return "redirect:/board/list";
	}
@PostMappingのページリクエスト方式はpostです.
RedirectAttributesがredirectにデータを渡す
addFlashAttributeは、データを転送するための使い捨ての転送です.
requestParam要求により渡された変数値OO名で受信した変数をOOに割り当てる
ブートストラップでcssファイル部分を受信します.

リスト部分は3種類に分かれています
タイトルセクション

コードが多すぎて省略しました
素手部分

リストセクション

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!-- jstl core 쓸때 태그에 c 로 표시. -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!-- jstl fmt 쓸때 위와 같음. fmt : formatter 형식 맞춰서 표시 -->
<%@ include file="../includes/header.jsp"%>
<!-- DataTales Example -->

<h1 class="h3 mb-2 text-gray-800">Tables</h1>
<p class="mb-4">
	DataTables is a third party plugin that is used to generate the demo
	table below. For more information about DataTables, please visit the <a
		target="_blank" href="https://datatables.net">official DataTables
		documentation</a>.
</p>

<div class="card shadow mb-4">
	<div class="card-body">
		<div class="card-header py-3" align="right">
			<button id="regBtn" style="color: green;">write</button>
		</div>
		<div class="table-responsive">
			<table class="table table-bordered" id="dataTable" width="100%"
				cellspacing="0">
				<thead>
					<tr>
						<th>#번호</th>
						<th>제목</th>
						<th>작성자</th>
						<th>작성일</th>
						<th>수정일</th>
					</tr>
				</thead>
				<tbody>
					<c:forEach var="board" items="${list }">
						<tr>
							<td><c:out value="${board.bno }" /></td>
							<td><c:out value="${board.title }" /></td>
							<td><c:out value="${board.writer }" /></td>
							<td><fmt:formatDate pattern="yyyy-MM-dd"
									value="${board.regdate }" /></td>
							<td><fmt:formatDate pattern="yyyy-MM-dd"
									value="${board.updateDate }" /></td>
						</tr>
					</c:forEach>
				</tbody>
			</table>
		</div>
	</div>
</div>
<div class="modal fade" id="myModal" tabindex="-1" role="dialog"
	aria-labelledby="exampleModalLabel" aria-hidden="true">
	<div class="modal-dialog" role="document">
		<div class="modal-content">
			<div class="modal-header"></div>
			<div class="modal-body"></div>
			<div class="modal-footer">
				<button class="btn btn-primary" type="button" datadismiss="modal">close</button>
			</div>
		</div>
	</div>
</div>
<script>
	$(document).ready(function() {
		$('#dataTable').DataTable({
			"order" : [ [ 0, "desc" ] ], //정렬 0컬럼의 내림차순으로
			"paging" : false, // 페이징 표시 안함.
			"bFilter" : false, // 검색창 표시 안함.
			"info" : false
		// 안내창 표시 안함.
		});
		$("#regBtn").on("click", function() {
			self.location = "/board/register";
			/* 아이디 regBtn 을 클릭한다면
			 현재창의 url를 쓰기로 변경 */
		});
		var result = '<c:out value="${result}"/>';
		// 자바스크립트는 형추론 이용.
		checkModal(result);
		// 게시물 번호를 매개변수로 전달하면서 checkModal 펑션 호출
		function checkModal(result) {
			if (result === '') {
				// == 는 값만 비교, === 은 값과 형식도 비교.
				return;
			}
			if (parseInt(result) > 0) {// 전달된 문자값을 숫자화, 자바의
				Integer.parseInt
				비슷함.$(".modal-body").html("게시글 " + parseInt(result) + "번이 등록");
				// 표시할 내용 만들기
			}
			$("#myModal").modal("show");// 모달창 표시
		}
	});
</script>
<%@ include file="../includes/footer.jsp"%>
上からリストセクションを表示

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
jstlはライブラリなのでcoreをheaderに追加する必要があります

<c:forEach var="board" items="${list }">
						<tr>
							<td><c:out value="${board.bno }" /></td>
							<td><c:out value="${board.title }" /></td>
							<td><c:out value="${board.writer }" /></td>
							<td><fmt:formatDate pattern="yyyy-MM-dd"
									value="${board.regdate }" /></td>
							<td><fmt:formatDate pattern="yyyy-MM-dd"
									value="${board.updateDate }" /></td>
						</tr>
					</c:forEach>
はloop文で、プロジェクト属性に配列を割り当てることができます.
${}をelと呼ぶ
elを使用すると、値を設定したり形状を変換したりする必要がなく、サーバに送信でき、形状を変換する必要がなく使用できます.
出力値