어느 사이트던 루트 컨텍스트를 가진다.
목록페이지
<table width="100%">
<thead>
<tr>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
</tr>
</tbody>
</table>
테이블의 토대 작성
테이블의 th 와 td는 같게 하는것이 일반적이다.
페이지를 들어갔을때 어떤 내용을 루트로 설정해서 보여줘야지는 백엔드에서 설정하는 것이다.
리디렉트 명령으로 처리할 수도 있다.
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);
return "redirect:/board/list";
}
/
로 요청을 했을때 redirect를 통해서 /board/list
의 jsp로 만들어낸 결과물을 보여준다. jsp는 사용자에게 보여지는 것이 아니다 .
이 상태에서 리스트를 받은건 컨트롤러 쪽이다. 이것을 뷰로 전달하기 위해 쓰는게 model이다.
@GetMapping("/list")
public void list(Model model) {
log.info("리스트요청");
model.addAttribute("list", service.getList());
}
그럼 이제 jsp 쪽에서 el형식으로 변수로 받을 수 있게 된다.
위와 같이 컨트롤러에서 jsp로 넘겨줄때 이름이 반드시 동일해야 데이터를 전달받을 수 있다.
ApplicationScope
SessionScope : 중요한 데이터
RequestScope : 요청을 하고 응답을 하는 것이 한 사이클
model은 여기에 속한다.
PageScope : 페이지 내에서만 유용한 scope.
위와 같이 requestScope을 하면 모두 살펴보지 않기때문에 속도가 빠르다.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
jstl를 쓸것라는 선언이다,
<c:forEach>
core라이브러리에서 제공하는 함수이다.
위와같이 코드를 작성하면 데이터가 잘 출력되는 것을 볼 수 있다.
log4j는 두군데가 있다. main의 resouce와 test의 resource가 있다. 서비스에 나오는 러ㅗ그도 출력하려면 log4j.xml에 선언을 해줘야 한다.
EL에서 ${board.bno}
board객체의 bno 프로퍼티를 찍어라
이는 board.getbno을 뜻하는데
b는 B로 대문자로 바뀐다
board.getBno의 함수가 호출된다.
EL은 형변환이 자유롭다 그래서 만약 ${board.bno}+ ${board.bno}을 수행하면 long타입의 연산을 수행할수있다.
오후수업시작
Mapper에 추가적인 작업을 선언하는 것이 첫번째
sql developer에서 직접 넣어보기
INSERT INTO tbl_board(bno, title, content, writer)
VALUES (seq_board.nextval, '1', '2', '3')
BoardMapper.xml 에 insert 쿼리를 만든다. 파라메터로 받아와서 넣는 부분을 수정한다
<insert id="insertSelectkey">
<selectKey order="BEFORE" resultType="Long" keyProperty="bno">
<![CDATA[
SELECT seq_board.nextval FROM dual
]]>
<selectKey>
<![CDATA[
INSERT INTO tbl_board(bno, title, content, writer)
VALUES (seq_board.nextval, #{title}, #{content}, #{writer})
]]>
</insert>
<![CDATA[
INSERT INTO tbl_board(bno, title, content, writer)
VALUES (#{bno}, #{title}, #{content}, #{writer})
]]>
seq_board.nextval
도 #{bno}
로 수정한다.
select에서 받아온 bno의 값을 넣는 것이기 때문이다.
order="BEFORE"
: INSERT 보다 selectkey를 먼저 수행해라
resultType
: 형식
keyProperty
: 지정값
이렇게 설정하고 나서 테스트 해보기
BoardMapperTests.java
@Test
public void testInsertSelectKey(){
BoardVO board = new BoardVO();
board.setTitle("안녕나야");
board.setContent("잘지내니");
board.setWriter("어제");
mapper.insertSelectKey(board);
}
결과
먼저 bno의 값이 수행되서 bno의 값을 가져오게 된다.
값이 정상적으로 나오면 이제 서비스로 이동해서 코드를 작성한다.
BoardService는 비즈니스 로직이라서 사용자 입장에 맞는 register()메서드를 등록한다.
그후 ServiceImpl에서 구현을 한다.
BoardServiceTests에서 테스트를 해본다.
@Test
public void testRegiter() {
BoardVO board = new BoardVO();
board.setTitle("테스트");
board.setContent("테스트");
board.setWriter("테스트");
log.info("실행전 : " + board.getBno());
service.register(board);
log.info("실행후 : " + board.getBno());
}
모두 처리가 끝났으면, 컨트롤러를 수정할 차례이다.
입력을 위한 화면이 필요하다. 즉, 입력용 페이지 요청이 들어오면
.jsp 파일을 보여주면 된다.
컨트롤러에 메소드를 추가한다.
public void register() {
}
void 요청이기 때문에 경로상에 그대로 jsp파일이 존재해야 한다.
서버로 데이터를 보내기 위해 기본적인 <form>
을 만들어준다.
중요한 속성 2가지 action과 method가 있다. method의 속성에 아무런 값이 없다면 get이 디폴트로 된다.
action에는 url을 작성한다.
컨트롤러에는 post방식의 요청을 받을수있도록 @PostMapping을 추가해준다.
이렇게 기본적인 토대를 만들어준다.
그 후에 <form>
태그에 데이터입력을 받을수 있는 <input>
태그를 추가한다.
버튼도 추가한다. 서밋버튼과 함께 초기화 버튼도 작성한다.
마지막으로 컨트롤러에
service.register(board); 를 작성하고 register 페이지에 데이터를 입력하고 등록했을때 데이터가 추가되면 성공이다.
성공했으면 콘솔페이지에서 위와 같이 출력된것을 볼수있다.