@RequestParam
▶ @RequestParam (required = true) // 필수입력이지만 값 입력x 시 400대(Client) Error
▶ @RequestParam (required = false, defaultValue="url에 값이 없을때 대입시킬 기본값")
//defaultValue 주지 않으면 500대(Server) Error
[EX]
public String main(HttpServletRequest request){ } |
public String main2(@RequestParam(name="year", required=false) == public String main2(String year) { } |
public String main3(@RequestParam(name="year", required=true) String year) == public String main3(@RequestParam String year) { } |
|
public String main5(@RequestParam(required=false, defaultValue="1") String year) { } |
[RequestMapping 대신 Get/PostMapping사용]
ex) 경로- "/mapping/examp" (메소드로 구분)
▶@RequestMapping((공통경로)"/mapping") + GetMapping("/examp") / PostMapping("/examp")
- @GetMapping
== @RequestMapping(value="경로", method=RequestMethod.GET)
== <servlet-context.xml>파일에 <view-contorller path="경로" view-name="jsp파일명"/>추가 (GET만 허용)
- @PostMapping("경로")
== @RequestMapping(value="경로", method=RequestMethod.POST)
@ModelAttribute
: 적용대상을 Model의 속성으로 자동 추가해주는 애너테이션, 반환타입 or 컨트롤러 메서드의 매개변수에 적용가능
> 호출, 저장이 따로 필요 없음
[EX]
@Controller
public class 클래스{
public String main(@ModelAttribute("myDate") MyDate date, Model m) {
== public String main(@ModelAttribute MyDate date, Model m) {
== public String main(MyDate date, Model m) { //참조형(MyDate date)은 @ModelAttribute 생략가능
// 1. 유효성 검사
if (!isValid(date)) return "yoilError";
// 2. 처리
char yoil = getYoil(date);
// 3. Model에 작업한 결과를 저장할 필요 없음 View로 자동 전달됨.
// 4. 작업 결과를 보여줄 뷰의 이름을 반환
return "yoil";
}
}
> 컨트롤러 매개변수가 기본형,string일때 : @RequestParam생략된 것
> 컨트롤러 매개변수가 참조형일때 : @ModelAttribute 생략된 것
redirect
[in JSP]
300번대(응답헤더)응답시 자동으로 헤더의 location으로 재요청(GET) / 요청과 응답이 2번
[in Spring]
DispatcherServlet에 요청> Controller의 메소드 호출 > Controller가 리턴값(redirect:경로) 전달 > DispatcherServlet가 RedirectView에 전달 > 응답
forward
[in JSP]
잘못된 경로로 혹은 일부만 처리할 수 있는 파일(1jsp)에 요청시 가능한 처리하고 다른 파일(2jsp)로 요청전달
> 응답 > 1jsp가 2jsp에 request를 Model(request객체)에 담아서 전달 / 1jsp = Controller역할, 2jsp = View역할 (MVC패턴)
[in Spring]
DispatcherServlet에 요청> Controller의 메소드 호출 > Controller가 리턴값(forward:경로")을 DispatcherServlet에게 반환 > DispatcherServlet가 InternalResourceViewResolver에게 받은 문자열 전달 > 해석 후 다시 서블릿에 반환 > JstlV iew에 경로를 전달 > Jsp파일에 Model을 전달 > Jsp파일이 응답
Cookie
: 이름과 값의 쌍으로 구성된 정보로 아스키 문자만 가능
: 서버에서 생성/ 브라우저에 저장/ 유효기간 이후 자동삭제
: 서버에 요청시 domain, path(하위경로포함)일치시 전송(응답헤더: Set-Cookie: id=id값; Max-Age=86400)
* 생성
Cookie cookie = new Cookie("id","id값"); //쿠키생성
cookie.setMaxAge("60*60*24"); //유효기간설정[sec] (=24시간)
response.addCookie(cookie); //응답에 쿠키 추가
개발자 도구에서 생성 > [Application] [Cookies] 탭에서 name, value값 입력
쿠키 존재시 login form에 자동으로 아이디 기억 체크박스 체크하기 > ${empty cookie.id.value ? " " : "checked"}
* 삭제 ( =유효기간이 0)
Cookie cookie = new Cookie("id",""); //동일한 이름 쿠키생성
cookie.setMaxAge(0); //유효기간설정[sec] (=0 =삭제)
response.addCookie(cookie); //응답에 쿠키 추가
* 읽기
Cookie[] cookie = request.getCookies(); //read, 존재x시 null
for(Cookie cookie:cookies){
String name = cookie.getName(); // id
String value = cookie.getValue(); // id값
System.out.println(name, value);
}
Session
: 서로 관련된 독립된 요청들을 쿠키를 이용하여 하나로 묶은 것으로 쿠키가 브라우저에 저장되므로, 브라우저마다 개별 저장소(Session)를 서버에서 제공 > 쿠키는 브라우저에, 세션은 서버에 저장
Spring DI(Dependency Injection)
** DI 의존성주입 : 사용할 객체를 외부에서 주입(라이브러리의 매개로) 받는것
[in Java] Beans : 재사용 가능한 컴포넌트, 상태(iv),. 게터&세터, no-args constructor
[in Servlet & JSP] Bean : (mvc의)Model, EL, Scope, JSP container가 bean을 관리
[in Spring] Bean
: 복잡한 EJB의 규칙을 심플하게 만듬 (POJO), Spring container가 관리하는 객체 - 단순, 독립적
<.xml> bean 정의됨
→ spring container에서 읽어드리고 클래스/객체관리, bean저장/관리(생성, 소멸, 연결(AutoWired))
IoC(Inversion of Conrol, 제어의 역전)
: 제어(if, for)의 flow흐름을 전통적인 방식과 다르게 뒤바꾸는 것
: 변하지 않는 코드만 라이브러리안에, 잘 변하는 코드는 사용자 코드에 작성 (= DI 의존성주입)
ex)
전통적인 방식 사용자가 라이브러리 코드를 호출 |
IoC 라이브러리에서 사용자 코드를 호출 |
[사용자] Car car = new Car(); car.turboDrive(); [라이브러리] void turboDrive(){ engine = new turboEngine(); engine.start(); } |
[사용자] Car car = new Car(); car.drive(new turboEngine()); // 수동연결 [라이브러리] void turboDrive(){ engine.start(); } |
> 변경에 유리한 코드
** 다형성
전 | 후 |
class SpotsCar { } class Truck { } SpotsCar car = new SpotsCar(); Truck car = new Truck(); |
class Car{} class SpotsCar extends Car{} class Truck extends Car{} Car car = new SpotsCar(); Car car = new Truck(); |
팩토리메서드
Car car = getCar();
static Car getCar() { return new SpotsCar() || new Truck();}
Map과 외부파일 (파일.txt의 내용만 변경하면 됨)
public static void main(String args[]){
// 리턴 받은 객체 해당 클래스로 형 변형
Car car = (Car)getObj("key값");
// 호출부분만 변경하면 용이
클래스 객체참조변수 = (클래스)getObj("key값");
}
static Obj getObj() {
//Properties:(String,String) == Map:(String,obj)
Properties p = new Properties();
// 파일.txt > key = 패키지명.class명
p.load(new FileReader("파일.txt");
Class clazz = Class.forName(p.getProperty(key));
// 객체 생성후 반환
return clazz.newInstance();
}
컨테이너사용
자동객체 등록하기 (위 코드에서 getbean 추가)
@Autowired 객체 자동연결
guava 다운로드 - https://mvnrepository.com/artifact/com.google.guava/guava/31.1-jre
[pom.xml]
<dependencies>
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency> //추가해줌
...
</dependencies>
이후 우클> maven > reload
: 인스턴스변수iv, setter, 참조형 매개변수를 가진 생성자, 메서드에 적용
: 생성자(construtor)는 @Autowired 생략가능
: 타입(value로 instance of) 검색해서 연결
: 검색된 bean이 여러개 > 참조변수와 이름이 일치하는 것 주입
@Component // == Component ("turboengine == bean의 id ")
class TurboEngine extends Engine{}
-------
@Component ("engine") //engine == bean의 id
class SuperEngine extends Engine{}
> DI대상이 변수일때
@Autowired Engine engine; //1개가 아니면 예외발생
// SuperEngine과 이름 일치 > 주입
> DI대상이 배열일때
@Autowired Engine[] engines;//bean이 0~n개여도 예외발생 x
// SuperEngine과TurboEngine 모두 주입
@Resource (name=" bean의 id")
: 이름(key값=name)으로 bean 검색하여 참조변수에 연결(자동주입 DI)
: 일치하는 이름(name)의 bean 없으면 예외 발생
: name생략가능> 참조변수 이름이 bean의 name이 됨
ex)
class Car {
@Resource(name="engine") Engine engine; }
**setter로 객체의 값 set시
class Car {
String color;
int oil;
Engine engine;
Door[] doors;
..//getter, setter
}
public static void main(String[] args) {
Car car1 = (Car) ac.getBean("car");
Engine engine = (Engine) ac.getBean("engine");
Door door = (Door) ac.getBean("door");
car1.setColor("red");
car1.setOil(100);
car1.setDoors(new Door[]{ (Door) ac.getBean("door"), (Door)ac.getBean("door")});
car1.setEngine(engine);
}
setter 사용 대신
[config.xml]의 bean으로 작성
<bean id="car" class="com.fastcampus.ch3.Car">
<property name="color" value="red"/>
<property name="oil" value="100"/>
<property name="engine" ref="engine"/>
<property name="doors">
<array value-type="com.fastcampus.ch3.Door">
<ref bean="door" />
<ref bean="door" />
</array>
</property>
</bean>
<bean id="engine" class="com.fastcampus.ch3.Engine"/>
<bean id="door" class="com.fastcampus.ch3.Door" scope="prototype"/>
[내일배움카드] [국비지원교육]
'Java&SpringBoot' 카테고리의 다른 글
6주차) 패스트캠퍼스 Java & Springboot 로 시작하는 웹 프로그래밍 (0) | 2023.02.25 |
---|---|
5주차) 패스트캠퍼스 Java & Springboot 로 시작하는 웹 프로그래밍 (0) | 2023.02.21 |
내가 보려고 쓰는 IntelliJ 활용(단축키, Tip) (1) | 2023.02.18 |
sts 스프링 설치 오류 (0) | 2023.02.18 |
4주차) 패스트캠퍼스 Java & Springboot 로 시작하는 웹 프로그래밍 (0) | 2023.02.15 |