SSM框架-SpringMVC详解

2023-11-16

springmvc概述

Springmvc是spring框架的一个模块,spring和springmvc无需中间整合层整合。

Springmvc是一个基于mvc的web框架

表现层的三大任务:

SSM框架-SpringMVC详解

 

  • URL到controller的映射
  • http请求参数绑定
  • http响应的生成和输出

MVC设计模式

MVC设计模式是一种通用的软件编程思想。

在MVC设计模式中认为, 任何软件都可以分为三部分组成:

(1)控制程序流转的控制器(Controller)

(2)封装数据处理数据的模型(Model)

(3)负责展示数据的视图(view)

springmvc的实现原理

SSM框架-SpringMVC详解

 

(1) .用户发送请求 至 前端控制器(DispatcherServlet);

提示:DispatcherServlet的作用:接收请求,调用其它组件处理请求,响应结 果,相当于转发器、中央处理器,是整个流程控制的中心

(2) .前端控制器(DispatcherServlet)收到请求后调用处理器映射器 (HandlerMapping)

处理器映射器(HandlerMapping)找到具体的Controller(可以根据xml配置、注解进 行查找),并将Controller返回给DispatcherServlet;

(3) .前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)。处理 器适配器经过适配调用具体的Controller;(Controller--> service --> Dao --> 数据库)

Controller执行完成后返回ModelAndView,

提示:Model(模型数据,即Controller处理的结果,Map) View(逻辑视图名,即 负责展示结果的JSP页面的名字)

处理器适配器(HandlerAdapter)将controller执行的结果(ModelAndView)返回给前 端控制器(DispatcherServlet);

(4) .前端控制器(DispatcherServlet)将执行的结果(ModelAndView)传给视图解析 器(ViewReslover)

视图解析器(ViewReslover)根据View(逻辑视图名)解析后返回具体JSP页面

(5) .前端控制器(DispatcherServlet)根据Model对View进行渲染(即将模型数据 填充至视图中);

前端控制器(DispatcherServlet)将填充了数据的网页响应给用户

springmvc实现

第一步:创建maven项目springmvc

SSM框架-SpringMVC详解

 

第二步:在pom文件中添加依赖

<dependencies>
    <!-- 单元测试 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
        <scope>test</scope>
    </dependency>
    <!-- SpringMVC的jar包 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.1.3.RELEASE</version>
    </dependency>
    <!-- servlet 和 jsp的jar包 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.0</version>
        <scope>provided</scope>
    </dependency>
    <!-- java对象转换json的工具类
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.5.1</version>
    </dependency>
    -->
</dependencies>

第三步:web.xml中配置前端控制器

<?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">
    <!-- 配置springmvc前端控制器, 将所有请求交给springmvc来处理 -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servletclass>org.springframework.web.servlet.DispatcherServlet</servletclass>
    <!-- 配置springmvc核心配置文件的位置,默认Springmvc的配置文件是在
    WEB-INF目录下,默认的名字为springmvc-servlet.xml,如果要放在其他目录,则
    需要指定如下配置:
    -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc-config.xml</param-value>
    </init-param>
    </servlet>
    <!-- 其中的斜杠(/)表示拦截所有请求(除JSP以外), 所有请求都要经过
    springmvc前端控制器 -->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

第四步:创建并配置springmvc-config.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:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/mvc
                           http://www.springframework.org/schema/mvc/spring-mvc4.0.xsd
                           http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/springbeans-4.0.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context4.0.xsd">
    <!-- 1.配置前端控制器放行静态资源(html/css/js等,否则静态资源将无法访问) -->
    <mvc:default-servlet-handler/>
    <!-- 2.配置注解驱动,用于识别注解(比如@Controller) -->
    <mvc:annotation-driven></mvc:annotation-driven>
    <!-- 3.配置需要扫描的包:spring自动去扫描 base-package 下的类,
    如果扫描到的类上有 @Controller、@Service、@Component等注解,
    将会自动将类注册为bean-->
    <context:component-scan base-package="com.tedu.controller">
    </context:component-scan>
    <!-- 4.配置内部资源视图解析器
    prefix:配置路径前缀
    suffix:配置文件后缀
    -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>

第五步:创建HelloController

restController=controller+responsebody:

restController返回json对象

controller返回string:modelandview

controller+responsebody返回json对象

package com.tedu.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/* @Controller,如果当前类所在的包配置了Spring容器包扫描,具有
 * 该注解的类,就会作为bean注册到spring容器中,由spring容器
 * 创建实例。 */
@Controller
public class HelloController {
    /* @RequestMapping为当前方法配置访问路径
     * 当浏览器访问http://localhost:8080/day20-springmvc/hello
     
     * 如果Controller类上没有配置访问路径,当前项目中所有
     *     controller中方法上的访问路径都不同冲突! */
    @RequestMapping("/hello")
    public String testHello() {
        System.out.println( "HelloController.testHello()" );
        System.out.println( "hello springmvc..." );
        //跳转到 /WEB-INF/pages/home.jsp
        return "home";
    }
}

第六步:创建并实现home.jsp

在WEB-INF/pages/目录下,创建home.jsp页面。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h1>day20-springmvc...home.jsp...</h1>
</body>
</html>

第七步:发送请求,进行测试

打开浏览器,输入url地址: http://localhost :8080/day16-springmv/hello 地址。

重定向和转发

重定向redirect和转发forward的区别

1,重定向浏览器地址栏显示新的地址,转发地址栏不变

2,重定向可以重定向别的网站,转发只能转发到本网站中的方法。

redirect重定向

适用于原先的网页不继续提供服务了。

@Controller
public class UserController {
    //重定向,原先的登录地址
    @RequestMapping("/login")
    public String login() {
        return "redirect:https://passport.jd.com/new/login.aspx";
    }
}

http://localhost:8080/login

SSM框架-SpringMVC详解

 

转发后浏览器的地址栏变为转发后的地址。

在chrome的调试窗口中network中查看status code

SSM框架-SpringMVC详解

 

forward转发

转发后浏览器地址栏还是原来的地址。所以转发前请求的参数在转发后仍然可以读取到。

//第一输入用户名和密码
    @RequestMapping("/loginByName")
    @ResponseBody
    public String loginByNamePwd(String username,String password) {
        
        return "login";
    }
    
    //再次登录时,还要输入验证码
    @RequestMapping("/loginByCode")
    public String loginByCode(String username,String password,String code) {
        //判断验证码是否正确
        return "forward:/loginByName";
    }

SSM框架-SpringMVC详解

 

restful风格

@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上

形成RUSTFul形式,这将是未来的发展趋势。它更加简洁,安全。强化URL GET访问方式。

@RestController
public class OrderCotroller {
    @RequestMapping("/order/{startTime}/{endTime}")
    public String searchByDate(@PathVariable String startTime,
            @PathVariable String endTime) {
        return "restful startTime="+startTime+",endtime="+endtime;
    }
}

浏览器访问的URL

http://localhost :8080/order/2019-10-01/2020-10-10

自动将URL 中模板变量{startTime}和{endTime}绑定到@PathVariable注解的同名参数上,即入参后startTime=“2019-10-01”、endTime=“2020-10-10”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SSM框架-SpringMVC详解 的相关文章

  • Java EE 6 和单例

    谁能解释一下在 Java EE 6 应用程序中实现 Singleton 的完整过程 我假设我不应该以声明静态变量的典型方式创建单例 而应该使用 Singleton注解 我必须这样做吗 难道只是声明一下的情况 Singleton就是这样 我还
  • 有没有更简单的方法来分割/重建字符串?

    目前我正在使用String split 像这样 String tmp props get i getFullName split String name for int j 1 j lt tmp length j if j gt 1 nam
  • Java:while循环冻结程序

    我正在制作一个游戏 我需要每 3 秒更新一次 JProgressBar 为此 我使用 while 循环 问题是我的程序由于 while 循环而冻结 我在其他问题中读到它 他们没有帮助我解决这个问题 我不知道如何解决 这是我的代码 publi
  • 查找所有数组的长度多维数组,Java

    我想使用多维数组来存储数据网格 但是 我还没有找到一种简单的方法来查找长度2nd数组的一部分 例如 boolean array new boolean 3 5 System out println array length 只会输出3 是否
  • 始终等待页面加载到 PageObjects 上

    因此 当出现问题时 我只是创建了一个简单的 selenium JBehave 代码 我将首先发布简化的代码 然后稍后解释我的问题是什么 所以这里我们有一个简单的 AbstractClass 它将在我的 PageObjects 上继承 此类仅
  • 有没有办法让Maven自动下载快照版本?

    所以我有一个项目依赖于另一个项目的快照版本 依赖关系是
  • 如何将日期字符串解析为Date? [复制]

    这个问题在这里已经有答案了 如何将下面的日期字符串解析为Date object String target Thu Sep 28 20 29 30 JST 2000 DateFormat df new SimpleDateFormat E
  • org.openqa.selenium.NoSuchSessionException:会话 ID 为空。调用 quit() 后使用 WebDriver?

    我已经进行了一些搜索 但仍然遇到同样的问题 我相信这可能是由于我的网络驱动程序是静态的造成的 我不太确定 在我的主课中 我包括了 BeforeTest and AfterTest BeforeTest包括根据我的 XML 文件启动新浏览器
  • Eclipse Oxygen - 该项目未构建,因为其构建路径不完整

    我刚刚安装了 Eclipse Oxygen 并尝试在工作台中打开现有项目 但收到此错误 该项目未构建 因为其构建路径不完整 不能 找到 java lang Object 的类文件 修复构建路径然后尝试 建设这个项目 我尝试右键单击该项目 转
  • Java ArrayList 和 HashMap 动态

    有人可以提供一个创建Java的例子吗ArrayList and HashMap在飞行中 所以而不是做一个add or put 实际上在类实例化时为数组 哈希提供种子数据 举个例子 类似于 PHP 的例子 array array 3 1 2
  • 不使用 length() 方法的字符串长度[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何在不使用字符串的情况下找到字符串的长度length String类的方法 str toCharArray length应该管用 或者怎么
  • 使用 Haskell 将函数注入到 Java .class 文件中

    我使用 Haskell 编写了一个 Java 字节码解析器 它工作得很好 然而下一步让我完全难住了 我的 Haskell 程序需要修改 class 文件 以便在执行时 Java 程序打印 输入 此处的方法名称 在执行方法之前 并且 退出 此
  • 用于 Eclipse 的 Resharper [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • IntelliJ - 无效源版本:17

    我已经在 IntelliJ 中使用 Gradle 创建了一个使用 Java 17 的新 Java 项目 运行我的应用程序时出现错误Cause error invalid source release 17 我的设置 我已经安装了openjd
  • JavaFX Integer Spinner (IntegerSpinnerValueFactory) 不会将值回绕到最小值

    我创建了一个带有值的整数微调器 min 5 max 15 and initialValue 12 and wrapAround true 一旦旋转器到达max 15 增量期间的值 而不是将值重置为min 5 正如它所说文档 https op
  • Eclipse Juno 指标插件

    Eclipse JUNO 版本有哪些 Eclipse 指标插件 我尝试了一些通用指标插件 但没有一个能够在 Eclipse 的 JUNO 版本中正常运行 差点忘了 我们正在使用 Java 作为编程语言 我想要诸如圈复杂度 代码行数 方法长度
  • 在Java内存管理中,“PS”代表什么?

    每当我看到 Java 中对内存的引用时 各种空格总是以 PS 为前缀 PS 是什么意思 它开始困扰我 到目前为止我唯一的猜测是 泳池空间 但这将是多余的 例子 PS伊甸园空间 PS 幸存者空间 PS 终身空间 老一代 PS Perm Gen
  • 对于双核手机,availableProcessors() 返回 1

    我最近购买了一部 Moto Atrix 2 手机 当我尝试查看手机中的处理器规格时 Runtime getRuntime availableProcessors 返回 1 proc cpuinfo 也仅包含有关处理器 0 的信息 出于好奇
  • Eclipse 如何创建一个未解决编译问题的类?

    当我尝试使用 javac 编译此类时 出现编译错误并且未创建 Test class public class Test public static void main String args int x 1L lt this cannot
  • 将 SQL 数据中的一行映射到 Java 对象

    我有一个 Java 类 其实例字段 以及匹配的 setter 方法 与 SQL 数据库表的列名相匹配 我想优雅地从表中获取一行 到 ResultSet 中 并将其映射到此类的实例 例如 我有一个 Student 类 其中包含实例字段 FNA

随机推荐

  • Web自动化 —— Selenium元素定位与防踩坑

    1 基本元素定位一 from selenium import webdriver from selenium webdriver chrome service import Service from selenium webdriver c
  • Mac系统编译Spring源码

    下载Spring源码 Spring源码托管在GitHub 点击进去之后 选择一个版本 然后下载 下载完成后 解压压缩包 然后打开spring framework 5 2 x gradle wrapper gradle wrapper pro
  • ARM学习系列 ---- ARM NEON

    ARM学习系列 ARM NEON 1 NEON概述 1 1 简介 NEON是指适用于Arm Cortex A系列处理器的一种高级SIMD 单指令多数据 扩展指令集 可执行并行数据处理 1 2 发展历史 arm v6 SIMD扩展 arm v
  • 计算器ajax实现代码,用JQuery写一个计算器

    因为觉得segment fault的markdown界面比CSDN漂亮一些 所以最近正在把博客迁移到这边来 这几天多发了两篇 作为一个学习中练手的小demo 选了一个计算器 原因大概只是因为早就想做 比较简单 又确实有很多地方不太清楚 所以
  • PAT 1011 A+B 和 C

    给定区间 2 31 2 31 内的 3 个整数 A B 和 C 请判断 A B 是否大于 C 注意本题数字的范围 是 2 31 2 31 因此要用long long 类型 刚开始用了int 类型 一直提示有错误 注意int 32位 可以包括
  • 开发规范-java代码注释及IDEA配置代码注释模板

    引 阿里巴巴开发规范 注释规约 强制 类 类属性 类方法的注释必须使用 Javadoc 规范 使用 内容 格式 不得使用 xxx 方式 说明 在 IDE 编辑窗口中 Javadoc 方式会提示相关注释 生成 Javadoc 可以正确输出相应
  • python正则表达式从字符串中提取数字的思路详解(转载)

    python从字符串中提取数字 使用正则表达式 用法如下 总结 匹配字符串的开始 匹配字符串的结尾 b 匹配一个单词的边界 d 匹配任意数字 D 匹配任意非数字字符 x 匹配一个可选的 x 字符 换言之 它匹配 1 次或者 0 次 x 字符
  • Unity - 无限循环列表

    效果和UI结构 效果 Tips 免费的视频转GIF网站 UI结构 父节点为一个Panel Panel的Vertical Layout Group方便快捷调整Panel下的Image子物体的位置 使用时取消组件 Image是列表的子物体 只有
  • CSS文字自动换行

    word break属性 normal 只在允许的断字点换行 浏览器保持默认处理 break word 在长单词或 URL 地址内部进行换行 white space属性 normal 默认 空白会被浏览器忽略 pre 空白会被浏览器保留 其
  • Java编程那些事儿88——文件操作之写文件

    Java编程那些事儿88 文件操作之写文件 陈跃峰 出自 http blog csdn net mailbomb 11 3 1 4 写文件 如前所述 将程序内部的数据输出到程序外部的数据源 应该使用IO类体系中的输出流 在实际的编程中 将程
  • MATLAB设计滤波器之新版filterDesigner使用

    一 引言 本篇内容主要介绍新版Matlab的滤波器设计filterDesigner工具的使用 并以设计两个带通滤波器为使用的例子 使用的MATLAB软件版本为MATLAB R2022a 二 filterDesigner设计滤波器 1 在命令
  • C++责任链模式:Chain of Responsibility Pattern

    当你想要让一个以上的对象有机会能够处理某个请求的时候 就可以使用责任链模式 责任链模式 将请求的发送和接收解耦 让多个接收对象都有机会处理这个请求 将这些接收对象串成一条链 并沿着这条链传递这个请求 直到链上的某个接收对象能够处理它为止 通
  • Ubuntu18.04装Miniconda后终端出现base环境

    在 Ubuntu18 04LTS DELL 台式机中安装 Pytorch 由于没有 GPU 只能下载仅使用 CPU 版的 Pytorch 去 Pytorch 官网按照文档 Start Locally PyTorch 一步步下载相应的环境 P
  • tomcat8下启动 jsp报错

    The method getDispatcherType is undefined for the type HttpServletRequest java lang ClassNotFoundException org apache js
  • PLSQL中的FOR循环

    游标的FOR循环 循环体是查询的表 游标的for循环 PL SQL 语言提供了 游标 FOR 循环语句 自动执行游标的 OPEN FETCH CLOSE 语句和 循环 语句的功能 当进入循环时 游标 FOR 循环语句 自动 打开游标 并提取
  • LCD调试流程

    本来想学的更深入一些再来写这些总结 但想想 边学边写 记录成长过程也挺好的 下面自底向上 了解LCD的整个工作流程 一 LCD的组成结构和各结构的功能 1 背光板模组 提供光的来源 2 上下偏光板 TFT Glass Substrate 液
  • 【C/C++学习笔记】c++ 回调函数

    1 介绍 回调函数就是一个通过函数指针调用的函数 如果你把函数的指针 地址 作为参数传递给另一个函数 当这个指针被用来调用其所指向的函数时 我们就说这是回调函数 回调函数不是由该函数的实现方直接调用 而是在特定的事件或条件发生时由另外的一方
  • Maven自动化构建工具详解

    一 Maven概述 1 使用Maven原因 我们先通过企业开发中的实际需求来看一看哪些方面是我们现有技术的不足 1 第三方Jar包添加 在今天的JavaEE开发领域 有大量的第三方框架和工具可以供我们使用 要使用这些jar包最简单的方法就是
  • win7+ubuntu20.04双系统安装,以及pointnet2_pytorch编译记录

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 win7 ubuntu20 04双系统安装 二 Ubuntu安装相关 1 Anaconda 2 Nvidia Driver 3 编译pointnet2 p
  • SSM框架-SpringMVC详解

    springmvc概述 Springmvc是spring框架的一个模块 spring和springmvc无需中间整合层整合 Springmvc是一个基于mvc的web框架 表现层的三大任务 URL到controller的映射 http请求参