Spring Web MVC

1、Spring Web MVC是什么

         SpringMVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助简化日常Web开发的。

         SpringMVC是为展现层提供的基于MVC设计理念的优秀的Web框架,是目前最主流的MVC框架之一,Spring3.0后已经全面超越Struts2,成为最优秀的MVC框架  

         Spring MVC通过一套MVC注解,让POJO成为处理请求的控制器,而无须实现任何接口。

         SpringMVC方便的支持了RESTful风格的URL请求

         SpringMVC由于Spring的特性而采用了松散耦合可插拔组件结构,比其他MVC框架更具扩展性和灵活性。        

2、Spring3 MVC的优点

         Spring3 MVC使用简单,学习成本低。学习难度小于Struts2,Struts2用不上的多余功能太多

         Spring3 MVC很容易就可以写出性能优秀的程序,Struts2要处处小心才可以写出性能优秀的程序

         Spring3MVC>Struts2(不使用OGNL和值栈)>>struts2(标签库、OGNL和值栈)

         Spring3 MVC的灵活是无法想像的,Spring框架的扩展性有口皆碑,Spring3 MVC当然也不会落后,不会因使用了MVC框架而感到有任何的限制

3、hello SpringMVC:SpringMVC应用一般开发步骤

         0、添加依赖spring-webmvc

         1、配置web.xml,指定业务层对应的Spring配置文件,定义DispatcherServlet

                   配置监听器 ---整合web和Spring

<context-param>

                                     <param-name>contextConfigLocation</param-name>

                                     <param-value>classpath:app*.xml</param-value>

                            </context-param>

                            <listener>

                                     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

                            </listener>

                           

                            <servlet>

                                     <servlet-name>yan</servlet-name>

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

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

                            </servlet>

                            <servlet-mapping>

                                     <servlet-name>yan</servlet-name>

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

                            </servlet-mapping>

 

        一般来说由监听器负责加载和创建的IoC容器叫做父容器,由DispatcherServlet负责创建和加载的容器叫做子容器

        父容器不能访问子容器中的受管bean,但是子容器可以直接访问父容器中的受管bean

         子容器中配置和web应用相关的组件,而父容器中配置和web应用没有直接关系的组件

        子容器的默认配置文件名称为<servlet-name>-servlet.xml,例如yan-servlet.xml,位置和web.xml位置一致。遵循惯例则不需要进行配置

  2、编写处理请求的控制器。处理器              

@Controller

                   public class HelloController {

                            @RequestMapping(value = "hello", method = RequestMethod.GET)针对方法进行映射,value对应的是请求路径hello.do

                     public String sayHello(String username用于接收客户端提交的同名参数?username=yanjun, Model model用于向页面传递数据,可以理解为request的attribute) throws Exception {

                                     if (username == null || username.trim().length() < 1)

                                               username = "SpringMVC";

                                     String message = "Hello " + username + "!";

                                     model.addAttribute("msg", message);

                                     return "show";逻辑地址名

                            }

                  

                   }

          3、编写视图/WEB-INF/content/show.jsp                              

<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>

                   <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

                   ${msg}

       4、配置Spring mvc的配置文件,使控制器,视图解析器等生效        

<?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:p="http://www.springframework.org/schema/p"

                   xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd

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

 

              <!-- 用于打开注解支持 -->

              <mvc:annotation-driven />         <!-- 使用解析器,用于将逻辑地址名转换为物理地址 --            

<bean

                            class="org.springframework.web.servlet.view.InternalResourceViewResolver"

                            p:prefix="/WEB-INF/content/" p:suffix=".jsp" />

                           

                   <context:component-scan base-package="com.yan.action">

                            <context:include-filter type="annotation"

                                     expression="org.springframework.stereotype.Controller" />

                   </context:component-scan>  

         </beans>

4、SpringMVC框架的原理

         1:整个过程始于客户端发出一个HTTP请求,Web应用服务器接收到这个请求,如果匹配DispatcherServlet的请求映射路径(web.xml下指定),Web容器将该请求转交给DispatcherServlet处理。

         2:DispatcherServlet接收到请求后,将根据请求信息(包括URL,HTTP方法等)及HandlerMapping的配置找到处理请求的处理器(Handler)。可将HandlerMapping看成是路由器,将Handler看成是目标主机。值得注意的是:Spring mvc中并没有定义一个Handler接口,实际上任何一个Object都可以成为请求的处理器。

         3:当DispatcherServlet根据HandlerMapping得到对应当前请求的Handler后,通过HandlerAdapter的Handler进行封装,再以

统一的适配器接口调用Handler。HandlerAdapter是Spring mvc的框架级接口,顾名思义HandlerAdapter是一个适配器,它用统一的接口

对各种Handler方法进行调用。

         4:处理器完成业务逻辑的处理后将返回一个ModelAndView给DsipatcherServlet,ModelAndView包含了试图逻辑名和模型数据信息。

         5:ModelAndView中包含的是“逻辑试图名”而非真正的视图对象,DispatcherServlet借由ViewResolver完成逻辑试图名到真是试图

对象的解析工作。

         6:当得到真实的视图对象view后DispatcherServlet就使用这个View对象对ModelAndView中的模型数据进行试图渲染。

         7:最终客户端得到的相应消息,可能是一个普通的HTML页面,也可能是一个XML或JSON串,甚至是一张图片或一个PDF文档等不同的媒体形式        

5、定义控制器

         Controller接口是Spring2.5-定义方法,目前不需要实现任何接口,不继承任何类      

@Controller控制器定义

      @Controller用于标识是处理器类。和Struts1一样,Spring的Controller是Singleton的。这就意味着会被多个请求线程共享。因此

 ,我们将控制器设计成无状态类。在spring 3.0中,通过@controller标注即可将class定义为一个controller类。为使spring能找到定义为

 controller的bean,需要在spring-context配置文件中增加如下定义:

      <context:component-scan base-package="com.yan.action"/>

注:实际上,使用@component,也可以起到@Controller同样的作用。

使用注解进行MVC相关配置,需要配置

         <mvc:annotation-driven/>

@RequestMapping  --新注解@GetMapping等

         在类前面定义,则将url和类绑定。在方法前面定义,则将url和类的方法绑定。

         String name() default "";类似于配置文件中<bean>的id

         String[] value() default {};用于定义对应的路径名称

         String[] path() default {};等价于value,一般不使用path

         RequestMethod[] method() default {};执行这个方法时所对应的http请求方法,例如GET,post等

         String[] params() default {};用于设置执行这个方法时参数对应的条件,例如有某个参数才对应这个方法

         String[] headers() default {};  请求头

         针对JSON的参数配置

                   String[] consumes() default {};

                   String[] produces() default {};

@Controller

@RequestMapping("/")

public class UserController {

         @RequestMapping(value = "login", method = RequestMethod.GET)

         public ModelAndView login() throws Exception {

                   ModelAndView mv=new ModelAndView();

                   mv.setViewName("user/login");

                   mv.addObject("msg","带到页面的参数");

                   return mv;

         }

}

返回给前端控制器的是逻辑地址名,需要通过视图解析器,将逻辑地址名解析为对应的View对象

         <bean

                   class="org.springframework.web.servlet.view.InternalResourceViewResolver"

                   p:prefix="/WEB-INF/content/" p:suffix=".jsp"

                   p:viewClass="org.springframework.web.servlet.view.JstlView" />

                   这个视图解析器会将Controller返回的视图名user/login转换为物理地址/WEB-INF/content/user/login.jsp

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值