导入开发包

前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接口


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

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

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


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

注册核心控制器

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


  1. <!-- 注册springmvc框架核心控制器 -->
  2. <servlet>
  3. <servlet-name>DispatcherServlet</servlet-name>
  4. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  5. <!--到类目录下寻找我们的配置文件-->
  6. <init-param>
  7. <param-name>contextConfigLocation</param-name>
  8. <param-value>classpath:hello.xml</param-value>
  9. </init-param>
  10. </servlet>
  11. <servlet-mapping>
  12. <servlet-name>DispatcherServlet</servlet-name>
  13. <!--映射的路径为.action-->
  14. <url-pattern>*.action</url-pattern>
  15. </servlet-mapping>

创建SpringMVC控制器

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

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

访问

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

SpringMVC工作流程

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

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

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

映射器

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

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

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

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


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

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


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

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

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

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


  1. <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  2. <property name="mappings">
  3. <props>
  4. <prop key="/hello.action">helloAction</prop>
  5. <prop key="/bye.action">helloAction</prop>
  6. </props>
  7. </property>
  8. </bean>


适配器

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

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


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

视图解析器

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

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

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

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


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

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

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

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

控制器

ParameterizableViewController

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

如下的代码:

  1. public String home(){
  2. return "home";
  3. }
  1. <package name="nsfw-home" namespace="/nsfw" extends="struts-default">
  2. <action name="nsfw_*" class="zhongfucheng.nsfw.HomeAction" method="{1}">
  3. <result name="{1}">/WEB-INF/jsp/nsfw/{1}.jsp</result>
  4. </action>
  5. </package>

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


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

  • 2017年9月26日15:57:45 现在看来, 好像还是在方法上写更好。我觉得统一管理起来会更加方便

AbstractCommandController

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

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

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


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

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

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

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

实体

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


  1. public class User {
  2. private String id;
  3. private String username;
  4. public User() {
  5. }
  6. public User(String id, String username) {
  7. this.id = id;
  8. this.username = username;
  9. }
  10. public String getId() {
  11. return id;
  12. }
  13. public void setId(String id) {
  14. this.id = id;
  15. }
  16. public String getUsername() {
  17. return username;
  18. }
  19. public void setUsername(String username) {
  20. this.username = username;
  21. }
  22. @Override
  23. public String toString() {
  24. return "User{" +
  25. "id='" + id + '\'' +
  26. ", username='" + username + '\'' +
  27. '}';
  28. }
  29. }

提交参数的JSP


  1. <form action="${pageContext.request.contextPath}/hello.action" method="post">
  2. <table align="center">
  3. <tr>
  4. <td>用户名:</td>
  5. <td><input type="text" name="username"></td>
  6. </tr>
  7. <tr>
  8. <td>编号</td>
  9. <td><input type="text" name="id"></td>
  10. </tr>
  11. <tr>
  12. <td colspan="2">
  13. <input type="submit" value="提交">
  14. </td>
  15. </tr>
  16. </table>
  17. </form>

配置Action处理请求


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

Action接收参数


  1. public class HelloAction extends AbstractCommandController {
  2. /*设置无参构造器,里边调用setCommandClass方法,传入要封装的对象*/
  3. public HelloAction() {
  4. this.setCommandClass(User.class);
  5. }
  6. /**
  7. *
  8. * @param httpServletRequest
  9. * @param httpServletResponse
  10. * @param o 这里的对象就表示已经封装好的了User对象了。!
  11. * @param e
  12. * @return
  13. * @throws Exception
  14. */
  15. @Override
  16. protected ModelAndView handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, BindException e) throws Exception {
  17. User user = (User) o;
  18. System.out.println(user);
  19. ModelAndView modelAndView = new ModelAndView();
  20. //跳转到ok.jsp
  21. modelAndView.setViewName("/WEB-INF/ok.jsp");
  22. //将数据封装到ModelAndView中
  23. modelAndView.addObject("USER", user);
  24. return modelAndView;
  25. }
  26. }

效果:

小总结

Struts2和SpringMVC存值的区别:

  • SpringMVC的工作流程:

    • 用户发送HTTP请求,SpringMVC核心控制器接收到请求
    • 找到映射器看该请求是否交由对应的Action类进行处理
    • 找到适配器看有无该Action类
    • Action类处理完结果封装到ModelAndView中
    • 通过视图解析器把数据解析,跳转到对应的JSP页面
  • 控制器介绍了两种:
    • ParameterizableViewController

      • 能够实现跳转到WEB-INF下资源,并不用写处理方法
    • AbstractCommandController
      • 可以实现对参数数据的封装

SpringMVC快速入门的更多相关文章

  1. SpringMVC 快速入门

    SpringMVC 快速入门 SpringMVC 简介 SpringMVC是 Spring为展示层提供的基于Web MVC设计模式的请求驱动类型的轻量级Web框架,它的功能和Struts2一样.但比S ...

  2. springmvc快速入门(注解版本)

    1)springmvc快速入门(传统版) 步一:创建springmvc-day02这么一个web应用 步二:导入springioc,springweb和springmvc相关的jar包 ------- ...

  3. springmvc快速入门(XML版本)

    1)springmvc快速入门(传统版) 步一:创建springmvc-day01这么一个web应用 步二:导入springioc,springweb , springmvc相关的jar包 步三:在/ ...

  4. springMVC快速入门 共分为五步

    springMVC快速入门 共分为5步分别为: 1 导入依赖 ​​ 2 spring-mvc.xml 配置 ​ 3 web.xml配置 ​ 4 自定义一个核心控制类 ​ 5 页面配置 详细步骤以及代码 ...

  5. SpringMvc快速入门之使用篇

    文章是为了结合工作需求来介绍springmvc,本文章只是切合实际的开发的场景对springmvc进行快速的入门介绍. 本篇文章不会对原理进行讲解.因为个人觉得有些对于新技术方面可以分为一下几个层次. ...

  6. SpringMVC快速入门记录(一)

    1.SpringMVC入门:表现层框架,spring的一部分 2.Spring处理流程: 3.要在web.xml里写好相关配置 <!--配置DispatcherServlet--> < ...

  7. SpringMVC快速入门记录(二)

    一.数组参数绑定和List参数绑定 1.数组参数绑定 提交多个相同name的参数,保持name的名字和Controller方法参数的数组名称相同即可. 2.List参数绑定 List中存放对象,并将定 ...

  8. 01.SpringMVC快速入门

    1.导入jar包 2.在web.xml中配置前端控制器 <!-- spring前端控制器 --> <servlet> <servlet-name>springmvc ...

  9. [jbdj]SpringMVC框架(1)快速入门

    1)springmvc快速入门(传统版) 步一:创建springmvc_demo一个web应用 步二:导入springioc,springweb , springmvc相关的jar包 步三:在/WEB ...

随机推荐

  1. C++学习笔记-关键词

    1.friend友元 采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口.但是,有时需要定义一些函数,这些函数不是类的一部分( ...

  2. kuangbin专题十二 HDU1176 免费馅饼 (dp)

    免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  3. UICollectionView的基本使用 collectionView

    #pragma mark -- 创建CollectionView - (void)createCollectionView{ //关闭自适应 self.automaticallyAdjustsScro ...

  4. Java技术列表

    完整的java技术列表,可以在oracle官网找到: https://www.oracle.com/technetwork/java/javaee/tech/index.html JSR: Java ...

  5. CF628D Magic Numbers (数据大+数位dp)求[a,b]中,偶数位的数字都是d,其余为数字都不是d,且能被m整除的数的个数

    题意:求[a,b]中,偶数位的数字都是d,其余为数字都不是d,且能被m整除的数的个数(这里的偶数位是的是从高位往低位数的偶数位).a,b<10^2000,m≤2000,0≤d≤9 a,b< ...

  6. c++从txt中读取数据,数据并不是一行路径(实用)

    #include <iostream>#include <fstream>#include <string> using namespace std; //输出空行 ...

  7. hadoop install start-dfs.sh 失败

    linux:ubuntu 16.04 LTS hadoop version: 2.7.3 JDK: java-9-open-jdk issue: start-dfs.sh start-dfs.sh:c ...

  8. 用navigator.geolocation.getCurrentPosition在IOS10以上的系统无法定位

    昨天老板告诉我代码有Bug(定位失败),于是各种测试最终发现IOS10以上版本手机不能成功(穷,买不起iphone,测试不完全),先贴失败代码: var city =""; nav ...

  9. DRF-->1 序列化组件的使用和接口设计---get

    定义序列化器(本质就是一个类),一般包括模型类的字段,有自己的字段类型规则.实现了序列化器后,就可以创建序列化对象以及查询集进行序列化操作,通过序列化对象.data来获取数据(不用自己构造字典,再返回 ...

  10. python3+Appium自动化12-H5元素定位环境搭建

    前言 在混合开发的App中,经常会有内嵌的H5页面.那么这些H5页面元素该如何进行定位操作呢? 针对这种场景直接使用前面所讲的方法来进行定位是行不通的,因为前面的都是基于Andriod原生控件进行元素 ...