Dev/Spring

스프링 MVC with @Annotation

surimi🍥 2021. 1. 14. 00:46
반응형

springPrac.zip
9.77MB

★ Setter에 @Autowired 

1. ~ context.xml의 Namespaces 탭에서 context 체크

2. bean의 property설정을 지우고 자바파일의 세터 메소드에 @Autowired 걸기

 

## servlet-context.xml
 
 <bean name="/notice/list" class="com.newlecture.web.controller.notice.ListController" > 
   		<!-- <property name="noticeService" ref="noticeService" /> 세터대신 @Autowired로 연결-->
    </bean>
    
## ListController.java

private NoticeService noticeService;

	@Autowired
	public void setNoticeService(NoticeService noticeService) {
		this.noticeService = noticeService;
	}

3. <context:annotation-config /> 걸기

## servlet-context.xml
 
	<context:annotation-config />

 

# @Autowired를 생성할 클래스에 직접 걸 경우 setter는 생략 가능하다.

	@Autowired
	private NoticeService noticeService;

	/*
	 * public void setNoticeService(NoticeService noticeService) {
	 * this.noticeService = noticeService; }
	 */

 


★ 서비스에 @Component

1. ~ context.xml 에 <context:component-scan ~ 삽입

<context:component-scan base-package="com.newlecture.web.service" />

<!-- bean은 제거
<bean name="noticeService" class="com.newlecture.web.service.jdbc.JDBCNoticeService"> 
	<property name="dataSource" ref="dataSource" /> 
</bean> 
-->

 

# base-package에는 @Component가 걸린 클래스가 들어있는 패키지를 입력한다.

 

2. bean 생성 하려는 클래스에 @Component 걸기

@Component
public class JDBCNoticeService implements NoticeService {

 

 

# <context:component-scan~ 을 걸면 <context:annotation-config />는 생략이 가능하다.

# @Component 대신 @Controller, @Service, @Repository를 달 수 있다. 기능은 같다.

 @Controller
 import org.springframework.stereotype.Controller;
 
 @Service
 import org.springframework.stereotype.Service;
 
 @Repository
 import org.springframework.stereotype.Repository;

 

★ 컨트롤러에 @Component

 

어노테이션을 사용하면 컨트롤러 클래스를 하나하나 만들 필요 없이

한 클래스 안에서 메소드로 각각 구현할 수 있으므로

 

1. 클래스들을 통합 할 Controller를 만들어준다.

 

2. 어노테이션으로 구현된 자바파일과 bean은 지워준다.

 ## servlet-context.xml
 <!-- 어노테이션으로 생성되었으므로 제거
    <bean name="/customer/notice/list" class="com.newlecture.web.controller.notice.ListController" > 
   		<property name="noticeService" ref="noticeService" /> 세터대신 @Autowired로 연결
    </bean>
    
    <bean name="/customer/notice/detail" class="com.newlecture.web.controller.notice.DetailController" />
    -->

 

# 반복되는 RequestMapping 줄이기

IndexController도 고쳐준다

 


 # 에러가 발생하는 경우

viewResolver가 설정이 되어있지 않을때 생기는 오류

&

컨트롤러의 메소드 반환형태가 void

 


# 페이지 이동이 아닌 단순히 페이지에 출력할 데이터를 보내려고 할 때


★ @RestController

@RestController를 달면 하위 메소드에 @ResponseBody를 건 효과가 난다.
즉, 이 클래스에 있는 메소드가 리턴하는 데이터는 view로 가는 url이 아닌,
페이지에서 사용할 데이터들이다.

 

v
결과

* api/notice/list 경로에 따로 파일(.jsp .html 등)은 만들지 않았다.

 

 


@ResponseBody로 String 처리할때 한글처리

## servlet-context.xml

	<mvc:annotation-driven>
		<mvc:message-converters> <!-- @ResponseBody로 String 처리할때 한글처리 -->
			<bean class="org.springframework.http.converter.StringHttpMessageConverter">
				<list>
					<value>text/html;charset=UTF-8</value>
				</list>			
			</bean>
		</mvc:message-converters>	
	</mvc:annotation-driven>

한글 처리


 @RequestParam

@RequestParam("")으로 데이터를 받으면 파라미터로 받아서 사용할 변수명을 편의에 맞게 고쳐서 쓸 수 있다.

 

 

@RequestParam의 기능

클릭하면 docs.spring.io로 이동

@RequestParam(defaultValue="1")

   파라미터로 들어오는 값이 null일경우 1을 대신 집어넣는다.

@RequestParam(required=false)

   파라미터로 들어오는 값이 null이어도 예외를 발생시키지 않고 진행한다.

@RequestParam(name="abc")

@RequestParam(value="abc") 

   파라미터로 받을 변수의 이름을 입력. 둘은 같다.

public String list(@RequestParam(name = "p", defaultValue = "1") int page) throws ClassNotFoundException, SQLException {
		System.out.println("page : " + page);

		return "notice.list";
	}

★ CharacterEncodingFilter

web.xml에 넣으면

문자 데이터 전송시 한글이 깨지지 않게 해준다.

## web.xml

<filter>
	<filter-name>characterEncodingFilter</filter-name>
	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>UTF-8</param-value>
	</init-param>
	<init-param>
		<param-name>forceEncoding</param-name>
		<param-value>true</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>characterEncodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

 

 

 

반응형