发表于: 2019-11-08 23:43:35

3 1222


啥也不说就是干!!!

今天完成的事情:

1、SpringMVC 概念

MVC 全名 Model View Controller
是模型(model)-视图(view)-控制器(controller)的缩写,是一种用于设计创建 Web 应用程序表现层的模式
MVC 在 Spring中的对应关系:
Model(模型):包括业务模型和数据模型,数据模型用于封装数据,业务模型用于处理业务
View(视图):通常指的就是 jsp 或者 html。作用一般就是展示数据。通常是依据模型数据创建的

Controller(控制器):是应用程序中处理用户交互的部分,一般就是处理程序逻辑的

注意 MVC 设计模式和工程的三层结构不是一个概念,三层结构指的是表现层、业务层、数据持久层,而 MVC 只针对表现层进行设计

SprinvMVC 流程分析

SpringMVC 是基于 MVC 设计模式的,处理用户请求的过程就是通过 MVC 这三个角色的功能实现。

1)用户发送请求至 DispatcherServlet

2)DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器

3) 处理器映射器根据 url 找到具体的处理器,生成处理器对象及处理器拦截器(如果配置了拦截器)一并返回给 DispatcherServlet

4) DispatcherServlet 通过 HandlerAdapter 处理器适配器调用处理器

5)HandlerAdapter 执行处理器(handler,也称为后端控制器)

6)Controller 执行完返回 ModelAndView

7)HandlerAdapter 将 Handler 执行结果 ModelAndView 返回给 DispatcherServlet

8)DispatcherServlet 将 ModelAndView 传递给 ViewResolver 视图解析器

9)ViewResolver 解析后返回具体的 View 对象

10)DispatcherServlet 对 View 进行视图渲染(将模型数据填充至视图中)

11)DispatcherServlet 响应用户

SpringMVC 核心组件

1)DispatcherServlet 前端控制器

整个流程控制的中心,由它调用其他组件处理用户的请求,DispatcherServlet 降低了组件之间的耦合性

2)HandlerMapping 处理器映射器

负责通过 url 找到相应的 Handler 处理器(SpringMVC 提供了不同的映射器实现不同的映射方式)

配置文件方式、实现接口方式、注解方式

3)Handler 处理器

在 DispatcherServlet 的控制下 Handler 对具体的用户请求进行处理

4)HandlerAdapter 处理器适配器

通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行

5)ViewResolver 视图解析器

负责将处理结果生成 View 视图,ViewResolver 首先根据逻辑视图名解析成物理视图名即具体的页面路径,生成 View 对象,对 View 进行渲染后通过页面展示给用户

6)View 视图

SpringMVC 提供了很多的 View 视图类型的支持。包括 jstlView freeMarkerView PDFView 等。最常用的视图就是 jsp


其中 HandlerMapping HandlerAdapter ViewResolver 称为 SpringMVC 的三大组件。需要用户开发的组件有 Handler(Controller)、视图

默认配置文件:spinrg-webmvc-xxx.jar 中有个 DispatcherServlet.properties 文件,该配置中默认加载了一些 SpringMVC 组件,下图为三大组件的默认配置:

2、开发步骤:

1)创建 MavenWeb 工程

添加 Maven 依赖:

<!-- spring ioc组件需要的依赖包 -->
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-beans</artifactId>
   <version>${org.springframework.version}</version>
</dependency>
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-core</artifactId>
   <version>${org.springframework.version}</version>
</dependency>
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>${org.springframework.version}</version>
</dependency>
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-expression</artifactId>
   <version>${org.springframework.version}</version>
</dependency>
<!--添加 Spring 及 Web 依赖 -->
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-web</artifactId>
   <version>${org.springframework.version}</version>
   <scope>compile</scope>
</dependency>
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
   <version>${org.springframework.version}</version>
   <scope>compile</scope>
</dependency>

2)配置前端控制器

<web-app
       version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 <display-name>Archetype Created Web Application</display-name>
 <servlet>
   <servlet-name>springmvc</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   <!-- 设置spring配置文件路径 -->
   <!-- 如果不设置初始化参数,那么DispatcherServlet会读取默认路径下的配置文件 -->
   <!-- 默认配置文件路径:/WEB-INF/springmvc-servlet.xml -->
   <init-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>classpath:springmvc.xml</param-value>
   </init-param>
   <load-on-startup>2</load-on-startup>
 </servlet>
 <servlet-mapping>
   <servlet-name>springmvc</servlet-name>

   <!-- URL-PATTERN的设置 -->
   <!-- 不要配置为/*,否则报错 -->
   <!-- 通俗解释:/*,会拦截整个项目中的资源访问,包含JSP和静态资源的访问,对于静态资源的访问springMVC提供了默认的Handler处理器 -->
   <!-- 但是对于JSP来讲,springmvc没有提供默认的处理器,我们也没有手动编写对于的处理器,此时按照springmvc的处理流程分析得知,它短路了 -->
   <url-pattern>/</url-pattern>
 </servlet-mapping>
</web-app>

3)SpringMvc 配置文件 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:context="http://www.springframework.org/schema/context"
      xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
      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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
      <context:component-scan base-package="com.gerry.jnshu"/>

   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
       <property name="prefix" value="/WEB-INF/views/"/>
       <property name="suffix" value=".jsp"/>
   </bean>
   <mvc:annotation-driven/>

</beans>

这里配置了 ViewResolver,并开启注解扫描

4)处理器编写(Controller)

Controller 实现有多种方式:实现 HttpRequestHandler 接口、实现 Controller 接口、注解方式等。实际开发中使用注解开发的方式。

@Controller
public class StudentController {
@RequestMapping("/hello")
public String hello(Model model) {
       model.addAttribute("msg", "helloworld");
       // 逻辑视图名称
       return "index";
   }

}

@Controller 注解:在类上添加,指定该类为一个请求处理器

@RequestMapping 注解:在方法或者类上添加,指定请求的 url 由该方法处理

Model 可以将数据存放至 Request 域中,返回给页面

这里返回值为 String 直接由配置的 ViewResolver 视图解析器解析为 WEB-INF/views/index.jsp

5)配置 Jetty 展示运行效果

Idea 配置 Jetty 参考:https://blog.csdn.net/weixin_42222334/article/details/80405158

Maven 配置 Jetty 插件:https://blog.csdn.net/u011054333/article/details/50958486

<plugin>
   <groupId>org.eclipse.jetty</groupId>
   <artifactId>jetty-maven-plugin</artifactId>
   <version>${jetty.version}</version>
   <configuration>
       <!--idleTimeout。一次连接的最大空闲时间。-->
       <!--port。jetty服务器的端口号。-->
       <!--host。jetty服务器监听的地址。-->
       <!--scanIntervalSeconds。扫描进行热部署的间隔时间。-->
       <httpConnector>
           <port>8080</port>
           <host>localhost</host>
       </httpConnector>
       <webAppConfig>
           <context-path>/JnshuTask2</context-path>
       </webAppConfig>
       <!--<scanIntervalSeconds>5</scanIntervalSeconds>-->
       <!--<jettyXml>jetty.xml,jetty-ssl.xml,jetty-https.xml</jettyXml>-->
   </configuration>
</plugin>

接下来启动 MavenWeb工程,直接输入 mvn jetty:run -Djetty.port=8080

看到项目以及启动成功:

在浏览器中访问:http://localhost:8080/JnshuTask2/hello,运行结果如下:

明天计划的事情:

1、继续学习 SpringMVC 相关的知识

2、编写 接口文档,用 restful 风格提供接口

遇到的问题:

Jstl 一直在 jsp 取不到值

应该在<web-app> 标签下添加描述符

<web-app
       version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

这样才能在 jsp 中取出值

收获:

学习 SpringMVC 入门,初步了解其原理及流程


返回列表 返回列表
评论

    分享到