spring MVC体系结构和请求控制器

 MVC处理过程

spring MVC架构模式都进行了分层设计如下

  • 数据访问接口:DAO层
  • 处理业务逻辑层:service层
  • 数据实体:POJO
  • 负责前端请求的接受并处理:servlet
  • 负责前端页面展示:JSP

  这种框架就是MVC设计模式,它是软件工程中的一种软件架构模式。它强制性地使软件系统的输入,处理和输出分开,把软件系统分为基本三个部分:

  1. 模型(model):模型对象拥有最多的处理任务,是应用程序的主题部分,它负责数据逻辑(业务规则)的处理和实现数据操作(即在数据库中存取数据)。对应组件:JavaBean
  2. 视图(view):负责格式化数据并把它们呈现给用户,包括数据展示,用户交互,数据验证,界面设计等功能。对应组件:JSP或者HTML文件
  3. 控制器(controller) :负责接收并转发请求,对请求进行处理指派视图并将响应结果发送到客户端。对应组件:servlet

MVC的优缺点

  1. 优点
    1. 多视图共享一个模型,大大提高代码的可重用性
    2. MVC三个模块相互独立,松耦合架构
    3. 控制器提高了应用程序的灵活和可配置性
    4. 有利于软件工程化管理
  2. 缺点
    1. 原理复杂
    2. 增加了系统结构和实现的复杂性
    3. 视图对模型数据的低效率访问

  对于MVC来说,它并不适合小型甚至中型规模的项目,花费大量时间将MVC应用到规模并不是很大的应用程序通常得不偿失,所以要根据应用场景来决定

总之,MVC的设计模式最终可以打造出一个松耦合+高重用性+高可适用性的完美架构,当然这也是架构设计的目标之一。

spring MVC框架介绍

   spring MVC是spring中用于web应用开发的一个模块,是spring提供额一个基于mvc设计模式的优秀web开发框架,它本质上相当于servlet。在MVC设计模式中

spring MVC作为控制器来建立模型与视图的数据交互,可称为一个典型的MVC框架,如下图

   在spring mvc 框架中,controller替换servlet来负责控制器的职责,controller接受请求,调用相应的model进行处理,处理器完成业务处理后返回处理结果。

controller调用相应的view并对处理进行视图渲染,最终客户端得到响应消息。由于spring mvc的结构较为复杂,上述只是对其框架结构的一个简单介绍。下面

我们将搭建spring mvc环境,并实现简单的例子来体验spring mvc是如何使用的。

spring MVC环境搭建

在新建web Project后,搭建步骤如下:

  1. 引入jar文件
  2. spring MVC配置:
    1. 在web.xml中配置servlet,定义DispatcherServlet
    2. 创建Spring MVC的配置文件
  3. 创建controller(处理请求的控制器)
  4. 创建view
  5. 部署运行

所需的jar文件如图(log4J可以无视):

web.xml中配置servlet

  Spring MVC是基于servlet的,dispatcherServlet是整个spring mvc框架的核心,它负责截获请求并将其分派给相应的处理器处理,那么必须配置时,

首先就要进行dispatcherServlet的配置,web.xml中配置关键代码如下:

 <!-- 配置spring mvc的核心控制器DispatcherServlet  -->
  <servlet>
      <servlet-name>srpingmvc</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!-- 初始化参数通过 DipatcherServlet 获取到初始化参数  -->
      <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:spring-servlet.xml</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
      <servlet-name>srpingmvc</servlet-name>
      <!-- 注意这里我这里是懒得改了,此拦截路径最好不要使用 / 因为它会把所有请求拦截 最好是 *.啥  比如:*.do 就会拦截以 .do结尾的请求 -->
      <url-pattern>/</url-pattern>
  </servlet-mapping>

注意最好避免使用 / 如果使用那么很有可能你在引用外部文件的时候会出问题 如下

这个请求会被拦截导致404从而使用不了js,但是路径又没问题。所以注意了 最好避免使用  /

创建sprig MVC配置文件

<?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:aop="http://www.springframework.org/schema/aop" 
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx"  
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-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/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-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 ">
    <!-- 配置映射 自动扫描 cn包下面所有控制器(包括子包) -->
    <context:component-scan base-package="cn.controller"></context:component-scan>
    <!-- 与返回出的值添加 前后缀 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

创建控制器

package cn.controller;

import java.util.Map;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("/user")     //要求路径前必须加上 user 比如要求路径是 index就需要写成 user/index
public class IndexController {
    private Logger logger = Logger.getLogger(IndexController.class);   
    //表示方法与那个请求URL对应(此处:”/index“)
    @RequestMapping("/index")
    public String index() {
        logger.info("hello,springMVC!");
        return "index";
    }

}

测试运行

 在web-INF下面建立一个index.jsp页面(直接运行会404),在浏览器中输入 http://localhost:8080/SpringMVC/user/index.html 即可

参数传递

那么如果要传入参数又该如何呢?只需添加上参数即可如下

@RequestMapping("/index")
    public String index(String name) {
        logger.info("hello,springMVC!:"+name);
        return "index";
    }

传入的名称需要与参数名称相同如下

如果直接使用get方法进行访问那么获取 index()方法获取的中文将会是乱码。也可以指定访问方式如下

@RequestMapping(value= {"/index"},method=RequestMethod.POST)
    public String index(String name) {
        logger.info("hello,springMVC!:"+name);
        return "index";
    }

访问结果如下说不能使用get方式进行访问

参数的类型有很多,如果你想使用某个sqlsession,或者request都可以添加进去,当然这些参数不需要手动的传入。

那么接受的参数又如何传递给页面呢?如下添加Model

  @RequestMapping(value= {"/index"})
    public String index(String name,Model model) {
        logger.info("hello,springMVC!:"+name);
        name="张三";
        //保存 数据
        model.addAttribute("name", name);
        return "index";
    }

jsp页面代码如下

<body>
    <h1>hell springMVC</h1>
    <h1>userName-->${name}</h1>
</body>

如果需要传递的参数对象呢?如下

@RequestMapping(value= {"/index"})
    public String index(String name,Map<String, User> uList,Model model) {
        logger.info("hello,springMVC!:"+name);
        name="张三";
        User u = new User();
        u.setName("二狗子");
        //保存 数据
        model.addAttribute("name", name);
        model.addAttribute("username", u);
        model.addAttribute(u);  //如果不给名称 默认访问名称为 user
        uList.put("u", u);
        return "index";
    }

页面代码

<body>
    <h1>hell springMVC</h1>
    <h1>usernameName-->${username.name}</h1>
    <h1>mapU-->${u.name}</h1>
    <h1>User-->${user.name}</h1>
</body>

如果还是不会可以去网盘下载我演示的项目:

链接:https://pan.baidu.com/s/1oYjZW0fpqXKcI3WXfIezxA
提取码:fdle

不会导入项目的可以去这里:https://www.cnblogs.com/hfx123/p/9745826.html

原文地址:https://www.cnblogs.com/hfx123/p/9718227.html