Salted Caramel

[수업 88일차] 21.12.14 /Spring 4/ 04_MVC02/ 05_MVC03/ Spring 에서 바로 jsp 파일로 접근이 안되는 이유/root-context.xml/spring jdbctemplate 본문

coding/[2021.08.02~2022.01.24] 수업복습

[수업 88일차] 21.12.14 /Spring 4/ 04_MVC02/ 05_MVC03/ Spring 에서 바로 jsp 파일로 접근이 안되는 이유/root-context.xml/spring jdbctemplate

꽃무늬라떼 2021. 12. 16. 01:09

https://devlog-wjdrbs96.tistory.com/209

 

[Spring] 스프링 웹 계층이란?

이번 글에서는 스프링은 어떤 계층이 존재하는지와 계층의 역할을 무엇인지, 프로젝트시 패키지를 어떻게 나누는 것이 좋은지에 대해 정리해보려 한다. 스프링의 계층은 Presentation Layer, Business,

devlog-wjdrbs96.tistory.com

package com.sist.mvc01;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller   //컨트롤러 에노테이션을 만듦
public class MyController {
	
	/*
	 * ModelAndView 객체란?
	 * - ModelAndView 객체는 컨트롤러에 의해서 비지니스 로직이 수행이 되고 나면 대체적으로  
	 * 사용자에게 반환되어 브라우저에 보여질 정보들이 만들어진다.
	 * 이때만들어진 정보를 view page로 넘겨주게 되는데 
	 * 응답을 할 view page 정보와 전달할 데이터를 한꺼번에 저장하여 넘겨줄 때 사용함.
	 * */
	
	@RequestMapping("/info")
	public ModelAndView abc() {
		
		ModelAndView mav = new ModelAndView();
		
		mav.addObject("email", "hong@naver.com");  //정보를 ModelAndView에 저장.
		mav.setViewName("member/email");//정보다 보여질 view page 설정 
		
		return mav;
		
	}

}

같은 말

WEB-INF/views/member/email.jsp

 

 = mav.setViewName("member/email");

 

 

mav.addObject("email", "hong@naver.com");

여기서 "email"을 키로 넘겨 주기 때문에 member/email.jsp에서 key 값인 email을 넘겨 받을 때 ${email} 이라고 작성하여 넘겨 받는다

 

<div align="center">

<h2>홍길동님의 메일 주소 : ${email }</h2>

 

</div>

 

 

WEB-INF/views/member/email.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>

	<div align="center">
		<h2>홍길동님의 메일 주소 : ${email }</h2>
	
	</div>

</body>
</html>

 

 

http://localhost:8282/mvc01/info


Spring 에서 jsp 파일로 바로 접근이 안되는 이유(Run As)

 

 

Spring 에서는 보안이 중요하기 때문에 정보가 들어 있는 폴더들을 바로 접근 할 수가 없다.

1) servlet-context.xml

2) root-context.xml

위 두가지 파일이 중요하다. 그중 두번째인  root-context.xml에는 데이터베이스 로그인 정보가 들어있기 때문에 제일 중요해서 바로 jsp 파일로 접근하게 되면 그 정보를 알게 되기 때문에 spring 자체에서 막아버린 것이다. 

 


http://localhost:8282/mvc02/input

http://localhost:8282/mvc02/inputOk?name=%ED%99%8D%EA%B8%B8%EB%8F%99&id=hong


05_MVC03

 

Mycontroller
@RequestMapping("/join")
	public String join() {
		return "join";
		
	}
join.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>

	<div align="center">
	   <hr width="50%" color="blue">
	      <h3>회원 가입 관련 입력 폼 페이지</h3>
	   <hr width="50%" color="blue">
	   <br> <br>
	   
	   <form method="post"
	      action="<%=request.getContextPath() %>/join_ok">
	   
	      <table border="1" cellspacing="0" width="400">
	         <tr>
	            <th>이 름</th>
	            <td> <input name="name"> </td>
	         </tr>
	         
	         <tr>
	            <th>아이디</th>
	            <td> <input name="id"> </td>
	         </tr>
	         
	         <tr>
	            <th>비밀번호</th>
	            <td> <input type="password" name="pwd"> </td>
	         </tr>
	         
	         <tr>
	            <th>나 이</th>
	            <td> <input name="age"> </td>
	         </tr>
	         
	         <tr>
	            <th>주 소</th>
	            <td> <input name="addr"> </td>
	         </tr>
	         
	         <tr>
	            <th>이메일</th>
	            <td> <input name="email"> </td>
	         </tr>
	         
	         <tr>
	            <td colspan="2" align="center">
	               <input type="submit" value="회원가입">&nbsp;&nbsp;&nbsp;
	         	   <input type="reset" value="다시작성">
	            </td>
	         </tr>
	      
	      </table>
	 
	   </form>

	</div>
</body>
</html>
http://localhost:8282/mvc03/join

 

package com.sist.model;

import lombok.Data;

@Data
public class Person {

	private String name;
	private String id;
	private String pwd;
	private int age;
	private String addr;
	private String email;
	
}

 

 

 

join.jsp 에서 작성한 name 을 그대로 작성.

 

 

 

package com.sist.mvc03;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MyController {

	
	@RequestMapping("/join")
	public String join() {
		return "join";
		
	}
	
	@RequestMapping("/join_ok")
	public String joinOk(Person person, Model model) {
		
		//String name = request.getParameter("name").trim();
		//String id = request.getParameter("id").trim();
		//String pwd = request.getParameter("pwd").trim();
		//String age = request.getParameter("age").trim();
		//String addr = request.getParameter("addr").trim();
		//String email = request.getParameter("email").trim();
	
		//model.addAttribute("userName", name);
		//model.addAttribute("userId", id);
		//model.addAttribute("userPwd", pwd);
		//model.addAttribute("userAge", age);
		//model.addAttribute("userAddr", addr);
		//model.addAttribute("userEmail", email);
		
		model.addAttribute("dto", person);
		
		return "joinInfo";
	
	}
	
}

model.addAttribute("dto", person);

입력 폼 창의 변수명을 다 받아 줄 수 있다. 

 

=> 회원 가입에서 사용하기 좋음.

 

joinInfo.jsp
<%@ 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>


	<div align="center">
		<hr width="50%" color="tomato">
			<h3>회원 로그 정보</h3>
		<hr width="50%" color="tomato">
		
		
		<table border="1" cellspacing="0" width="300">
			<c:set var="dto" value="${dto }"/>
			<c:if test="${!empty dto}">
			<tr>
				<th>회원 이름</th>
				<td>${dto.getName() }</td>
			</tr>
			
			
			<tr>
				<th>회원 아이디</th>
				<td>${dto.getId()}</td>
			</tr>
			
			<tr>
				<th>회원 비밀번호</th>
				<td>${dto.getPwd() }</td>
			</tr>
			
			<tr>
				<th>회원 나이</th>
				<td>${dto.getAge() }</td>
			</tr>
			
			
		</c:if>
		
		<c:if test="${empty dto }">
			
		</c:if>
	
		</table>
	
	</div>

</body>
</html>

 

 


package com.sist.model;

import java.util.List;

/*
 * EmpDAO 인터페이스 특징
 * - 호출하는 클래스와 실제 DB에 접근하는 구현 클래스와의
 *   직접적인 의존관계를 느슨하게 하기 위해서 인터페이스를 사용.
 */

public interface EmpDAO {

	List<EmpDTO> getEmpList();    // 전체 사원 목록 관련 추상메서드.
	int empInsert(EmpDTO dto);    // 사원을 등록(추가)하는 추상메서드.
	EmpDTO empCont(int empno);    // 사원번호에 해당하는 사원의 정보를 조회하는 추상메서드.
	int empUpdate(EmpDTO dto);    // 특정 사원의 사원 정보를 수정하는 추상메서드.
	int empDelete(int empno);     // 특정 사원을 emp 테이블에서 삭제하는 추상메서드.
	List<DeptDTO> getDeptList();  // 부서 테이블 전체 리스트 관련 추상메서드.
	List<EmpDTO> getMgrList();    // 관리자만을 조회하는 추상메서드.
	
}

 

 

root-context.xml
<!-- Root Context: defines shared resources visible to all other web components -->
	
	<!--  스프링과 관련된 설정 파일을 설정하는 공간 :DB 연동과 관련 설정 공간 -->
	
	<!--  1.DataSource 정보 설정 
		==>DB와 관련된 connection(연결) 정보를 담고 있는 객체.
		
	-->
	
 	
 	<bean name="dataSource"

 

package com.sist.model;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

@Repository
// Spring에서 일반적으로 DAO 클래스에 적용되는 애노테이션
public class EmpDAOImpl implements EmpDAO {

	// 자동으로 의존관계를 설정해 주는 애노테이션.
	// 무조건 객체에 대한 의존을 주입해 주는 애노테이션.
	@Autowired
	private JdbcTemplate template;
	
	
	String sql = null;
	
	@Override
	public List<EmpDTO> getEmpList() {
	
		List<EmpDTO> list = null;
		
		sql = "select * from emp order by empno";
		
		return list = template.query(sql, new RowMapper<EmpDTO>() {

			@Override
			public EmpDTO mapRow(ResultSet rs, int rowNum) throws SQLException {
				
				EmpDTO dto = new EmpDTO();
				dto.setEmpno(rs.getInt("empno"));
				dto.setEname(rs.getString("ename"));
				dto.setJob(rs.getString("job"));
				dto.setMgr(rs.getInt("mgr"));
				dto.setHiredate(rs.getString("hiredate"));
				dto.setSal(rs.getDouble("sal"));
				dto.setComm(rs.getDouble("comm"));
				dto.setDeptno(rs.getInt("deptno"));
				
				return dto;
			}
		});
		
	}

	@Override
	public int empInsert(EmpDTO dto) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public EmpDTO empCont(int empno) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public int empUpdate(EmpDTO dto) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int empDelete(int empno) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public List<DeptDTO> getDeptList() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<EmpDTO> getMgrList() {
		// TODO Auto-generated method stub
		return null;
	}

}

[참고 자료]

https://devlog-wjdrbs96.tistory.com/209

 

[Spring] 스프링 웹 계층이란?

이번 글에서는 스프링은 어떤 계층이 존재하는지와 계층의 역할을 무엇인지, 프로젝트시 패키지를 어떻게 나누는 것이 좋은지에 대해 정리해보려 한다. 스프링의 계층은 Presentation Layer, Business,

devlog-wjdrbs96.tistory.com