1. 스프링 MVC Controller 객체 구현
1) model 전달자 3번
* responsecontroller, ex01, result03, result04
package com.simple.controller;
import java.util.Date;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/response")
public class ResponseController {
//@ModelAttribute = request + model
@RequestMapping("/result03")
public String result03(@ModelAttribute("num") String aaa ) {
System.out.println("화면 데이터: " + aaa);
return "response/result03";
}
@RequestMapping("/result04")
public String result04(@ModelAttribute("article") ReqVO vo) {
System.out.println("화면 데이터:" + vo.toString());
return "response/result04";
}
}
<%@ 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>
<a href="result03?num=10">modelAttr 단일값</a>
<form action="result04" method="post">
<input type="text" name="name">
<input type="number" name="age">
<input type="submit" value="modelAttr객체" >
</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>
result03 화면<br/>
넘어온 값: ${num }
</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>
result04 화면<br />
넘어오는 값: ${article.name }과 ${article.age }
</body>
</html>
2) model 전달자 4번
* responseController, redirect_login, home
package com.simple.controller;
import java.util.Date;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.simple.command.ReqVO;
@Controller
@RequestMapping("/response")
public class ResponseController {
//redirect 이동과 redirectAttribute
//스프링에서 redirect는 다시 컨트롤러를 태우는 요청입니다.
//redirectAttribute는 redirect 시에 1회성 데이터를 저장할 수 있습니다.
//화면 요청
@RequestMapping("/redirect_login")
public String loginView() {
return "response/redirect_login";
}
//로그인 요청
@RequestMapping(value = "/login", method=RequestMethod.POST)
public String login(@RequestParam("id") String id,
@RequestParam("pw") String pw,
RedirectAttributes ra ) {
//로그인 성공 → home 화면으로
if(id.equals(pw)) {
ra.addFlashAttribute("msg", "어서와"); //1회성 데이터
return "redirect:/"; //다시 / 컨트롤러를 태워서 보냄 - model을 사용할 순 없음
//로그인 실패
} else {
ra.addFlashAttribute("msg", "틀렸는데요?");
return "redirect:/response/redirect_login"; //"redirect:/절대경로", 다시 로그인 화면으로 이동
}
}
}
<%@ 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>
<h3>redirect 사용해보기</h3>
<form action="login" method="post">
<input type="text" name="id">
<input type="password" name="pw">
<input type="submit" value="확인">
${msg }
</form>
</body>
</html>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>Home</title>
</head>
<body>
<h1>
Hello world!
${msg }
</h1>
</body>
</html>
3) 예제(quiz1~3, quiz1~2_ok, quizController, quiz01VO)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%--
1. QuizController에는 /quiz 폴더 아래의 모든 요청을 처리할 수 있는 컨트롤러를 생성하세요
2. quiz01 화면처리를 할 수 있는 메서드를 생성 (quiz01 맵핑)
3. 다음 생년월일을 받아서 콘솔에 출력하는 메서드를 생성 (sendBirth 맵핑)
조건) Quiz01VO 커맨드객체 사용, 콘솔에 전송된 값을 붙여서 출력합니다 ex)20180615
4. 출력후엔 quiz01_ok 페이지에 "당신의 생일은 ~~~~년 ~~월 ~~일" 을 출력하세요
--%>
<h2>quiz화면(화면 URL요청: /quiz/quiz01)</h2>
<form action="sendBirth" method="post">
생년월일:<br>
<input type="text" name="year" maxlength="4" size="4" placeholder="년(4자)">
<select name="month">
<c:forEach var="i" begin="1" end="12">
<option>${i }</option>
</c:forEach>
</select>
<input type="text" name="day" maxlength="2" size="4" placeholder="일">
<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>
<%--
1.QuizController에 화면처리 메서드 생성
2.폼 처리 메서드 생성
3.입력한 정보를 quiz02_ok.jsp 화면에 출력
4.방법 자유
--%>
<h2>회원가입</h2>
<form action="join" method="post">
아이디:<input type="text" name="id"><br>
비밀번호:<input type="password" name="pw"><br>
이름:<input type="text" name="name"><br>
이메일:<input type="email" name="email"><br>
<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>
<%--
1. quiz03 파일의 화면처리를 할 수 있는 메서드를 생성하세요.
2. 폼태그의 맵핑은 join2 으로 맵핑하세요.
3. 아이디가 적지 않았다면 이라면 quiz03화면으로 이동해서 화면에 "아이디를 입력하세요" 출력
4. 비밀번호와 비밀번호 체크가 다르다면 quiz03화면으로 이동해서 "비밀번호를 확인하세요" 출력
5. 그렇지 않으면 quiz03_ok로 이동해서 "id님 회원가입을 축하합니다" 출력
6. 힌트:문자열 비교는 equals()를 이용, RedirectAttribute 이용
--%>
<form action="join2" method="post">
ID: <input type="text" name="id" size="10"><br>
비밀번호 : <input type="password" name="pw" size="10"><br>
비밀번호 확인: <input type="password" name="pw_check" size="10"><br>
<span>${msg }</span>
<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>
당신의 생일은 ${sendBirth.year }년 ${sendBirth.month }월 ${sendBirth.day }일
</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>
아이디: ${id}
비밀번호: ${pw}
이름: ${name}
이메일: ${email}
</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>
package com.simple.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.simple.command.Quiz01VO;
@Controller
@RequestMapping("/quiz")
public class QuizController {
//quiz01 화면
@RequestMapping("/quiz01") //입력 경로
public void quiz01() {
}
//quiz01 요청
@RequestMapping(value="/sendBirth") //폼 요청
public String sendBirth(@ModelAttribute("sendBirth") Quiz01VO vo) {
System.out.println(vo.toString());
return "quiz/quiz01_ok"; //출력
}
//quiz02 화면
@RequestMapping("/quiz02") //입력 경로
public void quiz02() {
}
//quiz02 요청
@RequestMapping(value="/join", method=RequestMethod.POST)
public String join(@ModelAttribute("id") String id,
@ModelAttribute("pw") String pw,
@ModelAttribute("name") String name,
@ModelAttribute("email") String email) {
return "quiz/quiz02_ok";
}
//quiz03 화면
@RequestMapping("/quiz03") //입력 경로
public void quiz03() {
}
//quiz03 요청
@RequestMapping(value="/join2", method=RequestMethod.POST)
//requestParam
public String join2(@RequestParam("id") String id,
@RequestParam("pw") String pw,
@RequestParam("pw_check") String pw_check,
RedirectAttributes ra,
Model model) {
if(id.equals("")) {
ra.addFlashAttribute("msg", "아이디를 입력하세요.");
//redirect:/~ 붙이면 컨트롤러를 다시 태워서 감
return "redirect:/quiz/quiz03";
}else if(!pw.equals(pw_check)) {
ra.addFlashAttribute("msg", "비밀번호를 확인하세요.");
return "redirect:/quiz/quiz03";
} else {
model.addAttribute("msg", id); //model
return "quiz/quiz03_ok";
}
}
}
package com.simple.command;
public class Quiz01VO {
private String year;
private String month;
private String day;
public Quiz01VO() {
}
//생성자
public Quiz01VO(String year, String month, String day) {
this.year = year;
this.month = month;
this.day = day;
}
//getter, setter
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public String getMonth() {
return month;
}
public void setMonth(String month) {
this.month = month;
}
public String getDay() {
return day;
}
public void setDay(String day) {
this.day = day;
}
//toString
@Override
public String toString() {
return "year" + "month" + "day";
}
}
2.스프링 MVC 웹서비스
1) 웹 어플리케이션 구조
2) 서비스 계층과 DAO 계층
- 마지막 사진에서 방법 2 참고: bean으로 직접 생성하고, 의존객체 자동주입 생성자나 멤버변수를 이용해서 자동 주입 하게 되면 들어감.
3) 예제(scoreRegist, serviceController, scoreVO, ScoreServiceImpl, servelet-context, ScoreService)
<%@ 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>
<form action="regist" method="post">
이름: <input type="text" name="name">
국어 점수: <input type="number" name="kor">
영어 점수: <input type="number" name="eng">
<input type="submit" value="등록">
</form>
</body>
</html>
package com.simple.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.simple.command.ScoreVO;
import com.simple.score.service.ScoreService;
import com.simple.score.service.ScoreServiceImpl;
@Controller
@RequestMapping("/service")
public class ServiceController {
//1st(전역 변수로 선언하면 재활용이 가능함)
// ScoreServiceImpl service = new ScoreServiceImpl();
//2nd: service를 bean으로 생성한다. 의존 객체 자동 주입
@Autowired
//serviceimpl에 이름을 통한 강제 연결
@Qualifier("이름")
private ScoreService service; //인터페이스 타입을 선언(밑에와 달라지는 것은 없음)
// private ScoreServiceImpl service;
//3nd: @Service로 빈을 생성하고 의존객체 자동 주입(이게 제일 편함)
//화면 출력
@RequestMapping("/scoreRegist")
public String registView() {
return "service/scoreRegist";
}
//폼 요청
@RequestMapping(value="/regist", method=RequestMethod.POST)
public String resist(ScoreVO vo) {
// System.out.println(vo.toString());
service.regist(vo);
return null; //?
}
}
package com.simple.command;
public class ScoreVO { //DTO
private String name;
private String kor;
private String eng;
//생성자
public ScoreVO(String name, String kor, String eng) {
this.name = name;
this.kor = kor;
this.eng = eng;
}
//getter, setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getKor() {
return kor;
}
public void setKor(String kor) {
this.kor = kor;
}
public String getEng() {
return eng;
}
public void setEng(String eng) {
this.eng = eng;
}
//toString
@Override
public String toString() {
return "ScoreVO [name=" + name + ", kor=" + kor + ", eng=" + eng + "]";
}
}
package com.simple.score.service;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import com.simple.command.ScoreVO;
//4개는 같은 의미지만 service영역에서는 service를 사용해주자
//@Service //@Repository //@Component //@Controller
@Service("이름") //bean의 이름 명시(붙이기)
public class ScoreServiceImpl {
public void regist(ScoreVO vo) {
System.out.println(vo.toString());
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 어노테이션 기능으로 핸들러 맵핑, 어댑터를 구현함. -->
<annotation-driven />
<!-- 정적 파일 경로 맵핑: css, js -->
<resources mapping="/resources/**" location="/resources/" />
<!-- 뷰 리졸버: 컨트롤러에서 돌아오는 뷰의 경로를 전체 경로로 변경 -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<!-- 해당 패키지 밑에 있는 애들 다 읽어줌 -->
<context:component-scan base-package="com.simple.*"></context:component-scan>
<!-- 패키지를 읽어서 @Controller를 빈으로 생성 -->
<!--
<context:component-scan base-package="com.simple.controller" />
<context:component-scan base-package="com.simple.score.service"/>
-->
<!-- 2nd: service 영역을 빈으로 생성한다. -->
<!-- 밑에 부분 추가하면 ScoreServiceImpl 부분이 s가 생김: 빈으로 만들어짐, 근데 수동으로 만들 필요가 없음. -->
<!--
<beans:bean class="com.simple.score.service.ScoreServiceImpl"/>
-->
</beans:beans>
package com.simple.score.service;
import com.simple.command.ScoreVO;
public interface ScoreService {
//service 구현체에서 사용할 추상 메서드의 모형을 선언합니다.
public void regist(ScoreVO vo);
}
* 최종 정리(ScoreDAO, ScoreDAOImpl, ScoreServiceImpl, scoreResult, scoreList, scoreRegist, serviceController)
- ScoreDAO
package com.simple.score.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
import com.simple.command.ScoreVO;
public interface ScoreDAO {
public void regist(ScoreVO vo);
//1. 인터페이스 ScoreDAO를 만들고, ScoreImpl은 scoreDAO를 implement 받는다.
//2. ScoreDAO에 추상메서드의 생성
//3. ScoreImpl에 @Repository 어노테이션 사용하고 인터페이스 override
//4. ScoreServiceImpl에 @Qualifier("yyy") @Autowired private ScoreDAO scoreDAO; 추가
//5. ScoreServiceImpl에 scoreDAO.regist(vo); 추가
//6. ScoreDAOImpl에 System.out.println("DAO영역:" + vo.toString()); 확인
}
- ScoreDAOImpl
package com.simple.score.dao;
import java.util.ArrayList;
import org.springframework.stereotype.Repository;
import com.simple.command.ScoreVO;
@Repository("yyy")
public class ScoreDAOImpl implements ScoreDAO{
//데이터 베이스
ArrayList<ScoreVO> list = new ArrayList<>();
@Override
public void regist(ScoreVO vo) {
//System.out.println("DAO영역:" + vo.toString());
list.add(vo); //insert 임
System.out.println(list.toString());
}
@Override
public ArrayList<ScoreVO> getList() {
//데이터 조회
return list;
}
@Override
public void delete(int num) {
//삭제 작업
list.remove(num);
}
}
- ScoreServiceImpl
package com.simple.score.service;
import java.util.ArrayList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import com.simple.command.ScoreVO;
import com.simple.score.dao.ScoreDAO;
//4개는 같은 의미지만 service영역에서는 service를 사용해주자
//@Service //@Repository //@Component //@Controller
@Service("이름") //bean의 이름 명시(붙이기)
public class ScoreServiceImpl implements ScoreService{
@Autowired
@Qualifier("yyy")
private ScoreDAO scoreDAO;
public void regist(ScoreVO vo) {
System.out.println(vo.toString());
scoreDAO.regist(vo);
}
@Override
public ArrayList<ScoreVO> getList() {
// ArrayList<ScoreVO> list= scoreDAO.getList();
return scoreDAO.getList();
}
@Override
public void delete(int num) {
scoreDAO.delete(num);
}
}
- scoreResult
<%@ 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>
<h3>등록 되었습니다.</h3>
<a href="scoreList">목록 화면으로</a>
<a href="scoreRegist">다시 등록하기</a>
</body>
</html>
- scoreList
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>목록 화면</h3>
<!--
for(int article: list){
}
-->
<!-- 인덱스 번호 찍으려면 varStatue="num" 선언 해줄 것 -->
<c:forEach var="article" items="${list }" varStatus="num">
${num.index }
${article.name }
${article.kor }
${article.eng }
<!-- 원래 삭제는 포스트 방법으로 해야함 -->
<!-- <a href="delete?키=값">삭제</a> -->
<!-- <a href="delete?num=인덱스 번호를 실어줌">삭제</a> -->
<a href="delete?num=${ num.index }">삭제</a>
<br/>
</c:forEach>
</body>
</html>
- scoreRegist
<%@ 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>
<form action="regist" method="post">
이름: <input type="text" name="name">
국어 점수: <input type="number" name="kor">
영어 점수: <input type="number" name="eng">
<input type="submit" value="등록">
</form>
</body>
</html>
- serviceController
package com.simple.controller;
import java.util.ArrayList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import com.simple.command.ScoreVO;
import com.simple.score.service.ScoreService;
import com.simple.score.service.ScoreServiceImpl;
@Controller
@RequestMapping("/service")
public class ServiceController {
//1st(전역 변수로 선언하면 재활용이 가능함)
// ScoreServiceImpl service = new ScoreServiceImpl();
//2nd: service를 bean으로 생성한다. 의존 객체 자동 주입
@Autowired
//serviceimpl에 이름을 통한 강제 연결
@Qualifier("이름")
private ScoreService service; //인터페이스 타입을 선언(밑에와 달라지는 것은 없음)
// private ScoreServiceImpl service;
//3nd: @Service로 빈을 생성하고 의존객체 자동 주입(이게 제일 편함)
//화면 출력
@RequestMapping("/scoreRegist")
public String registView() {
return "service/scoreRegist";
}
//폼 요청
@RequestMapping(value="/regist", method=RequestMethod.POST)
public String resist(ScoreVO vo) {
// System.out.println(vo.toString());
service.regist(vo);
return "service/scoreResult";
}
//목록 화면
@RequestMapping("/scoreList")
public String scoreList(Model model) {
//data 조회
ArrayList<ScoreVO> list = service.getList();
model.addAttribute("list", list);
// System.out.println(list.toString());
return "service/scoreList";
}
//삭제 요청
@RequestMapping("/delete")
//단일값은 requestParam으로 받기 좋음
public String delete(@RequestParam("num") int num) {
// System.out.println(num);
service.delete(num);
//삭제 후에 목록으로
return "redirect:/service/scoreList";
}
}
3. 스프링 DB 연동: 오라클
- 요새는 postgre, mysql(수업 시간에 사용할 것), mariaDB 사용
- mySQL 검색, 다운로드 탭에서 밑에 내리면 community 버전 다운로드
'TIL > Spring' 카테고리의 다른 글
day78-spring (0) | 2023.02.06 |
---|---|
day77-spring (0) | 2023.02.03 |
day75-spring (1) | 2023.02.01 |
day74-spring (0) | 2023.01.31 |
day73-spring (0) | 2023.01.30 |