SpringMVC(1)

一:SpringMVC简介:它时一种设计模式或者称为设计规范,M既Model层,模型层,主要对应Javaweb时的Dao和service,V即View层,视图层,主要对应Javaweb时的jsp/HTML,C即Controller层,控制层,主要对应Javaweb时的servlet。

1.Model:包含数据(Dao)和行为(Service),提供要展示的数据、模型数据查询、数据更新等功能。

2.View:负责模型的展示,也就是我们可以看到的前端界面

3.Controler:接收用户请求,委托给模型进行处理,处理完毕后将结果返回给视图,相当于调度员。

4.流程图:以前Javaweb时,都是先创建Dao层连接数据库,然后service层去调用dao层执行一些具体的业务,再然后servlet层,这一层负责接收前端的数据,把这些数据交给service层去处理,处理完毕后获取service层处理后的结果,并将结果返回给前端model层:负责编写业务逻辑、保存数据状态、连接数据库等操作

SpringMVC(1)

二:职责分析:

1.controller层:取得表单数据、负责调用业务逻辑、转向指定页面

2.model层:负责链接数据库(dao),业务逻辑编写(service)

3.view层:负责展示数据

三:向SpringMVC的过渡_一个简单的servlet程序

  1. <dependencies>
            <dependency>
                <groupId>junitgroupId>
                <artifactId>junitartifactId>
                <version>4.12version>
            dependency>
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-webmvcartifactId>
                <version>5.1.9.RELEASEversion>
            dependency>
            <dependency>
                <groupId>javax.servletgroupId>
                <artifactId>servlet-apiartifactId>
                <version>2.5version>
            dependency>
            <dependency>
                <groupId>javax.servlet.jspgroupId>
                <artifactId>jsp-apiartifactId>
                <version>2.2version>
            dependency>
            <dependency>
                <groupId>javax.servletgroupId>
                <artifactId>jstlartifactId>
                <version>1.2version>
            dependency>
        dependencies>
  2. 删掉项目中的src文件夹,方便后期创建多个子项目,右键SpringMVC项目,新建一个module,命名为Study01_Servlet,导入相关依赖
    <dependencies>
            <dependency>
                <groupId>javax.servletgroupId>
                <artifactId>servlet-apiartifactId>
                <version>2.5version>
            dependency>
            <dependency>
                <groupId>javax.servlet.jspgroupId>
                <artifactId>jsp-apiartifactId>
                <version>2.2version>
            dependency>
        dependencies>
  3. 右键Study01_Servlet子项目,选择Add Framework Support,添加框架支持,在打开的界面中选择web,点击应用。
  4. 编写一个servlet:在java文件夹,右键->新建->类->命名为com.xiaoma.servlet->HelloServlet,继承HttpServlet类,重写doGet和doPost方法,添加一下代码
@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取前端请求参数
        String method = req.getParameter("method");
        if (method.equals("add")) {
            req.getSession().setAttribute("msg","执行了add方法");
        }
        if (method.equals("delete")) {
            req.getSession().setAttribute("msg","执行了delete方法");
        }
        //调用具体的业务类
        //转发或者重定向页面
        req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
  1. 写完servlet就去web.xml文件去配置servlet

    <servlet>
            <servlet-name>testHelloServletservlet-name>
            <servlet-class>com.xiaoma.servlet.HelloServletservlet-class>
        servlet>
        <servlet-mapping>
            <servlet-name>testHelloServletservlet-name>
            <url-pattern>/userurl-pattern>
        servlet-mapping>
    

    <session-config> <session-timeout>60session-timeout>session-config>

    6. 6. 在WEB-INF文件夹下编写一个jsp页面,命名为jsp/test.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
    <title>Titletitle>
    head>
    <body>
    ${msg}
    body>
    html>

    7. 配置tomcat并启动,然后访问:(注意:这里配置tomcat的时候,我的Delopment里边的Application context是/,默认是Study01_Servlet_war_exploed)
    7.

  2. localhost:8080/user?method=add (结果为:跳转页面并显示”执行了add方法”)

  3. localhost:8080/user?method=delete (结果为:跳转页面并显示”执行了delete方法”)
  4. 程序执行流程:首先用户通过浏览器访问url连接并携带参数,然后根据请求链接会找到程序中对应的servlet-mapping对应的url-pattern,这个url-pattern有个对应的servlet-name,这个servlet-name是和servlet中的servlet-name对应的,servlet根据不同的servlet-name去寻找对应的servlet类,servlet类中去处理请求及其参数,执行不同的操作,最后根据不同的条件去寻找不同的视图文件(jsp/html),并将结果返回给对应的视图界面,视图界面将数据取出并展示。

四:初识SpringMVC

1.Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。查看官方文档:https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/web.html#spring-web

2.简单的springmvc案例及其解析:

1.首先创建一个子模块命名为Study02_helloMVC,无需添加依赖

2.右键Study02_helloMVC子项目,选择Add Framework Support,添加框架支持,在打开的界面中选择web,点击应用。

3.在web/WEB-INF/web.xml文件中添加以下代码

springmvc
        class>org.springframework.web.servlet.DispatcherServletclass>

        springmvc
        /

4.在web/WEB-INF文件夹下新建jsp/hello.jsp文件,添加如下代码

"text/html;charset=UTF-8" language="java" %>

    Title

${msg}

5.在Java文件夹下新建com.xiaoma.controller.HelloController的类文件,添加如下代码,添加完毕后,hello.jsp文件中对应的msg信息就能匹配到了

package com.xiaoma.controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Author:xiaoma
 * FileName:HelloController
 * Data:2022/4/24 10:10
 */
public class HelloController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","HellospringMVC");
        //封装要跳转的视图,放在ModelAndView中,最终匹配的视图对象是前缀+setViewName.后缀
        //这里就是/WEB-INF/jsp/hello.jsp
        mv.setViewName("hello");
        return mv;
    }
}

6.在resources文件夹下创建springmvc-servlet.xml文件

"1.0" encoding="UTF-8"?>
"http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">

        "prefix" value="/WEB-INF/jsp/"/>

        "suffix" value=".jsp"/>

    "/hello1" class="com.xiaoma.controller.HelloController"/>

7.配置并启动tomcat,访问localhost:8080/hello1测试效果(这里的hello1正好对应着springmvc-servlet.xml注册的那个Controller文件,这里配置tomcat的时候,我的Delopment里边的Application context是/,默认是Study02_helloMVC_war_exploed),最后界面输出HelloController里的msg信息。

8.注意:有可能会出现404的情况,点击idea菜单栏的file-》project structure-》Artifacts,选择Study02这个项目,看看再WEB-INF下是否又lib文件夹,如果没有则新建一个lib文件夹并添加全部依赖

SpringMVC(1)

9.执行流程:

1.用户在浏览器输入localhost:8080/hello1

2.因为springmvc-servlet.xml文件中配置了BeanNameUrlHandlerMapping和SimpleControllerHandlerAdapter这两个bean,而这两个bean是根据浏览器中的url寻找对应的controller文件的,再这个springmvc-servlet.xm文件中我们还配置了一个bean,其中id为/hello1,其对应的类就是我们的HelloController类,程序就会去找到这个HelloController类

3.HelloController类被执行,再这个类里有个setViewName方法,里边的参数是”hello”,程序就会根据这个参数结合再web.xml中配置的前后缀,找到这个WEB-INF/jsp/hello.jsp文件,并跳转到这个视图中。这个类里边还有个addObject方法,这个里边存放了视图中显示的数据,是一个kv的形式,k用来让前端jsp视图通过${k}取出对应的v。

10.程序运行后访问url出现的问题:报错500,错误内容为java.io.FileNotFoundException:Could not open ServletContext resource [/WEB-INF/springmvc-servlet.xml],解决方案为下边的第二张图片

SpringMVC(1)

SpringMVC(1)

五:SpringMVC执行原理

SpringMVC(1)

图为SpringMVC的一个较完整的流程图,实线表示SpringMVC框架提供的技术,不需要开发者实现,虚线表示需要开发者实现。

  1. DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。 我们请求的url为 : http://localhost:8080/SpringMVC/hello1 如上url拆分成三部分: http://localhost:8080 服务器域名 SpringMVC部署在服务器上的web站点 hello表示控制器 通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。
  2. HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。
  3. HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为:hello1。
  4. HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。
  5. HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
  6. Handler让具体的Controller执行。
  7. Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
  8. HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
  9. DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
  10. 视图解析器将解析的逻辑视图名传给DispatcherServlet。
  11. DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
  12. 最终视图呈现给用户。

Original: https://www.cnblogs.com/XiaoMaGuai/p/16172814.html
Author: XiaoMaGuai
Title: SpringMVC(1)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/592499/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 后端开发学习记录(二)——MySQL的学习

    MySQL 一、什么是数据库 数据库:(DB,DataBase) 概念:数据仓库,安装在操作系统之上(windows,linux,mac…)之上 作用:储存数据,管理数…

    Java 2023年6月13日
    078
  • 分页查询

    1.分页概念 分页查询则是在页面上将本来很多的数据分段显示,每页显示用户自定义的行数。可提高用户体验度,同时减少一次性加载,内存溢出风险。 1.1.真分页 每次翻页从数据库中查询数…

    Java 2023年6月15日
    065
  • 【Java深入研究】11、深入研究hashmap中的hash算法

    大家都知道,HashMap中定位到桶的位置 是根据Key的hash值与数组的长度取模来计算的。 JDK8中的hash 算法: 取模算法: 1、取模算法为什么用的是位与运算? 由于位…

    Java 2023年5月29日
    062
  • xxl-job踩坑记录——执行器,执行10分钟自动失败

    问题描述 上一篇Docker 部署xxl-job 报错:xxl-rpc remoting error(connect timed out), for url : xxxxxx &#…

    Java 2023年6月5日
    092
  • Java多线程基础:Java与线程

    Java多线程基础:Java与线程 线程的实现 使用内核线程实现 内核线程(Kernel-Level Thread,KLT)就是直接 由操作系统内核支持的线程。内核通过操纵调度器对…

    Java 2023年5月29日
    058
  • 入门 Spring Security

    @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowir…

    Java 2023年5月30日
    078
  • UML 活动图

    本学期在学 uml 建模,这星期要完成对项目用例图中几个主要用例的活动图分析,索性写下自己对活动图的学习笔记和实操。有些类似的用例,网上或者书上的活动图表示都不尽相同,我是按照自己…

    Java 2023年6月5日
    058
  • C++基础- 引用

    引用 引用的基本使用 作用:给变量起别名 语法:数据类型 &别名 = 原名 引用注意事项 引用必须初始化 引用一旦初始化,就不可以更改(一个别名只能初始化一次:只可以跟一个…

    Java 2023年6月5日
    069
  • Liunx-CentOS安装Nginx

    0 卸载Nginx 查看nginx是否运行 ps -ef | grep nginx 停止用stop、或者用kill /usr/local/nginx/sbin/nginx -s s…

    Java 2023年6月9日
    069
  • nacos 快速入门

    外表可是具有欺骗性的。 No victory comes without a price. 凡是成功就要付出代价。 这个快速开始手册是帮忙您快速在您的电脑上,下载、安装并使用 na…

    Java 2023年6月9日
    0131
  • Java 集合常见知识点&面试题总结(上),2022 最新版!

    你好,我是 Guide。秋招即将到来(提前批已经开始),我对 JavaGuide 的内容进行了重构完善,公众号同步一下最新更新,希望能够帮助你。 你也可以在网站(javaguide…

    Java 2023年6月9日
    087
  • MaxComputer/ODPS使用pyODPS将计算值写入ODPS指定数据表中

    MaxComputer/ODPS使用pyODPS将计算值写入ODPS指定数据表中 阿里云官方参考文档:https://help.aliyun.com/document_detail…

    Java 2023年6月9日
    070
  • 03第三章:【1】_MQTT协议数据包结构

    一、MQTT协议数据包结构 在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、可变头(Variable header)、消息体(payload)三部分构成…

    Java 2023年5月29日
    052
  • 匿名内部类的使用

    原始做法: /** * 创建时间: 2022/4/30 * * @author 尼古拉斯.Cai灯 */ public class BasicClass { public stat…

    Java 2023年6月9日
    074
  • 110_入门案例-Work模式-轮询模式(Round-Robin)

    Work模式轮询模式(Round-Robin) 生产者 消费者-Work1 消费者-Work2 小结 Work模式轮询模式(Round-Robin) :::info参考官网:htt…

    Java 2023年6月7日
    0158
  • DHCP 动态主机设置协议 分析

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月9日
    067
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球