º Server º/Spring
[Spring] 스프링 프레임워크 : STS에서 JSP 사용하기
Poony
2023. 7. 8. 08:25
- packaging : war로 설정하고 만들어줌
- next → oracle, Spring web, lombok추가

2. pom.xml 추가
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
3. application.properties 설정하기
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:XE
spring.datasource.data-username=c##madang
spring.datasource.data-password=madang
server.port=8088
server.session.timeout=36000
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
4. WEB-INF폴더 생성 → views 폴더 생성

5. STS → HELP → jsp 검색 → 설치

< 실습하기 >
- 순서
1. vo, dao 폴더 만들어서 생성
package com.example.demo.vo;
import lombok.Data;
@Data
public class DeptVO {
private int dno;
private String dname;
private String dloc;
}
package com.example.demo.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import org.springframework.stereotype.Repository;
import com.example.demo.vo.BookVO;
@Repository
public class BookDAO {
public ArrayList<BookVO> findAll (){
ArrayList<BookVO> list = new ArrayList<>();
String sql = "select * from book";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","c##madang","madang");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()) {
BookVO d = new BookVO();
d.setBookied(rs.getInt(1));
d.setBookname(rs.getString(2));
d.setPublisher(rs.getString(3));
d.setPrice(rs.getInt(4));
list.add(d);
}
if(rs != null) {
rs.close();
}
if(conn != null) {
conn.close();
}
if(stmt != null) {
stmt.close();
}
} catch (Exception e) {
System.out.println("예외발생 : "+e.getMessage());
}
return list;
}
}
2. com.example.demo.controller 컨트롤러 만들어서 상태유지
- 조회, 수정, 삭제, 추가 모두 하나의 컨트롤러에 입력 가능
package com.example.demo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.example.demo.dao.DeptDAO;
import com.example.demo.vo.DeptVO;
import com.fasterxml.jackson.annotation.JsonCreator.Mode;
//이 클래스를 스프링의 컨트롤러로 지정하기 위한 어노테이션입니다.
@Controller
public class DeptController {
// DeptDAO 타입의 객체를 자동으로 주입받기 위해 @Autowired 어노테이션을 사용하고 있습니다.
// 이 객체는 dao 변수에 할당됩니다.
@Autowired
private DeptDAO dao;
//DeptDAO 객체를 설정하기 위한 setter 메소드입니다.
public void setDao(DeptDAO dao) {
this.dao = dao;
}
// method가 get인 경우 해당 메소드로 옵니다.
//@RequestMapping(value = "/insertDept", method = RequestMethod.GET)
@GetMapping("/insertDept")
public void insertForm() {
}
// method가 post인 경우 해당 메소드로 옵니다.
//@RequestMapping(value = "/insertDept", method = RequestMethod.POST)
@PostMapping("/insertDept")
//사용자의 form 에 입력되서 온 데이터를 매개변수로 지정된 vo에 바로 담아줍니다. -> (command object라고 함)
public ModelAndView insertSubmit(DeptVO d) {
int re = dao.insert(d);
ModelAndView mav = new ModelAndView("insertDeptOK");
String msg = "부서 등록에 성공했습니다.";
if(re != 1) {
msg = " 부서등록에 실패하였습니다.";
}
//상태유지하기 위한 메소드 addObject();
mav.addObject("msg",msg);
return mav;
}
@RequestMapping("/listDept")
public ModelAndView list() {
ModelAndView mav = new ModelAndView();
// findAll() 메소드를 호출하여 "list"라는 이름으로 모델에 데이터를 추가
mav.addObject("list",dao.findAll());
// "listDept"라는 뷰를 설정하여 ModelAndView 객체를 반환
mav.setViewName("listDept");
return mav;
}
}
3. WEB-INF → views 에서 결과 도출할 jsp 만들기
- 조회 jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="<http://java.sun.com/jsp/jstl/core>"%>
부서목록
<%@ 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>Insert title here</title>
</head>
<body>
<h2>부서목록</h2>
<hr>
<table border="1" width:80%>
<tr>
<th>부서번호</th>
<th>부서이름</th>
<th>부서주소</th>
</tr>
<c:forEach var="d" items="${list }">
<tr>
<td>${d.dno }</td>
<td>${d.dname }</td>
<td>${d.dloc }</td>
</tr>
</c:forEach>
</table>
</body>
</html>
- 추가 jsp (insertDept, insertDeptOK)
<%@ 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>
<h2>부서등록</h2>
<hr>
<form action="insertDept" method="post">
부서번호 : <input type="text" name="dno"><br>
부서이름 : <input type="text" name="dname"><br>
부서위치 : <input type="text" name="dloc"><br>
<input type="reset" value="다시입력">
<input type="submit" value="등록">
</form>
</body>
</html>
<%@ 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>
${msg }
</body>
</html>
+ 리다이렉트 뷰 값을 설정해주면 지정한 페이지로 이동시키게 됩니다.
- 그러나 보통은 요청한 이름의 뷰로 설정하는 것이 대부분입니다.
그래서 현재의 스프링부트에서는 따로 뷰를 지정하지 않아도 요청한 이름의 뷰가 자동으로 설정됩니다.

예시 )
- ModelAndView 클래스 불러와서 사용 (리다이렉트 뷰 값을 설정)
//기본방식
@RequestMapping("/listBook")
public ModelAndView listBook() {
ModelAndView mav = new ModelAndView();
mav.setViewName("listBook");
mav.addObject("list",dao.findAll());
return mav;
}
- model 에 상태유지 (뷰가 자동으로 같은 이름의 JSP로 이동하게 됨)
// 뷰가 자동으로 설정되어 간단히 작성한 방식
@RequestMapping("/listBook")
public void listBook(Model model) {
model.addAttribute("list",dao.findAll());
}