본문 바로가기
CLASS/SPRING,JSTL

#1-2 / @ , spring 규칙1

by hingu 2024. 7. 8.

[ @가 어디서 어떻게..쓰이는가.. ]

@ : Class 밖, Class 안, 인자값  가능

 

[@Controller ]

@Autowired => Controller

@ModelAttribute => Controller  에서 DAO(setter 역할) dao와 함께 사용하는 형태의 class 

@RequestParam => required : Controller  (전달값 필수 , 필수 아님 )

@PostMapping , @GetMapping => Controller에서

@Setter, @Getter => DAO, VO(@Getter만)

 

[Spring I/O]

@Multiconfig => server 업로드 => CDN서버(이미지용 서버)로는 전송 불가능

commons-filedupload library 사용 => CDN,localServer 둘다 가능

 

[자료형]

@ResponseBody 

- http 프로토콜 주소를 html에서 로드시 자동 맵핑 역할을 하여 결과값을 return해주는 annotation
  ex ) 이미지, xml, json 등... 에 사용 , ajax랑은 관계없음 (webpage에 걍 그대로 출력하는거)
@RequestBody 

- ajax로 요청시 해당 내용을 맵핑하여 출력시키는 역할

  ex) javascript ajax console로 출력 => this.response

 

=> 이 둘중 하나를 쓴다는건 api 서버를 만들겠다는 것!


 

 

https://dev-eunse.tistory.com/193 여기서 넘어온걸로 do..test.. 혼돈...

⚡ test1

data.jsp
<form action="./mainpage.do" id="frm" method="get">
	검색 : <input type="text" name="search"><br>
	<input type="button" value="전송" onclick="abc()">
</form>
</body>
<script>
	function abc(){
		frm.submit();
	}
</script>


test.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>
Spring view JSP test <br>
검색어 : ${search} <br>
</body>
</html>


mainpage.java

package webspring;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
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.servlet.ModelAndView;

@Controller
public class mainpage {
	//@RequestMapping("/mainpage.do") //get,post
	//@PostMapping("/mainpage.do") //post
	
    @GetMapping("/mainpage.do") //get
	//response 사용시 JSTL을 사용하지못함 - 일반 JSP를 사용해야함(Model 사용하지못함)
	//printWriter 사용시 rewponse 사용하며 해당 script를 활성화시킴
	  //(단, view페이지에서는 제작하지 않음)
	public String main(HttpServletRequest req, Model m) { //Model : Interface
		String search = req.getParameter("search");
		System.out.println(search);
		
		m.addAttribute("search",search);
		return "test"; //파일명만 작성
	}
	
	//가상의 웹페이지2
	@RequestMapping("/mainpage2.do")
	public void main2() {
		
	}
}


❗ Model (interface) 은 response사용시 사용하지 못함!!
spring은 굉장히 규격화 되어있음..
이거 쓸땐 이것만 써야하구 저거 쓸땐 저것만 써야함

 


 

⚡ spring은 규칙이 매우 중요함!

기본적으로 spring은 controller가 있으면 view(.jsp)를 찾음

- login.jsp
<body>
	<form id="frm">
		아이디 : <input type="text" name="mid"><br>
		패스워드 : <input type="text" name="mpass"><br>
		<input type="button" value="전송" onclick="abc()">
	</form>
</body>
<script>
	function abc(){
		frm.method="post";
		frm.action="./mainpage2.do"; //mainpage3,mainpage4 로 바꿔가며 연습
		frm.submit();
	}
</script>

- mainpage.java  - @RequestMapping("/mainpage2.do") 
package webspring;

@Controller
public class mainpage {
	//즉시실행 메소드는 spring Controller에서 사용하지 않음 - 자체가 작동안함
//	HttpServletResponse res;
//	public mainpage() {
//		this.res.setContentType("text/html;charset=utf-8");
//	}
	
	//가상의 웹페이지2
	@RequestMapping("/mainpage2.do")
	public void main2(HttpServletRequest req,HttpServletResponse res) throws Exception{
		//얘 빼고는 다 return

		String mid = req.getParameter("mid");
		String mpass = req.getParameter("mpass");
		res.setContentType("text/html;charset=utf-8");
		 
		PrintWriter pw = res.getWriter();
		
		if(mid.equals("")) {
			System.out.println("test");
		}else {
			pw.write("<script>"
					+ "alert('로그인 완료');"
					+ "location.href='./test.jsp';"
					+ "</script>");
		}
		pw.close();
		
	}
}

👀 spring 규칙
 1.  즉시실행 메소드는 spring Controller에서 사용하지 않음 - 자체가 작동안함 ⭐
 2. HttpServletResponse를 사용할 경우는 script를 무조건 활용 (printWriter 사용)
 3.  void메소드일 경우 기본으로 view(jsp) 발동함 / 해당 jsp를 사용하기 싫다면 printWriter를 사용
   => 다음 페이지 (view페이지) 로 넘어가지 않아도 되는 경우 사용 (단순 alert 후 페이지 이동만 있을 경우)
        ex) 로그인..
 4.  void 메소드 외에 return이 있는 메소드는 언제사용 ?  jsp와 무조건 사용
   => 다음 페이지(view페이지)가 있을 경우 (Script 발동 x , 넘어간 다음 페이지에서 작성)
        ex) 검색 페이지..


- mainpage.java  - @RequestMapping("/mainpage3.do") 
@Controller
public class mainpage {
	
	//가상의 웹페이지3
	ModelAndView mv = new ModelAndView(); //필드에 넣어서 사용 가능
	@RequestMapping("/mainpage3.do")
	public ModelAndView main3(HttpServletRequest req) {
		String mid = req.getParameter("mid");
		String mpass = req.getParameter("mpass");
		
		this.mv.addObject("mid",mid);
		this.mv.addObject("mpass",mpass);
		this.mv.setView(null); //ModelAndview는 이게 필수
		
		return this.mv; 
	}
	
}

 5 . 일반 자료형 메소드와 ModelAndView 자료형 메소드가 return null에서 서로 다른 결과가 발생함

일반 자료형-null일 경우 Mapping 주소와 같은 jsp파일을 찾음
ModelAndView-null일 경우 jsp파일 찾지 않음


- mainpage.java  - @RequestMapping("/mainpage4.do") 

@Controller
public class mainpage {
	
	//가상의 웹페이지4
	ModelAndView mv = new ModelAndView();
	@RequestMapping("/mainpage4.do")
	public ArrayList<Integer> main4(HttpServletRequest req,Model m) {
		String mid = req.getParameter("mid");
		String mpass = req.getParameter("mpass");
		
		ArrayList<Integer> al = new ArrayList<Integer>();
		al.add(25);
		al.add(35);
		al.add(45);
		
		//mv를 쓰고싶으면 자료형이 ModelAndView여야함
//		this.mv.addObject("mid",mid);
//		this.mv.addObject("al",al);
//		this.mv.setView(null);
		
		m.addAttribute("mid",mid);
		m.addAttribute("al",al);
		
		return null;
	}
    
}

 6.
Integer,int(return 0),float,long... 등으로 로 사용시 view 안됨 - 규칙
작동 가능 : void,String,StringBuffer, Stringbuilder, ModelAndView,ArrayList<String>,ArrayList<Integer>..
(배열도 작동 가능..!)

 7.  ModelandView는 자료형이 ModelAndView인 메소드 안에서만 사용할 수 있음


🔽 mainpage4.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<!--
JSP안에 JSTL코드를 쓰는건 절대 불가능!
<%
String mid = ${mid}; 
%>
-->

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>view</title>
</head>
<body>
	${al} <br>
	${mid}
</body>
</html>


 8.  ModelandView 외에 return이 있는 메소드 모두 Model이라는 ui를 이용하여 JSTL 형태로 출력
 9.  JSP형태의 <%%> 문법안에 JSTL ${} 사용하지 못함!

요렇게 출력