springMVC学习

第三章:SpringMVC

第1节:基本概念

1.1 三层架构和MVC
		我们的开发架构一般都是基于两种形式,一种是 C/S 架构,也就是客户端/服务器,另一种是 B/S 架构,也就是浏览器服务器。在 JavaEE 开发中,几乎全都是基于 Browser/S 架构的开发。那么在 B/S 架构中,系统标准的三层架构
包括:表现层(web)、业务层(service)、持久层(dao)。三层架构在我们的实际开发中使用的非常多,所以我们课程中的案例也都是基于三层架构设计的。
      
三层架构中,每一层各司其职,接下来我们就说说每层都负责哪些方面:
(1)表现层(表示层,web):也就是我们常说的web层。它负责接收客户端请求,向客户端响应结果,通常客户端使用http协议请求web 层,web 需要接收 http 请求,完成 http 响应。
表现层包括展示层和控制层:控制层负责接收请求,展示层负责结果的展示。	
(2)业务层:也就是我们常说的 service 层。它负责业务逻辑处理,和我们开发项目的需求息息相关。	
(3)持久层(Dao data access  object):也就是我们是常说的 dao 层。负责数据持久化,和数据库做交互。
1.2 SpringMVC概述
1.2.1 介绍
		SpringMVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把ModelViewController分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。

百科介绍:
		Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用SpringSpring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用)Struts 2(一般老项目使用)等等。

总结: 
		springmvc 是应用web层的 基于MVC设计模式的轻量级的web框架。 对Servlet封装,支持restful风格。
官网: 
	https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#spring-web
springMVC位于三层架构中的表现层,作用是接收请求响应数据,响应的数据通过视图、模板展示给用: 
数据访问层:  Mybatis DButils JdbcTemplate Jdbc | Mybatis-plus | mapper Hibernate JPA  
业务层:    spring框架: IOC提供对象, 声明式事务~ 
表现层:    springMVC Servlet | Struts2(很少)  Struts1 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YBAYK9Fy-1667308343086)(.\images\图片4.png)]

1.2.2 优势
1)清晰的角色划分。
(2)分工明确,而且扩展点相当灵活,可以很容易扩展,虽然几乎不需要。 
(3)POJO 就可以充当控制器,屏蔽了繁琐的servlet的API
(4)和 Spring 其他框架无缝集成,是其它 Web 框架所不具备的。 
(5)可适配,通过 HandlerAdapter 可以支持任意的类作为处理器。 
(6)可定制性,HandlerMappingViewResolver 等能够非常简单的定制。 
(7)功能强大的数据验证、格式化、绑定机制。 
		………………还有比如RESTful风格的支持、简单的文件上传、约定大于配置的契约式编程支持、基于注解的零配
置支持等等。

约定优于配置, 配置优于编码~ 

第2节:使用

2.1 入门案例
2.1.1 需求分析
构建页面index.jsp发起请求,在服务器端处理请求,控制台打印处理请求成功,跳转success.jsp成功页面;
2.1.2 添加依赖
注意:  maven war   工程打包方式war。 
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.5.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.5.RELEASE</version>
</dependency>

总结: springmvc: webmvc web
2.1.3 配置web.xml
<servlet>
    <servlet-name>springmvc01</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc01</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
2.1.4 配置springmvc.xml
 	<!--扫描注解包-->
    <context:component-scan base-package="com.offcn.controller"></context:component-scan>
    
	<!--处理器映射器:根据请求路径匹配映射路径找到对应的执行器-->
   <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>

    <!--处理器适配器:根据处理器映射器返回的执行器对象,去执行执行器对象-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>

    <!--视图解析器:解析视图-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
2.1.5 构建页面发起请求
<a href="/hello/test1">hello</a>
2.1.6 编写控制器并使用注解配置
@Controller //必须开启注解扫描
@RequestMapping("hello")
public class HelloController {
   
    @RequestMapping("test1")
    public String test1(){
   
        System.out.println("正在处理请求");
        return "success";
    }
}
2.1.7 启动服务器测试
pom.xml文件中服务器插件配置:
 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <!--指定编码格式-->
                    <uriEncoding>utf-8</uriEncoding>
                    <!--指定项目启动后的访问路径-->
                    <path>/</path>
                    <!--指定访问端口号-->
                    <port>8888</port>
                </configuration>
            </plugin>
        </plugins>
    </build>
2.2 执行过程及原理分析
		浏览器发送请求,被DispatcherServlet捕获,DispatcherServlet没有直接处理请求,而是将请求交给HandlerMapping处理器映射器,处理器映射器根据请求路径去controller控制层中匹配对应的执行器,并将匹配结果返回给DispatcherServlet,由DispacherServlet调用HandlerAdapter处理器适配器来执行控制层执行器方法;
执行器方法执行后的返回结果,由DispatcherServlet交给视图解析器ViewResolver来处理,找到对应的结果视图,渲染视图,并将结果响应给浏览器。

http://localhost:8080/xxx/servlet
(1)客户端浏览器发出请求, 到达DispatcherServlet前端控制器。 springmvc 框架提供的。  
(2)DispatcherServlet 将请求交给了 处理器映射器,进行路径映射。映射结果交给前端控制器。 
(3)请求到达处理器适配器,可以进行数据类型的转换等操作,最后达到Handler。【后端处理器,自定义的 Servlet(4)后端处理器处理完毕之后, 将结果经过处理器适配器最终交给 前端控制器。 
(5)经过视图解析器: 数据解析到 view 对象当中。  交给了前端控制器
(6)前端控制器将view对象 交给模板引擎,进行试图渲染。 最终生成静态页面,响应给用户。 

以下组件: 
一个中心是三个基本点: 不需要自己开发,springmvc提供的
一个中心: DispatcherServlet 
三个基本点: 处理器映射器  处理器适配器  试图解析器
Handler后端处理器:程序员自己开发~ 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FoG48u5i-1667308343087)(.\images\图片6.png)]

第3节:常用组件介绍

3.1 DispatcherServlet
		用户请求到达前端控制器,它就相当于 mvc 模式中的 controller,dispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性。 
		DispatcherServlet本质上就是servlet web.xml当中。 该组件是springMVC 提供的, 无所编写,只需配制。
3.2 HandlerMapping
		HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC提供了不同的映射器实现不同的映射方式: 
该组件: springMVC提供的。 无需编写
3.3 Handler
它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由Handler 对具体的用户请求进行处理。 
等价于之前编写的Servlet。后端逻辑处理 【程序员编写】
3.4 HandlAdapter
通过 HandlerAdapter 对处理器进行执行, 适配器主要进行数据类型类转换等操作~  
该组件: 无需编写, 只需配置~ 
3.5 View Resolver
		View Resolver 负责将处理结果(ModelAndView)生成 View 对象,将view对象返回给前端控制器。 
注意: 组件springmvc提供的, 如果不使用,可以不用配置。  
      如果要使用,自行配置试图解析器~ 

3.6 View:视图渲染
SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jsp、freemarkerView、pdfView,FreeMark ,thymeleaf 等。我们最常用的视图就是 jsp。之后的学习, 我们会学习静态模板技术~  
view对象的数据渲染到页面上。 

总结: 
springmvc 基于组件开发: 
DispatcherServlet: 一个中心
三个基本点:
    处理器映射器: 
    处理器适配器: 
    试图解析器: 
    
后端处理器: 类似与servlet, 程序员自定义。 
3.7 特殊标签说明
		在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。使用 <mvc:annotation-driven> 自动加载 RequestMappingHandlerMapping(处理映射器)和RequestMappingHandlerAdapter ( 处 理 适 配 器 ),可 用 在 SpringMVC.xml 配 置 文 件 中 使 用<mvc:annotation-driven>替代处理映射器和适配器的配置(一般开发中都需要该标签)。注意:我们只需要编写处理具体业务的控制器以及视图。
    
<mvc:annotation-driven> 
标签相当于以下配置:
<!-- HandlerMapping处理器映射器 --> 
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerM
apping"></bean> 
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
    
<!-- HandlerAdapter处理器适配器 --> 
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerA
dapter"></bean> 
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
    
<!-- HadnlerExceptionResolvers异常处理器 --> 
<bean class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExcept
ionResolver"></bean> 
<bean class="org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolv
er"></bean> 
<bean class="org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver"
></bean>

第4节:请求参数绑定【重点】

4.1 绑定说明
4.1.1 绑定的机制
我们都知道,表单中请求参数都是基于 key=value 的。SpringMVC绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。

获得前端页面提交的参数:
request.getParameter("username");
String [] values = request.getParameterValues("hobby");
request.getParameterMap(); => Map集合
4.1.2 支持的数据类型
简单类型参数:包括基本类型和 String 类型
POJO 类型参数:包括实体类,以及关联的实体类
数组和集合类型参数:包括 List 结构和 Map 结构的集合(包括数组)
4.1.3 使用要求
如果是基本类型或者 String 类型:要求我们的参数名称必须和控制器中方法的形参名称保持一致。(严格区分大小写)
如果是 POJO 类型,或者它的关联对象:要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。
如果是集合类型,有两种方式:
(1)第一种:要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。给 List 集合中的元素赋值,使用下标。给 Map 集合中的元素赋值,使用键值对。
(2)第二种:接收的请求参数是 json 格式数据。需要借助一个注解实现。 @RequestBody注解
4.2 参数绑定示例
4.2.1 基本类型和 String 类型作为参数
1)页面定义请求:
<form action="/hello/test2" method="post">
    用户名:<input name="userName" type="text">
    年龄:<input name="age" type="text">
    <input type="submit" value="提交">
</form>2)执行器方法绑定参数:
 @RequestMapping("test2")
    public String test2(String userName,int age){
   
        System.out.println("用户名:"+userName);
        System.out.println("年龄:"+age);
        return "main";
    }
注意: 参数提交的名称和方法形式参数的名称保持一致。 否则封装失败~  ,并且能够进行数据类型的转换。 
4.2.2 POJO 类型作为参数
1)页面定义请求:
<form action="/hello/test3" >
    用户名:<input name="pname" type="text">
    年龄:<input name="age" type="text">
    车名称:<input name="car.cname" type="text">
    车价格:<input name="car.cprice" type="text">
    <input type="submit" value="提交">
</form>2)执行器方法绑定参数:
 @RequestMapping("test3")
    public String test3(Person person){
   
        System.out.println(person);
        return "main";
    }

4.2.3 POJO 类中包含集合类型参数(了解)
集合类型,不能直接绑定在方法的形式参数上。 
(1)页面定义请求:
<form action="/hello/test4" >
    用户名:<input name="pname" type
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在我的身边

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值