07_Framework
lib > taglibs 추가 ( JDBC boardProject > lib 안에 있는 파일 복사 붙여넣기 )
Server 실행
프로젝트 우클릭 - Run As - Run on Server
Hello world!가 나와야 정상출력된 것.
CF ) 되지 않을 경우 ?!
프로젝트 우클릭 - Maven - updateProject - ok
프로젝트 우클릭 - Run as - Mave install
프로젝트 우클릭 - Run as - run on server
크롬에서 출력됨.
서버가 처음 돌 때
web.xml
-> root-context.xml
-> servlet-context.xml
cf) 화면단에 뿌려주는 로직
package edu.kh.project;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* Handles requests for the application home page.
*/
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
/**
* Simply selects the home view to render by returning its name.
*/
// Handler Mapping
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
String formattedDate = dateFormat.format(date);
model.addAttribute("serverTime", formattedDate );
/*
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
/WEB-INF/views/home.jsp
*/
// Controller에서 return 값에 쓰여져 있는 것은 forward 경로!
return "home";
}
}
package edu.kh.project.main.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
// @Controller : 현재 클래스가 컨트롤러임을 명시 -> 요청, 응답처리
// + Bean 등록
// IOC 제어의 역전
// -> 프레임워크가 객체를 생성하고 관리
// --> 이때 생성된 객체를 == Bean 라 한다.
@Controller
public class MainController {
// tip: spring 에서 controller 메서드 작성 시
// 반환값을 모르겠다면 일단 String 으로 작성!
// @RequestMapping("/") : 요청 주소가 "/" 인 경우
// 해당 메서드와 연결
@RequestMapping("/")
public String mainForward() {
// <beans:property name="prefix" value="/WEB-INF/views/" />
// <beans:property name="suffix" value=".jsp" />
// Spring 에서 forward 하는 방법!
// -> webapp 폴더 기준으로
// 요청 위임할 JSP 파일 경로를 리턴하면 된다!
// 단, servlet-context.xml에 작성된
// prefix, suffix 부분을 제외하고 작성!
// -> prefix + 리턴값 + suffix 로 경로 완성
// ** View Resolver **
return "common/main";
}
}
<%@ 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>
<!-- fontaswesom 아이콘 사용할 수 있는 스크립트 연결-->
<script src="https://kit.fontawesome.com/f821b57119.js" crossorigin="anonymous"></script>
</head>
<body>
<main>
<%-- header.jsp 추가 --%>
<%--
<jsp:include page="jsp파일경로" />
- jsp 파일 경로는 'webapp 폴더 기준'으로 작성
- JSP 액션 태그(jsp에 기본 내장됨)
- 다른 jsp 파일의 코드를 현재 위치에 추가
--%>
<jsp:include page="/WEB-INF/views/common/header.jsp" />
<section class="content">
<section class="content-1">
<h3>로그인된 회원 정보</h3>
</section>
<!-- 아이디/비밀번호/로그인버튼 영역 -->
<section class="content-2">
<c:choose>
<%-- 로그인이 안되었을때 --%>
<%-- EL empty : 비어있거나 null이면 true --%>
<c:when test="${empty sessionScope.loginMember}">
<form action="/member/login" method="post" name="login-form" id="loginFrm">
<fieldset class="id-pw-area">
<section>
<input type="text" name="inputEmail" placeholder="이메일">
<input type="password" name="inputPw" placeholder="비밀번호">
</section>
<section>
<button>로그인</button>
</section>
</fieldset>
<label>
<input type="checkbox" name="saveId"> 아이디 저장
</label>
<!-- 회원가입/ Id/pw 찾기 영역 -->
<section class="signup-find-area">
<a href="#">회원가입</a>
<span>|</span>
<a href="#">ID/PW 찾기</a>
</section>
</form>
</c:when>
<%-- 로그인이 되었을때 --%>
<c:otherwise>
<article class="login-area">
<a href="#">
<img src="/resources/images/user.png" id="memberProfile">
</a>
<div class="my-info">
<div>
<a href="#" id="nickname">${sessionScope.loginMember.memberNickname}</a>
<a href="/member/logout" id="logoutBtn">로그아웃</a>
</div>
<p></p>
</div>
</article>
</c:otherwise>
</c:choose>
</section>
</section>
</main>
<jsp:include page="/WEB-INF/views/common/footer.jsp" />
</body>
</html>
package edu.kh.project.member.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller // 요청/응답 클래스 + bean 등록(Spring 관리하는 객체)
@RequestMapping("/member") // 공통된 주소 앞부분 작성, member로 시작하는 요청은 해당 컨트롤러에서 처리
public class MemberController {
// 로그인 : /member/login
// 로그아웃 : /member/logout
// /member/login, post 처리방식
// @RequestMapping : 요청 주소에 맞는 클래스/메서드 연결
// @RequestMapping("요청주소") : -> GET / POST 구분 X , 주소만 맞으면 연결하지만 GET요청시 사용
// @RequestMapping(value="/login", method=RequestMethod.GET/POST) -> GET/POST 방식을 구분
@RequestMapping(value="/login", method=RequestMethod.POST)
public String login(HttpServletRequest req) {
// 파라미터 전달 방법 1 : HttpServletRequest를 이용하는 방법
// -> Controller 메서드에 매개변수로 HttpServletRequest를 작성
// 매개변수에 적으면 사용 가능한 이유
// Spring 제공하는 Argument Resolver(매개변수해결사)가 자동으로
// 대입해주고 해결해줌.
String inputEmail = req.getParameter("inputEmail");
String inputPw = req.getParameter("inputPw");
System.out.println("inputEmail : " + inputEmail);
System.out.println("inputPw : " + inputPw);
// ******************* redirect 방법! *******************
// "redirect:요청주소"
return "redirect:/";
}
}
user, pass 입력 시,
package edu.kh.project.member.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
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.bind.annotation.RequestParam;
@Controller // 요청/응답 클래스 + bean 등록(Spring 관리하는 객체)
@RequestMapping("/member") // 공통된 주소 앞부분 작성, member로 시작하는 요청은 해당 컨트롤러에서 처리
public class MemberController {
// 로그인 : /member/login
// 로그아웃 : /member/logout
// /member/login, post 처리방식
// @RequestMapping : 요청 주소에 맞는 클래스/메서드 연결
// @RequestMapping("요청주소") : -> GET / POST 구분 X , 주소만 맞으면 연결하지만 GET요청시 사용
// @RequestMapping(value="/login", method=RequestMethod.GET/POST) -> GET/POST 방식을 구분
// @RequestMapping(value="/login", method=RequestMethod.POST)
public String login(HttpServletRequest req) {
// 파라미터 전달 방법 1 : HttpServletRequest를 이용하는 방법
// -> Controller 메서드에 매개변수로 HttpServletRequest를 작성
// 매개변수에 적으면 사용 가능한 이유
// Spring 제공하는 Argument Resolver(매개변수해결사)가 자동으로
// 대입해주고 해결해줌.
String inputEmail = req.getParameter("inputEmail");
String inputPw = req.getParameter("inputPw");
System.out.println("inputEmail : " + inputEmail);
System.out.println("inputPw : " + inputPw);
// ******************* redirect 방법! *******************
// "redirect:요청주소"
return "redirect:/";
}
// @PostMapping : @RequestMapping 자식으로
// Post 방식 요청을 연결하는 어노테이션
@PostMapping("/login")
public String login(/*@RequestParam("inputEmail")*/ String inputEmail,
/*@RequestParam("inputPw")*/ String inputPw/*,
@RequestParam(value="saveId", required="fasle", defaultValue="1")*/) {
// 파라미터 전달 방법 2 : @RequestParam 어노테이션 이용(+생략방법)
// @RequestParam 어노테이션
// - request 객체를 이용한 파라미터 전달 어노테이션
// - 매개변수 앞에 해당 어노테이션 작성하면, 매개변수에 값이 주입됨.
// ** 파라미터의 name 속성값과
// 매개변수명이 같으면 @RequestParam 생략 가능! **
// @RequestParam(value="name", required="fasle", defaultValue="1")
// [속성]
// value : 전달 받은 input 태그의 name 속성값
// required : 입력된 name 속성값 파라미터 필수 여부 지정(기본값 true)
// -> required = true인 파라미터가 존재하지 않는다면 400 Bad Request 에러 발생
// -> required = true인 파라미터가 null인 경우에도 400 Bad Request
// defaultValue : 파라미터 중 일치하는 name 속성 값이 없을 경우에 대입할 값 지정.
// -> required = false인 경우 사용
System.out.println("inputEmail : " + inputEmail);
System.out.println("inputPw : " + inputPw);
return "redirect:/";
}
}
user, pass 입력 시,
package edu.kh.project.member.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
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.bind.annotation.RequestParam;
import edu.kh.project.member.model.dto.Member;
@Controller // 요청/응답 클래스 + bean 등록(Spring 관리하는 객체)
@RequestMapping("/member") // 공통된 주소 앞부분 작성, member로 시작하는 요청은 해당 컨트롤러에서 처리
public class MemberController {
// 로그인 : /member/login
// 로그아웃 : /member/logout
// /member/login, post 처리방식
// @RequestMapping : 요청 주소에 맞는 클래스/메서드 연결
// @RequestMapping("요청주소") : -> GET / POST 구분 X , 주소만 맞으면 연결하지만 GET요청시 사용
// @RequestMapping(value="/login", method=RequestMethod.GET/POST) -> GET/POST 방식을 구분
// @RequestMapping(value="/login", method=RequestMethod.POST)
public String login(HttpServletRequest req) {
// 파라미터 전달 방법 1 : HttpServletRequest를 이용하는 방법
// -> Controller 메서드에 매개변수로 HttpServletRequest를 작성
// 매개변수에 적으면 사용 가능한 이유
// Spring 제공하는 Argument Resolver(매개변수해결사)가 자동으로
// 대입해주고 해결해줌.
String inputEmail = req.getParameter("inputEmail");
String inputPw = req.getParameter("inputPw");
System.out.println("inputEmail : " + inputEmail);
System.out.println("inputPw : " + inputPw);
// ******************* redirect 방법! *******************
// "redirect:요청주소"
return "redirect:/";
}
// @PostMapping : @RequestMapping 자식으로
// Post 방식 요청을 연결하는 어노테이션
//@PostMapping("/login")
public String login(/*@RequestParam("inputEmail")*/ String inputEmail,
/*@RequestParam("inputPw")*/ String inputPw/*,
@RequestParam(value="saveId", required="fasle", defaultValue="1")*/) {
// 파라미터 전달 방법 2 : @RequestParam 어노테이션 이용(+생략방법)
// @RequestParam 어노테이션
// - request 객체를 이용한 파라미터 전달 어노테이션
// - 매개변수 앞에 해당 어노테이션 작성하면, 매개변수에 값이 주입됨.
// ** 파라미터의 name 속성값과
// 매개변수명이 같으면 @RequestParam 생략 가능! **
// @RequestParam(value="name", required="fasle", defaultValue="1")
// [속성]
// value : 전달 받은 input 태그의 name 속성값
// required : 입력된 name 속성값 파라미터 필수 여부 지정(기본값 true)
// -> required = true인 파라미터가 존재하지 않는다면 400 Bad Request 에러 발생
// -> required = true인 파라미터가 null인 경우에도 400 Bad Request
// defaultValue : 파라미터 중 일치하는 name 속성 값이 없을 경우에 대입할 값 지정.
// -> required = false인 경우 사용
System.out.println("inputEmail : " + inputEmail);
System.out.println("inputPw : " + inputPw);
return "redirect:/";
}
@PostMapping("/login")
public String login(/*@ModelAttribute*/ Member inputMember) {
// 파라미터 전달 방법 3 : @ModelAttribute 이용한 방법
// - DTO(또는 VO)와 같이 사용하는 어노테이션
// - 전달 받은 파라미터의 name 속성 값이
// 같이 사용되는 DTO의 필드명과 같다면
// 자동으로 setter를 호출해서 필드에 값을 세팅
System.out.println(inputMember);
// ** @ModelAttribute 사용 시 주의 사항 **
// - DTO에 기본 생성자가 필수로 존재해야 한다
// - DTO에 setter가 필수로 존재해야 한다
// ** ModelAttribute 어노테이션은 생략이 가능하다 ! **
// ** @ModelAttribute를 이용해 값이 필드에 세팅된 객체를
// 커맨드 객체 라고 부른다.
// Member [ memberEmail = user123, memberPw = pass123.. ]
return "redirect:/";
}
}
package edu.kh.project.member.model.dto;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@NoArgsConstructor
@Getter
@Setter
@ToString
public class Member {
private int memberNo;
private String memberEmail;
private String memberPw;
private String memberNickname;
private String memberTel;
private String memberAddress;
private String profileImage;
private String enrollDate;
private String memberDeleteFlag;
private int authority;
}
user, pass 입력 시,