ch07_SpringDI를 처음 시작했을 때와 같은 방법으로 설정하면 연결이된다.
2024.06.12 - [분류 전체보기] - 쌍용교육 -JSP수업 77일차 - ch07_SpringDI(1)
쌍용교육 -JSP수업 77일차 - ch07_SpringDI(1)
workspace에 압축풀기연결 후 인식 시키기위한 단계
nine-victory.tistory.com
src/main/webapp => index.jsp 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Spring MVC</title>
</head>
<body>
Hello Spring!!
</body>
</html>
WEB-INF/web.xml에서 web-app 빨간줄 없애기
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
이라고 바꿔주면 빨간줄이 사라진다.
스프링 MVC의 주요 구성 요소
구성요소 | 설명 |
DispatcherServlet | 클라이언트의 요청을 전달받는다. 컨트롤러에게 클라이언트의 요청을 전달하고, 컨트롤러가 리턴한 결과값을 View에 전달하여 알맞은 응답을 생성하도록 한다. |
HandlerMapping | 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할지를 결정한다. |
컨트롤러(Controller) | 클라이언트의 요청을 처리한 뒤, 그 결과를 DispatcherServlet에 알려준다. 스트럿츠의 Action과 동일한 역할을 수행한다. |
ModelAndView | 컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보를 담는다. |
ViewResolver | 컨트롤러의 처리 결과를 생성할 뷰를 결정한다. |
뷰(View) | 컨트롤러의 처리 결과 화면을 생성한다. JSP나 Velocity 템플릿 파일 등을 뷰로 사용한다. |
kr.spring.ch01.controller => HelloController
package kr.spring.ch01.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller //이걸 쓰지않으면 모델클레스로 인식하지 않고 일반클래스로 인식하기때문에 동작을 위해서라면 이 어노테이션을 필수로 사용해야됨.
public class HelloController {
//요청URL과 실행 메서드 연결
@RequestMapping("/hello.do")//hello.do는 요청 URL
public ModelAndView hello() { //hello()는 실행 메서드
ModelAndView mav = new ModelAndView();
//뷰 이름 지정
//WEB-INF/views/hello.jsp
mav.setViewName("hello"); //hello.jsp라고 쓰면 안되고 hello라고만 명시해야됨. servlet-context.xml에 있는 viewResolver 설정에 명시해뒀기 때문에
//뷰에서 사용할 데이터 셋팅
mav.addObject("greeting","안녕하세요!");
return mav;
}
}
servlet-context.xml
<?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"
xmlns:p="http://www.springframework.org/schema/p"
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">
<!-- @Controller 어노테이션을 이용한 컨트롤러를 사용하기 위한 설정 -->
<annotation-driven/>
<!-- DispatcherServlet의 매핑 경로를 '/'로 주었을 때, JSP/HTML/CSS 등을 올바르게 처리하기 위한 설정 -->
<!-- <mvc:default-servlet-handler/> -->
<!--============================== viewResolver 설정============================= -->
<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>
<!-- MVC 기본 설정 -->
<beans:bean id="helloController" class="kr.spring.ch01.controller.HelloController"/>
</beans:beans>
WEB-INF => views => hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>인사</title>
</head>
<body>
인사말 : <strong>${greeting}</strong>
</body>
</html>
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Spring MVC</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/hello.do">HelloController</a>
</body>
</html>
kr.spring.ch02.controller => SearchController
package kr.spring.ch02.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class SearchController {
//요청 URL과 실행 메서드 연결
@RequestMapping("/search/internal.do")
public ModelAndView searchInternal() {
ModelAndView mav = new ModelAndView();
//뷰 이름 지정
mav.setViewName("search/internal");
return mav;
}
}
servlet-context.xml 추가
<beans:bean id="searchController" class="kr.spring.ch02.controller.SearchController"/>
views => search => internal.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>내부 검색</title>
</head>
<body>
내부 검색
</body>
</html>
index.jsp에 내용을 넣고 실행
<a href="${pageContext.request.contextPath}/search/internal.do">SearchController</a><br>
get방식으로 데이터 넘기기
index.jsp
<a href="${pageContext.request.contextPath}/search/internal.do?query=sea">SearchController</a><br>
SearchController 수정
package kr.spring.ch02.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class SearchController {
//요청 URL과 실행 메서드 연결
@RequestMapping("/search/internal.do")
public ModelAndView searchInternal(@RequestParam String query) {
System.out.println("query = "+query);
/*
ModelAndView mav = new ModelAndView();
//뷰 이름 지정
mav.setViewName("search/internal");
*/
//위에 주석을 return값에 명시하여 코드 줄이기
//뷰 이름 지정
return new ModelAndView("search/internal");
}
}
실행시 자바 console 창의 결과값
query = sea
sea 대신 한글과 같은 다른값을 사용해도, web.xml에 utf-8을 이미 사용하도록 세팅해뒀기 때문에 결과값이 문제없이 나온다.
package kr.spring.ch02.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class SearchController {
/*
* @RequestParam 어노테이션은 HTTP 요청 파라미터를 메서드의
* 파라미터로 전달
* [형식]
* 1.@RequestParam(요청파라미터네임) 메서드의 인자(파라미터)
* 2.요청파라미터명과 호출메서드의 인자명이 같으면 요청파라미터명 생략 가능
* @RequestParam 메서드의 인자명
* 요청파라미터를 필수적으로 사용하지 않으면 오류 밸생
* 아래와 같이 required는 false로 지장하면 요청파라미터가 없어도 오류가 발생하지 않음
* @RequestParam(value="query",required=false)
*/
//요청 URL과 실행 메서드 연결
@RequestMapping("/search/internal.do") //"query"는 파라미터네임. 생략가능
public ModelAndView searchInternal(@RequestParam (required=false)String query) {
System.out.println("query = "+query);
/*
ModelAndView mav = new ModelAndView();
//뷰 이름 지정
mav.setViewName("search/internal");
*/
//위에 주석을 return값에 명시하여 코드 줄이기
//뷰 이름 지정
return new ModelAndView("search/internal");
}
}
query = 서울
package kr.spring.ch02.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class SearchController {
/*
* @RequestParam 어노테이션은 HTTP 요청 파라미터를 메서드의
* 파라미터로 전달
* [형식]
* 1.@RequestParam(요청파라미터네임) 메서드의 인자(파라미터)
* 2.요청파라미터명과 호출메서드의 인자명이 같으면 요청파라미터명 생략 가능
* @RequestParam 메서드의 인자명
* 요청파라미터를 필수적으로 사용하지 않으면 오류 밸생
* 아래와 같이 required는 false로 지장하면 요청파라미터가 없어도 오류가 발생하지 않음
* @RequestParam(value="query",required=false)
* @RequestParam(required=false)
* 3.@RequestParam 생략가능
* 요청파라미터명과 호출메서드의 인자명을 동일하게 표기
*/
//요청 URL과 실행 메서드 연결
@RequestMapping("/search/internal.do") //"query"는 파라미터네임. 생략가능
public ModelAndView searchInternal(String query) {
System.out.println("query = "+query);
/*
ModelAndView mav = new ModelAndView();
//뷰 이름 지정
mav.setViewName("search/internal");
*/
//위에 주석을 return값에 명시하여 코드 줄이기
//뷰 이름 지정
return new ModelAndView("search/internal");
}
}
<a href="${pageContext.request.contextPath}/search/internal.do?query=부산">SearchController</a><br>
query = 부산
<a href="${pageContext.request.contextPath}/search/internal.do">SearchController</a><br>
query = null
SearchController 내용추가
@RequestMapping("/search/external.do")
public ModelAndView searchExternal(
@RequestParam String query,
@RequestParam("p") int pageNumber) {
System.out.println("query = " + query);
System.out.println("p = "+ pageNumber);
//뷰 이름
return new ModelAndView("search/external");
}
search/external.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>외부검색</title>
</head>
<body>
외부검색
</body>
</html>
index.jsp
<a href="${pageContext.request.contextPath}/search/external.do?query=제주&p=10">SearchController-external.do</a><br>
query = 제주
p = 10
SearchController 내용수정
@RequestMapping("/search/external.do")
public ModelAndView searchExternal(String query,int pageNumber) {
System.out.println("query = " + query);
System.out.println("p = "+ pageNumber);
//뷰 이름
return new ModelAndView("search/external");
}
index.jsp
<a href="${pageContext.request.contextPath}/search/external.do?query=제주&pageNumber=10">SearchController-external.do</a><br>
query = 제주
p = 10
query = 제주
p = 10
int값을 유지한 상태로 index.jsp의 값을 뺴면 에러가난다.
<a href="${pageContext.request.contextPath}/search/external.do?query=제주">SearchController-external.do</a><br>
에러를 없애는 방법.
@RequestMapping("/search/external.do")
public ModelAndView searchExternal(String query, @RequestParam(value="p",defaultValue="1")int pageNumber) {
System.out.println("query = " + query);
System.out.println("p = "+ pageNumber);
//뷰 이름
return new ModelAndView("search/external");
}
이 방법 또는 pageNumber값을 int가 아닌 Integer로 바꾸면 에러가 나질않는다.
(전달을 하지 않았기 때문에 기본값 1이 들어감)
query = 제주
p = 1
kr.spring.ch03.controller => NewArticleController
package kr.spring.ch03.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class NewArticleController {
@RequestMapping("/article/newArticle.do")
public String form() {
//뷰 이름 지정
return "article/newArticleForm";
}
}
servlet-context.xml 추가
<!-- @Autowired 사용을 위해서 -->
<context:annotation-config />
<!-- 전송된 데이터 자바빈(VO)에 담기 -->
<beans:bean id="newArticleController" class="kr.spring.ch03.controller.NewArticleController "/>
views =>article => newArticleForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시글 쓰기</title>
</head>
<body>
게시글 쓰기 입력 폼
<form action="newArticle.do" method="post">
제목 : <input type="text" name="title"><br>
작성자 : <input type="text" name="name"><br>
내용 : <textarea rows="5" cols="30" name="content"></textarea>
<input type="submit" value="전송">
</form>
</body>
</html>
index.jsp 추가
<a href="${pageContext.request.contextPath}/article/newArticle.do">newArticleController</a><br>
kr.spring.ch03.vo => NewArticleVO
package kr.spring.ch03.vo;
public class NewArticleVO {
private String title;
private String name;
private String content;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "NewArticleVO [title=" + title + ", name=" + name + ", content=" + content + "]";
}
}
NewArticleController 내용추가
//POST 요청이 들어올 때 호출
@PostMapping("/article/newArticle.do")
public String submit(
@RequestParam String title,
@RequestParam String name,
@RequestParam String content) {
NewArticleVO vo = new NewArticleVO();
vo.setTitle(title);
vo.setContent(content);
vo.setName(name);
System.out.println(vo);
return "article/newArticleSumitted";
}
article => newArticleSumitted.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시글 쓰기 완료</title>
</head>
<body>
게시글이 등록되었습니다.
</body>
</html>
kr.spring.ch03.service => NewArticleService
package kr.spring.ch03.service;
import kr.spring.ch03.vo.NewArticleVO;
public class NewArticleService {
public void writeArticle(NewArticleVO vo) {
System.out.println("신규 게시글 등록 : "+vo);
}
}
NewArticleController 내용추가
package kr.spring.ch03.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.RequestParam;
import kr.spring.ch03.service.NewArticleService;
import kr.spring.ch03.vo.NewArticleVO;
@Controller
public class NewArticleController {
@Autowired //이렇게 넣으면 setter를 만들어서 넣어주지 않아도 된다.
private NewArticleService newArticleService;
//GET 요청이 들어올 때 호출
.
.
.
(생략)
vo.setName(name);
newArticleService.writeArticle(vo);
return "article/newArticleSumitted";
}
}
servlet-context.xml 추가
<beans:bean id="newArticleService" class="kr.spring.ch03.service.NewArticleService"/>
신규 게시글 등록 : NewArticleVO [title=봄이와요, name=홍길동, content=하하 호호]
NewArticleController 내용변경
/*
* @ModelAttribute 어노테이션을 이용해서 전송된 데이터를 자바빈에 담기
* [기능]
* 1.자바빈(VO) 생성
* 2.전송된 데이터를 자바빈에 저장
* 3.View에서 사용할 수 있도록 request에 자바빈(VO)를 저장
*/
//POST 요청이 들어올 때 호출
@PostMapping("/article/newArticle.do")
//command라는 속성명으로 자바빈을 저장
public String submit(@ModelAttribute("command") NewArticleVO vo) {
newArticleService.writeArticle(vo);
return "article/newArticleSumitted";
}
이렇게해도 위에서 했던 결과와 같은 결과가 나온다
newArticleSumitted.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시글 쓰기 완료</title>
</head>
<body>
게시글이 등록되었습니다.
<br>
제목 : ${command.title}<br>
작성자 : ${command.name}<br>
내용 : ${command.content}
</body>
</html>
index.jsp 실행 후 값을 입력하고난 뒤 결과
신규 게시글 등록 : NewArticleVO [title=여름이와요, name=작성자, content=크크크]
다른방법
/*
* @ModelAttribute 어노테이션을 이용해서 전송된 데이터를 자바빈에 담기
* [기능]
* 1.자바빈(VO) 생성
* 2.전송된 데이터를 자바빈에 저장
* 3.View에서 사용할 수 있도록 request에 자바빈(VO)를 저장
* [형식]
* 1. @ModelAttribute(속성명) NewArticleVO vo
* 지정한 속성명으로 JSP에서 request에 접근해서 자바빈(VO) 호출가능.
* 예) $(속성명.title}
* 2. @ModelAttribute를 명시할 때 속성명을 생략할 수 있음.
* 속성명을 생략하면 클래스명의 첫 글자를 소문자로 속성명을 자동 생성
* 예) ModelAttribute NewArticleVO vo
* ${newArticleVO.title}
*/
//POST 요청이 들어올 때 호출
@PostMapping("/article/newArticle.do")
public String submit(@ModelAttribute NewArticleVO vo) {
newArticleService.writeArticle(vo);
return "article/newArticleSumitted";
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시글 쓰기 완료</title>
</head>
<body>
게시글이 등록되었습니다.
<br>
제목 : ${newArticleVO.title}<br>
작성자 : ${newArticleVO.name}<br>
내용 : ${newArticleVO.content}
</body>
</html>
결과는 이전과 똑같이 나온다.
또 다른 방법
*/
3. @ModelAttribute 생략
* 호출 메서드에 인자명만 명시
* 예)NewArticleVO vo와 같이 인자명만 명시.
* request에 저장되는 속성명은 newArticleVO로 저장됨
*/
//POST 요청이 들어올 때 호출
@PostMapping("/article/newArticle.do")
public String submit( NewArticleVO vo) {
newArticleService.writeArticle(vo);
return "article/newArticleSumitted";
}
결과는 이전과 똑같이 나온다.
kr.spring.ch04.controller => CookieController
package kr.spring.ch04.controller;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class CookieController {
@RequestMapping("/cookie/make.do")
public String make(HttpServletResponse response) {
//쿠키를 생성해서 클라이언트에 전송
response.addCookie(new Cookie("auth","10"));
return "cookie/make";
}
}
servlet-context.xml 추가
<!-- @CookieValue 어노테이션을 이용한 쿠키 매핑 -->
<beans:bean id="cookieController" class="kr.spring.ch04.controller.CookieController"/>
views=>cookie=>make.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>쿠키</title>
</head>
<body>
쿠키를 생성함
</body>
</html>
index.jsp 내용추가
<a href="${pageContext.request.contextPath}/cookie/make.do">CookieController - make.do</a><br>
CookieController 내용추가
@RequestMapping("/cookie/view.do")
public String view(@CookieValue("auth") String auth) {
System.out.println("auth 쿠키:"+auth);
return "cookie/view";
}
views=>cookie=>view.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>쿠키확인</title>
</head>
<body>
쿠키확인
</body>
</html>
index.jsp 내용추가
<a href="${pageContext.request.contextPath}/cookie/view.do">CookieController - view.do</a><br>
auth 쿠키:10
어노테이션이 잘 작동해서 나온것을 알 수 있다.
@RequestMapping("/cookie/view.do")
public String view(@CookieValue String auth) {
System.out.println("auth 쿠키:"+auth);
return "cookie/view";
}
@RequestMapping("/cookie/view.do")
public String view(String auth) {
System.out.println("auth 쿠키:"+auth);
return "cookie/view";
}
나머지 두 방법도 같은 결과로 나오는 것을 볼 수 있다. 그러나 맨처음 방법을 사용하고자함.
/*
* @CookieValue 어노테이션을 이용하면 쿠키 값을 파라미터로 전달받을 수 있음
* 해당 쿠키가 존재하지 않으면 기본적으로 400에러를 발생시킴.
* @CookieValue(value="auth",required=false)로 지정했을 경우
* 해당 쿠키가 존재하지 않으면,null 값으로 전달
* @CookieValue(value="auth",defaultValue="0")로 지정했을 경우
* 쿠키가 존재하지 않으면, defaultValue에 지정한 값 사용
*/
@RequestMapping("/cookie/view.do")
public String view(@CookieValue(value="auth",defaultValue="0") String auth) {
System.out.println("auth 쿠키:"+auth);
return "cookie/view";
}
make를 클릭하지않고 바로 view를 들어가면 기본값 0 으로 나옴
auth 쿠키:0
'쌍용교육(JAVA) > Spring' 카테고리의 다른 글
쌍용교육 -JSP수업 81일차 - ch08_SpringMVC(3) (0) | 2024.06.19 |
---|---|
쌍용교육 -JSP수업 80일차 - ch08_SpringMVC(2) (0) | 2024.06.18 |
쌍용교육 -JSP수업 79일차 - ch07_SpringDI(4) (0) | 2024.06.17 |
쌍용교육 -JSP수업 78일차 - ch07_SpringDI(3) (0) | 2024.06.14 |
쌍용교육 -JSP수업 77일차 - ch07_SpringDI(2) (0) | 2024.06.13 |