728x90

1. ViewResolver 설정

 

뷰 영역 구현

컨트롤러는 최종적으로 결과를 출력할 뷰와 뷰에 전달할 객체를 담고 있는 ModelAndView 객체를 리턴한다.

DispatherServlet은 ViewResolver를 사용하여 결과를 출력할 View 객체를 구하고, 구한 View 객체를 이용하여 내용을 생성한다.

 

JSP를 뷰 기술로 사용할 경우 다음과 같이 InternalResourceViewResolver 구현체를 빈으로 등록해주면 된다.

 

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="WEB-INF/view"/>
<property name="suffix" value=".jsp/>
// 이는 ViewResolver가 "WEB-INF/view/뷰이름.jsp"를 뷰 JSP로 사용한다는 것을 의미한다. 
// 즉, 앞의 예에서 HelloController는 뷰 이름으로 "hello"를 리턴하므로, 
// 실제로 사용되는 뷰 파일은 "WEB-INF/view/hello.jsp"파일이 된다.
</bean>

InternalResourceViewResolver는 컨트롤러가 지정한 뷰 이름으로부터 실제로 사용될 뷰를 선택하는데, 이 때 컨트롤러가 지정한 뷰 이름 앞뒤로 prefix 프로퍼티와 suffix 프로퍼티를 추가한 값이 실제로 사용될 자원의 경로가 된다.



 

2. ViewResolver 구현 클래스

스프링 컨트롤러는 뷰에 의존적이지 않다. 컨트롤러는 아래 코드와 같이 결과를 생성할 뷰의 이름만 지정할 뿐이다.

컨트롤러가 지정한 뷰 이름으로부터 응답 결과 화면을 생성하는 View 객체는 ViewResolver가 구한다.

스프링은 몇 가지 ViewResolver 구현 클래스를 제공하고 있는데, 이중 주료 ViewResolver 구현 클래스는 다음과 같다.

 


3. ContentNegotiatingViewResolver 이해하기

 

ContentNegotiatingViewResolver 는 View 를 찾기위해 요청 URL의 확장자와 AcceptHeader를 사용하는 ViewResolver 입니다.

자체적으로 View 를 찾지는 않으며 viewResolvers 에 설정된 ViewResolver 를 사용하여 View 를 찾습니다.

 

ContentNegotiatingViewResolver의 기본적인 설정방법은 아래와 같습니다.

 

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">

<!-- 확장자와 contentType 을 연결해 준다. -->

<property name="mediaTypes">

<map>

  <entry key="atom" value="application/atom+xml"/>

  <entry key="html" value="text/html"/>

  <entry key="json" value="application/json"/>

</map>

</property>

<property name="viewResolvers">

<list>

  <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>

  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/WEB-INF/jsp/"/>

<property name="suffix" value=".jsp"/>

  </bean>

</list>

</property>

<!-- 위의 viewResolvers 에 의해 view를 얻지 못했을 경우에 사용되는 view -->

<property name="defaultViews">

<list>

  <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />

</list>

</property>

<property name="defaultContentType" value="application/json" />

</bean>

 

mediaType 은 URL 의 확장자와 contentType 을 연결해주는 일종의 맵입니다.

http://localhost/user.html 이 들어왔을 경우에는 URL 의 확장자인 html 에 연결된 text/html (ContentType) 을 처리하는 View 를 찾게되고 

http://localhost/user.json 이 요청되었을 경우에는 위와 마찬가지로 URL의 확장자인 json 과 연결된 application/json (ContentType) 을 처리하는 View 를 찾습니다.

 

viewResolvers ContentNegotiatingViewResolver 가 View 를 찾기위해 사용하는 ViewResolver 들

 

defaultViews 는 viewResolvers 에 의해 view 를 찾지 못했을 경우에 사용되는 view 입니다.

 

 

json 이 MappingJacksonJsonView 와 연결되는 방법

 

org.springframework.web.servlet.View

org.springframework.web.servlet.AbstractView

org.springframework.web.servlet.view.json.MappingJacksonJsonView

 

MappingJacksonJsonView 상속 관계를 보면 최상위에 org.springframework.web.servlet.View 인터페이스가 있습니다.

org.springframework.web.servlet.View 인터페이스 내에는 해당 View 가 처리할 수 있는 ContextType 를 정의해야 하는 getContentType() 메소드가 있는데 여기서 리턴되는 값을 통해서 해당 View 가 처리해야할 ContentType 을 정의하고 있습니다.

 

MappingJacksonJsonView 에서 직접적으로 getContentType() 메소드를 구현하지 않는데 구현은 AbstractView 에 이미 들어가 있습니다.

AbstractView 소스를 들여다보면 setContextType( String contextType), getContextType() 메소드가 존재합니다.

따라서 MappingJacksonJsonView 에서는 

setContentType( "application/json"); 메소드로 해당 View 에서 처리해야할 ContextType을 정의하게 됩니다.

 

 

4. @ResponseBody

@ResponseBodysms @RequestBody와 비슷한 방식으로 동작함

@ResponseBody가 메서드 레벨에 부여되면, 메서드가 리턴하는 객체는 바로 HTTP 응답의 메시지 본문으로 전환됨. (뷰를 통해 결과를 만들어내는 모델로 사용되지 않음)

 

@RequestMapping("/hello")
@ResponseBody
public String hello(){
	return "<html><body>Hello Spring</body></html>";
}

 

만약 메서드에 @ResponseBody가 없다면, 스트링 타입의 리턴값은 뷰이름으로 인식 될것.

하지만 @ResponseBody가 붙었으므로, HttpServletResponse의 출력 스트림에 넣어 버림.

 

 

 


Reference

https://devbox.tistory.com/entry/Spring-ViewResolver-설정

https://ismydream.tistory.com/139

https://m.blog.naver.com/todoskr/220856216311

728x90
728x90

 

1. Controller 여러개 사용하기

 

만약 com.template.board.controller라는 프로젝트 경로에

 

com.template.board.controller.MainController1

com.template.board.controller.MainController2

 

가 있다고 가정할 경우, 둘 다 사용하기 위해서는 다음과 같이 수정해야함

 

 

1) component-scan 부분

 

<context:component-scan base-package="com.template.board.*" />

별표로 표시하면 그 이하 패키지는 모두 스캔됨

스캔 한번만 해주면 되므로 web.xml  서블릿에서 하는 방법으로 일일이 url 을 맵핑해 줄 필요 없음

 

다시 예를 들면
<context:component-scan base-package="com.*" />

로 하면 com 패키지 이하는 모두 스캔이 됨.

 

*****주의할 점은

 <context:component-scan base-package="com.template.board.controller" />

상위 부모가 아니라, 직접 해당 경로를 지정하면 하나 이상 선언이 불가능함.

 

 

2) Controller 클래스 부분에 직접 @RequestMapping 적용

 

@Controller

@RequestMapping(value="/member")

public class MemberController {

}

 

 

 

 

2. 단일 메소드를 여러 이름으로 접근하여 처리할 경우

=> value 값을 배열{}로 주어 처리

@RequestMapping(value = { "/userList", "/userList2" })

 

 

 

 

 

Reference

https://yangyag.tistory.com/211

https://okky.kr/article/393298

728x90
728x90

The archive: bootstrap.jar which is referenced by the classpath, does not exist.

 

 

방법1

 

이클립스 Servers 탭에서 서버를 더블클릭

 

-> 해당 서버의 Overview 창의 General Information에서 Open launch configuration 클릭

 

 

상단 탭 메뉴들 중에 Classpath 선택 -> 하단 설정에 bootstrap.jar의 경로가 올바른지, 혹은

두개를 참조하고 있는지 등을 확인하기 (한개만 있어야 됨)

 

 

방법2

 

혹은

이클립스 상단 메뉴의 Run -> Run Configuration 선택

 

① Classpath 탭에서 잘못된 bootstrap.jar을 선택한다. (경로가 잘못된것이 있을것이다.)

② Remove 버튼으로 잘못된 bootstrap.jar을 삭제한다

③ Apply버튼으로 삭제된 설정을 적용한다

④ Run 이나 Close버튼으로 서버를 실행 혹은 설정을 종료한다.

 

 

 

방법3

 

이렇게 해봤는데도 안되었다. 그래서 결국 서버 정보를 삭제하고 다시 설정. 참고로 이 때, 기존에 설치했던 톰캣 경로를 재설정하여도 인식을 못해서, 아예 톰캣 설치 경로까지 다 삭제하고 다시 다른 경로로 설치해서 연결.

 

 

 

 

Reference


https://www.ihee.com/220
https://sesion.tistory.com/79

 

 

 

728x90
728x90

 

 

- DispatcherServlet: client의 요청을 최초로 받아서 다른 곳들에 넘기도록 처리함. 중요하지만, 실제로 많이 다루지는 않음.

 

- Model, View, Controller 정도를 많이 다룸 (MVC)

- 나머지 부분(HandlerMApping, HandlerAdapter)은 스프링 프레임워크에서 자동으로 다뤄짐

 

 

 

 

 

 

 

src/main/webapp은 web의 root라고 보면 됨.

 

 

 

 

<resources mapping=/resources/**" location="/resources/"/>는

servlet이 해당 경로는 가로채지 않도록 예외시키는 것

 

<resources mapping=/MyResources/**" location="/MyResources/"/>라고 만들면 해당 폴더도 가로채지 않음

 

 

 

12. 컨트롤러(Controller)

 

13. Form 데이터

 

 

728x90

+ Recent posts