톰켓이 켜지자 마자 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>
'스프링' 카테고리의 다른 글
[22.01.05] 스프링 DI 의존성주입, Bean 객체 (0) | 2022.01.05 |
---|---|
[서블릿과 JSP ] 3. URL 패턴 , EL표기 (0) | 2021.12.04 |
[서블릿과 JSP ] 2 . 유효범위와 속성 (0) | 2021.12.01 |
서블릿과 JSP (변환과정, JSP기본객체) (0) | 2021.12.01 |
[스프링] Http 요청과 응답 (HttpServletRequest , HttpServletResponse) (0) | 2021.10.16 |