★ 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 줄이기
# 에러가 발생하는 경우
&
# 페이지 이동이 아닌 단순히 페이지에 출력할 데이터를 보내려고 할 때
★ @RestController
@RestController를 달면 하위 메소드에 @ResponseBody를 건 효과가 난다.
즉, 이 클래스에 있는 메소드가 리턴하는 데이터는 view로 가는 url이 아닌,
페이지에서 사용할 데이터들이다.
* 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의 기능
@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>
'Dev > Spring' 카테고리의 다른 글
[ Spring 설정 ] DataSource (DBCP) 설정 (0) | 2021.02.24 |
---|---|
[ Spring ] component-scan / annotation-config / annotation-driven (0) | 2021.02.24 |
스프링 MVC + Maven + Tomcat 프로젝트 생성 (0) | 2021.01.12 |
스프링 MVC 기본구조 정리 (0) | 2021.01.10 |
AOP 기능 사용하기 예제 (1) | 2020.12.28 |