ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] 스프링 프레임워크 : STS에서 JSP 사용하기
    º Server º/Spring 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());
    		
    	}
    
Coder yein