一:springmvc 的角色定位就是web层,也就是表现层,接收前端请求,将请求参数传递给service的spring,再由spring传递给dao层的mybatis,将处理的结果在原路返回给springmvc,进行数据的处理和页面的渲染,返回给用户。
二、入门
1)导入jar包:
需要导入:spring-web和spring-webmvc2个jar包。
2、创建jsp页面,我们做一个简单的商品页面itemList.jsp
注意:isELIgnored="false" 设置,否则页面的el表达式无法识别。还有pageEncoding="UTF-8" 编码的设定
1 <%-- 2 Created by IntelliJ IDEA. 3 User: liumeide 4 Date: 2018/4/29 5 Time: 16:46 6 To change this template use File | Settings | File Templates. 7 --%> 8 <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" pageEncoding="UTF-8" %> 9 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 10 <html> 11 <head> 12 <title>商品列表</title> 13 </head> 14 <body> 15 16 <table style="border: black solid 1px"> 17 <thead> 18 <th>商品编号</th> 19 <th>商品名称</th> 20 <th>商品价格</th> 21 </thead> 22 <tbody> 23 <c:forEach items="${items}" var="n" > 24 <tr> 25 <td>${n.num}</td> 26 <td>${n.name}</td> 27 <td>${n.price}</td> 28 </tr> 29 </c:forEach> 30 </tbody> 31 </table> 32 33 </body> 34 </html>
3、创建controller类:
1 package jd.com.controller; 2 3 4 5 /* 6 采用注解方式进行书写 7 1)首先类需要@Controller注解 表明这是一个Controller类 8 */ 9 import jd.com.projo.goods; 10 import org.springframework.stereotype.Controller; 11 import org.springframework.web.bind.annotation.RequestMapping; 12 import org.springframework.web.servlet.ModelAndView; 13 14 import java.util.ArrayList; 15 import java.util.List; 16 17 @Controller 18 public class itemLsitController { 19 20 // 使用注解RequestMapping 声明访问的url。 21 @RequestMapping("/list") 22 public ModelAndView itemList(){ 23 /* 24 @param:无 25 @return:返回值是ModelAndView 视图处理器对象 26 */ 27 List<goods> itemsList=new ArrayList<>(); 28 goods good=new goods(); 29 for (Integer i=0;i<5;i++){ 30 good.setName("iphone"+i); 31 good.setNum(1112211+i); 32 good.setPrice(22+i); 33 itemsList.add(good); 34 } 35 //返回数据需要用到视图处理器。 36 ModelAndView modelAndView =new ModelAndView(); 37 //封装数据 38 modelAndView.addObject("itemsLIst",itemsList); 39 //填写网页资源 40 modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp"); 41 return modelAndView; 42 } 43 }
4、配置文件配置:springmvc.xml
添加约束我使用的官方的约束:https://docs.spring.io/spring-framework/docs/4.2.4.RELEASE/spring-framework-reference/html/mvc.html
1)开启注解扫----自动到我们指定的包位置查找我们的controller类。
1 <context:component-scan base-package="jd.com.controller" />
2)开启注解驱动:---指定注解的处理器适配器和处理器映射器。
1 <mvc:annotation-driven />
开启目的:默认情况会根据配置文件C:org/springframework/web/servlet/DispatcherServlet.properties。进行查找我们对应的使用的处理器适配器和处理器映射器。这种方式不是高效的做法。
导入方式:这种方式不能保证我们导入的处理器映射器和处理器适配器的类是最新根据上面的配置文件导入的是已经遗弃的类。
查找最新的:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter和org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping但并不能保证以后升级之后这2个类还是最新的。
所以springmvc为我们提供了注解驱动:<mvc:annotation-driven /> 自动帮我们导入最新的处理器映射器和处理器适配器。
3)配置视图解析器。
prefix:url前缀。
suffix:扩展名称。或者后缀。
1 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 2 <property name="prefix" value="/WEB-INF/jsp/" /> 3 <property name="suffix" value=".jsp" /> 4 </bean>
因为我们在写controller类的时候 返回modelAndView对象的时候,需要我们写对应的页面的资源。配置如上配置之后,我们不需要在配置其他,只需要在controller类中配置页面名称(不包含扩展名称。)
springmvc.xml完整配置:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:p="http://www.springframework.org/schema/p" 5 xmlns:context="http://www.springframework.org/schema/context" 6 xmlns:mvc="http://www.springframework.org/schema/mvc" 7 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 8 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd 9 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd 10 "> 11 12 13 <!--开启注解扫描--> 14 15 <context:component-scan base-package="jd.com.controller"/> 16 <!--开启注解驱动--> 17 <!--这个标签自动加载我们最新的注解的处理器映射器、处理器适配器 18 好处:默认情况会根据配置文件C:org/springframework/web/servlet/DispatcherServlet.properties 19 进行查找我们对应的使用的处理器适配器和处理器映射器。这种方式不是高效的做法。但是我们不推荐使用这种方式: 20 <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/> 21 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/> 22 这种不是最新的处理器映射器和处理器适配器。我们可以查看源码 最新的: 23 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter 24 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping 25 如果以后更新版本的话,有可能也不是最新的所以使用注解驱动,自动加载最新的是处理器映射器和处理器适配器 26 --> 27 <!--<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>--> 28 <!--<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>--> 29 <!--开启注解驱动--> 30 <mvc:annotation-driven/> 31 <!--开启视图处理器 32 默认是处理jsp 33 --> 34 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 35 <property name="prefix" value="WEB-INF/jsp/"/> 36 <property name="suffix" value=".jsp"/> 37 </bean> 38 39 </beans>
5、配置前端控制器(web,xml)
1 <!DOCTYPE web-app PUBLIC 2 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 3 "http://java.sun.com/dtd/web-app_2_3.dtd" > 4 5 6 7 <web-app> 8 <servlet> 9 <servlet-name>dispatcher</servlet-name> 10 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 11 <!--启动加载配置文件。--> 12 <init-param> 13 <param-name>contextConfigLocation</param-name> 14 <param-value>classpath:springmvc.xml</param-value> 15 </init-param> 16 <load-on-startup>1</load-on-startup> 17 </servlet> 18 19 <servlet-mapping> 20 <servlet-name>dispatcher</servlet-name> 21 <url-pattern>*.action</url-pattern> 22 </servlet-mapping> 23 </web-app>
只拦截action结尾的请求。
访问:http://127.0.0.1:8080/list.action
三、springMVC 结构:
说明:
1、首先用户请求到前端控制器dispatchservlet。根据web.xml的配置详情,加载配置文件和前端过滤器dispatchservlet 检查用户的访问的url是否符合前端过滤器的url要求。
2、如果符合前端控制器拦截的url,springmvc会根据配置文件springmvc.xml的内容进行controller的类的扫描,匹配我们的处理器前端处理器,然后匹配到相应的类(@Controller)对应的方法(@ReuqestMapper(url)),返回处理器执行链,执行链中有拦截器,判断该url是否需要拦截
3、不需要拦截直接返回handle给处理器适配器,根绝执行的方式的不同,匹配注解和非注解适配器,进行执行相应的代码, 探后返回(ModelAndView)给视图解析器。
4、视图解析器(View Resolver)负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。