사상 최 강 SpringMVC 상세 예시 실전 강좌(그림)

24374 단어 SpringMVC
1.SpringMVC 기반 입문,HelloWorld 프로그램 만 들 기
1.우선 SpringMVC 에 필요 한 jar 가방 을 가 져 옵 니 다.

2.웹.xml 프로필 에 SpringMVC 설정 추가

 <!--configure the setting of springmvcDispatcherServlet and configure the mapping-->
 <servlet>
   <servlet-name>springmvc</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>
    <!-- <load-on-startup>1</load-on-startup> -->
 </servlet>

 <servlet-mapping>
   <servlet-name>springmvc</servlet-name>
   <url-pattern>/</url-pattern>
 </servlet-mapping>
3.src 에 springmvc-servlet.xml 프로필 추가

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">          

  <!-- scan the package and the sub package -->
  <context:component-scan base-package="test.SpringMVC"/>

  <!-- don't handle the static resource -->
  <mvc:default-servlet-handler />

  <!-- if you use annotation you must configure following setting -->
  <mvc:annotation-driven />
  
  <!-- configure the InternalResourceViewResolver -->
  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
      id="internalResourceViewResolver">
    <!--    -->
    <property name="prefix" value="/WEB-INF/jsp/" />
    <!--    -->
    <property name="suffix" value=".jsp" />
  </bean>
</beans>
4.WEB-INF 폴 더 아래 jsp 라 는 폴 더 를 만들어 jsp 보 기 를 저장 합 니 다.hello.jsp 를 만 들 고 body 에'Hello World'를 추가 합 니 다.
5.가방 및 컨트롤 러 를 만 드 는 것 은 다음 과 같다.

6.컨트롤 러 코드 작성

@Controller
@RequestMapping("/mvc")
public class mvcController {

  @RequestMapping("/hello")
  public String hello(){    
    return "hello";
  }
}
7.서버 시작,입력 http://localhost:8080/프로젝트 이름/mvc/hello
2.설정 분석
  1.Dispatcherservlet
Dispatcher Servlet 은 웹.xml 파일 에 설 치 된 사전 컨트롤 러 입 니 다.일치 하 는 요청 을 차단 합 니 다.Servlet 차단 일치 규칙 은 스스로 정의 하고 차단 한 요청 을 해당 규칙 에 따라 목표 Controller 에 나 누 어 처리 하 는 것 이 spring MVC 를 설정 하 는 첫 번 째 단계 입 니 다.
  2.InternalResourceViewResolver
보기 이름 해석 기
3.위 에 나타 난 주해
  @Controller spring 컨 텍스트 에 bean 등록 담당
@RequestMapping 주 해 는 컨트롤 러 로 어떤 URL 요청 을 처리 할 수 있 는 지 지정 합 니 다.
3.SpringMVC 상용 주해
  @Controller
spring 컨 텍스트 에 bean 등록 담당
  @RequestMapping
컨트롤 러 에서 어떤 URL 요청 을 처리 할 수 있 는 지 지정 합 니 다.
  @RequestBody
이 설명 은 Request 가 요청 한 body 부분 데 이 터 를 읽 는 데 사 용 됩 니 다.시스템 기본 설정 의 HttpMessageConverter 를 사용 하여 분석 한 다음 해당 데 이 터 를 되 돌 릴 대상 에 연결 합 니 다. ,HttpMessage Converter 가 되 돌아 오 는 대상 데 이 터 를 controller 의 방법 에 연결 하 는 매개 변수 입 니 다.
  @ResponseBody
이 주 해 는 Controller 의 방법 을 되 돌려 주 는 대상 으로,적절 한 HttpMessageConverter 를 통 해 지 정 된 형식 으로 변환 한 후 Response 대상 의 body 데이터 영역 에 기록 합 니 다.
  @ModelAttribute    
방법 정의 에@ModelAttribute 주 해 를 사용 합 니 다:Spring MVC 는 대상 처리 방법 을 호출 하기 전에 방법 급 에@ModelAttribute 방법 을 표시 합 니 다.
방법의 참 여 를 하기 전에@ModelAttribute 주 해 를 사용 합 니 다.함 축 된 대상 에서 함 축 된 모델 데이터 에서 대상 을 얻 을 수 있 고 요청 매개 변수 C 를 대상 에 연결 한 다음 에 참 여 된 방법 을 모델 에 추가 할 수 있 습 니 다. 
  @RequestParam 
처리 방법 에 참여 할 때@RequestParam 을 사용 하면 요청 매개 변 수 를 요청 방법 에 전달 할 수 있 습 니 다.
  @PathVariable
바 인 딩 URL 자리 차지 문자 입 참
  @ExceptionHandler
방법 에 주석 을 달 면 이상 이 생 겼 을 때 이 방법 을 실행 합 니 다.
  @ControllerAdvice
하나의 Contoller 를 전역 적 인 이상 처리 클래스 로 만 듭 니 다.클래스 에서@ExceptionHandler 방법 으로 설명 하 는 방법 으로 모든 Controller 에서 발생 하 는 이상 을 처리 할 수 있 습 니 다.
4.자동 일치 매개 변수

 //match automatically
 @RequestMapping("/person")
 public String toPerson(String name,double age){
   System.out.println(name+" "+age);
   return "hello";
 }
자동 포장
1.Person 실체 클래스 작성

package test.SpringMVC.model;

public class Person {
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  private String name;
  private int age;
  
}
2.Controller 에서 작성 하 는 방법

 //boxing automatically
 @RequestMapping("/person1")
 public String toPerson(Person p){
   System.out.println(p.getName()+" "+p.getAge());
   return "hello";
 }
6.Date 형식의 인 자 를 InitBinder 로 처리 합 니 다.

 //the parameter was converted in initBinder
 @RequestMapping("/date")
 public String date(Date date){
   System.out.println(date);
   return "hello";
 }
  
 //At the time of initialization,convert the type "String" to type "date"
 @InitBinder
 public void initBinder(ServletRequestDataBinder binder){
   binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),
       true));
 }
7.프론트 데스크 에 매개 변 수 를 전달 합 니 다.

 //pass the parameters to front-end
 @RequestMapping("/show")
 public String showPerson(Map<String,Object> map){
   Person p =new Person();
   map.put("p", p);
   p.setAge(20);
   p.setName("jayjay");
   return "show";
 }
프론트 데스크 톱 은 Request 필드 에서"p"를 찾 을 수 있 습 니 다.
8.Ajax 호출 사용

 //pass the parameters to front-end using ajax
 @RequestMapping("/getPerson")
 public void getPerson(String name,PrintWriter pw){
   pw.write("hello,"+name);    
 }
 @RequestMapping("/name")
 public String sayHello(){
   return "name";
 }
프론트 데스크 톱 은 아래 Jquery 코드 로 호출 합 니 다.

 $(function(){
   $("#btn").click(function(){
    $.post("mvc/getPerson",{name:$("#name").val()},function(data){
       alert(data);
     });
   });
 });
9.Controller 에서 redirect 방식 으로 요청 처리

 //redirect 
 @RequestMapping("/redirect")
 public String redirect(){
   return "redirect:hello";
 }
파일 업로드
1.jar 가방 2 개 가 져 오기

2.SpringMVC 프로필 에 추가

 <!-- upload settings -->
 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
   <property name="maxUploadSize" value="102400000"></property>
 </bean>
3.방법 코드

  @RequestMapping(value="/upload",method=RequestMethod.POST)
  public String upload(HttpServletRequest req) throws Exception{
    MultipartHttpServletRequest mreq = (MultipartHttpServletRequest)req;
    MultipartFile file = mreq.getFile("file");
    String fileName = file.getOriginalFilename();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");    
    FileOutputStream fos = new FileOutputStream(req.getSession().getServletContext().getRealPath("/")+
        "upload/"+sdf.format(new Date())+fileName.substring(fileName.lastIndexOf('.')));
    fos.write(file.getBytes());
    fos.flush();
    fos.close();
    
    return "hello";
  }
4.프론트 폼

  <form action="mvc/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file"><br>
    <input type="submit" value="submit">
  </form>
11.@RequestParam 을 사용 하여 지정 한 매개 변 수 를 설명 합 니 다 name

@Controller
@RequestMapping("/test")
public class mvcController1 {
  @RequestMapping(value="/param")
  public String testRequestParam(@RequestParam(value="id") Integer id,
      @RequestParam(value="name")String name){
    System.out.println(id+" "+name);
    return "/hello";
  }  
}
12.RESTFul 스타일 의 SringMVC
  1.RestController

@Controller
@RequestMapping("/rest")
public class RestController {
  @RequestMapping(value="/user/{id}",method=RequestMethod.GET)
  public String get(@PathVariable("id") Integer id){
    System.out.println("get"+id);
    return "/hello";
  }
  
  @RequestMapping(value="/user/{id}",method=RequestMethod.POST)
  public String post(@PathVariable("id") Integer id){
    System.out.println("post"+id);
    return "/hello";
  }
  
  @RequestMapping(value="/user/{id}",method=RequestMethod.PUT)
  public String put(@PathVariable("id") Integer id){
    System.out.println("put"+id);
    return "/hello";
  }
  
  @RequestMapping(value="/user/{id}",method=RequestMethod.DELETE)
  public String delete(@PathVariable("id") Integer id){
    System.out.println("delete"+id);
    return "/hello";
  }
  
}
2.form 폼 은 put 와 delete 요청 을 보 냅 니 다.
웹.xml 에 설정

 <!-- configure the HiddenHttpMethodFilter,convert the post method to put or delete -->
 <filter>
   <filter-name>HiddenHttpMethodFilter</filter-name>
   <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
 </filter>
 <filter-mapping>
   <filter-name>HiddenHttpMethodFilter</filter-name>
   <url-pattern>/*</url-pattern>
 </filter-mapping>
프론트 데스크 에서 다음 코드 로 요청 할 수 있 습 니 다.

  <form action="rest/user/1" method="post">
    <input type="hidden" name="_method" value="PUT">
    <input type="submit" value="put">
  </form>
  
  <form action="rest/user/1" method="post">
    <input type="submit" value="post">
  </form>
  
  <form action="rest/user/1" method="get">
    <input type="submit" value="get">
  </form>
  
  <form action="rest/user/1" method="post">
    <input type="hidden" name="_method" value="DELETE">
    <input type="submit" value="delete">
  </form>
13.json 형식의 문자열 을 되 돌려 줍 니 다.
1.아래 jar 패키지 가 져 오기

2.방법 코드

@Controller
@RequestMapping("/json")
public class jsonController {
  
  @ResponseBody
  @RequestMapping("/user")
  public User get(){
    User u = new User();
    u.setId(1);
    u.setName("jayjay");
    u.setBirth(new Date());
    return u;
  }
}
14.이상 한 처리
1.부분 이상 처리(컨트롤 러 내)

 @ExceptionHandler
 public ModelAndView exceptionHandler(Exception ex){
   ModelAndView mv = new ModelAndView("error");
   mv.addObject("exception", ex);
   System.out.println("in testExceptionHandler");
   return mv;
 }
  
 @RequestMapping("/error")
 public String error(){
   int i = 5/0;
   return "hello";
 }
2.전역 이상 처리(모든 컨트롤 러)

@ControllerAdvice
public class testControllerAdvice {
  @ExceptionHandler
  public ModelAndView exceptionHandler(Exception ex){
    ModelAndView mv = new ModelAndView("error");
    mv.addObject("exception", ex);
    System.out.println("in testControllerAdvice");
    return mv;
  }
}
3.전역 이상 을 처리 하 는 또 다른 방법
SpringMVC 프로필 에 설정

 <!-- configure SimpleMappingExceptionResolver -->
 <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
   <property name="exceptionMappings">
     <props>
       <prop key="java.lang.ArithmeticException">error</prop>
     </props>
   </property>
 </bean>
오류 페이지
15.사용자 정의 차단기 설정
1.MyInterceptor 클래스 를 만 들 고 Handler Interceptor 인 터 페 이 스 를 실현 합 니 다.

public class MyInterceptor implements HandlerInterceptor {

  @Override
  public void afterCompletion(HttpServletRequest arg0,
      HttpServletResponse arg1, Object arg2, Exception arg3)
      throws Exception {
    System.out.println("afterCompletion");
  }

  @Override
  public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
      Object arg2, ModelAndView arg3) throws Exception {
    System.out.println("postHandle");
  }

  @Override
  public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
      Object arg2) throws Exception {
    System.out.println("preHandle");
    return true;
  }

}
2.SpringMVC 프로필 에 설정

  <!-- interceptor setting -->
  <mvc:interceptors>
    <mvc:interceptor>
      <mvc:mapping path="/mvc/**"/>
      <bean class="test.SpringMVC.Interceptor.MyInterceptor"></bean>gt;
    </mvc:interceptor>    
  </mvc:interceptors>
3.차단기 실행 순서

16.폼 의 검증(Hibernate-vaidate 사용)및 국제 화
1.Hibernate-validate 에 필요 한 jar 패키지 가 져 오기

(선택 되 지 않 았 습 니 다.가 져 오지 않 아 도 됩 니 다)

2.실체 클래스 User 를 작성 하고 인증 주 해 를 추가 합 니 다.

public class User {
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public Date getBirth() {
    return birth;
  }
  public void setBirth(Date birth) {
    this.birth = birth;
  }
  @Override
  public String toString() {
    return "User [id=" + id + ", name=" + name + ", birth=" + birth + "]";
  }  
  private int id;
  @NotEmpty
  private String name;

  @Past
  @DateTimeFormat(pattern="yyyy-MM-dd")
  private Date birth;
}
ps:@Past 는 시간 이 과거 값 이 어야 함 을 표시 합 니 다.
3.jsp 에서 SpringMVC 폼 사용 하기

  <form:form action="form/add" method="post" modelAttribute="user">
    id:<form:input path="id"/><form:errors path="id"/><br>
    name:<form:input path="name"/><form:errors path="name"/><br>
    birth:<form:input path="birth"/><form:errors path="birth"/>
    <input type="submit" value="submit">
  </form:form> 
ps:path 대응 name
4.Controller 코드

@Controller
@RequestMapping("/form")
public class formController {
  @RequestMapping(value="/add",method=RequestMethod.POST)  
  public String add(@Valid User u,BindingResult br){
    if(br.getErrorCount()>0){      
      return "addUser";
    }
    return "showUser";
  }
  
  @RequestMapping(value="/add",method=RequestMethod.GET)
  public String add(Map<String,Object> map){
    map.put("user",new User());
    return "addUser";
  }
}
  ps:
1.jsp 에서 modelAttribute 속성 을 사 용 했 기 때문에 request 필드 에'user'가 있어 야 합 니 다.
2.@Valid 는 실체 에 표 시 된 주해 검증 파 라미 터 를 표시 합 니 다.
3.원래 페이지 로 돌아 가면 오류 메시지 가 나타 나 고 폼 도 나타 납 니 다.
5.오류 정보 사용자 정의
src 디 렉 터 리 에 locale.properties 추가

NotEmpty.user.name=name can't not be empty
Past.user.birth=birth should be a past value
DateTimeFormat.user.birth=the format of input is wrong
typeMismatch.user.birth=the format of input is wrong
typeMismatch.user.id=the format of input is wrong
SpringMVC 프로필 에 설정

  <!-- configure the locale resource -->
  <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="locale"></property>
  </bean>
6.국제 화 디 스 플레이
src 에 locale 추가zh_CN.properties

username=  
password=  
locale.properties 에 추가

username=user name
password=password
locale.jsp 만 들 기

 <body>
  <fmt:message key="username"></fmt:message>
  <fmt:message key="password"></fmt:message>
 </body>
SpringMVC 에 설정

  <!-- make the jsp page can be visited -->
  <mvc:view-controller path="/locale" view-name="locale"/>
WEB-INF 에서 도 locale.jsp 가 직접 방문 할 수 있 도록 합 니 다.
마지막 으로 locale.jsp 를 방문 하여 브 라 우 저 언어 를 바 꾸 고 계 정과 비밀 번 호 를 볼 수 있 는 언어 도 바 뀌 었 습 니 다.
17.압권 인 SpringIOC 와 SpringMVC 통합
1.테스트.SpringMVC.integrate 패 키 지 를 만 들 고 통합 을 보 여 주 며 다양한 패 키 지 를 만 듭 니 다.

2.User 실체 클래스

public class User {
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public Date getBirth() {
    return birth;
  }
  public void setBirth(Date birth) {
    this.birth = birth;
  }
  @Override
  public String toString() {
    return "User [id=" + id + ", name=" + name + ", birth=" + birth + "]";
  }  
  private int id;
  @NotEmpty
  private String name;

  @Past
  @DateTimeFormat(pattern="yyyy-MM-dd")
  private Date birth;
}
3.UserService 클래스

@Component
public class UserService {
  public UserService(){
    System.out.println("UserService Constructor...





"); } public void save(){ System.out.println("save"); } }
  4.UserController

@Controller
@RequestMapping("/integrate")
public class UserController {
  @Autowired
  private UserService userService;
  
  @RequestMapping("/user")
  public String saveUser(@RequestBody @ModelAttribute User u){
    System.out.println(u);
    userService.save();
    return "hello";
  }
}
5.Spring 프로필
src 디 렉 터 리 에 SpringIOC 프로필 만 들 기 applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/util 
    http://www.springframework.org/schema/util/spring-util-4.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    "
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"  
    >
  <context:component-scan base-package="test.SpringMVC.integrate">
    <context:exclude-filter type="annotation" 
      expression="org.springframework.stereotype.Controller"/>
    <context:exclude-filter type="annotation" 
      expression="org.springframework.web.bind.annotation.ControllerAdvice"/>    
  </context:component-scan>
  
</beans>
웹.xml 에 설정 추가

 <!-- configure the springIOC -->
 <listener>
   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
 <context-param> 
  <param-name>contextConfigLocation</param-name> 
  <param-value>classpath:applicationContext.xml</param-value>
 </context-param>
6.SpringMVC 에서 SpringMVC 와 SpringIOC 가 같은 대상 에 대한 관리 가 겹 치지 않도록 설정 합 니 다.

<!-- scan the package and the sub package -->
  <context:component-scan base-package="test.SpringMVC.integrate">
    <context:include-filter type="annotation" 
      expression="org.springframework.stereotype.Controller"/>
    <context:include-filter type="annotation" 
      expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
  </context:component-scan>
18.SpringMVC 상세 운행 절차 도

19.SpringMVC 와 struts 2 의 차이
1.springmvc 는 방법 에 따라 개 발 된 것 이 고 struts 2 는 유형 에 따라 개 발 된 것 이다.springmvc 는 url 과 contrller 의 방법 을 매 핑 합 니 다.맵 에 성공 한 후 springmvc 는 Handler 대상 을 만 들 었 습 니 다.대상 에는 하나의 method 만 포함 되 어 있 습 니 다.방법 집행 종료,형 삼 데이터 소각.springmvc 의 controller 개발 은 웹 서비스 개발 과 유사 합 니 다.
2.springmvc 는 단일 사례 개발 을 할 수 있 고 단일 사례 개발 을 권장 합 니 다.struts 2 는 클래스 의 구성원 변 수 를 통 해 파 라 메 터 를 받 고 단일 사례 를 사용 할 수 없 으 며 여러 사례 만 사용 할 수 있 습 니 다.
3.실제 테스트 를 통 해 struts 2 속도 가 느 린 것 은 struts 라벨 을 사용 하 는 것 입 니 다.struts 를 사용 하면 jstl 을 사용 하 는 것 을 권장 합 니 다.

좋은 웹페이지 즐겨찾기