Loading presentation...

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in our knowledge base article

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

Make your likes visible on Facebook?

Connect your Facebook account to Prezi and let your likes appear on your timeline.
You can change this under Settings & Account at any time.

No, thanks

SpringMVC

스프링 MVC 이해를 돕기위한 기초적인 자료 Controller 부분
by

성진 이

on 4 June 2011

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of SpringMVC

Client Server Spring MV 서블릿 웹 애플리케이션 컨텍스트 핸들러 매핑 전략 Dispatcher Servlet URL 패턴 지정 방안 *.do
*.action
*.html (사용된 기술을 감추기 위해서) /app/*

/app로 시작하는 URL만 서블릿이 담당
확장자를 사용하지 않고
RESTful 스타일의 URL을 활용할 때 /*

서블릿이 처리하지 않아야 할 것은
별도의 서블릿 매핑을 만들어서 걸러야함 특정 URL 폴더를 기준으로 매핑 모든 요청 처리 확장자로 구분 핸들러 어댑터 컨트롤러 SimpleServlet
HandlerAdapter Servlet HttpRequest
HandlerAdapter HttpRequest
Handler SimpleController
HandlerAdapter Controller AbstractController handleRequest() 는
기반 컨트롤러가 구현.

개별 컨트롤러는
템플릿 메소드 패턴 적용 AnnotationMethod
HandlerAdapter 컨트롤러의 타입이
정해져 있지 않다. BeanNameUrl ControllerBeanName ControllerClassName HandlerMapping SimpleUrl DefaultAnnotation 서블릿 웹 컨텍스트에 등록 <bean name="/s*" class="com.control"/> <bean id="hello" class="com.control"/> <bean class=
"org.ControllerBeanNameHandlerMapping">
<property name="urlPrefix" value="/app/sub/" />
</bean> 전략 빈 등록 컨트롤 매핑 등록 컨트롤 매핑 등록 컨트롤 매핑 등록 <bean class="com.HelloController"/> public class HelloController implements Controller 전략 빈 등록 해야 함 <bean class="SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello">helloController</prop>
<prop key="/sub/*">subController</prop>
</props>
</property>
</bean>

<bean id="helloController" ...>
<bean id="subController" ...> 컨트롤 매핑 등록 @RequestMapping
클래스나 메소드에 직접 부여 사용 간편, 빠르게 쉽게 URL 매핑 컨트롤러의 개수가 많아지면
URL 정보가 xml 빈 선언이나
클래스의 애노테이션 등에 분산
전체적인 매핑구조 파악 및 관리 불편 id 애트리뷰트에 사용할 수 있는 문자의 제한이 있음.
URL의 시작 기호 / 안됨 하지만 이 매핑이 자동으로 빈 id에 /를
붙여주기 때문에 빈의 아이디로도
매핑할 URL을 지정할 수 있음 <bean name="/hello" class="control"/> 디폴트 전략 무시 Controller를 뺀 나머지 이름을 URL에 매핑 /hello 컨트롤 매핑 등록 URL과 컨트롤러의 매핑정보를
한곳에 모아놓을 수 있는 매핑 전략 매핑할 컨트롤러 빈의 이름을 직접 작성
오타 등의 오류 발생 메소드 단위로 URL을 매핑.
컨트롤러의 개수를 획기적으로 줄일 수 있음. 같은 URL Get() Post() 특정 파라미터 Controller Controller Controller 사용 정책과 작성 기준을 잘 정해두지 않으면,
개발자마다 제멋대로 매핑 방식을 적용해서
매핑정보가 지저분해지고 관리하기 힘들어짐 public class ServletControllerTest extends AbstractDispatcherServletTest {
@Test
public void helloServletController() throws ServletException, IOException {
setClasses(SimpleServletHandlerAdapter.class, HelloServlet.class);
initRequest("/hello").addParameter("name", "Spring");
assertThat(runService().getContentAsString(), is("Hello Spring"));
}

@Component("/hello")
static class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
resp.getWriter().print("Hello " + name);
}
}
} web.xml 에 등록 사용하면 되는 서블릿을,
굳이 스프링 MVC 컨트롤러로 사용할 필요가 있나? 기존에 서블릿으로 개발된 코드를 재사용 가능
서블릿 코드를 그대로 유지하면서 스프링의 빈으로 등록
즉, 서블릿 코드를 점진적으로 스프링 애플리케이션에 맞게 포팅할 때 유용 서블릿이 컨트롤러 빈으로 등록된 경우에는
자동으로 init(), destroy()와 같은 생명주기 메소드 호출 않됨. package org.springframework.web;

public interface HttpRequestHandler {
void handleRequest(HttpServletRequest req, HttpServletResponse res);
} 서블릿처럼 동작하는 컨트롤러를 만들기 위해 사용.

HTTP 프로토콜을 기반으로 한 전용 서비스를 만들기 위해 사용. 모델과 뷰 개념이 없는 HTTP 기반의 RMI와 같은 로우레벨 서비스를 개발할때 이용 HTTP Invoker 제공 public interface Controller {
ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res);
} synchronizeOnSession
supportedMethods abstract class SimpleController implements Controller {
private String[] requiredParams;
private String viewName;

public void setRequiredParams(String[] requiredParams) {
this.requiredParams = requiredParams;
}

public void setViewName(String viewName) {
this.viewName = viewName;
}

public abstract void control(Map<String, String> params, Map<String, Object> model) throws Exception;

final public ModelAndView handleRequest(HttpServletRequest req,
HttpServletResponse res) throws Exception {
if (viewName == null) throw new IllegalStateException();

Map<String, String> params = new HashMap<String, String>();
for(String param : requiredParams) {
String value = req.getParameter(param);
if (value == null) throw new IllegalStateException();
params.put(param, value);
}

Map<String, Object> model = new HashMap<String, Object>();

this.control(params, model);

return new ModelAndView(this.viewName, model);
}

} public class HelloController extends SimpleController {

public HelloController() {
this.setRequiredParams(new String[] {"name"});
this.setViewName("/WEB-INF/view/hello.jsp");
}

// 기반 추상클래스에서 정의해준 추상메소드를 개별 컨트롤러에서 구현
public void control(Map<String, String> params, Map<String, Object> model) throws Exception {
model.put("message", "Hello " + params.get("name"));
}
} @Controller
public class HelloController {

@RequestMapping("/hello")
public String hello(@RequestParam("name") String name, ModelMap map) {
map.put("message", "Hello " + name);
return "/WEB-INF/view/hello.jsp";
}
} DefaultAnnotationHandlerMapping 사용 강력한 기능,
코드는 단순,
유연한 형태로 컨트롤러 작성가능 요청 응답 Controller Model View DB Servlet JSP C
Full transcript