SpringMVC(一):简介和第一个程序
本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出一遍就懂!b站搜索狂神说或点击下面链接
https://space.bilibili.com/95256449?spm_id_from=333.788.b_765f7570696e666f.2
SpringMVC
SpringMVC重点
执行流程
SSM框架整合
回顾MVC
MVC就是模型(model)、视图(View)、控制层(Controller),是一种软件设计规范。
是将业务逻辑、数据、显示分离的方法来组织代码。
MVC主要作用是降低了视图与业务逻辑间的双向偶合。
MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在差异。以前我们是这样编写的:
M:dao, service
V:Jsp
C:servlet
定义
Model(模型):实体类和业务逻辑:Value Object(数据Dao) 和 服务层(行为Service)。
View(视图):客户直接看到的页面。
Controller(控制器):接收客户请求,调用业务逻辑,转向指定的页面。
最典型的MVC就是JSP + servlet + javabean的模式。
回顾Servlet
创建maven项目,导入依赖。
- <!--导入依赖-->
- <dependencies>
- <!--spring-->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-webmvc</artifactId>
- <version>5.2.5.RELEASE</version>
- </dependency>
- <!--spring connect to db-->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-jdbc</artifactId>
- <version>5.2.5.RELEASE</version>
- </dependency>
- <!--aop-->
- <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
- <dependency>
- <groupId>org.aspectj</groupId>
- <artifactId>aspectjweaver</artifactId>
- <version>1.9.5</version>
- </dependency>
- <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>8.0.19</version>
- </dependency>
- <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis</artifactId>
- <version>3.5.4</version>
- </dependency>
- <!--Mybatis and spring -->
- <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis-spring</artifactId>
- <version>2.0.4</version>
- </dependency>
- <!--junit-->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.11</version>
- <scope>test</scope>
- </dependency>
- <!--servlet依赖-->
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <version>2.5</version>
- </dependency>
- <!--jsp依赖-->
- <dependency>
- <groupId>javax.servlet.jsp</groupId>
- <artifactId>jsp-api</artifactId>
- <version>2.1</version>
- </dependency>
- <!--jstl表达式-->
- <dependency>
- <groupId>javax.servlet.jsp.jstl</groupId>
- <artifactId>jstl-api</artifactId>
- <version>1.2</version>
- </dependency>
- <!--standard标签库-->
- <dependency>
- <groupId>taglibs</groupId>
- <artifactId>standard</artifactId>
- <version>1.1.2</version>
- </dependency>
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>1.2.17</version>
- </dependency>
- <!--工具类,可以复制对象-->
- <!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
- <dependency>
- <groupId>commons-beanutils</groupId>
- <artifactId>commons-beanutils</artifactId>
- <version>1.9.4</version>
- </dependency>
-
- </dependencies>
添加Web框架
HelloServlet
- package com.rzp.servlet;
-
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
-
- public class HelloServlet extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //获取前端参数
- String method = req.getParameter("method");
- if (method.equals("add")){
- req.getSession().setAttribute("msg","执行了add方法");
- }
- if (method.equals("delete")){
- req.getSession().setAttribute("msg","执行了delete方法");
- }
- //TODO:调用业务层
-
- //转发
- req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,resp);
- }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- doGet(req, resp);
- }
- }
-
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>hello</servlet-name>
- <servlet-class>com.rzp.servlet.HelloServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>hello</servlet-name>
- <url-pattern>/hello</url-pattern>
- </servlet-mapping>
-
-
- </web-app>
jsp/test.jsp
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>${msg}</title>
- </head>
- <body>
- ${msg}
- </body>
- </html>
测试
小结
用户通过输入url和参数可以进入到对应的页面,这里MVC框架做的事情:
封装用户输入的信息(request),根据url,通过wel.xml中注册的信息,映射到Java的类里面。
处理用户的请求,业务处理,封装响应的数据。
把响应的数据转发/重定向到页面中。
转发/重定向回顾:
转发不会改变url,使用的是request的方法getRequestDispatcher
重定向会改变url,使用的是response的方法sendRedirect。
SpringMVC简介
Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。
Spring MVC的特点:
轻量级,简单易学
高效 , 基于请求响应的MVC框架
与Spring兼容性好,无缝结合
SpringMVC中所有的的都可以在Spring中注册。
约定优于配置
功能强大:RESTful、数据验证、格式化、本地化、主题等
简洁灵活
Spring的web框架围绕DispatcherServlet [ 本质是继承了Servlet ] 设计。
DispatcherServlet的作用是将请求分发到不同的处理器。从Spring 2.5开始,使用Java 5或者以上版本的用户可以采用基于注解形式进行开发,十分简洁;
第一个SpringMVC程序
创建4个文件
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">
-
- <!--注册DispatcherServlet-->
- <!--这个类是Spring写好的,我们直接注册就可以了-->
- <servlet>
- <servlet-name>springmvc</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <!--导入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>
-
- <!--所有的请求都会经过这个类-->
- <!--/ 匹配所有的请求(不包括jsp)-->
- <!--/* 匹配所有的请求(包括jsp)-->
- <servlet-mapping>
- <servlet-name>springmvc</servlet-name>
- <url-pattern>/</url-pattern>
- </servlet-mapping>
-
- </web-app>
springmvc-servlet
- <?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:aop="http://www.springframework.org/schema/aop"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- https://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/aop
- https://www.springframework.org/schema/aop/spring-aop.xsd
- http://www.springframework.org/schema/context
- https://www.springframework.org/schema/context/spring-context.xsd">
- <!--添加 处理映射器-->
- <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
- <!-- 添加 处理器适配器-->
- <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
- <!--视图解析器:DispatcherServlet给他的ModelAndView-->
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
- <!--页面前缀-->
- <property name="prefix" value="/WEB-INF/jsp/"/>
- <!--页面后缀-->
- <property name="suffix" value=".jsp"/>
- </bean>
-
- <!--Handler-->
- <bean id="/hello" class="com.rzp.controller.HelloController"/>
-
-
- </beans>
HelloController
- package com.rzp.controller;
- import org.springframework.web.servlet.ModelAndView;
- import org.springframework.web.servlet.mvc.Controller;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
-
-
- //注意:这里我们先导入Controller接口
- public class HelloController implements Controller {
- public HelloController() {
- System.out.println("构造HelloController");
- }
-
- public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
- //ModelAndView 模型和视图
- ModelAndView mv = new ModelAndView();
- //封装对象,放在ModelAndView中。Model
- mv.addObject("msg","HelloSpringMVC!");
- //封装要跳转的视图,放在ModelAndView中
- mv.setViewName("hello"); //: /WEB-INF/jsp/hello.jsp
- return mv;
- }
- }
hello.jsp
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>Title</title>
- </head>
- <body>
- ${msg}
- </body>
- </html>
-
测试:在url的项目名后面输入/hello即可:
http://localhost:8080/项目名/hello
发布的问题
发布后由于jar包需要提供给Tomcat,程序才能正常启动,因此要这样配置,否则可能会出现程序一切正常,但是输入地址后就是404:
这样就会把依赖的jar包发布到项目中。
测试,在发布后的浏览器中
SpringMVC的执行流程
首先用户在浏览器上输入地址,一定会经过DispatcherServlet。
因为DispatcherServlet就是我们在servlet的web.xml中唯一需要注册的类
用户发出请求,首先就会经过DispatcherServlet接收请求并拦截请求
相对的,其他的类我们都不再需要在servlet中注册了,简化了大量的代码,全部都经过SpringMVC帮我们处理。DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。
我们假设请求的url为 : http://localhost:8080/SpringMVC/hello
如上url拆分成三部分:
SpringMVC部署在服务器上的web站点
hello表示控制器--也就是我们写的Controller层的类
通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。
DispatcherServlet得到url后,调用HandlerMapping,HandlerMapping根据请求url查找Handler。
HandlerMapping为处理器映射,是一个接口。
HandlerExecution表示具体的Handler,会根据我们输入的url--hello查找对应的类。
HandlerExecution将找到的类传递给DispatcherServlet。
DispatcherServlet再传递给HandlerAdapter。
Handler执行Controller的ModeAndView方法,也就是我们继承Controller重写的方法。
在这里我们可以调用Mode层,并把要显示的信息、要用来显示的界面封装到ModeAndView这个对象里----正是Controller层应该做的事。
Controller将ModeAndView对象返回给HandlerAdapter。
HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名
视图解析器将解析的逻辑视图名传给DispatcherServlet。
DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
最终视图呈现给用户。
备注:
实际开发中我们并不会使用这个方式,而是使用注解开发。
另外,即使使用这个方式,其实也不需要注册映射器和适配器,在这里只是为了更好的说明MVC的流程。
SpringMVC(一):简介和第一个程序的更多相关文章
- Hibernate5笔记1--Hibernate简介和第一个程序
Hibernate简介: Hibernate是一个开放源代码的ORM(对象关系映射)框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hib ...
- Python第一部分--Python简介+第一个程序+Python2和Python3介绍 001-016
一.Python起源 1.1 解释器(科普) 1.2Python的设计目标 1.3 Python的设计哲学 02.为什么学Python? 代码量少 同一样问题,不用的语言解决,代码量差距还是很多的,一 ...
- [Fluent NHibernate]第一个程序
目录 写在前面 Fluent Nhibernate简介 基本配置 总结 写在前面 在耗时两月,NHibernate系列出炉这篇文章中,很多园友说了Fluent Nhibernate的东东,也激起我的兴 ...
- 1.SpringMVC的简介和环境搭建
SpringMVC的简介: SpringMVC 和 Struts一样是一个MVC框架,和Spring无缝连接,和struts2类似, Spring MVC属于SpringFrameWork的后续产品, ...
- 【C语言探索之旅】 第三课:你的第一个程序
内容简介 1.课程大纲 2.第一部分第三课:你的第一个程序 3.第一部分第四课预告:变量的世界 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个 ...
- SLAM+语音机器人DIY系列:(二)ROS入门——4.如何编写ROS的第一个程序hello_world
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- OpenGL初学:安装配置与第一个程序
OpenGL初学:安装配置与第一个程序 2014年10月12日 12:37:03 process-z 阅读数:12413 标签: opengl安装教程 更多 个人分类: OpenGL 计算机图形学 ...
- SpringMVC系列(一)SpringMVC概述和搭建SpringMVC的第一个helloWord入门程序
一.SpringMVC 概述 • Spring为展现层提供的基于MVC设计理念的优秀的Web框架,是目前最主流的MVC框架之一 • Spring3.0 后全面超越 Struts2,成为最优秀的 MVC ...
- Python基础—01-认识python,编写第一个程序
认识python 发展历史:点此查看简介 就业方向: WEB.爬虫.运维.数据分析.机器学习.人工智能.... 版本选择 python2.7是最后一个py2的版本,2020年将不再提供支持 pytho ...
随机推荐
- Python基础类型(1)
整数 整数在Python中的关键字用int来表示; 整型在计算机中运于计算和比较 在32位机器上int的范围是: -2**31-2**31-1,即-2147483648-2147483647 在64 ...
- Echart饼形图和折线图的循环展示及选择展示
需求:根据不同的入参调同一接口,循环展示一组饼形图或折线图: 主要问题:在于给定的数据格式不符合图表的配置项格式,需要拆分组装数据:首先默认展示几个图表,当选中一个类别,需要展示其中一个的时候,页面中 ...
- 【工具】Intel HLS工具
目前新版本的Quartus 软件 都自带有 HLS 工具,比如 18.1版本安装以后,HLS相关文件夹如下: HLS工具 也可以单独下载: https://www.intel.com/content ...
- 选择tomcat时候提示Project facet Java version 1.8 is not supported.解决办法
是因为jdk版本不一致导致的,如何解决? 方法一: 选中项目Properties,选择Project Facets,右击选择Java,Change Version 方法二: 在项目的目录下有一个.se ...
- Python——项目-小游戏2-动画绘制
实现游戏循环还有事件的监听 在上一讲中 你需要完成这样的这样的效果, 如果你还没有完成,请不要继续往下阅读!!切记切记切记.,重要的事情说三遍 我们来看一下什么是游戏循环 所谓的游戏循环很好的理解 就 ...
- python如何通过正则表达式一次性提取到一串字符中所有的汉字
1.python如何通过正则表达式一次性提取到一串字符中所有的汉字 https://blog.csdn.net/py0312/article/details/93999895 说明:字符串前的 “ r ...
- 9. selenium+request方式的cookie绕过
1. 首先确认POST请求的content-type类型 2. 查看cookies数据 3. 找到对应的headers数据 4. 如果是application/json,传入的json数据需要时jso ...
- 基于Jquery WeUI的微信开发H5页面控件的经验总结(2)
在微信开发H5页面的时候,往往借助于WeUI或者Jquery WeUI等基础上进行界面效果的开发,由于本人喜欢在Asp.net的Web界面上使用JQuery,因此比较倾向于使用 jQuery WeUI ...
- 渗透神器cobalt strike在数字杀软环境下的使用
当我们拿到cobalt strike的beacon权限时,使用它如何渗透目标内网.因为我看网上的文章都是在无杀软下写的,这难免有点脱离实战环境,本文主要测试CS的beacon在数字杀软环境下进行常规渗 ...
- hdu2795billboard线段树
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/2795/ 题目大意:有一块长方形木板,从上到下被分成h*w的区域,现要将n个长条放进这些区域中,要求从上到下只要后 ...