SpringMVC 的学习冒险之旅

这篇具有很好参考价值的文章主要介绍了SpringMVC 的学习冒险之旅。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

内及其子包内的所有“类”(不包含接口),并为添加,JavaEE框架,spring,springMvc,java,服务器

       哈喽~大家好呀,前段时间将 Spring 框架篇结束,从这篇开始,开始了我们 SpringMVC 的学习之旅了,这篇来看看SpringMVC 项目起步讲解吧。

 🥇个人主页:个人主页​​​​​             

🥈 系列专栏:【Java框架】   

🥉与这篇相关的文章:            

  

【JAVAEE框架】MyBatis与Spring的整合(上) 【JAVAEE框架】MyBatis与Spring的整合(上)_程序猿追的博客-CSDN博客
【JAVAEE框架】浅谈 AOP 及代码实现 【JAVAEE框架】浅谈 AOP 及代码实现_程序猿追的博客-CSDN博客
【JAVAEE框架】浅谈 Spring 框架的两大核心思想 AOP 与 IOP 【JAVAEE框架】浅谈 Spring 框架的两大核心思想 AOP 与 IOP_程序猿追的博客-CSDN博客

目录

一、前言

二、入门程序

三、有参数的传递


一、前言

As everyone knows,在JavaEE 体系结构包括四层,从上到下分别是应用层、Web层、业务层、持久层SpringMVC 是 Web 层的框架,Spring 是业务层的框架,MyBatis 是持久层的框架

经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。其中,View的定义比较清晰,就是用户界面。

MVC流程如图所示

内及其子包内的所有“类”(不包含接口),并为添加,JavaEE框架,spring,springMvc,java,服务器

​​

💡SpringMVC架构流程如图所示

内及其子包内的所有“类”(不包含接口),并为添加,JavaEE框架,spring,springMvc,java,服务器

💡SpringMVC 的核心架构

内及其子包内的所有“类”(不包含接口),并为添加,JavaEE框架,spring,springMvc,java,服务器

💡 SpringMVC 体系结构

内及其子包内的所有“类”(不包含接口),并为添加,JavaEE框架,spring,springMvc,java,服务器

❓​SpringMVC 体系结构流程是怎样的呢?

✅具体流程:

1、用户在页面进行操作,浏览器发送请求,发送到 DispatcherServlet(前端控制器),前端控制器收到后自己不处理,去交给其他解析器去解析

2、DispatcherServlet 将请求发给 HandlerMapping(处理器映射器),处理器映射器将请求映射为 HandlerExecutionChain 对象

3、DispatcherServlet 到 HandlerAdapter(处理器适配器),处理器适配器将会把处理器包装为适配器,从而就有了支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;

4、HandlerAdapter 到 Handler,调用处理器相应功能处理方法,经过数据的一些处理,并返回一个 ModelAndView(模型数据、逻辑视图名)

5、ModelAndView 对象(Model 部分是业务对象返回的模型数据,View 部分为逻辑视图名)到 ViewResolver(视图解析器), 视图解析器将把逻辑视图名解析为具体的 View;

6、View ——> 渲染,View会根据传进来的 Model 模型数据进行渲染,此处的 Model 实际是一个Map 数据结构;

7、View 渲染之后,由 View 返回响应给用户,相应的页面展现给用户看,到此一个流程结束。

二、练手程序

pom 文件写入依赖

        <!--SpringMVC jar-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.2.22.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.22.RELEASE</version>
        </dependency>

web.xml 文件

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springMVC.xml</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

<!--    打开默认页面-->
    <welcome-file-list>
        <welcome-file>userText.html</welcome-file>
    </welcome-file-list>

</web-app>

DispatcherServlet

DispatcherServlet是前置控制器,配置在 web.xml 文件当中的,拦截匹配的请求,Servlet 拦截匹配规则要自己定义,将拦截下来的请求按照相应的规则分发到目标 Controller 来处理,是配置spring MVC的第一步。

<url-pattern>/</url-pattern>

看官方文档可知,如果我们的项目中配置了"/",会覆盖掉 tomcat 中的默认 servlet,当其他的 url-pattern 匹配不上时都会走这个 servlet。意思就是说,页面来的所有请求都会走这个 servlet,也就是 DispatcherServlet。

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: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/context
	http://www.springframework.org/schema/context/spring-context-4.0.xsd
	http://www.springframework.org/schema/mvc
	http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
	">

<!--    spring注解-->
<!--    作用:扫描包内及其子包内的所有“类”(不包含接口),并为添加了@Service、@Component、@Controller、@Repository修饰的类创建对象并存入IOC容器-->
<!--    @Service、@Component、@Controller、@Repository修饰的类中含有@Autowired修饰的成员变量,则创建对象时会从IOC容器中取值为该成员变量赋值-->
    <context:component-scan base-package="com.itxzw">
        <context:exclude-filter type="regex" expression="com.itxzw.util"/>
    </context:component-scan>

    <!--SpringMVC相关配置-->
    <!--视图解析器,他的作用是在Controller返回的时候进行解析视图-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/view/"/>
        <property name="suffix" value=".html" />
    </bean>

    <!--启动SpringMVC注解-->
<!--    主要用于spring mvc 中的annotation注解功能,作用是帮我们注入一些内置bean,例如RequestMappingHandlerMapping
        和 RequestMappingHandlerAdapter等,这些类是Aware的子类,能完成特定的供能,例如:
        RequestMappingHandlerMapping负责解析@RequestMapping("/helloworld")注解。
        主要是解析spring mvc的一些标签和语法!
-->
    <mvc:annotation-driven />
    <mvc:default-servlet-handler/>
</beans>

context:component-scan

作用:扫描包内及其子包内的所有“类”(不包含接口),并为添加了@Service、@Component、@Controller、@Repository修饰的类创建对象并存入IOC容器,@Service、@Component、@Controller、@Repository修饰的类中含有@Autowired修饰的成员变量,则创建对象时会从IOC容器中取值为该成员变量赋值

context:include-filter

排除类,排除不需要扫描的类

InternalResourceViewResolver

视图解析器,他的作用是在Controller返回的时候进行解析视图

mvc:annotation-driven

主要用于 spring mvc 中的 annotation 注解功能,作用是帮我们注入一些内置 bean,例如RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter 等,这些类是 Aware 的子类,能完成特定的供能,例如:RequestMappingHandlerMapping 负责解析@RequestMapping("/helloworld")注解。主要是解析spring mvc的一些标签和语法。

<mvc:default-servlet-handler/>

我们在配置 dispatchServlet 时配置<url-pattern>/</url-pattern>拦截所有请求,这时候dispatchServlet完全取代了default servlet,将不会再访问容器中原始默认的servlet,而对静态资源的访问就是通过容器默认servlet处理的,故而这时候静态资源将不可访问。
换句话说我们用了 这个 <url-pattern>/</url-pattern>, html就文件访问不了了,如果想要解决访问静态资源问题,就要加上<mvc:default-servlet-handler/>

自定义处理器

// @Controller 是Spring框架提供的注解。
// @Controller标识的类,该类代表控制器类(控制层/表现层)。
// 这里控制层里面的每个方法,都可以去调用@Service标识的类(业务逻辑层),
@Controller
// 在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置
@RequestMapping("/user")
public class UserAction {

    @RequestMapping("/userText")
    public String userText(){
        return "userText";
    }
}

@Controller

是Spring框架提供的注解。@Controller标识的类,该类代表控制器类(控制层/表现层)。 这里控制层里面的每个方法,都可以去调用@Service标识的类(业务逻辑层)。

@RequestMapping

在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置。可以理解为访问路径。

userText.html 前端页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试</title>
</head>
<body>

<p>我是测试1</p>
<p>我是测试2</p>

</body>
</html>

项目名

day09_SpringMvc01

测试地址

http://localhost:8080/day09_SpringMvc01/user/userText

三、有参数的传递

自定义处理器

    @RequestMapping(value = "/test02")
    public String test02(User user){
        System.out.println(user);
        return "userList";
    }

User 实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {

    private String username;
    private String password;
    private int age;
    private String gender;
    private String[] hobby;

}

index.jsp 请求页面

<html>
<body>

<form action="/day09_SpringMvc01/user/test02" method="post">
    姓名:<input type="text" name="username" /> <br>
    密码:<input type="text" name="password" /><br>
    产品名称:<input type="text" name="proname" /><br>
    爱好:唱<input type="checkbox" name="hobby" value="sing">
    跳<input type="checkbox" name="hobby" value="dance">
    rap<input type="checkbox" name="hobby" value="rap">
    篮球<input type="checkbox" name="hobby" value="basketball">
    <br>
    <input type="submit" value="登录">
</form>

</body>
</html>

测试

内及其子包内的所有“类”(不包含接口),并为添加,JavaEE框架,spring,springMvc,java,服务器

效果

内及其子包内的所有“类”(不包含接口),并为添加,JavaEE框架,spring,springMvc,java,服务器

如果想让结果显示在另外一个页面上呢?

✅index.jsp 前端页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>

<form action="/day09_SpringMvc01/user/test03" method="post">
    姓名:<input type="text" name="username" /> <br>
    密码:<input type="text" name="password" /><br>
    产品名称:<input type="text" name="proname" /><br>
    爱好:唱<input type="checkbox" name="hobby" value="sing">
    跳<input type="checkbox" name="hobby" value="dance">
    rap<input type="checkbox" name="hobby" value="rap">
    篮球<input type="checkbox" name="hobby" value="basketball">
    <br>
    <input type="submit" value="登录">
</form>

</body>
</html>

自定义处理器

    @RequestMapping("/test03")
    public ModelAndView test03(User user){

        ModelAndView mv = new ModelAndView();
        mv.addObject("user",user);
        mv.setViewName("userDetail");
        return mv;
    }

userDetail.jsp 接收页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <h1>用户详情页</h1>
    <h1>姓名:${user.username}</h1>
    <h1>密码:${user.password}</h1>
    <h1>爱好:${user.hobby}</h1>

</body>
</html>

测试

访问路径

http://localhost:8080/day09_SpringMvc01/index.jsp

内及其子包内的所有“类”(不包含接口),并为添加,JavaEE框架,spring,springMvc,java,服务器

效果

内及其子包内的所有“类”(不包含接口),并为添加,JavaEE框架,spring,springMvc,java,服务器

 扩:@GetMapping 与 @PostMapping

首先要了解一下@RequestMapping注解。

@RequestMapping用于映射url到控制器类的一个特定处理程序方法。可用于方法或者类上面。也就是可以通过url找到对应的方法。

@RequestMapping有8个属性。

value:指定请求的实际地址。

method:指定请求的method类型(GET,POST,PUT,DELETE)等。

consumes:指定处理请求的提交内容类型(Context-Type)。

produces:指定返回的内容类型,还可以设置返回值的字符编码。

params:指定request中必须包含某些参数值,才让该方法处理。

headers:指定request中必须包含某些指定的header值,才让该方法处理请求。

@getMapping与@postMapping是组合注解。

@GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写

@postMapping 是一个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写

@RequestParam

主要用于将请求参数区域的数据映射到控制层方法的参数上。

什么意思?

举个例子,user实体类有两个成员变量(username 与 password),正常情况下我传一个username,不传password,username 就有值,password就是默认的值,如果加了@RequestParam 就必须要传值,如果加了,则默认一定要传参,如果不想传值,可以@RequestParam(required = false)

    @RequestMapping("/test03")
    public String test03(@RequestParam(name = "id",required = false) String ids ){
        System.out.println(ids);
        return "userList";
    }

不积跬步无以至千里,趁年轻,使劲拼,给未来的自己一个交代!向着明天更好的自己前进吧!

内及其子包内的所有“类”(不包含接口),并为添加,JavaEE框架,spring,springMvc,java,服务器文章来源地址https://www.toymoban.com/news/detail-797274.html

到了这里,关于SpringMVC 的学习冒险之旅的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • k8s查看所有在运行pod内的镜像版本

    本地跑的算法镜像有时候与线上跑的环境不一致,这时候又需要同步,每一个都去查找又很麻烦 这时候查看两边的镜像,选取其中不同的地方edit一下,就方便多了 名称空间更改为自己的名称空间 查询镜像并去重,有名称空间的  记得把名称空间加上  同时显示pod名称和镜像

    2024年02月12日
    浏览(52)
  • 【JAVA学习笔记】53 - 集合-List类及其子类Collection、ArrayList、LinkedList类

    https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter14/src/com/yinhai/collection_ https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter14/src/com/yinhai/list_ 目录 项目代码 集合 一、引入 数组 集合 二、集合的框架体系 单列集合        双列集合        Collection类 一、Collection类接

    2024年02月06日
    浏览(47)
  • springmvc 获取项目中的所有请求路径

    springboot/springmvc 获取项目中的所有请求路径 1. 编写业务代码 2. 异常信息 No qualifying bean of type ‘org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping’ available: expected single matching bean but found 3: swagger2ControllerMapping,requestMappingHandlerMapping,controllerEndpointHandlerMapping 原因就

    2024年02月09日
    浏览(32)
  • LLaMA及其子孙模型概述

    与原始transformer的区别: 预归一化[GPT3] 。为了提高训练稳定性,对每个Transformer子层的输入进行归一化,而不是对输出进行归一化。使用了Zhang和Sennrich(2019)引入的RMSNorm规范化函数。 SwiGLU激活功能[PaLM] 。用Shazeer(2020)引入的SwiGLU激活函数取代了ReLU非线性,以提高性能。论

    2024年02月10日
    浏览(23)
  • 使用 ZipArchiveInputStream 读取压缩包内文件总数

    ZipArchiveInputStream 是 Apache Commons Compress 库中的一个类,用于读取 ZIP 格式的压缩文件。在处理 ZIP 文件时,编码格式是一个重要的问题,因为它决定了如何解释文件中的字符数据。通常情况下,ZIP 文件中的文本文件是以特定的字符编码格式存储的,例如 UTF-8 或 ISO-8859-1。但是,

    2024年04月23日
    浏览(17)
  • Xcode打包ipa文件,查看app包内文件

    1、Xcode发布ipa文件前,在info中打开如下两个选项,即可在手机上查看app包名文件夹下的文件及数据。

    2024年02月09日
    浏览(26)
  • Linux学习,使用sed命令对文件内的指定字符串进行替换

    一、创建一个txt文件,用于做测试 vi huawei.txt 二、替换每行第一个huawei为apple,第三个“/”后,不加参数就是只替换第一个 sed -i \\\"s/huawei/apple/\\\" huawei.txt 实现效果: 三、替换每行所有的xiaomi为iphone,第三个“/”后,加参数g就是替换所有 sed -i  \\\"s/xiaomi/iphone/g\\\" huawei.txt 实现效果

    2024年02月17日
    浏览(46)
  • 【vim 学习系列文章 3 - vim 选中、删除、复制、修改引号或括号内的内容】

    上篇文章:【vim 学习系列文章 2 - vim 常用插件配置】 下篇文章 【vim 学习系列文章 4 - vim与系统剪切板之间的交互】 Vim 有一个模块化的结构,允许你使用各种命令的组合操作。大多数命令有两个、三个或四个部分。三部分结构的一个版本是这样的: 操作符 (operator)- 文本对

    2024年02月15日
    浏览(34)
  • 配置交换机trunk接口和路由器基本配置及其子接口

    1.构建网络拓扑结构图 2.配置交换机的Trunk端口,把端口24配置为trunk模式 3.配置交换机vlan 4.路由器基本配置及其子接口 5.路由器接口配置 6.显示Trunk接口信息 7.显示路由信息 8.测试vlan间的连通性 把端口24配置为trunk模式 Sw99a(config)#int vlan 10 Sw99a(config-if)#int vlan 20 Sw99a(config-if)#

    2024年01月20日
    浏览(33)
  • 【UGUI容器】中Content Size Fitter组件-使 UI 元素适应其子内容的大小

    必备组件:Content Size Fitter 通常,在使用矩形变换定位 UI 元素时,应手动指定其位置和大小(可选择性地包括使用父矩形变换进行拉伸的行为)。 但是, 有时可能希望自动调整矩形的大小来适应 UI 元素的内容 。为此,可添加名为内容大小适配器 (Content Size Fitter) 的组件。

    2024年01月22日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包