springMVC框架--入门程序(一)


1      springMVC框架

1.1    springMVC是什么

Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,springMVC是spring的一个模块,提供web层解决方案。

1.2    springMVC的框架


 

 

第一步:用户发起request请求,请求至DispatcherServlet前端控制器

第二步:DispatcherServlet前端控制器请求HandlerMapping处理器映射器查找Handler

                   DispatcherServlet:前端控制器,相当于中央调度器,各各组件都和前端控制器进行交互,降低了各各组件之间耦合度。

第三步:HandlerMapping处理器映射器,根据url及一些配置规则(xml配置、注解配置)查找Handler,将生成的Handler对象和处理器拦截器链一并返回给DispatcherServlet前端控制器

第四步:DispatcherServlet前端控制器调用适配器执行Handler,附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法有了适配器通过适配器去扩展对不同Handler执行方式(比如:原始servlet开发,注解开发)

第五步:适配器执行具体的Handler也就是controller,将request域中的数据注入到controller方法的形参中,

在填充controller方法的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
      HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
      数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
      数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
      数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中

第六步:Handler执行完成返回ModelAndView

                   ModelAndView:springmvc的一个对象,对Model和view进行封装。

第七步:适配器将ModelAndView返回给DispatcherServlet

第八步:DispatcherServlet调用视图解析器进行视图解析,解析后生成view

                   视图解析器根据逻辑视图名解析出真正的视图。

         View:springmvc视图封装对象,提供了很多view,jsp、freemarker、pdf、excel等               

第九步:ViewResolver视图解析器给前端控制器返回view

第十步:DispatcherServlet调用view的渲染视图的方法,将模型数据填充到request域。

第十一步:DispatcherServlet向用户响应结果(jsp页面、json数据等)

2      入门程序


2.1    环境搭建所需的jar包

使用spring3.2.0(带springwebmvc模块)的jar包

 

2.2    前端控制器配置

web.xml中配置:

 <!-- 前端控制器 -->
  <servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <!-- 加载springmvc配置 -->
  <init-param>
      <param-name>contextConfigLocation</param-name>
      <!-- 配置文件的地址
          如果不配置contextConfigLocation,
          默认查找的配置文件名称classpath下的:servlet名称+"-serlvet.xml"即:springmvc-serlvet.xml
       -->
      <param-value>classpath:springmvc.xml</param-value>
  </init-param>
 
  </servlet>
  <servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <!--
  可以配置/ ,此工程所有请求全部由springmvc解析,此种方式可以实现 RESTful方式,需要特殊处理对静态文件的解析不能由springmvc解析
  可以配置*.do或*.action,所有请求的url扩展名为.do或.action由springmvc解析,此种方法常用
  不可以/*,如果配置/*,返回jsp也由springmvc解析,这是不对的。
   -->
  <url-pattern>*.action</url-pattern>
  </servlet-mapping>

2.3    处理器映射器

springmvc.xml中配置:

BeanNameUrlHandlerMapping: 根据请求url(XXXX.action)匹配spring容器bean的 name

找到对应的bean(程序编写的Handler)

<!--配置处理器映射器 springmvc框架根据HandlerMapping接口判断是否是处理器映射器 -->
   <!-- 根据bean的name进行查找Handler 将action的url配置在bean的name中 -->
   <bean
   class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
所有处理器映射器都实现HandlerMapping接口。

2.4    处理器适配器 

在springmvc.xml配置:

<!--配置处理器适配器springmvc框架根据HandlerAdapter接口判断是否是处理器适配器 -->

   <bean

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

所有的适配器都是实现了HandlerAdapter接口。

 

程序编写Handler根据适配器的要求编写。

SimpleControllerHandlerAdapter适配器要求:

通过supports方法知道Handler必须要实现Controller接口:

publicboolean supports(Object handler) {

      return (handlerinstanceofController);

   }

2.5    Handler编写

pojo商品信息:Item.java
public class Items {
    private Integer id;

    private String name;

    private Float price;

    private String pic;

    private Date createtime;

    private String detail;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name == null ? null : name.trim();
    }

    public Float getPrice() {
        return price;
    }

    public void setPrice(Float price) {
        this.price = price;
    }

    public String getPic() {
        return pic;
    }

    public void setPic(String pic) {
        this.pic = pic == null ? null : pic.trim();
    }

    public Date getCreatetime() {
        return createtime;
    }

    public void setCreatetime(Date createtime) {
        this.createtime = createtime;
    }

    public String getDetail() {
        return detail;
    }

    public void setDetail(String detail) {
        this.detail = detail == null ? null : detail.trim();
    }
}

编写ItemController1.java

public class ItemController1 implements Controller {
   public ModelAndView handleRequest(HttpServletRequest request,
         HttpServletResponse response) throws Exception {
 
      // 使用静态数据将商品信息列表显示在jsp页面
      // 商品列表
      List<Items> itemsList = new ArrayList<Items>();
 
      Items items_1 = new Items();
      items_1.setName("联想笔记本");
      items_1.setPrice(6000f);
      items_1.setCreatetime(new Date());
      items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
 
      Items items_2 = new Items();
      items_2.setName("苹果手机");
      items_2.setPrice(5000f);
      items_2.setDetail("iphone6苹果手机!");
 
      itemsList.add(items_1);
      itemsList.add(items_2);
     
      ModelAndView modelAndView = new ModelAndView();
      //将数据填充到request
//    request.setAttribute("itemsList",itemsList);
      modelAndView.addObject("itemsList", itemsList);
      //指定转发的jsp页面
      modelAndView.setViewName("/WEB-INF/jsp/itemsList.jsp");
      return modelAndView;
   }
}

2.6    配置Handler

在springmvc.xml配置Handler由spring管理Handler。


<!--配置Handler由于使用了BeanNameUrlHandlerMapping处理映射器,name配置为url -->

   <beanid="itemController1"name="/itemList.action"

      class="cn.itcast.springmvc.first.ItemController1"/>

2.7    配置视图解析器

配置视图解析,能够解析jsp视图:

<!--配置视图解析器要求将jstl的包加到classpath -->

   <!-- ViewResolver -->

   <bean

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

   </bean>

2.8    springmvc.xml所有配置

<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">
 
   <!-- 配置Handler 由于使用了BeanNameUrlHandlerMapping处理映射器,name配置为url -->
   <bean name="/itemList.action"
      class="cn.itcast.springmvc.first.ItemController1"/>
 
   <!-- 配置处理器映射器 springmvc框架根据HandlerMapping接口判断是否是处理器映射器 -->
   <!-- 根据bean的name进行查找Handler 将action的url配置在bean的name中 -->
   <bean
      class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
 
   <!-- 配置处理器适配器 springmvc框架根据HandlerAdapter接口判断是否是处理器适配器 -->
   <bean
      class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
 
   <!-- 配置视图解析器要求将jstl的包加到classpath-->
   <!-- ViewResolver -->
   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
   </bean>
 
</beans>

2.9    工程部署

将整个入门程序加载到tomcat,然后访问:http://localhost:8080/springMVCfirst/itemList.action

 

3      其它非注解处理器映射器和适配器

3.1    BeanNameUrlHandlerMapping(映射器)

根据请求url(XXXX.action)匹配spring容器bean的 name

找到对应的bean(程序编写的Handler)

3.2    SimpleUrlHandlerMapping(映射器)

   <!--简单url映射集中配置beanid对应url -->

   <beanclass="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

      <propertyname="mappings">

         <props>

            <prop key="/itemsTest1.action">itemController1</prop>

            <prop key="/itemsTest2.action">itemController2</prop>

         </props>

      </property>

   </bean>

注意:在springmvc.xml配置了多个处理器映射器,多个处理器映射器可以共存。

3.3    SimpleControllerHandlerAdapter(适配器)

要求程序编写的Handler(Controller)需要实现 Controller接口。

3.4 HttpRequestHandlerAdapter(适配器) 

在springmvc.xml配置:HttpRequestHandlerAdapter

要求Handler 实现HttpRequestHandler接口

这里就相当于使用原始servlet开发

3.4.1    根据HttpRequestHandlerAdapter开发Handler

public class ItemController2 implements HttpRequestHandler {
 
   public void handleRequest(HttpServletRequestrequest, HttpServletResponse response)
         throws ServletException, IOException {
     
      // 使用静态数据将商品信息列表显示在jsp页面
      // 商品列表
      List<Items> itemsList = new ArrayList<Items>();
 
      Items items_1 = new Items();
      items_1.setName("联想笔记本");
      items_1.setPrice(6000f);
      items_1.setCreatetime(new Date());
      items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
 
      Items items_2 = new Items();
      items_2.setName("苹果手机");
      items_2.setPrice(5000f);
      items_2.setDetail("iphone6苹果手机!");
 
      itemsList.add(items_1);
      itemsList.add(items_2);
     
      request.setAttribute("itemsList", itemsList);
      //转发到jsp页面
      request.getRequestDispatcher("/WEB-INF/jsp/itemsList.jsp").forward(request, response);
   }
}

3.4.2    配置Handler

<!--handler2 -->

<beanid="itemController2"class="cn.itcast.springmvc.first.ItemController2"></bean>

映射器可以随便使用哪个配置这里使用SimpleUrlHandlerMapping映射器

key="/itemsTest2.action">itemController2</prop>

4      DispatcherServlet.properoties 

 

DispatcherServlet.properoties 这个配置文件是DispatcherServlet前端控制器加载默认加载配置文件,里面配置了各种处理器的映射器和适配器从而默认加载各各组件。

如果在springmvc.xml中配置了处理器映射器和适配器,则以sprintmvc.xml中配置的为准

5      注解映射器和适配器

5.1    注解映射器

spring3.1之前默认加载映射器是

org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping,

3.1之后要使用:

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping

 

使用RequestMappingHandlerMapping需要在Handler 中使用@controller标识此类是一个控制器,使用@requestMapping指定Handler方法所对应的url。

5.2    注解适配器

spring3.1之前默认加载映射器是

org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter,

3.1之后要使用:

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

 

RequestMappingHandlerAdapter,不要求Handler实现任何接口,它需要和RequestMappingHandlerMapping注解映射器配对使用,主要解析Handler方法中的形参。

5.3    注解开发Hanlder

@Controller
public class ItemController3 {
   //商品列表,@RequestMapping中url建议和方法名一致,方便开发维护
   @RequestMapping("/queryItems")
   public ModelAndView queryItems(){
     
      // 使用静态数据将商品信息列表显示在jsp页面
      // 商品列表
      List<Items> itemsList = new ArrayList<Items>();
 
      Itemsitems_1 = new Items();
      items_1.setName("联想笔记本");
      items_1.setPrice(6000f);
      items_1.setCreatetime(new Date());
      items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
 
      Items items_2 = new Items();
      items_2.setName("苹果手机");
      items_2.setPrice(5000f);
      items_2.setDetail("iphone6苹果手机!");
 
      itemsList.add(items_1);
      itemsList.add(items_2);
     
      ModelAndView modelAndView = new ModelAndView();
      modelAndView.addObject("itemsList", itemsList);
      //指定逻辑视图名
      modelAndView.setViewName("/WEB-INF/jsp/itemsList.jsp");
 
      return modelAndView;
   }
   //其他方法
}

5.1    配置Handler

<!--注解的handler,单个配置 -->

   <!-- <beanclass="cn.itcast.springmvc.first.ItemController3"/> -->

   <!-- 使用spring组件扫描 -->

   <context:component-scanbase-package="cn.itcast.springmvc.first"/>


建议使用组件扫描,组件扫描可以扫描@Controller@Service@component@Repsitory

6      小结

DispatcherServlet:前端控制器,相当于中央调度器,可以降低组件之间的耦合度。

HandlerMapping:处理器映射器,负责根据url查找Handler

HandlerAdapter:处理器适配器,负责根据适配器要求的规则去执行处理器。可以通过扩展适配器支持不同类型的Handler。

viewResolver:视图解析器,根据逻辑视图名解析成真正的视图,

<!--配置视图解析器要求将jstl的包加到classpath -->

   <!-- ViewResolver -->

   <bean

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

      <propertyname="prefix"value="/WEB-INF/jsp/"/>

      <propertyname="suffix"value=".jsp"/>

   </bean>

 

真正的视图=前缀+逻辑视图名+后缀

框架源码分析

1、DispatcherServlet在doDispatch(HttpServletRequestrequest, HttpServletResponse response)z这个初始化的方法中通过mappedHandler查找HandlerExecutionChina

 

2、DispatcherServlet通过适配器去执行Handler,得到ModelAndview

 

3、视图解析

视图解析完成得到一个view:

 

4、进行视图渲染

将Model中的数据填充到request域。

 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

愚人节第二天

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

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

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

打赏作者

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

抵扣说明:

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

余额充值