SpringMVC框架(1)

1 .SpringMVC 入门

MVC 模式


MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。

  • Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
  • View(视图) - 视图代表模型包含的数据的可视化。
  • Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
     

1.1 简介

Spring MVC是Spring提供的一个强大而灵活的web框架。借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单。这些控制器一般不直接处理请求,而是将其委托给Spring上下文中的其他bean,通过Spring的依赖注入功能,这些bean被注入到控制器中。

Spring MVC主要由DispatcherServlet、处理器映射【找控制器】、适配器【调用控制器的方法】、控制器【业务】、视图解析器、视图组成。

1.2 SpringMVC的原理(执行流程)

执行流程

1.DispatcherServlet表示前端控制器,是整个SpringMVC的控制中心,用户发起请求,DispatcherServlet接收请求并拦截请求

  •       我们假设请求的url为:http://localhost:8080/SpringMVC/hello
  •       如上吧url拆分为是三个部分:
  •       http://localhost:8080服务器的域名
  •       SpringMVC部署在服务器上的web站点
  •       hello表示控制器
  •       通过分析,如上url表示为:请求位于服务器localhost:8080的SpringMVC站点的hello控制器

2.HandlerMapping为处理器映射器,DispatcherServlet调用,HandlerMapping根据请求查找Handler

3.HandlerExecution表示具体的Handler,其主要的作用是根据url查找控制器,如上url被查找控制器为:user

4.HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等

5.HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler

6.Handler让具体的Controller执行

7.Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView

8.HandlerAdapter将视图逻辑或模型传递给DispatcherServlet

9.DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名

10.视图解析器将解析的逻辑视图名传给DispatcherServlet

11.DispatcherServlet根据视图解析器的视图结果,调用具体的视图

12.最终将视图呈现给用户

处理器映射器的作用:将请求的url映射到对应的handler上,找到对应的controller的路径

处理器适配器的作用:执行对应的controller

视图解析器的作用:将返回的modelandview数据进行解析,渲染并返回给用户

简单的执行流程

1.用户发起请求到前端控制器

2.前端控制器将请求发送给处理器映射器并返回相应的处理器执行链

3.前端控制器调用处理器适配器并调用其Handler方法,返回ModelAndView给前端控制器

4.前端控制器请求解析视图,由视图解析器返回view对象回前端控制器

5.通过渲染视图并响应给用户

1.3Spring入门案例

第一步:导入springmvc jar包

暂时先导入下面的jar包

第二步:在web.xml配置DispatcherServlet(前端控制器)

 <servlet>

        <servlet-name>DispatcherServlet</servlet-name>

        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>

        <servlet-name>DispatcherServlet</servlet-name>

        <url-pattern>*.do</url-pattern>

    </servlet-mapping>

第三步:在WEB-INF目录下创建DispatcherServlet-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:mvc="http://www.springframework.org/schema/mvc"

    xmlns:context="http://www.springframework.org/schema/context"

    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"

    xsi:schemaLocation="http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd

        http://www.springframework.org/schema/mvc

        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd

        http://www.springframework.org/schema/context

        http://www.springframework.org/schema/context/spring-context-3.2.xsd

        http://www.springframework.org/schema/aop

        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd

        http://www.springframework.org/schema/tx

        http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

       

</beans>

第四步:配置DispatcherServlet-servlet.xml

<!-- 1. 配置处理器映射,springmvc默认的处理器映射器

                BeanNameUrlHandlerMapping:根据bean的name属性的url去找handlerController -->

          <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

          <!-- 2. 配置处理器适配置器执行Controller -->

          <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

          <!-- 3.配置一个控制器Handler -->

          <bean name="/user.do" class="com.gyf.backoffice.web.controller.UserController"/>

          <!-- 4.配置springmvc视图解析器

               视图解析器解析的视频路径为:前缀 + 后缀 -->

          <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

               <property name="prefix" value="/WEB-INF/views"/>

               <property name="suffix" value=".jsp"/>

          </bean>

第五步:创建个Controller控制器



第六步:创建一个userList.jsp页面

第七步:运行项目,访问路径


1.4 SpringMVC的各组件


SimpleControllerHandlerAdapter控制器处理适配器源码

 (1)URL处理器映射


【1】BeanNameUrlHandlerMapping 

功能:寻找Controller,根据url请求去匹配bean的name属性,从而获取Controller


【2】SimpleUrlHandlerMapping

功能:寻找Controller,根据浏览器url匹配简单url的key,key就是Controller的id找到Controller

 


测试路径:


http://localhost:8080/springmvc-demo01/user1.do

http://localhost:8080/springmvc-demo01/user2.do

http://localhost:8080/springmvc-demo01/user3.do

【3】ControllerClassNameHandlerMapping

功能:寻找Controller

            根据类名(MyController)类名.do来访问,类名首字母小写

测试


 

(2)处理器适配器

【1】SimpleControllerHandlerAdapter

功能:执行controller

           调用controller里面方法,返回modelAndView

【2】HttpRequestHandlerAdapter

执行控制器

负责调用实现HttpRequestHandler接口的控制器

注意:两个处理器适配器可以共存

1.5命令控制器【了解】

Springmvc通过命令设计模式接受页面参数

添加页面

<form action="${pageContext.request.contextPath}/command.do" method="post">

    用户名:<input type="text" name="username"><br>

    密码:<input type="text" name="password"><br>

    性别:<input type="text" name="gender"><br>

    生日:<input type="text" name="birthday"><br>

    <input type="submit">

  </form>


Command控制器

Info.jsp

views结构


DispatchServelt-sevlet配置文件

如果bean中配置name,都要加上/斜杠

测试

默认日期格式只能2017/10/11格式,其它格式接收参数会为空

乱码问题

POST请求乱码

<!-- 配置编码过滤器  -->

     <filter>

          <filter-name>EncodingFilter</filter-name>

          <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

          <init-param>

               <param-name>encoding</param-name>

               <param-value>UTF-8</param-value>

          </init-param>

     </filter>

    

     <filter-mapping>

          <filter-name>EncodingFilter</filter-name>

          <url-pattern>/*</url-pattern>

     </filter-mapping>

GET请求乱码

Tomcat8 默认进行了url编码,get请求不乱码,Tomcat7会乱码


日期类型转换

springmvc默认接收的日期格式为yyyy/MM/dd,如果添加其它格式,只要重写一个方法,如图

2.注解开发

2.1 注解开发入门案例

修改springmvc的 配置文件

把前面的项目复制一份,修改一个DispatchServlet-Servlet.xml配置文件

 <!-- 1.配置注解扫描位置 -->

<context:component-scan base-package="com.gyf.backoffice.web.controller"/>

       

<!-- 2. 配置处理器映射,通过注解来查找 -->

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

<!-- 3.配置注解处理适配器来执行控制器的方法 -->  

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

       

<!-- 配置springmvc视图解析器

            视图解析器解析的视频路径为:前缀 + 后缀 -->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

    <property name="prefix" value="/WEB-INF/views"/>

    <property name="suffix" value=".jsp"/>

</bean>

把UserController修改下


修改Tomcat运行的jdk版本

因为3.2springmvc注解与jdk1.8不兼容,跑tomat时会报错,如图


解决办法1:升级spring到4.0的版本

解决办法2:修改Tomcat运行的jdk版本


测试注解配置的访问


MVC:annotation-driven

代化mvc配置文件

2.2 RequestMapping讲解

配置请求路径映射路径

写法:

@RequestMapping(“list”)

@RequestMapping(“/list.do”)

@RequestMapping(value=”/list.do”)

@RequestMapping(value = "/list3",method=RequestMethod.POST) 只能使用POST方法 相当于PostMapping

@RequestMapping(value = "/list3",method=RequestMethod.Get) 只能使用GET方法 相当于GetMapper

        

自定义根路径

可以控制器上添加一个RequestMapping,如图

2.3接收请求参数

封装参数分析

参数类型有:基本类型,int,String等等基本类型, Pojo类

Struts2参数:基于属性封装,action会添加属性,提供set方法。

Springmvc参数封装:基于方法进行封装。

接收int,String,Date,数组类型

在views/user中提供一个form表单在UserController提供一个用户注册的方法

接收pojo类型

创建一个pojo User类型

配置一个注册方法

springmvc接收参数时不需要像struts那样,在表单标签添加user.username这第一个东西

接收包装类型参数

把User写成一个类的属性

添加一个注册方法

修改form表单

接收集合List类型参数

在User扩展中添加一个集合

添加一个注册 的方法,参数写UserExt

表单



接收集合Map类型参数

2.4 Spring与Struts的区别

实现机制:

Struts2是基于过滤器实现的。

Springmvc基于servlet实现。

运行速度:

Servlet比过滤器快。

Struts2是多例

每一次请求,都会创建一个Action对象

请求来了以后,struts2创建多少个对象:ActionContext,valuestack,UAction,ActionSuport,ModelDriven

Springmvc是单例。

    同一个Controller请求,只会创建一个Controller

参数封装来分析:

Struts基于属性进行封装,Action有参数属性。

Springmvc基于方法封装,参数是写在Controller的方法。

3.页面回显

3.1 配置一个列表方法


3.2 显示列表数据

3.3 edit方法


3.4 编辑页面


效果

4.URL模版映射

url模版映射可以restfull软件架构

体验

修改url格式,如图

配置接收url模版映射

{}:匹配接受页面Url路径参数

@Pathariable{}里面参数注入后面参数里面

在web.xml中配置rest路径

Web.xml

测试

5.转发和重定

转发到同一个控制器的方法



转发到不同一个控制器的方法

重定向,只需要把forward改成redirect


6 RequestParam

/**

    * RequestParam参数描述

    * value:参数名称

    * defaultValue:默认值

    * required:参数是否必须有值,如果为true,参数又为空,会报错

    * */

7.ResponseBody和RequestBody

@ResponseBody把后台pojo转换其他数据类型(一般是json数据),返回到页面。

@RequestBody接受前台json数据,把json数据自动封装javaBean

使用

第一步:导入json的jar

第二步:添加个json转换器

置文件

第三步:写个jsp页面,提交json请求参数

第四步:后台处理

注意学生类一定要提供无参的构造方法

案例:只有响应json数据

第一步:表单

第二步:后台处理

8.Springmvc多视图

多视图是一个方法可以返回json/xml等格式的数据

第一步:导入xml格式支持的jar包

第二步:配置支持多视图

<bean

          class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">

          <!-- 配置支持媒体类型 -->

          <property name="contentNegotiationManager">

               <bean

                    class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">

                    <property name="mediaTypes">

                         <map>

                              <entry key="json" value="application/json"></entry>

                              <entry key="xml" value="application/xml"></entry>

                         </map>

                    </property>

               </bean>

          </property>

          <!-- 指定默认视图 -->

          <property name="defaultViews">

               <!-- 支持多个视图 -->

               <list>

                    <!-- josn格式视图支持 -->

                    <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>

                    <!-- xml格式视图支持 -->

                    <bean class="org.springframework.web.servlet.view.xml.MarshallingView">

                         <constructor-arg>

                              <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">

                                   <property name="classesToBeBound">

                                        <list>

                                             <value>com.gyf.backoffice.domain.Student</value>

                                        </list>

                                   </property>

                              </bean>

                         </constructor-arg>

                    </bean>

               </list>

          </property>

     </bean>

 第三步:控制器提供一个接口

    

第四步:测试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值