SpringMVC——介绍

目录

1. 前言

1.1 SpringMVC与struts2比较

1.2 hello world

1.2.1 控制层

2.1.2 SpringMVC配置文件

2.1.3 web.xml配置

2.1.4 访问

1.3 hello程序的执行顺序

2. springmvc架构

2.1 框架默认加载组件

2.2 框架执行流程

3 springmvc的常用组件说明

3.1 前端控制器DispatcherServlet

3.2 处理器映射器HandlerMapping

 3.2.1 介绍

3.2.2 配置方式

3.3 处理器Handler

3.4 处理器适配器HandlerAdapter

3.4.1 介绍

3.4.2 配置

3.5 视图解析器ViewResolver

3.6 视图View

4. 组件扫描器

5. 注解驱动

6. 视图解析器


1. 前言

springMVC就是类似于Struts2的mvc框架,属于SpringFrameWork的后续产品

1.1 SpringMVC与struts2比较

 
对比项目SrpingMVCStruts2优势
国内市场情况有大量用户,一般新项目启动都会选用springmvc有部分老用户,老项目组,由于习惯了,一直在使用。国内情况,springmvc的使用率已经超过Struts2
框架入口基于servlet基于filter本质上没太大优势之分,只是配置方式不一样
框架设计思想

控制器基于方法级别的拦截,处理器设计为单实例

控制器基于类级别的拦截, 处理器设计为多实例

由于设计本身原因,造成了Struts2,通常来讲只能设计为多实例模式,相比于springmvc设计为单实例模式,Struts2会消耗更多的服务器内存。
参数传递参数通过方法入参传递参数通过类的成员变量传递Struts2通过成员变量传递参数,导致了参数线程不安全,有可能引发并发的问题。
与spring整合与spring同一家公司,可以与spring无缝整合需要整合包Springmvc可以更轻松与spring整合

1.2 hello world

1.2.1 控制层

新建一个普通的java类,加上注解

@Controller
public class HelloMvc {
	@RequestMapping("/hello")
	public ModelAndView helloMvc(){
		System.out.println("hello mcv");
		ModelAndView mv = new ModelAndView();
		
		// 设置模型数据,用于传递到jsp
		mv.addObject("msg", "hello mvc");
		// 设置视图名称
		mv.setViewName("/WEB-INF/jsp/hello.jsp");
		return mv;
	}
}

注意:

1. ModelAndView为MVC提供的一个模型视图器,可以用于设置模型数据与视图名称

2. 控制层只需要将ModelAndView对象返回即可

2.1.2 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:p="http://www.springframework.org/schema/p"
	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-4.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

	<!-- 配置controller扫描包 -->
	<context:component-scan base-package="com.bjc.mvc.controller" />
</beans>

2.1.3 web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
	 <!-- 配置核心控制器 -->
	 <servlet>  
        <servlet-name>DispatcherServlet</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>DispatcherServlet</servlet-name>  
        <url-pattern>*.action</url-pattern> <!--会拦截URL中带“/”的请求。-->  
    </servlet-mapping>  
</web-app>

2.1.4 访问

http://localhost:8080/01-SpringMVC/hello.action  即可访问

注意:因为web.xml中配置的url-pattern为*.action,所以,hello后缀名必须为.action才行

1.3 hello程序的执行顺序

1. 输入url地址http://localhost:8080/01-SpringMVC/hello.action 发送请求

2. 请求到web.xml中查找*.action的拦截配置<servlet-mapping> ,找到对应的<servlet-name>

3. 根据<servlet-name>找到处理器<servlet>下的核心控制器DispatcherServlet

4. 然后在核心控制下找到初始化的参数配置<init-param>,将springmvc.xml配置文件加载

5. 加载springmvc.xml配置文件,发现其配置了一个包扫描器

6. 扫描对应包下的注解,得到controller

7. 根据请求连接找到@RequestMapping绑定的请求路径,执行逻辑代码。

8. 执行完成,返回模型视图ModelAndView

2. springmvc架构

2.1 框架默认加载组件

我们没有做任何配置,就可以使用SpringMVC,是因为框架已经为我们默认配置并加载了SpringMVC的组件了。

SpringMVC默认加载/org/springframework/web/servlet/DispatcherServlet.properties

处理器映射器:

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
	org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

处理器适配器:

org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
	org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
	org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

 视图解析器:

org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

2.2 框架执行流程

1. 用户发送url请求

2. 请求交给前端控制器DispatcherServlet

3. DispatcherServlet收到请求调用处理器映射器HandlerMapping

4. HandlerMapping根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet

5. DispatcherServlet通过处理器适配器HandlerAdapter调用处理器,执行处理器(Controller,也叫作后端处理器)

6. Controller执行完成返回视图解析器ModelAndView

7. HandlerAdapter将处理器COntroller执行结果ModelAndView返回给DispatcherServlet

8. DispatcherServlet在将ModelAndView传给视图解析器ViewResolver

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

10. 然后DispatcherServlet对View进行渲染视图(即将模型数据填充到视图中)

10.最后DispatcherServlet将渲染好的视图响应给用户。

图解:

3 springmvc的常用组件说明

SpringMVC有三大组件:处理器映射器、处理器适配器、视图解析器。

3.1 前端控制器DispatcherServlet

         用户请求到达前端控制器,它就相当于MVC模式中的C,DispatcherServlet是整个流程控制的中心,由它调用其他组件处理用户的请求,DispatcherServlet的存在降低了组件间的耦合性。

3.2 处理器映射器HandlerMapping

 3.2.1 介绍

        HandlerMapping负责根据用户请求url找到Handler处理器,springmvc提供了不同的映射器实现不同的映射方式。例如:配置文件方式、接口实现方式、注解方式等。

3.2.2 配置方式

我们可以通过配置bean的方式来配置HandlerMapping

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

3.3 处理器Handler

        Handler是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理,由于Handler涉及具体的用户业务请求,所以一般情况下需要程序员根据业务需求开发Handler也即Controller层

3.4 处理器适配器HandlerAdapter

3.4.1 介绍

        通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。即处理器适配器可以实例化Controller并调用对应的方法。

3.4.2 配置

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

3.5 视图解析器ViewResolver

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

3.6 视图View

        SpringMVC提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们通常用的视图就是jsp。

        一般情况下,需要通过页面标签或页面模板技术将模型数据通过页面展示给用户,需要我们根据业务需求开发具体的页面。

注意:

1. 在springMVC中的各个组件,处理器映射器、处理器适配器、视图解析器称之为SpringMVC的三大组件

2. 需要我们自己开发的组件有Handler、view

3. 处理器映射器与处理器适配器是成套使用的。

4. 组件扫描器

使用组件扫描器省去了在spring容器配置每个Controller类的繁琐,使用

<context:component-scan base-package="com.bjc.mvc.controller" />

自动扫描标记@Controller的控制器类。

注意:多个包之间用逗号“ , ”分隔。

5. 注解驱动

        直接配置处理器映射器和处理器适配器比较麻烦,可以使用注解驱动来加载。SpringMVC中使用<mvc:annotation-driven />自动加载RequestMappingHandlerMapping和RequestMappingAdapter。配置注解驱动相当于同时使用最新的处理器映射器与处理器适配器,同时注解驱动对json数据响应提供支持。

可以在SpringMVC.xml配置文件中使用<mvc:annotation-driven />来代替注解处理器和适配器的配置

<mvc:annotation-driven />

6. 视图解析器

在默认配置中有视图解析器的配置

org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

打开org.springframework.web.servlet.view.InternalResourceViewResolver类,通过其父类,我们发现其父类有一些比较有意思的属性,比方说prefix(前缀),suffix(后缀),由此我们可以得到视图解析器的配置

<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="prefix" value="/WEB-INF/jsp/"></property>
	<property name="suffix" value=".jsp"></property>
</bean>

7. SpringMVC的web.xml的配置

7.1 配置核心过滤器

<!-- 配置核心控制器 -->
<servlet>  
   <servlet-name>DispatcherServlet</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>DispatcherServlet</servlet-name>  
   <url-pattern>*.action</url-pattern> <!--会拦截URL中带“/”的请求。-->  
</servlet-mapping>

7.2 字符串编码配置

<!-- 解决post请求乱码 -->
<filter>
    <filter-name>encoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <!-- 设置编码为UTF-8 -->
    <init-param>
    	<param-name>encoding</param-name>
    	<param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值