*view JSP의 구분
-/WEB-INF/vies 폴더의 하위 폴더를 만들어 서비스 수행
(view를 업무별로 구분하여 작성할 수 있음)
-DD를 수정 (모든 응답 url이 변경됨 - 권장X)
<beans:property name="prefix" value="/WEB-INF/views/경로명/" />
@RequestMapping("/경로명/a.do")
public String method( ) {
return "view명";
}
-return JSP명 앞에 이동경로를 붙임
@RequestMapping("/경로명/a.do")
public String method( ) {
return "경로명/view명"; // 경로명이 prefix 뒤에 붙음 >> /WEB-INF/views/경로명/view명.jsp
}
//views에 하위 폴더를 만들고 jsp를 구분하여 저장할 때
@GetMapping("/sub_folder.do")
public String subFolder() {
return "sub/test";
}//subFolder
*Controller에서 View로 데이터 전송
- HttpServletRequest사용,Model사용, ModelAndView사용
*HttpServletRequest사용 (권장하지 않음)
-요청처리 method의 매개변수로 HttpServletRequest(scope객체)를 선언하고,
setAttribute(“이름”, 값) 를 사용하여 View로 전달
-JSP에서 request(내장객체)의 getAttribute(“이름”)을 사용하여 처리된 결과를 받음
*Model사용
- 데이터와 view페이지명을 분리할 수 있음
- org.springframework.ui.Model interface를 사용
- 요청처리 method에서 매개변수로 선언하면 DispatcherServlet에서 Model의 구현클래스를 arguments 로 입력해줌
사용법)
1. 요청처리 method에서 매개변수로 Model 선언
public String method(Model model){
2. 입력받은 모델 객체에 업무처리 결과를 할당
model.addAttribute(“이름” ,값 );
}
3.JSP에서는 request 내장객체로 전달받음
<% (Casting)request.getAttribute(“이름”); %>
${ requestScope.이름 }
//Model에 값 설정해주면 scope객체에 들어감
@GetMapping("/model_set.do")
public String setModelSession(Model model) {
model.addAttribute("mId", "kim");
model.addAttribute("mName", "xx");
model.addAttribute("mObj", new DataDomain("이oo", "lee@test.com"));
//view resolver를 거치지 않고 바로 간다
return "redirect:index.html";
}//setModelSession
//spring v5.x부터는 Model에 getAttribute 메서드가 추가되어
//세션에 설정된 값을 얻을 때에도 HttpSession을 사용하지 않아도 됨
@GetMapping("/model_get2.do")
public String getModelSession2(Model model) {
String id = (String)model.getAttribute("mId");
String name = (String)model.getAttribute("mName");
DataDomain dd = (DataDomain)model.getAttribute("mObj");
if(dd!=null) {
System.out.println("모델 이용: "+id+"/"+name+"/"+dd.getName()+"/"+dd.getEmail());
}//end if
//view resolver를 거치지 않고 바로 간다
return "session/get_model_value";
}//getModelSession2
//Model에 설정된 session값은 HttpSession으로는 삭제할 수 없음
//Model에 세션에 값을 설정했다면 SessionStatus를 사용하여 세션값 삭제
@GetMapping("/model_remove.do")
public String removeModelSession(SessionStatus ss) {
ss.setComplete();//세션에 존재하는 모든 값이 삭제됨
System.out.println("removeModelSession에서 세션 삭제");
//view resolver를 거치지 않고 바로 간다
return "redirect:index.html";
}//removeModelSession
*ModelAndView 사용
-데이터와 뷰를 묶어서 하나로 관리할 수 있음
-@ExceptionHandler를 사용하여 예외처리할 때는 반드시 사용
-개발자가 요청처리 method안에서 객체를 생성하여 사용함
-요청처리method의 반환형이 ModelAndView 객체가 되어야 함
사용법)
1. 반환형을 ModelAndView 설정
public ModelAndView mehtod() {
2.ModelAndView 생성
ModelAndView mav=new ModelAndView();
3.View명 설정
mav.setViewName(“뷰명”);// 뷰명 => ViewResolver, redierct: forward:
4. 데이터를 설정
mav.addObject(“이름”, 값);
5.ModelAndView 반환
return mav;
}
Controller에서 HttpServletRequest에 값을 넣든,
Model에 값을 넣든,ModelAndView에 값을 넣든
JSP에서는 동일한 코드로 사용할 수 있음
JSP에서 request내장객체로 값을 얻을 수 있음
<% request.getAttribute(“이름”); %>
${ requestScope.이름 }
*redirect
-Controller에서 JSP로 이동할 때 WEB-INF/views 폴더에 존재하는 JSP, webapp에 존재하는 HTML,JSP로 이동할 수 있음
-ViewResolver를 거치지 않고 응답됨 ( prefix와 suffix가 사용되지 않은 이동)
-.do, .jsp, .html의 요청이 가능
사용법) 페이지명을 반환할 때 “redirect:이동할페이지명” 의 형식으로 사용
*.do요청 : DispatcherServlet으로 요청을 보냄
public String method(){
return “redirect:a.do”; //Controller에 .do를 요청
}
//.do를 redirect로 호출
@GetMapping("/redirect_do.do")
public String redirectDo() {
//return "sub_folder.do";
//viewResolver를 통해서 요청하기 때문에
//WEB-INF/views/sub_folder.do.jsp의 형식으로 만들어짐
return "redirect:sub_folder.do";
//viewResolver를 거치지 않고 .do를 직접 호출하도록 만들어야함
}//redirectDo
*.jsp나 .html요청: html또는 jsp로 직접 요청을 보냄
public String method(){
return “redirect:xxx.jsp”; “redirect:xxx.html”; //Controller를 거치지 않고 직접 요청
//.jsp가 존재하는 폴더와 jsp의 확장자를 기술해야 함
}
//jsp를 redirect로 호출
@GetMapping("/redirect_jsp.do")
public String redirectJsp() {
//webapp 폴더 하위 폴더에 존재하는 jsp는 viewResolver를 거치지 않고 호출되어야함
//WEB-INF/views/sub_folder.do.jsp의 형식으로 만들어짐
return "redirect:data_send/main.jsp";
}//redirectDo
@Controller
public class DoChainController {
//chainA가 요청되면 chainB에서 업무처리 후 chainC를 요청함
@GetMapping("/chain_a.do")
public String chainA() {
return "forward:chain_b.do";
}//chainA
//chainB가 요청되면 chainB에서 업무처리 후 chainC를 요청함
@GetMapping("/chain_b.do")
public String chainB() {
return "forward:chain_c.do";
}//chainB
//chainC 작업은 chainB에서 업무처리 후 요청됨
@GetMapping("/chain_c.do")
public String chainC() {
return "view_data/chain_result"; //업무처리 결과를 보여줌
}//chainC
}//class
*include
-중복 디자인이나 코드를 줄일 목적으로 사용
-JSP를 include할 수 있음
<%@include %> //중복코드를 처리할 때
<jsp:include/> //중복디자인을 처리할 때 (URI만 가능)
<c:import /> //중복디자인을 처리할 때 (URI, URL 모두 가능)
*jsp include
-webapp폴더 하위 jsp가 존재하는경우
<jsp:include page=“/경로/jsp명”/> //처리된 데이터를 보여주지 않는 JSP
-WEB-INF/views 폴더 jsp가 존재하는 경우
<jsp:include page=“/WEB-INF/views/jsp명”/> //외부에서 직접 요청을 할 수 없지만 include가능
처리된 데이터를 보여주는 JSP
직접 include하는 것 보다는 do를 include하는 것이 좋음
*do include
-액션태그, JSTL 가능 – 코드의 병합은 안됨 <%@ include %>
<jsp:include file=“요청.do”/>
<c:import url=“요청.do”/>
- include되는 jsp에서는 외부 JSP에 요청된 web parameter를 받을 수 있음
*관계유지
-session, cookie
*session
-접속자 브라우저에 id를 부여하고, 접속자의 정보를 서버측 메모리에 저장하는 기술
-HttpServletRequest, HttpSession, @SessionAttributes를 사용할 수 있음
사용법)
- HttpServletRequest 사용
1. 요청처리 method의 매개변수를 HttpServletRequest로 선언
public String method(HttpServletRequet request){
2. 세션 얻기
HttpSession session=request.getSession();
-HttpSession사용
1.요청처리 method의 매개변수를 HttpSession으로 선언
public String method(HttpSession session){
-세션 값 설정 : session.setAttribute(“이름”,값);
-세션 값 얻기 : session.getAttribute(“이름”);
-세션생존시간 설정: DD설정, session.setMaxInactiveInterval( 초 );
-세션 값 삭제 : session.removeAttribute(“이름”);
-세션무효화 : session.invalidate();
*@SessionAttributes
- class위에 선언
- Model에 같은 이름으로 값을 설정하면 세션에 값이 할당됨
설정 - 사용법)
1.SessionAttributes 선언
@SessionAttributes({“이름”,,,,})
@Controller
public class Test{
2. method에서 Model을 매개변수로 선언
public String method( Model model ){
3. SessionAttributes에 존재하는 이름과 동일한 이름으로 값을 설정
model.addAttribute(“이름”,값); //request scope과 session scope에 값이 들어감
-값 얻기) – Spring 5.2부터는 Model.getAttribute method가 추가되었음
Controller 얻기- HttpSession 사용
public String method( HttpSession session ){
session.getAttribute(“이름”);
JSP얻기
<% session.getAttribute(“이름”) %>
${ sessionScope.이름 }
//@SessionAttributes("mId") //세션에 값 하나만 설정
@SessionAttributes({"mName","mId","mObj"}) //세션에 값 여러개 설정
@Controller
public class SessionController {
//HttpSession을 사용한 값 설정
@GetMapping("/session_set.do")
public String setSession(HttpSession session) {
//jsp에서 바로 쓸 수 있음
session.setAttribute("id", "sang");
session.setAttribute("name", "윤상");
//view resolver를 거치지 않고 바로 간다
return "redirect:index.html";
}//setSession
*세션 삭제
- org.sprginframework.web.bind.support.SessionStatus interface사용
- HttpSession으로는 세션 삭제가 되지 않음
사용법)
1. SessionStatus를 매개변수로 선언
public String method( SessionStatus ss){
2. 세션 모든 값 삭제
ss.setComplete();
//세션에 설정된 값을 Controller에서 얻어보기
@GetMapping("/session_get.do")
public String getSession(HttpSession session) {
String id = (String)session.getAttribute("id");
String name = (String)session.getAttribute("name");
System.out.println(id+" / "+name);
return "session/get_value";
}//getSession
//세션에 설정된 값 Controller에서 삭제
@GetMapping("/session_remove.do")
public String removeSession(HttpSession session) {
session.removeAttribute("id");
session.removeAttribute("name");
//view resolver를 거치지 않고 바로 간다
return "redirect:index.html";
}//removeSession
*Cookie
- 값을 설정하는 코드는 이전의 코드를 그대로 사용
- @CookieValue를 사용하여 값을 손쉽게 얻을 수 있음
사용법)
값 설정)
1. 쿠키를 심기위해 HttpServletResponse를 입력받음
public String method( HttpServletResponse response){
2. 쿠키 생성
Cookie cookie=new Cookie(“이름”, “값”);
3. 생존시간 설정 –설정하지 않으면 브라우저가 열려있는 동안만 유지
cookie.setMaxAge(생존시간);
4. 쿠키 심기
response.addCookie( cookie );
//쿠키 심기 : 기존의 코드를 그대로 사용
@GetMapping("/add_cookie.do")
public String addCookie(HttpServletResponse response) {
//1.쿠키생성
Cookie cookie = new Cookie("name", "황충연");
Cookie cookie2 = new Cookie("age", "26");
//2.생존시간 설정
cookie.setMaxAge(60*60*24*1); //하루동안
cookie2.setMaxAge(60*60*24*1); //하루동안
//3.쿠키심기
response.addCookie(cookie);
response.addCookie(cookie2);
//쿠키 심고 메인으로 가자
return "redirect:index.html";
}//addCookie
//쿠키에 설정된 값 얻기 @CookieValue(value="쿠키이름", defaultValue="쿠키가 없을 때 설정된 값")
@GetMapping("/get_cookie.do")
public String getCookie(
@CookieValue(value="name",defaultValue="윤상") String name,
@CookieValue(value="age",defaultValue="24") String age,
Model model) {
model.addAttribute("name", name);
model.addAttribute("age", age);
System.out.println("쿠키 얻기: "+name+"/"+age);
return "session/get_cookie";
}//getCookie
//쿠키 삭제 : 기존의 코드를 그대로 사용
@GetMapping("/remove_cookie.do")
public String removeCookie(HttpServletResponse response) {
//1.쿠키생성 (값이 없도록)
Cookie cookie = new Cookie("name", "");
Cookie cookie2 = new Cookie("age", "");
//2.생존시간 설정 (즉시 죽을 수 있게)
cookie.setMaxAge(0);
cookie2.setMaxAge(0);
//3.쿠키심기
response.addCookie(cookie);
response.addCookie(cookie2);
//쿠키 심고 메인으로 가자
return "redirect:index.html";
}//removeCookie
*쿠키 값 얻기
-매개변수로 쿠키에 설정된 값을 얻음
@CookieValue(value=“쿠키이름”,defaultValue=“쿠키가 없을 때 설정될 값” )
public String method(@CookieValue()데이터형 변수명, ,, ){ //매개변수로 쿠키 값이 입력됨
*FileUpload
Parameter 전송방식이 아닌 파일 전송방식으로 요청을 처리
=> 요청 처리 method에 매개변수로 VO를 넣는다고 입력값이 들오지 않음!!!
1.매개변수에 HttpServletRequest를 선언
public String method( HttpServletRequest request ){
2. 파일업로드 컴포넌트에 요청처리 객체를 넘겨줌
MultipartRequest mr=new MultipartRequest( request ,,,,, );
3. 파일업로드 컴포넌트를 통해 파라메터를 받음
mr.getFileSystemName(“이름”)
mr.getParameter(“이름”)
mr.getParameterValues(“이름”);
@PostMapping("/upload_frm/upload_process.do")
public String uploadProcess(HttpServletRequest request, Model model) {
String movePage="";
//1.파일 저장 경로 얻기
File saveDir = new File("E:/dev/workspace_spring/spring_mvc/src/main/webapp/upload");
int fileSize = 1024*1024*30; //30MB
try {
MultipartRequest mr = new MultipartRequest(request, saveDir.getAbsolutePath(), fileSize,
"UTF-8",new DefaultFileRenamePolicy());
//model에 할당된 값은 JSP에서 ${requestScope.uploader} 사용됨
model.addAttribute("uploader", mr.getParameter("uploader"));
model.addAttribute("age", mr.getParameter("age"));
model.addAttribute("fileName", mr.getFilesystemName("file"));
model.addAttribute("oriFileName", mr.getOriginalFileName("file"));
movePage="upload/upload_result";
} catch (IOException e) {
movePage="redirect:upload_frm/upload_err.html";
e.printStackTrace();
}//end catch
return movePage;
}
pom.xml선언
<dependencies>노드 하위에 아래 노드를 정의
<dependency>
<groupId>배포사이트에서 제공하는 아이디</groupId>
<artifactId>식별하기 위한 아이디</artifactId>
<version>다운로드 받을 버전</version>
</dependency>