SpringMVC第一篇【介绍、入门、工作流程、控制器】

时间:2023-01-12 13:06:24

什么是SpringMVC?

SpringMVC是Spring家族的一员,Spring是将现在开发中流行的组件进行组合而成的一个框架!它用在基于MVC的表现层开发,类似于struts2框架

SpringMVC第一篇【介绍、入门、工作流程、控制器】

为什么要使用SpringMVC?

我们在之前已经学过了Struts2这么一个基于MVC的框架….那么我们已经学会了Struts2,为啥要要学习SpringMVC呢???

下面我们来看一下Struts2不足之处:

  • 有漏洞【详细可以去搜索】
  • 运行速度较慢【比SpringMVC要慢】
  • 配置的内容较多【需要使用Struts.xml文件】
  • 比较重量级

基于这么一些原因,并且业内现在SpringMVC已经逐渐把Struts2给替代了…因此我们学习SpringMVC一方面能够让我们跟上业界的潮流框架,一方面SpringMVC确实是非常好用

可以这么说,Struts2能做的东西,SpringMVC也能够做….

回顾Struts2开发

在Struts2中,我们的开发特点是这样的:

  • Action类继承着ActionSupport类【如果要使用Struts2提供的额外功能,就要继承它】
  • Action业务方法总是返回一个字符串,再由Struts2内部通过我们手写的Struts.xml配置文件去跳转到对应的view
  • Action类是多例的,接收Web传递过来的参数需要使用实例变量来记住,通常我们都会写上set和get方法

Struts2的工作流程

SpringMVC第一篇【介绍、入门、工作流程、控制器】

  • Struts2接收到request请求
  • 将请求转向我们的过滤分批器进行过滤
  • 读取Struts2对应的配置文件
  • 经过默认的拦截器之后创建对应的Action【多例】
  • 执行完业务方法就返回给response对象

SpringMVC快速入门

导入开发包

前6个是Spring的核心功能包【IOC】,第7个是关于web的包,第8个是SpringMVC包

  • org.springframework.context-3.0.5.RELEASE.jar
  • org.springframework.expression-3.0.5.RELEASE.jar
  • org.springframework.core-3.0.5.RELEASE.jar
  • org.springframework.beans-3.0.5.RELEASE.jar
  • org.springframework.asm-3.0.5.RELEASE.jar
  • commons-logging.jar
  • org.springframework.web-3.0.5.RELEASE.jar
  • org.springframework.web.servlet-3.0.5.RELEASE.jar

编写Action

Action实现Controller接口


public class HelloAction implements Controller {
@Override
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
return null;
} }

我们只要实现handleRequest方法即可,该方法已经说了request和response对象给我们用了。这是我们非常熟悉的request和response对象。然而该方法返回的是ModelAndView这么一个对象,这是和Struts2不同的。Struts2返回的是字符串,而SpringMVC返回的是ModelAndView

ModelAndView其实他就是将我们的视图路径和数据封装起来而已【我们想要跳转到哪,把什么数据存到request域中,设置这个对象的属性就行了】


public class HelloAction implements Controller {
@Override
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception { ModelAndView modelAndView = new ModelAndView(); //跳转到hello.jsp页面。
modelAndView.setViewName("/hello.jsp");
return modelAndView;
}
}

注册核心控制器

在Struts2中,我们想要使用Struts2的功能,那么就得在web.xml文件中配置过滤器。而我们使用SpringMVC的话,我们是在web.xml中配置核心控制器


<!-- 注册springmvc框架核心控制器 -->
<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:hello.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<!--映射的路径为.action-->
<url-pattern>*.action</url-pattern>
</servlet-mapping>

创建SpringMVC控制器

我们在hello.xml配置文件中把SpringMVC的控制器创建出来

    <!--
注册控制器
name属性的值表示的是请求的路径【也就是说,当用户请求到/helloAction时,就交由HelloAction类进行处理】
-->
<bean class="HelloAction" name="/hello.action"></bean>

访问

当我们在浏览器访问http://localhost:8080/hello.action的时候,Spring会读取到我们的访问路径,然后对比一下我们的配置文件中是否有配置/hello.action,如果有。那么就交由对应的Action类来进行处理。Action类的业务方法将其请求输出到hello.jsp页面上。

SpringMVC第一篇【介绍、入门、工作流程、控制器】


SpringMVC工作流程

SpringMVC第一篇【介绍、入门、工作流程、控制器】

  • 用户发送请求
  • 请求交由核心控制器处理
  • 核心控制器找到映射器,映射器看看请求路径是什么
  • 核心控制器再找到适配器,看看有哪些类实现了Controller接口
  • 将带过来的数据进行转换,格式化等等操作
  • 找到我们的控制器Action,处理完业务之后返回一个ModelAndView对象
  • 最后通过视图解析器来对ModelAndView进行解析
  • 跳转到对应的JSP/html页面

上面的工作流程中,我们是没有讲过映射器,适配器,视图解析器这样的东西的。但是SpringMVC的环境还是被我们搭建起来了。

下面就由我来一个一个来介绍他们是有什么用的!

映射器

我们在web.xml中配置规定只要是.action为后缀的请求都是会经过SpringMVC的核心Servlet

当我们接收到请求的时候,我们发现是hello.action,是会经过我们的核心Servlet的,那么核心Servlet就会去找有没有专门的Action类来处理hello.action请求的

也就是说:映射器就是用于处理“什么样的请求提交给Action”处理【默认可省略的】…..

其实我们在快速入门的例子已经配置了:name属性就是规定了hello.action到HelloAction控制器中处理


<!--
注册控制器
name属性的值表示的是请求的路径【也就是说,当用户请求到/helloAction时,就交由HelloAction类进行处理】
-->
<bean class="HelloAction" name="/hello.action"></bean>

映射器默认的值是这样的:


<!-- 注册映射器(handler包)(框架)【可省略】 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
</bean>

当然了,上面我们在创建控制器的时候【也就是HelloAction】可以不使用name属性来指定路径,可以使用我们的映射器来配置。如以下的代码:

    <bean class="HelloAction" id="helloAction"></bean>

    <!-- 注册映射器(handler包)(框架) -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.action">helloAction</prop>
</props>
</property>
</bean>

当我们需要多个请求路径都交由helloAction控制器来处理的话,我们只要添加prop标签就行了!


<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.action">helloAction</prop>
<prop key="/bye.action">helloAction</prop>
</props>
</property>
</bean>

SpringMVC第一篇【介绍、入门、工作流程、控制器】


适配器

当我们映射器找到对应的Action来处理请求的时候,核心控制器会让适配器去找该类是否实现了Controller接口【默认可省略的】

也就是说:适配器就是去找实现了Controller接口的类


<!-- 适配器【可省略】 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>

视图解析器

我们把结果封装到ModelAndView以后,SpringMVC会使用视图解析器来对ModelAndView进行解析。【默认可省略的】

也有一种情况是不能省略的。我们在快速入门的例子中,将结果封装到ModelAndView中,用的是绝对真实路径!如果我们用的是逻辑路径,那么就必须对其配置,否则SpringMVC是找不到对应的路径的。

那什么是逻辑路径呢???我们在Struts2中,返回的是”success”这样的字符串,从而跳转到success.jsp这样的页面上。我们就可以把”success”称作为逻辑路径

在Action中返回hello,hello是一个逻辑路径。需要我们使用视图解析器把逻辑路基补全


public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception { ModelAndView modelAndView = new ModelAndView(); //跳转到hello.jsp页面。
modelAndView.setViewName("hello");
return modelAndView;
}

如果不使用视图解析器的话,那么就会找不到页面:

SpringMVC第一篇【介绍、入门、工作流程、控制器】

因此,我们需要配置视图解析器



    <!--
如果Action中书写的是视图逻辑名称,那么视图解析器就必须配置
如果Action中书写的是视图真实名称,那么视图解析器就可选配置
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 路径前缀 -->
<property name="prefix" value="/"/>
<!-- 路径后缀 -->
<property name="suffix" value=".jsp"/>
<!-- 前缀+视图逻辑名+后缀=真实路径 -->
</bean>

控制器

ParameterizableViewController

我们在之前使用Struts2的时候,如果仅仅要跳转到某个WEB-INF/JSP页面,也要写业务方法。而业务方法也仅仅是返回一个简单的字符串。

如下的代码:



public String home(){

    return "home";
}
    <package name="nsfw-home" namespace="/nsfw" extends="struts-default">

        <action name="nsfw_*" class="zhongfucheng.nsfw.HomeAction" method="{1}">
<result name="{1}">/WEB-INF/jsp/nsfw/{1}.jsp</result>
</action>
</package>

在SpringMVC中,如果仅仅是跳转到某个视图上,我们可以省略该Action和业务方法。配置的Action只要继承着ParameterizableViewController这个类就行了


<!-- 专用于jsp到jsp/html的转发控制器 -->
<bean name="/ok.action" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
<!-- 转发到真实视图名 -->
<property name="viewName" value="/WEB-INF/ok.jsp"/>
</bean>

SpringMVC第一篇【介绍、入门、工作流程、控制器】


AbstractCommandController

到目前为止,我们都没有将SpringMVC是怎么接收web端传递过来的参数的。

我们在Struts2中,只要在Action类上写对应的成员变量,给出对应的set和get方法。那么Struts2就会帮我们把参数封装到对应的成员变量中,是非常方便的。

那么我们在SpringMVC中是怎么获取参数的呢????我们是将Action继承AbstractCommandController这么一个类的。


public class HelloAction extends AbstractCommandController { @Override
protected ModelAndView handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, BindException e) throws Exception { return null;
}
}

在讲解该控制器之前,首先我们要明白SpringMVC控制器一个与Struts2不同的地方:SpringMVC的控制器是单例的,Struts2的控制器是多例的

也就是说:Struts2收集变量是定义成员变量来进行接收,而SpringMVC作为单例的,是不可能使用成员变量来进行接收的【因为会有多个用户访问,就会出现数据不合理性】

那么SpringMVC作为单例的,他只能通过方法的参数来进行接收对应的参数只有方法才能保证不同的用户对应不同的数据

实体

实体的属性要和web页面上的name提交过来的名称是一致的。这和Struts2是一样的!


public class User { private String id;
private String username; public User() {
} public User(String id, String username) {
this.id = id;
this.username = username;
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} @Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", username='" + username + '\'' +
'}';
}
}

提交参数的JSP


<form action="${pageContext.request.contextPath}/hello.action" method="post">
<table align="center">
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>编号</td>
<td><input type="text" name="id"></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="提交">
</td>
</tr>
</table> </form>

配置Action处理请求


<bean class="HelloAction" id="helloAction"></bean> <!-- 注册映射器(handler包)(框架) -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.action">helloAction</prop>
</props>
</property>
</bean>

Action接收参数


public class HelloAction extends AbstractCommandController { /*设置无参构造器,里边调用setCommandClass方法,传入要封装的对象*/
public HelloAction() {
this.setCommandClass(User.class);
} /**
*
* @param httpServletRequest
* @param httpServletResponse
* @param o 这里的对象就表示已经封装好的了User对象了。!
* @param e
* @return
* @throws Exception
*/
@Override
protected ModelAndView handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, BindException e) throws Exception { User user = (User) o; System.out.println(user); ModelAndView modelAndView = new ModelAndView();
//跳转到ok.jsp
modelAndView.setViewName("/WEB-INF/ok.jsp");
//将数据封装到ModelAndView中
modelAndView.addObject("USER", user);
return modelAndView;
}
}

效果

SpringMVC第一篇【介绍、入门、工作流程、控制器】

小总结

SpringMVC第一篇【介绍、入门、工作流程、控制器】

SpringMVC第一篇【介绍、入门、工作流程、控制器】

Struts2和SpringMVC存值的区别:

SpringMVC第一篇【介绍、入门、工作流程、控制器】


SpringMVC第一篇【介绍、入门、工作流程、控制器】的更多相关文章

  1. Java并发包下锁学习第一篇&colon;介绍及学习安排

    Java并发包下锁学习第一篇:介绍及学习安排 在Java并发编程中,实现锁的方式有两种,分别是:可以使用同步锁(synchronized关键字的锁),还有lock接口下的锁.从今天起,凯哥将带领大家一 ...

  2. spring cloud系列教程第一篇-介绍

    spring cloud系列教程第一篇-介绍 前言: 现在Java招聘中最常见的是会微服务开发,微服务已经在国内火了几年了,而且也成了趋势了.那么,微服务只是指spring boot吗?当然不是了,微 ...

  3. 尚硅谷面试第一季-10SpringMVC的工作流程

    目录结构: 关键代码: web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xml ...

  4. Vue学习记录第一篇——Vue入门基础

    前面的话 Vue中文文档写得很好,界面清爽,内容翔实.但文档毕竟不是教程,文档一上来出现了大量的新概念,对于新手而言,并不友好.个人还是比较喜欢类似于<JS高级程序设计>的风格,从浅入深, ...

  5. 本文可能是国内第一篇介绍C&sol;4HANA Foundation的中文博客

    SAP C/4HANA从去年发布已经过去了一年多的时间,C/4HANA的从业者,对于这五朵云里包含的产品集,想必都有了一些了解. Jerry注意到,SAP C/4HANA Foundation这个概念 ...

  6. 第一篇 UEditor入门部署和体验

    UEditor 是由百度「FEX前端研发团队」开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许*使用和修改代码. UEditor富文本编辑器,轻量, ...

  7. 我的微信小程序第一篇(入门)

    前言 微信小程序出来已经有一段时间了,已经有很多大牛都写过相关教程了,那么我为啥还要写这篇文章呢?其实仅仅是个人对微信开发的一个兴趣吧,觉得是个很有意思的事情,后面有时间可能会发更多关于小程序的文章, ...

  8. FPGA第一篇:SRAM工作原理

    一.SRAM概述 SRAM主要用于二级快速缓存(Level2 C ache). 它利用晶体管来存储数据.与DRAM相比,SRAM的速度快,但在同样面积中SRAM的容量要比其它类型的内存小. 大部分FP ...

  9. SpringBoot 第一篇:入门篇

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10819728.html 版权声明:本文为博主原创文章,转载请附上博文链接! 前言   博主从去年 ...

随机推荐

  1. ASP&period;NET之纠错

    甘特图是:计划项目的时间安排和资源平衡 IoC容器会自动判断javabean和某些数据类型是否建立起依赖关系(装配是否成功),主要用在自动装配中. 通过设置属性<bean id="&q ...

  2. react 表单

    import React ,{PropTypes}from 'react'; import { render } from 'react-dom'; const styles={ mb10:{ mar ...

  3. linux菜鸟日记&lpar;2&rpar;

    ntp服务的安装与配置: 安装ntp服务的过程比较简单首先你需要挂载光盘然后安装ntp服务如果配置了本地yum源可以直接使用光盘中的资源进行本地yum的安装,如果没有就使用rpm包进行安装. 由于我已 ...

  4. 使用Xcode HeaderDoc和Doxygen文档化你的Objective-C和Swift代码

    在一个应用的整个开发过程中涉及到了无数的步骤.其中一些是应用的说明,图片的创作,应用的实现,和实现过后的测试阶段.写代码可能组成了这个过程的绝大部分,因为正是它给了应用生命,但是这样还不够,与它同等重 ...

  5. NSBundle的pathForResource&colon;ofType&colon; 返回值为nil问题

    一.问题描述 在处理XML的过程中,在项目中手动创建名为“data.xml”的文件,加入网上找的内容 <?xml version="1.0" encoding="u ...

  6. Linux--U盘安装Ubuntu12&period;04

    前言 最近一直在研究Android内核驱动开发的相关事宜,使用VMware虚拟机虽然可以更方便的开发,但是对于开发环境硬件的要求还是比较高的,若用于开发,效率太低了,所以考虑使用单独PC去装载Linu ...

  7. 2016ACM-ICPC Qingdao Online青岛网络赛题解

    TonyFang+Sps+我=5/12 滚了个大粗 2016年9月21日16:42:36 10题完工辣 01 题意:求形同的数中大于n的最小值 题解:预处理所有的(5194个),在这里面二分 #inc ...

  8. 去掉MySQL字段中的空格

    mysql replace 函数   语法:replace(object,search,replace)   意思:把object中出现search的全部替换为replace   案例: SQL Co ...

  9. 02-4&period; BCD解密&lpar;10&rpar;

    BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位.所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12.但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了 ...

  10. Fastify 系列教程一(路由和日志)

    介绍 Fastify是一个高度专注于以最少开销和强大的插件架构,为开发人员提供最佳体验的Web框架. 它受到了 Hapi 和 Express 的启发,是目前最快的 Node 框架之一. Fastify ...