SpringMVC入门

来源:互联网 发布:软件验收专家意见 编辑:程序博客网 时间:2024/06/04 00:36

1      SpringMVC入门

1.1    需求

实现商品查询列表功能。

 

1.2    开发环境准备

本教程使用Eclipse+tomcat7开发

 

详细参考“Eclipse开发环境配置-indigo.docx”文档

 

 

1.3    第一步:建立一个Web项目

在eclipse下创建动态web工程springmvc_first。

 

1.4    第二步:导入spring3.2.0的jar包

 

 

1.5    第三步:前端控制器配置

在WEB-INF\web.xml中配置前端控制器,

 

<servlet>

<servlet-name>springmvc</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>

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

</servlet>

<servlet-mapping>

<servlet-name>springmvc</servlet-name>

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

</servlet-mapping>

 

 

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

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

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

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

 

1.5.1  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成功。

 

1.6    第四步:springmvc配置文件

 

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

 

<init-param>

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

<param-value>classpath:springmvc.xml</param-value>

</init-param>

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

 

1.7    第五步:配置处理器适配器

 

在springmvc.xml文件配置如下:

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

 

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

Springmvc的后端控制器。

 

1.8    第六步:处理器开发

 

publicclass ItemList1 implements Controller {

 

   @Override

   public ModelAndView handleRequest(HttpServletRequest request,

           HttpServletResponse response)throws Exception {

      

      //商品列表

       List<Items> itemsList =new ArrayList<Items>();

      

       Items items_1 =new Items();

       items_1.setName("联想笔记本");

       items_1.setPrice(6000f);

       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 modelAndView =new ModelAndView();

      

      //填充数据

       modelAndView.addObject("itemsList", itemsList);

      //视图

       modelAndView.setViewName("order/itemsList");

      

      return modelAndView;

    }

   

 

}

 

org.springframework.web.servlet.mvc.Controller:处理器必须实现Controller 接口。

ModelAndView:包含了模型数据及逻辑视图名

 

 

 

1.9    第七步:配置处理器映射器

 

在springmvc.xml文件配置如下:

 

<beansxmlns="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">

 

  <!-- 处理器映射器 -->

  <!-- 根据beanname进行查找Handleractionurl配置在beanname -->

  <bean

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

 

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

 

1.10       第八步:处理器配置

 

在springmvc.xml文件配置如下:

 

<!-- controller配置 -->

    <beanname="/items1.action"id="itemList1"

class="cn.itcast.springmvc.controller.first.ItemList1"/>   

 

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

 

 

1.11       第九步:配置视图解析器

 

在springmvc.xml文件配置如下:

 

<!--ViewResolver -->

<beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver">

<propertyname="viewClass"value="org.springframework.web.servlet.view.JstlView"/>

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

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

</bean>

 

InternalResourceViewResolver:支持JSP视图解析

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

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

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

 

 

 

 

 

1.12       第十步:视图开发

 

创建/WEB-INF/jsp/order/itemsList.jsp视图页面:

 

<%@page language="java"contentType="text/html; charset=UTF-8"

   pageEncoding="UTF-8"%>

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

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

<!DOCTYPEhtmlPUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<metahttp-equiv="Content-Type"content="text/html; charset=UTF-8">

<title>查询商品列表</title>

</head>

<body>

商品列表:

<tablewidth="100%"border=1>

<tr>

   <td>商品名称</td>

   <td>商品价格</td>

   <td>商品描述</td>

</tr>

<c:forEachitems="${itemsList }"var="item">

<tr>

   <td>${item.name }</td>

   <td>${item.price }</td>

   <td>${item.detail }</td>

</tr>

</c:forEach>

 

</table>

</body>

</html>

 

 

 

1.13       第十一步:部署在tomcat测试

 

通过请求:http://localhost:8080/springmvc_first/items1.action,如果页面输出商品列表就表明我们成功了!

 

1.14       DispatcherServlet

         DispathcerServlet作为springmvc的中央调度器存在,DispatcherServlet创建时会默认从DispatcherServlet.properties文件加载springmvc所用的各各组件,如果在springmvc.xml中配置了组件则以springmvc.xml中配置的为准,DispatcherServlet的存在降低了springmvc各各组件之间的耦合度。

 

 

1.15       HandlerMapping处理器映射器

HandlerMapping 负责根据request请求找到对应的Handler处理器及Interceptor拦截器,将它们封装在HandlerExecutionChain 对象中给前端控制器返回。

 

1.15.1             BeanNameUrlHandlerMapping

         BeanNameUrl处理器映射器,根据请求的url与spring容器中定义的bean的name进行匹配,从而从spring容器中找到bean实例。

 

<!—beanName Url映射器 -->

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

 

 

 

1.15.2             SimpleUrlHandlerMapping

         simpleUrlHandlerMapping是BeanNameUrlHandlerMapping的增强版本,它可以将url和处理器bean的id进行统一映射配置。

<!—简单url映射 -->

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

      <property name="mappings">

          <props>

             <prop key="/items1.action">controller的bean id</prop>

             <prop key="/items2.action">controller的bean id</prop>

          </props>

      </property>

    </bean>

 

161    HandlerAdapter处理器适配器

       HandlerAdapter会根据适配器接口对后端控制器进行包装(适配),包装后即可对处理器进行执行,通过扩展处理器适配器可以执行多种类型的处理器,这里使用了适配器设计模式。

 

SimpleControllerHandlerAdapter简单控制器处理器适配器,所有实现了org.springframework.web.servlet.mvc.Controller 接口的Bean通过此适配器进行适配、执行。

 

适配器配置如下:

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

 

 

 

1.1.1  HttpRequestHandlerAdapter

HttpRequestHandlerAdapter,http请求处理器适配器,所有实现了org.springframework.web.HttpRequestHandler 接口的Bean通过此适配器进行适配、执行。

 

适配器配置如下:

<beanclass="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>

 

Controller实现如下:

 

 

publicclass ItemList2 implements HttpRequestHandler {

 

    @Override

    publicvoid handleRequest(HttpServletRequest request,

           HttpServletResponse response)throws ServletException,IOException {

 

       // 商品列表

       List<Items> itemsList =newArrayList<Items>();

 

       Items items_1 = new Items();

       items_1.setName("联想笔记本");

       items_1.setPrice(6000f);

       items_1.setDetail("ThinkPadT430联想笔记本电脑!");

 

       Items items_2 = new Items();

       items_2.setName("苹果手机");

       items_2.setPrice(5000f);

       items_2.setDetail("iphone5 苹果手机!");

 

       itemsList.add(items_1);

       itemsList.add(items_2);

 

       // 填充数据

       request.setAttribute("itemsList", itemsList);

      

       // 视图

       request.getRequestDispatcher("/WEB-INF/jsp/order/itemsList.jsp").forward(request, response);

 

 

    }

 

}

 

从上边可以看出此适配器器的handleRequest方法没有返回ModelAndView,可通过response修改定义响应内容,比如返回json数据:

 

response.setCharacterEncoding("utf-8");

response.setContentType("application/json;charset=utf-8");

response.getWriter().write("json串");

 

 

1.2    注解映射器和适配器

1.2.1  Controller的代码

 

@Controller

publicclass ItemList3 {

 

    @RequestMapping("/queryItem.action")

    public ModelAndView queryItem() {

       // 商品列表

       List<Items> itemsList =newArrayList<Items>();

 

       Items items_1 = new Items();

       items_1.setName("联想笔记本");

       items_1.setPrice(6000f);

       items_1.setDetail("ThinkPadT430联想笔记本电脑!");

 

       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 modelAndView =new ModelAndView();

 

       // 填充数据

       modelAndView.addObject("itemsList", itemsList);

       // 视图

       modelAndView.setViewName("order/itemsList");

 

       return modelAndView;

    }

 

}

 

1.2.2 组件扫描器

         使用组件扫描器省去在spring容器配置每个controller类的繁琐。使用<context:component-scan自动扫描标记@controller的控制器类,配置如下:

 

<!--扫描controller注解,多个包中间使用半角逗号分隔 -->

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

 

 

1.2.3  RequestMappingHandlerMapping

         注解式处理器映射器,对类中标记@ResquestMapping的方法进行映射,根据ResquestMapping定义的url匹配ResquestMapping标记的方法,匹配成功返回HandlerMethod对象给前端控制器,HandlerMethod对象中封装url对应的方法Method。

 

从spring3.1版本开始,废除了DefaultAnnotationHandlerMapping的使用,推荐使用RequestMappingHandlerMapping完成注解式处理器映射。

 

配置如下:

 

<!--注解映射器 -->

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

  

 

注解描述:

@RequestMapping定义请求url到处理器功能方法的映射

 

 

1.2.4  RequestMappingHandlerAdapter

注解式处理器适配器,对标记@ResquestMapping的方法进行适配。

 

从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用RequestMappingHandlerAdapter完成注解式处理器适配。

 

配置如下:

<!--注解适配器 -->

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

 

1.2.5 <mvc:annotation-driven>

springmvc使用<mvc:annotation-driven>自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter,可用在springmvc.xml配置文件中使用<mvc:annotation-driven>替代注解处理器和适配器的配置。

 

 

1.16       HandlerAdapter处理器适配器

       HandlerAdapter会根据适配器接口对后端控制器进行包装(适配),包装后即可对处理器进行执行,通过扩展处理器适配器可以执行多种类型的处理器,这里使用了适配器设计模式。

 

1.16.1             SimpleControllerHandlerAdapter

SimpleControllerHandlerAdapter简单控制器处理器适配器,所有实现了org.springframework.web.servlet.mvc.Controller 接口的Bean通过此适配器进行适配、执行。

 

适配器配置如下:

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

 

 

 

1.16.2             HttpRequestHandlerAdapter

HttpRequestHandlerAdapter,http请求处理器适配器,所有实现了org.springframework.web.HttpRequestHandler 接口的Bean通过此适配器进行适配、执行。

 

适配器配置如下:

<beanclass="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>

 

Controller实现如下:

 

publicclass ItemList2 implements HttpRequestHandler {

 

   @Override

   public void handleRequest(HttpServletRequest request,

           HttpServletResponse response)throws ServletException,IOException {

 

      // 商品列表

       List<Items> itemsList =newArrayList<Items>();

 

       Items items_1 =new Items();

       items_1.setName("联想笔记本");

       items_1.setPrice(6000f);

       items_1.setDetail("ThinkPadT430联想笔记本电脑!");

 

       Items items_2 =new Items();

       items_2.setName("苹果手机");

       items_2.setPrice(5000f);

       items_2.setDetail("iphone5 苹果手机!");

 

       itemsList.add(items_1);

       itemsList.add(items_2);

 

      // 填充数据

       request.setAttribute("itemsList", itemsList);

      

      // 视图

       request.getRequestDispatcher("/WEB-INF/jsp/order/itemsList.jsp").forward(request, response);

 

 

    }

 

}

 

从上边可以看出此适配器器的handleRequest方法没有返回ModelAndView,可通过response修改定义响应内容,比如返回json数据:

 

response.setCharacterEncoding("utf-8");

response.setContentType("application/json;charset=utf-8");

response.getWriter().write("json串");

 

 

1.17       注解映射器和适配器

1.17.1             Controller的代码

 

@Controller

publicclass ItemList3 {

 

   @RequestMapping("/queryItem.action")

   public ModelAndView queryItem() {

      // 商品列表

       List<Items> itemsList =newArrayList<Items>();

 

       Items items_1 =new Items();

       items_1.setName("联想笔记本");

       items_1.setPrice(6000f);

       items_1.setDetail("ThinkPadT430联想笔记本电脑!");

 

       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 modelAndView =new ModelAndView();

 

      // 填充数据

       modelAndView.addObject("itemsList", itemsList);

      // 视图

       modelAndView.setViewName("order/itemsList");

 

      return modelAndView;

    }

 

}

 

1.17.2             组件扫描器

         使用组件扫描器省去在spring容器配置每个controller类的繁琐。使用<context:component-scan自动扫描标记@controller的控制器类,配置如下:

 

<!--扫描controller注解,多个包中间使用半角逗号分隔 -->

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

 

 

1.17.3             RequestMappingHandlerMapping

         注解式处理器映射器,对类中标记@ResquestMapping的方法进行映射,根据ResquestMapping定义的url匹配ResquestMapping标记的方法,匹配成功返回HandlerMethod对象给前端控制器,HandlerMethod对象中封装url对应的方法Method。

 

从spring3.1版本开始,废除了DefaultAnnotationHandlerMapping的使用,推荐使用RequestMappingHandlerMapping完成注解式处理器映射。

 

配置如下:

 

<!--注解映射器 -->

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

  

 

注解描述:

@RequestMapping定义请求url到处理器功能方法的映射

 

 

1.17.4             RequestMappingHandlerAdapter

注解式处理器适配器,对标记@ResquestMapping的方法进行适配。

 

从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用RequestMappingHandlerAdapter完成注解式处理器适配。

 

配置如下:

<!--注解适配器 -->

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

 

1.17.5             <mvc:annotation-driven>

springmvc使用<mvc:annotation-driven>自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter,可用在springmvc.xml配置文件中使用<mvc:annotation-driven>替代注解处理器和适配器的配置。

 

1.18       springmvc处理流程源码分析

 

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

2.        DispatherServlet调用HandlerMapping(处理器映射器)根据url查找Handler

     

3.        DispatherServlet调用HandlerAdapter(处理器适配器)对HandlerMapping找到Handler进行包装、执行。HandlerAdapter执行Handler完成后,返回了一个ModleAndView(springmvc封装对象)

 

           DispatherServlet找一个合适的适配器:

   

           适配器执行Hanlder

       

4.        DispatherServlet拿着ModelAndView调用ViewResolver(视图解析器)进行视图解析,解析完成后返回一个View(很多不同视图类型的View)

 

视图解析:


5.        DispatcherServlet进行视图渲染,将Model中数据放到request域,在页面展示


将model数据放在request域:

 


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 实木床一动就响怎么办 cad图纸是斜的怎么办 老房子土墙腻子老掉怎么办 生完孩子子宫大怎么办 刚开的店没人怎么办 刚开业的店没人怎么办 美容店没人进店怎么办 新店开业招不到营业员怎么办 无意开通了花呗怎么办? 花呗灰色用不了怎么办 花呗逾期用不了怎么办 店铺花呗关闭了怎么办 花呗无法使用了怎么办 借呗自动关闭了怎么办 蚂蚁花呗无法开通怎么办 花呗本月还不了怎么办 蚂蚁借呗没钱还怎么办 淘宝账号被限制登录怎么办 辱骂买家被投诉骚扰怎么办 淘宝卖家骚扰买家怎么办 被淘宝卖家电话骚扰怎么办 闲鱼卖东西买家退货运费怎么办 淘宝被恶意拍单怎么办 炒作信用度评价被删除怎么办 删除淘宝评价之后卖家不返现怎么办 美团客户给差评怎么办 淘宝卖家评价差怎么办 淘宝卖家发货未揽收怎么办 周不过5我超过了怎么办 淘宝申请退款后卖家不确认怎么办 淘宝直通车b类扣12分怎么办 淘宝店铺被买家投诉怎么办 淘宝店铺遭买家投诉怎么办 淘宝店铺被买家恶意投诉怎么办 苹果手机无法识别指纹怎么办 淘宝店铺虚假交易违规怎么办 斗鱼直播太卡怎么办 神笔添加视频尺码不符合怎么办 闲鱼卖家单号填错了怎么办 户户通没有信号强度怎么办 全民k歌qq登不上怎么办