zoukankan      html  css  js  c++  java
  • 【从零开始学SpringMVC笔记】SpringMVC入门

    Springmvc是什么

    Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来,如下图:

    Springmvc处理流程

    如下图所示:

    入门程序

    需求:使用浏览器显示商品列表

    创建web工程

    springMVC是表现层框架,需要搭建web工程开发。
    如下图创建动态web工程:

    导入jar包

    加入配置文件

    1. 创建springmvc.xml

    创建SpringMVC的核心配置文件
    SpringMVC本身就是Spring的子项目,对Spring兼容性很好,不需要做很多配置。
    这里只配置一个Controller扫描就可以了,让Spring对页面控制层Controller进行管理。

    <?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:p="http://www.springframework.org/schema/p"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xmlns:mvc="http://www.springframework.org/schema/mvc"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    
    	<!-- 配置controller扫描包 -->
    	<context:component-scan base-package="com.tyust.springmvc.controller" />
    
    </beans>
    
    1. 创建包com.tyust.springmvc.controller

    2. 配置前端控制器
      配置SpringMVC的前端控制器DispatcherServlet
      在web.xml中

    <!-- 配置SpringMVC前端控制器 -->
    	<servlet>
    		<servlet-name>springmvc</servlet-name>
    		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    		<!-- 指定SpringMVC配置文件 -->
    		<!-- SpringMVC的配置文件的默认路径是/WEB-INF/${servlet-name}-servlet.xml -->
    		<init-param>
    			<param-name>contextConfigLocation</param-name>
    			<param-value>classpath:springmvc.xml</param-value>
    		</init-param>
    	</servlet>
    
    	<servlet-mapping>
    		<servlet-name>springmvc</servlet-name>
    		<!-- 设置所有以action结尾的请求进入SpringMVC -->
    		<url-pattern>*.action</url-pattern>
    	</servlet-mapping>
    
    1. /* 拦截所有.jsp、.js、.png和.css
      真的全拦截(建议不使用)
    2. *.action*.do拦截以do、action结尾的请求
      肯定能使用(ERP)
    3. /拦截所有(不包括jsp) (包含.js、.png、.css)
      强烈建议使用(前台、面向消费者)
      /jd. com/search/ ======对静态资源放行

    加入jsp页面

    把参考资料中的itemList.jsp复制到工程的/WEB-INF/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"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>查询商品列表</title>
    </head>
    <body>
    	<form
    		action="${pageContext.request.contextPath }/item/queryitem.action"
    		method="post">
    		查询条件:
    		<table width="100%" border=1>
    			<tr>
    				<td><input type="submit" value="查询" /></td>
    			</tr>
    		</table>
    		商品列表:
    		<table width="100%" border=1>
    			<tr>
    				<td>商品名称</td>
    				<td>商品价格</td>
    				<td>生产日期</td>
    				<td>商品描述</td>
    				<td>操作</td>
    			</tr>
    			<c:forEach items="${itemList }" var="item">
    				<tr>
    					<td>${item.name }</td>
    					<td>${item.price }</td>
    					<td><fmt:formatDate value="${item.createtime}"
    							pattern="yyyy-MM-dd HH:mm:ss" /></td>
    					<td>${item.detail }</td>
    
    					<td><a
    						href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>
    
    				</tr>
    			</c:forEach>
    
    		</table>
    	</form>
    </body>
    
    </html>
    

    实现显示商品列表页

    1. 创建pojo
      分析页面,查看页面需要的数据,创建商品pojo
    public class Item {
    
    	// 商品id
    	private int id;
    	// 商品名称
    	private String name;
    	// 商品价格
    	private double price;
    	// 商品创建时间
    	private Date createtime;
    	// 商品描述
    	private String detail;
    
    	public int getId() {
    		return id;
    	}
    
    	public void setId(int id) {
    		this.id = id;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public double getPrice() {
    		return price;
    	}
    
    	public void setPrice(double price) {
    		this.price = price;
    	}
    
    	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;
    	}
    
    	@Override
    	public String toString() {
    		return "Item [id=" + id + ", name=" + name + ", price=" + price + ", detail=" + detail + "]";
    	}
    
    	public Item(int id, String name, double price, Date createtime, String detail) {
    		super();
    		this.id = id;
    		this.name = name;
    		this.price = price;
    		this.createtime = createtime;
    		this.detail = detail;
    	}
    
    }
    
    1. 创建ItemController
      ItemController是一个普通的java类,不需要实现任何接口。
      需要在类上添加@Controller注解,把Controller交由Spring管理
      在方法上面添加@RequestMapping注解,里面指定请求的url。其中“.action”可以加也可以不加。
    @Controller
    public class ItemController {
    
    	// @RequestMapping:里面放的是请求的url,和用户请求的url进行匹配
    	// action可以写也可以不写
    	@RequestMapping(value = "/itemList.action")
    	public ModelAndView queryItemList() {
    		// 创建页面需要显示的商品数据
    		List<Item> list = new ArrayList<>();
    		list.add(new Item(1, "1华为 荣耀8", 2399, new Date(), "质量好!1"));
    		list.add(new Item(2, "2华为 荣耀8", 2399, new Date(), "质量好!2"));
    		list.add(new Item(3, "3华为 荣耀8", 2399, new Date(), "质量好!3"));
    		list.add(new Item(4, "4华为 荣耀8", 2399, new Date(), "质量好!4"));
    		list.add(new Item(5, "5华为 荣耀8", 2399, new Date(), "质量好!5"));
    		list.add(new Item(6, "6华为 荣耀8", 2399, new Date(), "质量好!6"));
    
    		// 创建ModelAndView,用来存放数据和视图
    		ModelAndView modelAndView = new ModelAndView();
    		// 设置数据到模型中
    		modelAndView.addObject("itemList", list);
    		// 设置视图jsp,需要设置视图的物理地址
    		modelAndView.setViewName("WEB-INF/jsp/itemList.jsp");
    
    		return modelAndView;
    	}
    }
    

    启动项目测试

    启动项目,浏览器访问地址
    http://localhost:8080/springmvcday01/itemList.action

    Springmvc架构

    框架结构

    框架结构如下图:

    架构流程

    1、用户发送请求至前端控制器DispatcherServlet
    2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
    3、处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
    4、DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
    5、执行处理器(Controller,也叫后端控制器)。
    6、Controller执行完成返回ModelAndView
    7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
    8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器
    9、ViewReslover解析后返回具体View
    10、 DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
    11、 DispatcherServlet响应用户

    组件说明

    以下组件通常使用框架提供实现:

    • DispatcherServlet:前端控制器

    用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

    • $color{blue}{HandlerMapping:处理器映射器}$

    HandlerMapping负责根据用户请求url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

    • $color{green}{Handler:处理器}$

    Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
    $color{red}{由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。}$

    • $color{blue}{HandlAdapter:处理器适配器}$

    通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

    • $color{blue}{ViewResolver:视图解析器}$

    View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。

    • $color{green}{View:视图}$

    springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。
    $color{red}{一般情况下需要通过页面标签或页面模版技术将模型数据通
    过页面展示给用户,需要由 }$
    $color{red}{程序员根据业务需求开发具体的页面。}$

    说明:在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。
    需要用户开发的组件有handler、view

    默认加载的组件

    我们没有做任何配置,就可以使用这些组件
    因为框架已经默认加载这些组件了,配置文件位置如下图:

    # Default implementation classes for DispatcherServlet's strategy interfaces.
    
    # Used as fallback when no matching beans are found in the DispatcherServlet context.
    
    # Not meant to be customized by application developers.
    
    org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
    
    org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver
    
    org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,
    
    org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
    
    org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,
    
    org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,
    
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
    
    org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,
    
    org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,
    
    org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
    
    org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
    
    org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
    
    org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
    

    组件扫描器

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

    <!-- 配置controller扫描包,多个包之间用,分隔 -->
    <context:component-scan  base-package="cn.itcast.springmvc.controller"  />
    

    注解映射器和适配器

    配置处理器映射器

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

    HandlerMethod对象中封装url对应的方法Method。

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

    在springmvc.xml配置文件中配置如下:

    <!-- 配置处理器映射器 -->
    
    <bean
    class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"  />
    

    注解描述:

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

    配置处理器适配器

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

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

    在springmvc.xml配置文件中配置如下:

    <!-- 配置处理器适配器 -->
    
    <bean
    
    class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"  />
    

    注解驱动

    直接配置处理器映射器和处理器适配器比较麻烦,可以使用注解驱动来加载。

    SpringMVC使用mvc:annotation-driven自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter

    可以在springmvc.xml配置文件中使用mvc:annotation-driven替代注解处理器和适配器的配置。

    <!-- 注解驱动 -->
    
    <mvc:annotation-driven />
    

    视图解析器

    视图解析器使用SpringMVC框架默认的InternalResourceViewResolver,这个视图解析器支持JSP视图解析

    在springmvc.xml配置文件中配置如下:

    	<!-- Example: prefix="/WEB-INF/jsp/", suffix=".jsp", viewname="test" -> 
    		"/WEB-INF/jsp/test.jsp" -->
    	<!-- 配置视图解析器 -->
    	<bean
    		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    		<!-- 配置逻辑视图的前缀 -->
    		<property name="prefix" value="/WEB-INF/jsp/" />
    		<!-- 配置逻辑视图的后缀 -->
    		<property name="suffix" value=".jsp" />
    	</bean>
    
    

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

    最终jsp物理地址:前缀+逻辑视图名+后缀

    修改ItemController

    修改ItemController中设置视图的代码

    	// 设置视图jsp,需要设置视图的物理地址
    	// modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp");
    	// 配置好视图解析器前缀和后缀,这里只需要设置逻辑视图就可以了。
    	// 视图解析器根据前缀+逻辑视图名+后缀拼接出来物理路径
    	modelAndView.setViewName("itemList");
    
    	return modelAndView;
    }
    
  • 相关阅读:
    稳扎稳打Silverlight(13) 2.0交互之鼠标事件和键盘事件
    稳扎稳打Silverlight(17) 2.0数据之详解DataGrid, 绑定数据到ListBox
    再接再厉VS 2008 sp1 + .NET 3.5 sp1(2) Entity Framework(实体框架)之详解 Linq To Entities 之一
    稳扎稳打Silverlight(8) 2.0图形之基类System.Windows.Shapes.Shape
    稳扎稳打Silverlight(11) 2.0动画之ColorAnimation, DoubleAnimation, PointAnimation, 内插关键帧动画
    稳扎稳打Silverlight(21) 2.0通信之WebRequest和WebResponse, 对指定的URI发出请求以及接收响应
    稳扎稳打Silverlight(16) 2.0数据之独立存储(Isolated Storage)
    稳扎稳打Silverlight(9) 2.0画笔之SolidColorBrush, ImageBrush, VideoBrush, LinearGradientBrush, RadialGradientBrush
    稳扎稳打Silverlight(23) 2.0通信之调用WCF的双向通信(Duplex Service)
    游戏人生Silverlight(1) 七彩俄罗斯方块[Silverlight 2.0(c#)]
  • 原文地址:https://www.cnblogs.com/zllk/p/12793163.html
Copyright © 2011-2022 走看看