• Spring MVC入门


    一、springMvc简介

       springMvc是一个web层框架;
     

    二、springMvc特点:

    • springMvc拥有强大的灵活性、非侵入性和可配置性;
    • springMvc拥有一个前端控制器DispatcherServlet,开发者无需额外开发控制器对象;
    • springMvc分工明确,包括控制器、验证器、命令对象、模型对象、处理程序映射视图解析,等等,每一个功能实现由一个专门的对象负责完成;
    • springMvc可以自动绑定用户输入,并正确地转换数据类型;
    • springMvc使用一个名称/值的Map对象实现更加灵活的模型数据传输;
    • springMvc内置了常见的校验器,可以验证用户输入,如果校验不通过,则重定向回输入表单,输入校验是可选的,并且支持编程方式及声明方式;
    • springMvc支持国际化,支持根据用户区域显示多国语言,并且国际化的配置很简单;
    • springMvc支持多种视图技术,jsp、Velocity、freeMarker等;
    • spring提供了一个简单而强大的jsp标签库,支持数据绑定功能,使得编写jsp页面更加容易;

    三、springMvc架构的原理

    核心架构的具体流程步骤如下:
      1、首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
      2、DispatcherServlet——>HandlerMapping,HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
      3、DispatcherServlet——>HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
      4、HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名);
      5、ModelAndView的逻辑视图名——> ViewResolver, ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
      6、View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;
      7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。

    四、springMvc入门程序

    步骤:
    • 新建动态web项目;
    • 导入springMvc独立运行必须jar包到lib目录以及需要用到的jsp页面;

    • 在web.xml文件中配置springMvc前端控制器:
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xmlns="http://java.sun.com/xml/ns/javaee"
                   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
      <display-name>springmvc0523</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
      <!-- springMVC前端控制器 -->
      <servlet>
           <servlet-name>springMVC</servlet-name>
              <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
           
           <!-- 指定springMVC核心配置文件 -->
           <init-param>
                  <param-name>contextConfigLocation</param-name>
                  <param-value>classpath:springMVC.xml</param-value>
           </init-param>
           <!-- tomcat启动时就加载这个servlet -->
           <load-on-startup>1</load-on-startup>
           <!-- 如果没有提供springMVC的核心配置文件,就会默认加载/WEB-INF/+  <servlet-name>的名字 + -servlet.xml-->
      </servlet>
      <servlet-mapping>
           <servlet-name>springMVC</servlet-name>
           <url-pattern>*.action</url-pattern>
      </servlet-mapping>
    </web-app>
    • 指定springMvc的核心配置文件springMVC.xml:
    <?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:dubbo="http://code.alibabatech.com/schema/dubbo"
           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://code.alibabatech.com/schema/dubbo
    http://code.alibabatech.com/schema/dubbo/dubbo.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.0.xsd">
           
    
        <context:component-scan base-package="com.hand.controller"/>
    </beans>
    • 创建ItemController

    ItemController是一个普通的java类,不需要实现任何接口,只需要在类上添加@Controller注解即可。@RequestMapping注解指定请求的url,其中“.action”可以加也可以不加。在ModelAndView对象中,将视图设置为“/WEB-INF/jsp/itemList.jsp”

    package com.hand.controller;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    
    import com.hand.pojo.Items;
    
    @Controller
    public class ItemController {
    
        @RequestMapping("/list")
        public ModelAndView itemList() throws Exception{
            ModelAndView modelAndView = new ModelAndView();
    
            List<Items> itemList = new ArrayList<Items>();
    
            // 商品列表
            Items items_1 = new Items();
            items_1.setName("联想笔记本_3");
            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苹果手机!");
    
            itemList.add(items_1);
            itemList.add(items_2);
    
            //封装modelAndView,然后返回
            //model:模型,填入返回的数据
            //view:视图,返回显示页面的地址
            
            modelAndView.addObject("itemList", itemList);
            modelAndView.setViewName("/WEB-INF/itemList.jsp");
            return modelAndView;
        }
    }
    • javaBean(pojo类)
    package com.hand.pojo;
    import java.util.Date;
    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();
        }
    }
    • itemList.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>
    • 运行结果

    五、springMvc三大组件的配置

    三大组件:

    • 处理器映射器HandlerMapping
                  HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
    • 处理器适配器HandlerAdapter
                  通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
    • 视图解析器ViewResoler
                 View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。

    配置组件的好处:

    springMvc框架中,不配置也可以,但是运行速度慢(原因是,默认的DispatcherServlet.propertities配置文件中已经配置,并且三大组件各有多种类型,运行时需要逐一比对类型,然后执行相应组件;配置后直接执行,加快运行速度;
    dispatcheServlet.properties配置文件中,框架默认加载组件

    怎么配置三大组件

    <?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:dubbo="http://code.alibabatech.com/schema/dubbo"
           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://code.alibabatech.com/schema/dubbo
    http://code.alibabatech.com/schema/dubbo/dubbo.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.0.xsd">
           <!-- 配置注解扫描 -->
           <context:component-scan base-package="com.hand.controller"/>
           
           <!-- 配置处理器映射器 -->
           <!-- <bean  class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/> 已经过时-->
           <!-- 配置最新版的注解形式的处理器映射器 -->
           <!-- <bean  class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> -->
           
           <!-- 配置注解形式的处理器适配器 -->
           <!-- <bean  class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>过时 -->
           <!-- 配置最新版的注解形式的处理器适配器 -->
           <!-- <bean  class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> -->
           
           <!-- 注解驱动,作用:加载最新版的注解形式的处理器映射器和处理器适配器 -->
           <mvc:annotation-driven/>
           
           <!-- 配置视图解析器 -->
           <bean  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                  <property name="prefix" value="/WEB-INF/"/>
                  <property name="suffix" value=".jsp"/>
           </bean>
    </beans>

    其他组件

    • DispatcherServlet:前端控制器
             用户请求到达前端控制器,他相当于mvc模式中的c,DispatcherServlet是整个流程控制的中心,由他调用其它组件处理用户的请求,dispatcherServlet的存在降低了各组件之间的耦合性;
    • Handler:处理器
             Handler是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
    • View:视图
             springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。

    六、Spring MVC和Struts不同

    1. springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。
    2. springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
    3. Struts采用值栈存储请求和响应的数据,通过OGNL存取数据,springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。
  • 相关阅读:
    扫描线算法
    [Baltic 2001]Mars Maps
    Lost Cow
    李超线段树
    多种方法求解Pku3468 A Simple Problem with Integers
    陈老师的福利
    leetcode 673. 最长递增子序列的个数
    #10043.「一本通 2.2 例 1」剪花布条
    PTA7-1
    6-1 实验三哈夫曼树 (15分)
  • 原文地址:https://www.cnblogs.com/wly1-6/p/10399452.html
Copyright © 2020-2023  润新知