MVC入门想法

来源:互联网 发布:c语言中short什么意思 编辑:程序博客网 时间:2024/06/03 05:30

1.SpingMVC框架

1.1什么是SpringMVC

Springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。

springmvc是一个基于mvc的web框架。取代了Struts2。


1.2 MVC在B/S系统下的应用

mvc是一个设计模式,mvc在b/s系统 下的应用:




1.3 SpingMVC框架执行过程



第一步:发起请求到前端控制器(DispatcherServlet)


第二步:前端控制器请求HandlerMapping查找 Handler

可以根据xml配置、注解进行查找


第三步:处理器映射器HandlerMapping向前端控制器返回Handler


第四步:前端控制器调用处理器适配器去执行Handler


第五步:处理器适配器去执行Handler


第六步:Handler执行完成给适配器返回ModelAndView


第七步:处理器适配器向前端控制器返回ModelAndView

ModelAndView是springmvc框架的一个底层对象,包括 Model和view


第八步:前端控制器请求视图解析器去进行视图解析

根据逻辑视图名解析成真正的视图(jsp)


第九步:视图解析器向前端控制器返回View


第十步:前端控制器进行视图渲染

视图渲染将模型数据(在ModelAndView对象中)填充到request域


第十一步:前端控制器向用户响应结果


组件:


1、前端控制器DispatcherServlet(不需要程序员开发)

作用接收请求,响应结果,相当于转发器,中央处理器。

有了DispatcherServlet减少了其它组件之间的耦合度。

 

2、处理器映射器HandlerMapping(不需要程序员开发)

作用:根据请求的url查找Handler

 

 

3、处理器适配器HandlerAdapter

作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler

 

4、处理器Handler(需要程序员开发)

注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler

 

5、视图解析器View resolver(不需要程序员开发)

作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)

 

6、视图View(需要程序员开发jsp)

View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf...)


2.入门程序

2.1需求


以案例作为驱动。

springmvc和mybaits使用一个案例(商品订单管理)。

 

功能需求:商品列表查询


2.2环境准备

数据库环境:MySQL 5.5

Java环境:

jdk1.8

eclipse Neon


springmvc版本:spring3.2

 

需要spring3.2所有jar(一定包括spring-webmvc-3.2.0.RELEASE.jar


2.3配置前端控制器

在web.xml中配置前端控制器。

[html] view plain copy
  1. <!-- Springmvc前端控制器 -->  
  2.   <servlet>  
  3.   <servlet-name>springmvc</servlet-name>  
  4.   <servlet-class>org.springframework.web.servlet.DispatcherServlet.class</servlet-class>  
  5.   <!-- contextConfigLocation配置springmvc加载的配置文件(配置处理器映射器、适配器等)  
  6.        如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet 名称-servlet.xml(springmvc-servlet.xml)  
  7.    -->  
  8.   <init-param>  
  9.   <param-name>contextConfigLocation</param-name>  
  10.   <param-value>classpath:springmvc.xml</param-value>  
  11.   </init-param>  
  12.     
  13.   </servlet>  
  14.     
  15.   <servlet-mapping>  
  16.   <servlet-name>springmvc</servlet-name>  
  17.   <!--   
  18.    第一种:*.action访问以.action结尾由DispatcherServlet进行解析  
  19.   第二种:/,所有访问的地址都由DispatcherServlet进行解析,对于静态的文件解析,需要配置不让DispatcherServlet进行解析  
  20.   使用此种方法可以实现RESTful风格的URL  
  21.   第三种:/*,这样配置不对,最终要转发到一个jsp页面时,仍然会由DispatcherServlet解析jsp,不能根据jsp页面找到handler,会报错  
  22.    -->  
  23.   <url-pattern></url-pattern>  
  24.   </servlet-mapping>  

2.4配置处理器适配器

classpath下的springmvc.xml中配置处理器适配器。

我们查看HandlerAdapter的源码,不难发现


此适配器能执行实现controller接口的Handler


我们向controller追溯

[java] view plain copy
  1. public interface Controller {  
  2.   
  3.     /** 
  4.      * Process the request and return a ModelAndView object which the DispatcherServlet 
  5.      * will render. A <code>null</code> return value is not an error: It indicates that 
  6.      * this object completed request processing itself, thus there is no ModelAndView 
  7.      * to render. 
  8.      * @param request current HTTP request 
  9.      * @param response current HTTP response 
  10.      * @return a ModelAndView to render, or <code>null</code> if handled directly 
  11.      * @throws Exception in case of errors 
  12.      */  
  13.     ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;  
  14.   
  15. }  


所以根据源码给我们的启示,我们开始编写Handler


2.5 开发Handler

需要实现 controller接口,才能由org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter适配器执行。


[java] view plain copy
  1. /** 
  2.  * 实现controller接口的处理器 
  3.  * @author Keo.Zhao 
  4.  * 
  5.  */  
  6. public  class ItemsController implements Controller{  
  7.   
  8.       
  9.     @Override  
  10.     public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {  
  11.         // 调用service查找数据库,查询商品列表,这里使用静态数据模拟  
  12.           
  13.         List<Items> itemsList = new ArrayList<Items>();  
  14.         // 向list中填充静态数据  
  15.   
  16.         Items items_1 = new Items();  
  17.         items_1.setName("联想笔记本");  
  18.         items_1.setPrice(6000f);  
  19.         items_1.setDetail("ThinkPad S5 联想笔记本电脑!");  
  20.   
  21.         Items items_2 = new Items();  
  22.         items_2.setName("苹果手机");  
  23.         items_2.setPrice(5000f);  
  24.         items_2.setDetail("iphone7苹果手机!");  
  25.   
  26.         itemsList.add(items_1);  
  27.         itemsList.add(items_2);  
  28.           
  29.         //返回ModelAndView  
  30.         ModelAndView modelAndView = new ModelAndView();  
  31.         //相当于request的setAttribute方法  
  32.         modelAndView.addObject("itemsList", itemsList);  
  33.         //指定视图  
  34.         modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.sjp");  
  35.         return modelAndView;  
  36.     }  
  37.   
  38.       
  39. }  

2.6视图的编写

[html] view plain copy
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>  
  4. <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>  
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  6. <html>  
  7. <head>  
  8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  9. <title>查询商品列表</title>  
  10. </head>  
  11. <body>   
  12. <form action="${pageContext.request.contextPath }/item/queryItem.action" method="post">  
  13. 查询条件:  
  14. <table width="100%" border=1>  
  15. <tr>  
  16. <td><input type="submit" value="查询"/></td>  
  17. </tr>  
  18. </table>  
  19. 商品列表:  
  20. <table width="100%" border=1>  
  21. <tr>  
  22.     <td>商品名称</td>  
  23.     <td>商品价格</td>  
  24.     <td>生产日期</td>  
  25.     <td>商品描述</td>  
  26.     <td>操作</td>  
  27. </tr>  
  28. <c:forEach items="${itemsList }" var="item">  
  29. <tr>  
  30.     <td>${item.name }</td>  
  31.     <td>${item.price }</td>  
  32.     <td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>  
  33.     <td>${item.detail }</td>  
  34.       
  35.     <td><a href="${pageContext.request.contextPath }/items/editItems.action?id=${item.id}">修改</a></td>  
  36.   
  37. </tr>  
  38. </c:forEach>  
  39.   
  40. </table>  
  41. </form>  
  42. </body>  
  43.   
  44. </html>  

2.7配置Handler和处理器映射器

将编写Handler在spring容器加载。


在classpath下的springmvc.xml中配置处理器映射器


[html] view plain copy
  1.    <!-- 配置handler -->  
  2.      <bean name="/queryItems.action" class="cn.ssm.controller.ItemsController"/>  
  3.     <!-- 处理器映射器   
  4.         将bean的name作为url进行查找,需要在配置Handler指定beanname(就是url)  
  5.     -->  
  6.     <bean  
  7.         class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />  

2.8配置视图解析器

需要配置解析jsp的视图解析器


[html] view plain copy
  1. <!-- 视图解析器   
  2.          解析jsp,默认使用jstl标签,classpath下得有jstl的包  
  3.     -->  
  4.     <bean   
  5.         class="org.springframework.web.servlet.view.InternalResourceViewResolver">  


看一下整体的spingmvc配置文件

[html] view plain copy
  1. <beans xmlns="http://www.springframework.org/schema/beans"  
  2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"  
  3.     xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  6.         http://www.springframework.org/schema/beans/spring-beans-3.2.xsd   
  7.         http://www.springframework.org/schema/mvc   
  8.         http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd   
  9.         http://www.springframework.org/schema/context   
  10.         http://www.springframework.org/schema/context/spring-context-3.2.xsd   
  11.         http://www.springframework.org/schema/aop   
  12.         http://www.springframework.org/schema/aop/spring-aop-3.2.xsd   
  13.         http://www.springframework.org/schema/tx   
  14.         http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">  
  15.   
  16.      <!-- 配置handler -->  
  17.      <bean name="/queryItems.action" class="cn.ssm.controller.ItemsController"/>  
  18.     <!-- 处理器映射器   
  19.         将bean的name作为url进行查找,需要在配置Handler指定beanname(就是url)  
  20.     -->  
  21.     <bean  
  22.         class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />  
  23.     <!-- 处理器适配器  
  24.          所有的处理器适配器都实现了HandlerAdapter  
  25.      -->  
  26.     <bean   
  27.         class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>  
  28.     <!-- 视图解析器   
  29.          解析jsp,默认使用jstl标签,classpath下得有jstl的包  
  30.     -->  
  31.     <bean   
  32.         class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>  
  33.     </beans>  


3.非注解的处理器映射器和适配器

3.1 非注解的处理器映射器

[html] view plain copy
  1. <!--简单url映射  -->  
  2. <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
  3.     <property name="mappings">  
  4.         <props>  
  5.             <!-- 对itemsController1进行url映射,url是/queryItems1.action -->  
  6.             <prop key="/queryItems1.action">itemsController1</prop>  
  7.             <prop key="/queryItems2.action">itemsController1</prop>  
  8.             <prop key="/queryItems3.action">itemsController2</prop>  
  9.         </props>  
  10.     </property>  
  11. </bean>  


处理器映射器:

org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping


另一个映射器:

org.springframework.web.servlet.handler.SimpleUrlHandlerMapping


结论:多个映射器可以并存,前端控制器判断url能让哪些映射器映射,就让正确的映射器处理。

0 0
原创粉丝点击