º Server º/Spring

[Spring] 스프링 프레임워크 : STS에서 JSP 사용하기

Poony 2023. 7. 8. 08:25
  1. 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());
		
	}