SpringMvc架构的理解

   

  1. SpringMVC架构

  1. 1 Spring web mvc介绍

Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来: 

   1.2 Springmvc的优点

(1)可以支持各种视图技术,而不仅仅局限于JSP;

(2)与Spring框架集成(如IoC容器、AOP等);

(3)清晰的角色分配:前端控制器(dispatcherServlet) , 请求到处理器映射(handlerMapping), 处理器适配器(HandlerAdapter), 视图解析器(ViewResolver)。

(4)支持各种请求资源的映射策略。 

   1.3 web mvc

      mvc设计模式在b/s系统下应用:

工作流程:

    1.用户发起request请求至控制器(Controller)控制接收用户请求的数据,委托给模型进行处理

    2.控制器通过模型(Model)处理数据并得到处理结果模型通常是指业务逻辑

    3.模型处理结果返回给控制器

    4.控制器将模型数据在视图(View)中展示web中模型无法将数据直接在视图上显示,需要通过控制器完成。如果在C/S应用中模型是可以将数据在视图中展示的。

    5.控制器将视图response响应给用户通过视图展示给用户要的数据或处理结果。

1.3 Spring web mvc 架构

 1.3.1 spring web mvc 架构图

 1.3.2 请求流程

   1. 用户发送请求至前端控制器DispatcherServlet.

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

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

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

 5.执行处理器(Controller,也叫后端控制器)。

 6.Controller执行完成返回ModelAndView

 7.HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet

 8.ViewReslover视图解析器解析后返回具体View

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

 10.DispatcherServlet响应用户

 1.3.3 spring web mvc 组件说明

   1.DispatcherServlet:前端控制器

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

   2.HandlerMapping:处理器映射器

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

   3.HandlAdapter:处理器适配器

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

   4.Handler:处理器

   Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。

   5.ViewResolver:视图解析器

   ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。

2.SpringMVC入门

2.1创建一个 web项目

 1.File---New---Project

2.选择Java Enterprise版本,然后配置tomcat

3.选择使用模板创建项目

4.创建web项目名配置tomcat

5.项目目录创建完成

2.2导入spring的jar包

2.3配置前端控制器

 2.3.1在WEB-INF\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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>springmvc</display-name>
  <!-- 配置Spring -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <!-- 配置SpringMVC的编码格式 -->
  <filter>  
    <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>  
     	<url-pattern>/*</url-pattern>  
  </filter-mapping> 
   <!-- 加载其他的配置文件 --> 
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring-servlet.xml</param-value>
  </context-param>  
   <!-- 配置Spring的前置控制器DispatcherServlet --> 
  <servlet>
        <servlet-name>spring</servlet-name>
            <servlet-class>
                org.springframework.web.servlet.DispatcherServlet
            </servlet-class>
        <load-on-startup>1</load-on-startup>
   </servlet>
<!--加入前端控制器-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
   <!-- 配置Spring的url后缀 --> 
   <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>*.do</url-pattern>
   </servlet-mapping>
</web-app>

load-on-startup:表示servlet随服务启动;

url-pattern*.action的请交给DispatcherServlet处理。

contextConfigLocation:指定springmvc配置的加载位置,如果不指定则默认加

WEB-INF/[DispatcherServlet Servlet 名字]-servlet.xml

2.3.2前端配置器servlet如何拦截

  1.拦截固定后缀的url,比如设置为 *.do、*.action, 例如:/user/add.action 此方法最简单,不会导致静态资源(jpg,js,css)被拦截。

  2.拦截所有,设置为/,例如:/user/add  /user/add.action此方法可以实现REST风格的url,很多互联网类型的应用使用这种方式。但是此方法会导致静态文件(jpg,js,css)被拦截后不能正常显示。需要特殊处理。

  3.拦截所有,设置为/*,此设置方法错误,因为请求到Action,当action转到jsp时再次被拦截,提示不能根据jsp路径mapping成功。

2.4.springMVC配置文件的配置

 2.4.1Springmvc默认加载WEB-INF/[前端控制器的名字]-servlet.xml,也可以在前端控制器定义处指定加载的配置文件,如下:

<!--加入前端控制器-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>

如上代码,通过contextConfigLocation加载classpath下的springmvc.xml配置文件

2.4.2 配置处理器映射器

springmvc.xml文件配置如下:

<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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.1.xsd 
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
    
   <!-- controller方法调用规则:通过url中的method参数指定要执行的controller方法-->  
    <bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">  
   	 	<property name="paramName" value="action" />  
    	<property name="defaultMethodName" value="view" />
	</bean>
	<!-- 配置MVC的前缀(prefix)和后缀(suffix) -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 
       <!--  <property name="prefix" value="/WEB-INF/" /> -->
        <property name="suffix" value=".jsp" />
    </bean>
    <!-- 以下是 控制器的配置 -->
    	<!-- 处理器映射器 -->
	<!-- 根据bean的name进行查找Handler 将action的url配置在bean的name中 -->
	<bean
		class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
  		<property name="order" value="1" />
  		<property name="mappings">
   			<props>
   				<prop key="user.do">userController</prop>
   				<prop key="index.do">indexController</prop>
   			</props>
  		</property>
  	</bean>  	
	<bean name="userController"  class="cn.raffaello.controller.UserController">
		<property name="userIService" ref="userIService"></property>
	</bean>
	<bean name="indexController"  class="cn.raffaello.controller.IndexController" />
	<!-- ServiceBean的配置 -->
	<bean name="userIService" class="cn.raffaello.service.impl.UserServiceImpl" />
</beans>

注:BeanNameUrlHandlerMapping:表示将定义的Bean名字作为请求的url,需要将编写的controller在spring容器中进行配置,且指定bean的name为请求的url,且必须以.action结尾。

2.4.3 配置适配器处理器

在springmvc.xml文件配置如下:

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

SimpleControllerHandlerAdapter:即简单控制器处理适配器,所有实现了org.springframework.web.servlet.mvc.Controller 接口的Bean作为Springmvc的后端控制器。

2.4.4 配置视图解析器

<!-- ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>

InternalResourceViewResolver:支持JSP视图解析

viewClassJstlView表示JSP模板页面需要使用JSTL标签库,所以classpath中必须包含jstl的相关jar 包;

prefix suffix:查找视图页面的前缀和后缀,最终视图的址为:

前缀+逻辑视图名+后缀,逻辑视图名需要在controller中返回ModelAndView指定,比如逻辑视图名为hello,则最终返回的jsp视图地址 “WEB-INF/jsp/hello.jsp

2.4.5配置后端控制器

springmvc.xml文件配置如下:

<!-- controller配置 -->

<bean name="/items1.action" id="itemList1"

class="com.test.springmvc.controller.first.ItemList1"/>

name="/items1.action"前边配置的处理器映射器为BeanNameUrlHandlerMapping,如果请求的URL 为“上下文/items1.action”将会成功映射到ItemList1控制器。

此时此刻web的相关项目配置已经基本完成,需要仔细配置,稍有差错都会出现错误,大家具体情况具体配置

3.springmvc用到的相关注解

1. @ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。

2.@component : 创建类对象 相当于配置<bean>

3.@service : 作用于业务逻辑层

4.@Repository : 作用于持久层

5.@controller :作用于表现层(spring-mvc的注解)

6.@RequestMapping :定义请求url到处理器功能方法的映射,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。

7. @RequestBody: 注解实现接收http请求的json数据,将json转换为java对象。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章