Spring MVC 학습 요약 (1) : Spring MVC 소개 및 입문 사례

1. Spring MVC 소개

1. MVC 모드

       우리가 자주 말하는 MVC는 Model, View, Controller의 약어로, 웹 애플리케이션에서 세 가지 책임을 나타냅니다.

  • 모델 : 데이터를 캡슐화하고 매핑합니다. 주로 데이터를 저장하고 사용자 요청의 비즈니스 로직을 처리하는 데 사용됩니다.
  • 보기 : 인터페이스는 작업을 보여줍니다. 주로 컨트롤러에 데이터를 제출하고 모델에 데이터를 표시합니다.
  • 컨트롤러 : 전체 웹 사이트의 점프 로직을 제어합니다. 뷰의 요청에 따라 처리를 위해 요청과 데이터를 전달할 모델과 처리 후 관련 결과를 업데이트하여 표시 할 뷰를 판단합니다.

       Servlet 기반 MVC 패턴의 구체적인 구현은 다음과 같습니다.

  • 모델 : 데이터 (JavaBean 클래스에 의해 생성 된 엔티티 모델)를 저장하고 비즈니스 로직 (일반 Java 클래스에 의해 생성 된 비즈니스 모델)을 처리하는 데 사용되는 하나 이상의 JavaBean 객체.
  • 보기 : 컨트롤러에 데이터를 제출하고 모델에 대한 데이터 표시를 제공하는 하나 이상의 JSP 페이지입니다. JSP 페이지는 주로 HTML 태그와 JavaBean 태그를 사용하여 데이터를 표시합니다.
  • 컨트롤러 : 뷰가 제출 한 요청에 따라 하나 이상의 Servlet 객체가 제어됩니다. 즉, 요청은 비즈니스 로직을 처리하는 JavaBean으로 전달되고 처리 결과는 엔티티 모델 JavaBean에 저장되고 뷰로 출력됩니다. 디스플레이.

       Servlet 기반 MVC 패턴의 프로세스는 다음과 같습니다.

2. Spring MVC 소개

       Spring 프레임 워크는 웹 애플리케이션을 빌드하기위한 모든 기능을 갖춘 MVC 모듈, 즉 Spring MVC를 제공합니다. Spring MVC 프레임 워크는 요청을 전달하기위한 프론트 컨트롤러로 DispatcherServlet을 제공함과 동시에 유연한 구성 핸들러 매핑, 뷰 분석, 언어 환경 및 테마 분석을 제공하고 파일 업로드를 지원합니다. 장점은 다음과 같습니다.

(1) 명확한 역할 구분 : 컨트롤러 (컨트롤러), 유효성 검사기 (검증 자), 명령 객체 (명령 객체), 양식 객체 (폼 객체), 모델 객체 (모델 객체), 서블릿 배포자 (DispatcherServlet), 프로세서 핸들러 매핑, 리졸 러보기 등 각 역할은 특화된 객체에 의해 실현 될 수 있습니다.

(2) 강력하고 직접적인 구성 방법 : 프레임 워크 클래스와 애플리케이션 클래스 모두 JavaBeans로 구성 될 수 있으며, 예를 들어 웹 컨트롤러의 비즈니스 객체 및 유효성 검사기에 대한 참조와 같은 여러 컨텍스트에 대한 참조를 지원합니다.

(3) 적응성 및 비침 입성 : 다양한 애플리케이션 시나리오에 따라 단일 컨트롤러 (예 : Action) 대신 컨트롤러 하위 클래스 (단순 유형, 명령 유형, 유형, 마법사 유형, 다중 작업 유형 또는 사용자 지정)를 선택할 수 있습니다. / ActionForm) 상속.

(4) 재사용 가능한 비즈니스 코드 : 특정 프레임 워크의 기본 클래스를 확장 할 필요없이 기존 비즈니스 개체를 명령 또는 양식 개체로 사용할 수 있습니다.

(5) 사용자 정의 가능한 바인딩 및 유효성 검사 : 예를 들어 유형 불일치는 응용 프로그램 수준 유효성 검사 오류로 간주되어 잘못된 값을 보장 할 수 있습니다. 또 다른 예는 현지화 된 날짜 및 숫자 바인딩 등입니다. 일부 다른 프레임 워크에서는 문자열 양식 개체 만 사용할 수 있으며이를 수동으로 구문 분석하고 비즈니스 개체로 변환해야합니다.

(6) 사용자 정의 가능한 핸들러 매핑 및보기 해상도 : Spring은 가장 단순한 URL 매핑에서 복잡한 전용 맞춤형 전략까지 제공합니다. 개발자가 하나의 특정 기술을 사용하도록하는 일부 웹 MVC 프레임 워크와 비교할 때 Spring은 더 유연합니다.

(7) 유연한 모델 변환 : Springweb 프레임 워크에서 Map 기반 키 / 값 쌍을 사용하여 다양한 뷰 기술과 쉽게 통합 할 수 있습니다.

(8) 사용자 정의 가능한 지역화 및 테마 (테마) 분석 : JSP에서 Spring 태그 라이브러리의 선택적 사용 지원, JSTL 지원, Velocity 지원 (추가 중간 레이어 필요 없음) 등

(9) 간단하고 강력한 JSP 태그 라이브러리 (Spring Tag Library) : 데이터 바인딩, 테마 등 다양한 기능을 지원합니다. 그는 마킹에서 최대한의 유연성을 제공합니다.

(10) JSP 양식 태그 라이브러리 : Spring 2.0에 도입 된 양식 태그 라이브러리를 사용하면 JSP에서 양식을 쉽게 작성할 수 있습니다.

(11) Spring Bean의 수명주기 : 현재 HTTP Request 또는 HTTP Session으로 제한 할 수 있습니다. 정확히 말하면 이것은 Spring MVC 프레임 워크 자체의 기능은 아니지만 Spring MVC에서 사용하는 WebApplicationContext 컨테이너에 속해야합니다.

두, Spring MVC 엔트리 케이스

1. helloWorld 프로그램 시연

(1) maven 프로젝트를 만들고 pom.xml에서 jar 패키지를 가져옵니다.

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>4.2.3.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.2.3.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.2.3.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-expression</artifactId>
      <version>4.2.3.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>4.2.3.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.2.3.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>4.2.3.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.2</version>
    </dependency>
  </dependencies>

(2) web.xml 파일에서 DispatcherServlet을 설정합니다. 구체적인 내용은 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <!--  指定Spring MVC配置文件的位置    -->
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <!--  
      Servlet一般都是在第一次访问时才加载,此配置表明容器在启动时就立即加载Servlet 
      load-on-startup:服务器启动时创建对象,值越小优先级越高,越先创建对象 
    -->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <!--  
        /*和/都是拦截所有请求
        /*:拦截到所有的请求,包括jsp,如果不写,默认值
        /:拦截除*.jsp之外的所有请求
     -->
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

(3) index.jsp에 하이퍼 링크 점프를 추가하고 WEB-INF 아래에 페이지 디렉토리를 만들어 helloPage.jsp를 설정합니다.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>首页</title>
</head>
<body>
<%--SpringMVCStudy_war/--%>
<a href="${pageContext.request.contextPath}/hello">你好</a>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>helloPage</title>
</head>
<body>
<h3>我是helloPage,你好</h3>
</body>
</html>

(4) HelloController 클래스 생성

@Controller
public class HelloController {
    @RequestMapping("/hello")
    public String sayHello(){
        System.out.println("我是控制台输出");
        return "helloPage";
    }
}

(5) resources 디렉토리에 springmvc.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:mvc="http://www.springframework.org/schema/mvc"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       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.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--  配置注解扫描的包  -->
    <context:component-scan base-package="com.yht.example1"></context:component-scan>
    <!--  配置视图解析器 :拼接页面地址 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--    访问路径的前缀    -->
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <!--    文件后缀    -->
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

       설명 : view parser는 Spring MVC의 중요한 부분으로, view parser를 설정하여 위 설정 파일에서 prefix = / WEB-INF / pages /, suffix = .jsp를 정의합니다. index.jsp에서 점프를 클릭하여 제어 계층으로 전송 된 hello 요청을 요청하고 sayHello ()를 통해 대상 페이지의 이름을 반환합니다. 여기서 접두사와 접미사는 맞춤법 작업을 구성하는 데 사용됩니다 (/ WEB-INF / pages). / helloPage .jsp) 및 클라이언트로 돌아갑니다.

 (6) tomcat 서버를 구성하고 프로젝트를 시작합니다.

시작 후 인덱스 인터페이스가 표시되면 하이퍼 링크를 클릭합니다.

2. 문제 요약

(1) springmvc.xml 구성 파일에 대한 설명.

web.xml에서 서블릿을 구성 할 때 springmvc.xml의 경로를 지정하지 않으면 기본적으로 dispatcherServlet-servlet.xml이라는 구성 파일이 WEB-INF 디렉토리에 있습니다. 오류 메시지는 다음과 같습니다.

org.springframework.beans.factory.BeanDefinitionStoreException : ServletContext 자원 [/WEB-INF/dispatcherServlet-servlet.xml]에서 XML 문서를 파싱하는 IOException; 중첩 된 예외는 java.io.FileNotFoundException :
    org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions (XmlBeanDefinitionReader.java:344)에서 ServletContext 리소스 [/WEB-INF/dispatcherServlet-servlet.xml] 열 수 없습니다.

솔루션 1 : init-param에 springmvc.xml의 경로를 지정하십시오.

해결 방법 2 : WEB-INF 디렉토리에 dispatcherServlet-servlet.xml 생성

(2) 구문 분석 오류 : $ % 7BpageContext.request.contextPath % 7D.

pageContext는 아래와 같이 $ % 7BpageContext.request.contextPath % 7D로 구문 분석됩니다.

이유 : archetype-webapp에 의해 생성 된 웹 프로젝트, 생성 된 기본 웹 버전은 2.3으로 너무 낮습니다.

해결 방법 : 버전을 다음과 같이 더 높은 버전으로 변경하십시오. 4.0

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
  
</web-app>

(3) 出现 问题 : DispatcherServlet에서 이름이 'dispatcherServlet'인 URI [/ SpringMVCStudy_war /]가있는 HTTP 요청에 대한 매핑이 없습니다.

이유 : web.xml의 dispatcherServlet 구성이 올바르지 않습니다. / *는 모두 일치하는 것을 의미하기 때문에 모든 수신 경로가 일치 한 다음 처리를 위해 DispatcherServlet으로 전달되고 "/는 DispatcherServlet이 기본 서블릿으로 사용되며 다른 모든 경로 매핑은 전달되기 전에 일치하지 않음을 의미합니다. 처리를 위해.

잘못된 구성 :

    <servlet-mapping>
		<servlet-name>dispatcherServlet</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping>
   <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern></url-pattern>
  </servlet-mapping>

올바른 구성 :

   <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

세, Spring MVC 워크 플로우 이해

1. 공통 구성 요소

(1) DispatcherServlet : 전체 프로세스 제어의 중심 인 프론트 컨트롤러로서 다른 컴포넌트의 실행, 통합 스케줄링, 컴포넌트 간의 결합을 줄이고 각 컴포넌트의 확장 성을 향상시킵니다. 사용자의 요청이 프론트 컨트롤러에 도달하면 dispatcherServlet은 다른 컴포넌트를 호출하여 사용자의 요청을 처리하고 다음 작업을 결정합니다.

(2) ViewResolver : 뷰 해상도를 수행하고 논리적 뷰 이름을 기준으로 실제 뷰로 해결합니다. ViewResolver는 처리 결과에서 View 뷰를 생성하는 역할을합니다. 먼저 논리적 뷰 이름에 따라 물리적 뷰 이름 (즉, 페이지의 특정 주소)을 확인한 다음 View 뷰 객체를 생성하고 마지막으로 View를 렌더링합니다. 페이지를 통해 사용자에게 처리 결과를 표시합니다.

(3) HandlerMapping : HandlerMapping은 사용자의 요청에 따라 Handler 프로세서를 찾는 역할을합니다 .Spring MVC는 구성 파일 모드, 구현 인터페이스 모드, 주석 모드 등 다양한 매핑 방법을 구현하기 위해 다양한 매퍼를 제공합니다.

(4) HandlAdapter : 특정 규칙에 따라 Handler를 실행합니다. 여기에는 어댑터 모드가 구현되어 있으며 어댑터를 확장하여 더 많은 유형의 프로세서를 실행할 수 있습니다.

2. 작업 흐름

Spring MVC의 작동 원리 다이어그램은 다음과 같습니다.

위 그림에서 볼 수 있듯이 Spring MVC 작업의 구체적인 단계는 다음과 같습니다.

(1) 사용자가 프론트 컨트롤러 DispatcherServlet에 요청을 보냅니다. (index.jsp의 하이퍼 링크를 클릭하여 / hello에 대한 요청을 시작하십시오)

(2) DispatcherServlet은 HandlerMapping 프로세서 매퍼 호출 요청을 수신합니다. (web.xml에 구성된 dispatcherServlet)

(3) 프로세서 매퍼는 특정 프로세서 (xml 구성 및 주석에 따라 찾을 수 있음)를 찾고 프로세서 객체와 프로세서 인터셉터 (있는 경우)를 생성하고 DispatcherServlet에 반환합니다.

(4) DispatcherServlet은 HandlerAdapter 프로세서 어댑터를 호출합니다.

(5) HandlerAdapter는 적응을 통해 특정 프로세서 (컨트롤러, 백엔드 컨트롤러라고도 함)를 호출합니다. (HelloController로 이동하여 / hello 요청을 처리 할 수 ​​있는지 확인)

(6) 컨트롤러 실행이 완료되고 ModelAndView로 돌아갑니다. (WEB-INF / pages / helloPage.jsp 반환)

(7) HandlerAdapter는 컨트롤러 실행 결과 ModelAndView를 DispatcherServlet에 반환합니다.

(8) DispatcherServlet은 ModelAndView를 ViewReslover 뷰 리졸버에 전달합니다.

(9) ViewReslover는 구문 분석 후 특정 View로 돌아갑니다.

(10) DispatcherServlet은 뷰에 따라 뷰를 렌더링합니다 (즉, 뷰에 모델 데이터를 채 웁니다).

(11) DispatcherServlet이 사용자에게 응답합니다.

 

추천

출처blog.csdn.net/weixin_47382783/article/details/112946994