스프링

[22.01.06] 스프링 어노테이션 등록

-JUNHEOK- 2022. 1. 6. 22:02

 

 

 

톰켓이 켜지자 마자 web.xml을 읽어서  DispatcherServlet  객체가 만들어지고 

XML 설정파일에 (servlet-context.xml) 대해 스프링 컨테이너가 구동된다. 

 

	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>


스프링컨테이너에 의해 관리되는 객체들

Servlet-content.xml 에 넣어둔 객체들을 관리한다. 

	<context:annotation-config></context:annotation-config>
	<context:component-scan base-package="com.my.product.dao"></context:component-scan>
	<context:component-scan base-package="com.my.product.service"></context:component-scan>
	<context:component-scan base-package="com.my.product.control"></context:component-scan>

 

해당 페키지에 어노테이션이 붙어있는 것들은 스프링에서 관리를 한다. 

 

 


 

controller

  • 컨트롤러 매개변수: request response session, 요청전달데이터이름, 커먼드 클래스 (javabean클래스)

 

 

@GetMapping("productdetail")  //get 방식
	public ModelAndView detail(HttpServletRequest request) {
		try {
			String prodNo = request.getParameter("prodNo");   //get방식으로 호출하면 /productdetail?prodNo=C0001
			Product p = service.findByNo(prodNo);  //service를 받아옴  
			
			ModelAndView mnv = new ModelAndView();
			mnv.addObject("greeting", "hello" );		//request.setAttribute() 과 같은 효과
			mnv.addObject("p", p); //p라는 상품정보
			mnv.setViewName("prodcutdetailresult.jsp");  //(forword)이동할 view 이름 
			return mnv;
		} catch (FindException e) {
			// TODO Auto-generated catch block
			return null;
		} 
	}

get 방식으로  호출시에는 productdetail?prodNo=C0001 url에 호출

  • request.getParameter("prodNo");  
  • Product p = service.findByNo(prodNo);    //service에서 받아온다.
  • addObject 는 request.setAttribute() 와 같은 효과를 낸다. key와 value를 가지고 있다. 
  • mnv.setViewName("prodcutdetailresult.jsp");      = forword로 이동할 view 이름이다

2. string  매개변수를 선언시 매개변수와 요청전달값의 이름과 일치시키면 값을 가져올 수 있다. 

@GetMapping("productdetail") // get 방식
public ModelAndView detail(String prodNo) { // prodNo에 해당하는 정보
try {
Product p = service.findByNo(prodNo);// service를 받아옴
ModelAndView mnv = new ModelAndView();
mnv.addObject("greeting", "hello"); // request.setAttribute() 과 같은 효과
mnv.addObject("p", p); // p라는 상품정보 최종view에서 getAttribute로 받아서 사용할 수 있음
mnv.setViewName("prodcutdetailresult.jsp");// (forword)이동할 view 이름
return mnv;
} catch (FindException e) {
return null;
}
}


 


  

3. 매개변수이름이 다르게 설정하고자 한다면 앞에 (requestParam name = 변수이름 ) 으로 설정한다.

 

@GetMapping("productadd")  //매개변수이름이 다르게 설정하고자 한다면 앞에 (requestParam name = 변수이름 ) 으로 설정한다.
public ModelAndView add(
	@RequestParam(name = "prodNo") String no, 
	@RequestParam(name = "prodName", required = false) String name, //required  false 필수로 전달하지 않아도됨
	@RequestParam(name = "prodPrice" ,required = false, defaultValue = "0") int Price) {

  	logger.warn(no + ":" + name + ":"  + Price);
	Product p = new Product(no, name, Price);
		return null;​

 

1.  prodNo, prodName, prodPrice 를 나타낸다. 

2. required 기본 값은 true이며 false 설정시 필수로 전달하지 않도록 한다. 

3. 위에 처럼 name, price 를 필수로 전달하지 않도록 한다.

필수전달이 아니다라고 하여도 기본 문자열 요청전달값이기 때문에 null에서  int 타입으로 변환할 수 없다. 
그렇기 때문에 기본값 0으로 만들어서 null값이 아닌  defaultValue = "0"을 만들고 int로 형변환이 가능하도록 한다.

요청전달데이터

http://localhost:8088/orderWEB/productadd?prodNo=1&prodName=2&prodPrice=1500
http://localhost:8088/orderWEB/productadd?prodNo=1&prodPrice=1500   :required = false 설정시
http://localhost:8088/orderWEB/productadd?prodNo=1       :name과 price는   required = false)​

 

 


3. 커멘드클래스  객체화해서 전달

 

@GetMapping("productadd")  //커멘드클래스 : 객체화해서 전달
	public ModelAndView add(Product p) {  //Product 클래스에서 public 으로 Product() 매개변수없는 생성자,
										// get/set메서드가 있어야지만 prodNo,prodName,prodPrice 안에 들어감 - 멤버변수 같아야함
		logger.warn(p);	
		return null;
	}

커멘드클래스는 사용할 때 조건이 있다. (리플렉션)

  • Product vo 클래스를 커멘드 클래스라고 한다. 자바빈의 조건에 만족해야한다. 
  • Product 클래스에서 public 으로 Product() 매개변수없는 생성자가 존재해야한다. 
  • 멤버변수 같아야함
  •  set메서드가 있어야지만 prodNo,prodName,prodPrice 안에 들어감  

 

 

요청전달데이터

http://localhost:8088/orderWEB/productadd?prodNo=1&prodName=2&prodPrice=1500
http://localhost:8088/orderWEB/productadd?prodNo=1&prodPrice=1500

 


4. 자료가 여러개 전달되는 경우 

같은 이름으로 여러 정보가 전달될 때 배열 형태로 전달받는 방식

 

 

	@GetMapping("productChk")
	public ModelAndView chk(@RequestParam(name="c", required = false) String[] cArr) {
		if(cArr != null) {
		for(String c: cArr) {
			logger.warn(c);    
			}  
		}
		return null;
	}

요청전달데이터

http://localhost:8088/orderWEB/productChk?c=coffe&c=tea&c=juice

 

 

5. string 타입으로 model에 담아서 전달시키기 

	////http://localhost:8088/orderWEB/productdetail?prodNo=C0001
 
	@GetMapping("productdetail")  //get 방식
	public String detail(String prodNo, Model model) { //prodNo에 해당하는 정보
		try {
			Product p = service.findByNo(prodNo);  //service를 받아옴  
			model.addAttribute("p",p);
			String viewName = "prodcutdetailresult.jsp";  //(forword)이동할 view 이름 
			return viewName;
		} catch (FindException e) {
			// TODO Auto-generated catch block
			return null;
		} 
	}

요청전달데이터

http://localhost:8088/orderWEB/productdetail?prodNo=C0001

 

 

 

 

jsp 를 붙히지 않아도  viewresolver에서 처리가 가능하다. servlet-context.xml에서 bean을 등록한다.

	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views/" />
		<property name="suffix" value=".jsp"/>
	</bean>