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

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

1认识springMVC
2搭建环境
3请求处理流程及体系结构
4传参的方式

1认识springMVC
MVC的全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范。它是用一种业务逻辑、数据与界面显示分离的方法来组织代码,将众多的业务逻辑聚集到一个部件里面,在需要改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,达到减少编码的时间。
MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器。
使用的MVC的目的:在于将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如Windows系统资源管理器文件夹内容的显示方式,下面两张图中左边为详细信息显示方式,右边为中等图标显示方式,文件的内容并没有改变,改变的是显示的方式。不管用户使用何种类型的显示方式,文件的内容并没有改变,达到M和V分离的目的。
在这里插入图片描述

在这里插入图片描述
在网页当中,
V即View视图是指用户看到并与之交互的界面。比如由html元素组成的网页界面,或者软件的客户端界面。MVC的好处之一在于它能为应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,它只是作为一种输出数据并允许用户操纵的方式。
M即model模型是指模型表示业务规则。在MVC的三个部件中,模型拥有最多的处理任务。被模型返回的数据是中立的,模型与数据格式无关,这样一个模型能为多个视图提供数据,由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。
C即controller控制器是指控制器接受用户的输入并调用模型和视图去完成用户的需求,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。

2搭建环境

我这里是创建的maven项目,是在上面文档中创建的Mybatis-spring整合的基础上进行的
1下载jar文件并导入工程
spring-web-3.2.13.RELEASE.jar
spring-webmvc-3.2.13.RELEASE.jar
2、配置文件
在web.xml中配置Servlet
创建Spring MVC的配置文件
3、创建Controller-处理请求的控制器
lBeanNameUrlHandlerMapping
4创建view视图
/WEB-INF/jsp/.jsp
5部署运行(Tomcat)

1下载jar文件并导入工程
在我们的pom.xml中添加架包

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.0.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.0.0.RELEASE</version>
</dependency>

2、配置文件

在web.xml中配置Servlet

ApplicationContext-jdbc.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <!--配置登入页面-->
    <welcome-file-list>
        <welcome-file>/WEB-INF/jsp/login.jsp</welcome-file>
    </welcome-file-list>
    <!--配置环境参数,指定sping配置文件的路径-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:ApplicationContext-*.xml</param-value>
    </context-param>
    <!--配置监听器,初始化spring容器-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!--核心控制器的配置DispatchServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--加载Spring MVC的配置文件 使用Spring资源路径方式来进行指定-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!--拦截我们的所有的请求-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

创建Spring MVC的配置文件
springmvc-servlet.xml

关键代码

<!--配置处理器映射-->
<!--<bean name="/index.html" class="cn.smbms.controller.IndexController"></bean>-->
<!--启动注解
配置处理器映射
view-controller(视图器-控制器)
-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--扫描controller 包下所有的注解-->
<context:component-scan base-package="cn.smbms.controller"></context:component-scan>
<!--配置视图解析器
 controller-view(控制器-视图器)
 /WEB-INF/jsp/index.jsp-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/"></property>
    <property name="suffix" value=".jsp"></property>
</bean>

配置spring配置文件

关键代码

<!--使用Spring扫描包下所有类,让注解生效-->
<context:component-scan base-package="cn.smbms.service"/>
<context:component-scan base-package="cn.smbms.dao"/>

3、创建Controller-处理请求的控制器

我这里是用的注解
@Controller
@RequestMapping("/user")

@RequestParam 注解细节:
注解有三个变量:value、required、defaultvalue
value :指定 name 属性的名称是什么,value 属性都可以默认不写
required :是否必须要有该参数,可以设置为【true】或者【false】
defaultvalue :设置默认值

package cn.kgc.controller;

import cn.kgc.pojo.Provider;
import cn.kgc.pojo.User;
import cn.kgc.service.Impl.ProviderServiceImpl;
import cn.kgc.service.ProviderService;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
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;
import org.springframework.web.servlet.mvc.AbstractController;
import sun.awt.SunToolkit;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.Map;

/**
 * @clsssName : IndexController
 * @Description : TODO
 * @Author : hukaixin
 */

@Controller
@RequestMapping("/user")
public class IndexController {
    private Logger logger=Logger.getLogger(IndexController.class);
    /*@Resource
    private ProviderService providerService;*/
    ProviderService providerService=new ProviderServiceImpl();

    /**
     * 使用注解的方式
     * @return
     */
    @RequestMapping(value = "/index",method = RequestMethod.GET)
    public String index(){
        logger.info("spring-mvc");
        return "index";
    }

    /**
     * url入参
     * method请求的方式
     * name = "userName",传入参数的名称
     * @param userName
     * @return
     */
    @RequestMapping( value = "/welcome",method = RequestMethod.GET,name = "userName" )
    public String welcome(@RequestParam String userName){
        logger.info("spring-mvc"+userName);
        return "index";
    }

    /**
     * @RequestParam(value = "userName" required = false),url中userName就可以不传参
     * @param userName
     * @return
     */
    @RequestMapping( value = "/welcome1",method = RequestMethod.GET)
    public String welcome1(@RequestParam(value = "userName",required = false) String userName){
        logger.info("spring-mvc"+userName);
        return "index";
    }
    @RequestMapping("/index1")
    public ModelAndView index1(@RequestParam(value = "userName",required = false) String userName){
        ModelAndView modelAndView=new ModelAndView();
        modelAndView.addObject("userName",userName);
        modelAndView.setViewName("index");
        return modelAndView;
    }
    @RequestMapping("/index2")
    public String index2(String userName, Model model){
        model.addAttribute("userName",userName);
        model.addAttribute(userName);
        User user=new User();
        user.setUserName("sdhfjhs");
        model.addAttribute(user);
        model.addAttribute("User",user);
        return "index";
    }


    @RequestMapping("/index4")
    public ModelAndView index4(@RequestParam(value = "userCode",required = false)String userCode){
        logger.info("userCode:"+userCode);
        ModelAndView modelAndView=new ModelAndView();
        modelAndView.addObject("userCode",userCode);
        modelAndView.setViewName("success");
        return modelAndView;
    }
    @RequestMapping(value = "/index6",method = RequestMethod.GET)
    public String index6(String userName,String password,Map map){
        map.put("userName",userName);
        map.put("password",password);
        return "index";
    }
    @RequestMapping("/index7")
    public String index7(String userName, String password, HttpSession session){
       session.setAttribute("userName",userName);
       session.setAttribute("password",password);
        return "index";
    }
}

4创建view视图
/WEB-INF/jsp/.jsp

<%--
  Created by IntelliJ IDEA.
  User: hu
  Date: 2019/7/9
  Time: 21:02
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>hello,spring-mvc</h1>
     <h1>userName--------->${userName}</h1>
    <h1>userName--------->${userName}</h1>
    <h1>userName--------->${string}</h1>
    <h1>userName--------->${user.userName}</h1>
    <h1>userName--------->${User.userName}</h1>
    <h1>userName map--------->${userName}</h1>

<h1>userCode--------------->${userCode}</h1>
<h1>${userName}:${password}</h1>
</body>
</html>

5部署运行(Tomcat)

3请求处理流程及体系结构

在早期 Java Web 的开发中,统一把显示层、控制层、数据层的操作全部交给 JSP 或者 JavaBean 来进行处理,我们称之为 Model1:

在这里插入图片描述
出现的弊端:
JSP 和 Java Bean 之间严重耦合,Java 代码和 HTML 代码也耦合在了一起
要求开发者不仅要掌握 Java ,还要有高超的前端水平
前端和后端相互依赖,前端需要等待后端完成,后端也依赖前端完成,才能进行有效的测试
代码难以复用
正因为上面的种种弊端,所以很快这种方式就被 Servlet + JSP + Java Bean 所替代了,早期的 MVC 模型(Model2)就像下图这样:
在这里插入图片描述
详细到接口在这里插入图片描述

首先用户的请求会到达 Servlet,然后根据请求调用相应的 Java Bean,并把所有的显示结果交给 JSP 去完成,这样的模式我们就称为 MVC 模式。
M 代表 模型(Model)
模型是什么呢? 模型就是数据,就是 dao,bean
V 代表 视图(View)
视图是什么呢? 就是网页, JSP,用来展示模型中的数据
C 代表 控制器(controller)
控制器是什么? 控制器的作用就是把不同的数据(Model),显示在不同的视图(View)上,Servlet 扮演的就是这样的角色。
扩展阅读:Web开发模式
Spring MVC 的架构
为解决持久层中一直未处理好的数据库事务的编程,又为了迎合 NoSQL 的强势崛起,Spring MVC 给出了方案:
在这里插入图片描述

传统的模型层被拆分为了业务层(Service)和数据访问层(DAO,Data Access Object)。在 Service 下可以通过 Spring 的声明式事务操作数据访问层,而在业务层上还允许我们访问 NoSQL ,这样就能够满足异军突起的 NoSQL 的使用了,它可以大大提高互联网系统的性能。
特点:
结构松散,几乎可以在 Spring MVC 中使用各类视图
松耦合,各个模块分离
与 Spring 无缝集成

Spring MVC请求处理流程

在这里插入图片描述

Spring MVC体系结构3-1
在这里插入图片描述

我们的用户通过url发送请求到我们的前端控制器(DispatcherServlet),前端控制器把我们发送的请求通过映射解析器,视图解析器,从view到contoller,进行处理,返回
modelAndview(数据模型和视图),在到我们的前端控制器,进行视图渲染。而在我我们的控制器contoller里,我们调用业务对象,返回模型数据。

Spring MVC体系结构

DispatcherServlet(前端控制器)
Spring MVC最核心的类
web.xml中配置
Handler(处理器):对应MVC中C(Controller层)
类型:Object
作用:实际处理请求
标注了@RequestMapping的所有方法都可以看作是一个Handler
ModelAndView
逻辑视图名
模型对象

核心组件

HandlerMapping(处理器映射)
*eanNameUrlHandlerMapping(默认)
将请求URL映射到同名的控制器Bean上
*DefaultAnnotationHandlerMapping
将请求映射到标注@RequestMapping注解的控制器和处理方法上RequestMappingHandlerMappingnHandlerAdapter(适配器)
AnnotationMethodHandlerAdapter
RequestMappingHandlerAdapter
ViewResolver(视图解析器)
InternalResourceView

4传参的方式

Controller方法中参数前加@RequestParam进行直接入参

@RequestMapping
标注在类定义处
标注在方法定义处
映射规则
通过请求URL进行映射
通过请求参数进行映射
若选择方法参数直接入参的话,方法入参名必须与请求中参数名保持一致
通过请求方法进行映射
GET
POST

@RequestParam 注解细节:
注解有三个变量:value、required、defaultvalue
value :指定 name 属性的名称是什么,value 属性都可以默认不写
required :是否必须要有该参数,可以设置为【true】或者【false】
defaultvalue :设置默认值

类型为ModelAndView
一:包含视图信息和模型数据信息
二:常用方法
1添加模型数据
ModelAndView addObject(String attributeName, Object attributeValue);
ModelAndView addAllObjects(Map<String,?> modelMap);
2设置视图
类型为Model
类型为Map
类型为session
都是以键值对的形式来进行传参
上面的代码有这些例子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值