01. Index 화면 구동
[ STEP 1 ] 오늘 날짜의 프로젝트 생성하고 버전 변경하기
[ STEP 2 ] 기본 파일 삭제하기
[ STEP 3 ] 'IndexController.java' 파일 생성
package com.peazh.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class IndexController {
// 처음 페이지 시작했을 때
@GetMapping("/")
public String index() {
return "index";
}
}
[ STEP 4 ] 'index.jsp' 파일 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>인덱스입니다.</title>
</head>
<body>
<h1>index</h1>
</body>
</html>
02. 에러 처리하기
[ STEP 1 ] 'main.jsp' 파일이 없는 상태에서 main 페이지로 이동해보기 (=에러 상황)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>인덱스입니다.</title>
</head>
<body>
<h1>index</h1>
<a href="./main">main</a>
</body>
</html>
[ STEP 2 ] 파일의 경로 줄여주기 위해서 'servlet-context.xml' 파일에서 코드 추가하기
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<resources location="/resources/css/" mapping="/css/**" />
<resources location="/resources/img/" mapping="/img/**" />
[ STEP 3 ] 'ErrorController.java' 파일 생성
package com.peazh.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class ErrorController {
@GetMapping("/error404")
public String error404() {
return "error404";
}
}
[ STEP 4 ] 이미지 폴더 만들어서 'error404'가 발생했을 때 나올 이미지 넣기
[ STEP 5 ] 'errorController.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>
<img alt="error" src="./img/error.jpg" style="width: 50%">
<h1>error</h1>
<h3>에러가 발생했습니다.</h3>
</body>
</html>
03. 게시판 만들기
[ STEP 1 ] 'BoardController.java' 파일 생성하기
package com.peazh.web;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class BoardController {
// 1. board 리스트 보는 화면 = board.jsp
@GetMapping("/board")
public String board(Model model) {
// 데이터 붙이기
model.addAttribute("name", "1234");
return "board";
}
// 2. detail 상세보기 화면 = detail.jsp
}
[ STEP 2 ] 'board.jsp' 파일 생성하기
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판</title>
</head>
<body>
<h1>게시판 : ${name }</h1>
<a href="./board">게시판</a>
<a href="./main">main</a>
</body>
</html>
[ STEP 3 ] 'BoardController.java'와 연결할 'BoardService.java' 파일 생성하기
package com.peazh.web;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Service;
@Service
public class BoardService {
public List<Integer> boardList() {
List<Integer> list = new ArrayList<Integer>();
for (int i = 1; i < 11; i++) {
list.add(i);
}
return list;
}
}
- 'board.jsp' 파일 수정
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판</title>
</head>
<body>
<h1>게시판 : ${name }</h1>
${list }
</body>
</html>
- 'BoardController.java' 파일 수정
package com.peazh.web;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class BoardController {
@Autowired
private BoardService service;
// 1. board 리스트 보는 화면 = board.jsp
@GetMapping("/board")
public String board(Model model) {
// 데이터 붙이기
model.addAttribute("name", "1234");
// service에서 메서드 불러오기
List<Integer> list = service.boardList();
model.addAttribute("list", list);
return "board";
}
// 2. detail 상세보기 화면 = detail.jsp
}
04. 리스트가 없을 경우 처음 index 화면으로 돌아가기
[ STEP 1 ] 'BoardController.java' 파일에서 아래의 코드 추가하기
// 리스트의 데이터가 있다면 보드로 이동하기
if (!list.isEmpty()) {
model.addAttribute("list", list);
return "board";
} else {
return "redirect:/";// 리다이렉트 : 다시 컨트롤러 지나감 (= /란 요청을 다시 함)
}
[ STEP 2 ] 리스트가 없을 경우 실행화면
05. DB랑 board 이어주기
[ STEP 1 ] 'pom.xml' 파일에서 jar파일 import하기 (아래의 코드 추가)
<!-- spring jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- 파일업로드 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<!-- mariadb-java-client -->
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>3.0.8</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!-- mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
[ STEP 2 ] 'servlet-context.xml'에서 코드 추가하기
<beans:import resource="classpath:/spring/*-context.xml"/>
[ STEP 3 ] 'spring' 폴더 만들고 폴더 안에 database-context.xml 파일 만들기
- 'database-context.xml' 코드
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="username" value="dbID"></property>
<property name="password" value="dbPW"></property>
<property name="url"
value="jdbc:mariadb://localhost:3306/db주소"></property>
<property name="driverClassName"
value="org.mariadb.jdbc.Driver"></property>
</bean>
<bean id="sqlSessionFactoryBean"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mapperLocations"
value="classpath:/mybatis/mappers/*-mapper.xml"></property>
<property name="configLocation"
value="classpath:/mybatis/config/mybatisConfig.xml"></property>
</bean>
<bean id="sqlSession"
class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory"
ref="sqlSessionFactoryBean"></constructor-arg>
</bean>
</beans>
[ STEP 4 ] src/main/resources/mybastis 안에 config, mappers 각각의 폴더 만들고 xml 파일 생성하기
- 'mybatisConfig.xml' 파일
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias type="java.lang.Integer" alias="integer"/>
</typeAliases>
</configuration>
- 'board-mapper.xml' 파일
<?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="board">
<select id="boardList" resultType="com.peazh.web.BoardDTO">
SELECT * FROM board
LIMIT 10
</select>
</mapper>
[ STEP 5 ] 'BoardDTO.java' 파일 생성
package com.peazh.web;
public class BoardDTO {
private int bno, blike;
private String btitle, bcontent, bdate, bwrite;
public int getBno() {
return bno;
}
public void setBno(int bno) {
this.bno = bno;
}
public int getBlike() {
return blike;
}
public void setBlike(int blike) {
this.blike = blike;
}
public String getBtitle() {
return btitle;
}
public void setBtitle(String btitle) {
this.btitle = btitle;
}
public String getBcontent() {
return bcontent;
}
public void setBcontent(String bcontent) {
this.bcontent = bcontent;
}
public String getBdate() {
return bdate;
}
public void setBdate(String bdate) {
this.bdate = bdate;
}
public String getBwrite() {
return bwrite;
}
public void setBwrite(String bwrite) {
this.bwrite = bwrite;
}
}
[ STEP 6 ] 'BoardDAO.java' 파일 생성
package com.peazh.web;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class BoardDAO {
@Autowired
private SqlSession sqlSession;
public List<BoardDTO> boardList() {
return sqlSession.selectList("board.boardList"); // 네임스페이스.id
}
}
[ STEP 7 ] 'BoardService.java' 파일 수정
- 'BoardDAO'에게 일 시기키
package com.peazh.web;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BoardService {
@Autowired
private BoardDAO boardDAO;
public List<BoardDTO> boardList() {
return boardDAO.boardList();
}
}
[ STEP 8 ] 'board.jsp'에서 jstl 사용해서 게시판 구동하기
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판</title>
</head>
<body>
<h1>게시판 : ${name }</h1>
<table>
<tr>
<th>번호</th>
<th>제목</th>
<th>작성자</th>
<th>작성일</th>
<th>좋아요</th>
</tr>
<c:forEach items="${list }" var="row">
<tr>
<td>${row.bno }</td>
<td>${row.btitle }</td>
<td>${row.bwrite }</td>
<td>${row.bdate }</td>
<td>${row.blike }</td>
</tr>
</c:forEach>
</table>
</body>
</html>
[ STEP 9 ] 'board-mapper.xml'에서 게시판이 역순으로 나오게 아래의 코드 추가하기
SELECT * FROM board
ORDER BY bno DESC
LIMIT 10
[ STEP 10 ] 'board.jsp'에서 a태그 넣기 (게시글을 눌렀을 때 해당 게시글로 이동하기 위함)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판</title>
</head>
<body>
<h1>게시판 : ${name }</h1>
<table>
<tr>
<th>번호</th>
<th>제목</th>
<th>작성자</th>
<th>작성일</th>
<th>좋아요</th>
</tr>
<c:forEach items="${list }" var="row">
<tr>
<td>${row.bno }</td>
<td><a href="./detail?bno=${row.bno }">${row.btitle }</a></td>
<td>${row.bwrite }</td>
<td>${row.bdate }</td>
<td>${row.blike }</td>
</tr>
</c:forEach>
</table>
</body>
</html>
[ STEP 11 ] 'BoardController.java'에서 아래의 코드 추가하기 (detail 페이지로 이동)
// 2. detail 상세보기 화면 = detail.jsp
@GetMapping("/detail")
public String detail(HttpServletRequest request) {
String bno = request.getParameter("bno");
int no = Integer.parseInt(bno);
return "detail";
}
06. 주소에 숫자 외엔 들어오지 못하도록 처리하기
[ 방법 1 ] 'isDigit' 이용하기
- 한글자씩 검사해서 숫자가 들어오면 true, 숫자 외에 글자가 들어오면 false 값을 반환해줌
// bno 길이만큼 돌면서 숫자를 하나씩 꺼내기
for (int i = 0; i < bno.length(); i++) {
System.out.println(Character.isDigit(bno.charAt(i)));
// '117'번을 눌렀다면 true, true, true
// '117번'을 눌렀다면 true, true, true, false
[ 방법 2 ] 'try-catch' 이용하기
- 오류가 없다면 try에 있는 문장이 출력, 오류가 나면 catch에 있는 문장이 출력
try {
int no = Integer.parseInt(bno);
System.out.println("숫자입니다.");
} catch (Exception e) {
System.out.println("숫자가 아닙니다.");
}
// 숫자가 들어왔을 경우 : 숫자입니다.
// 문자가 들어왔을 경우 : 숫자가 아닙니다.
댓글