在上一篇文章《整合SSM框架必备基础—SpringMVC(上)》中,胖达介绍了关于SpringMVC的诞生、优势以及执行流程等理论知识点,这篇文章打算在实操中加深一下对SpringMVC的认识,毕竟实践才是学习技术最有效的方法嘛,Let's Go!

一、 首先来创建一个Web小项目吧

JDK版本:jdk1.7.0_07

开发环境:Intellij IDEA v2018.03

首先需要在IDEA的项目列表页面新建一个Web项目,这里IDEA给我们提供了众多的项目模板,只要选择了相应的模板就可以快速新建一个项目骨架,在这里,我们可以首先通过一个webapp模板新建Web项目,步骤如下:

1.创建新项目

2.通过Maven模板选择,新建项目骨架

3.为组织和项目新建唯一标志符

4.选择本地或者默认的Maven及其版本

5.确定项目名称以及项目新建的位置即可

6.生成的Web项目目录

在上述步骤完成后,点击Finish,即可成功利用模板生成了一个简易的Web项目骨架,其生成的项目目录如下图所示:

二、SpringMVC的配置要经历哪些过程呢?

1.在pom.xml中配置Maven依赖

配置SpringMVC首先需要添加该框架所需的Maven依赖(即jar文件),思考一下SpringMVC的运行需要哪些jar包的支持呢?我们需要把这些依赖都添加到pom.xml文件中,才可进行SpringMVC项目的构建,下面我整理了一份,虽然不是很全但是够用。

添加依赖之前,首先需要在pom.xml中的properties标签属性中标记一下Spring的版本,如果像我一样额外引入了Hibernate,顺便标记一下Hibernate的版本哈,配置如下:

  1. <properties>
  2. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  3. <maven.compiler.source>1.7</maven.compiler.source>
  4. <maven.compiler.target>1.7</maven.compiler.target>
  5. <spring.version>4.2.6.RELEASE</spring.version>
  6. <hibernate.version>5.1.0.Final</hibernate.version>
  7. </properties>

然后在这个文件中添加dependency依赖,依赖文件的配置如下:

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-core</artifactId>
  4. <version>4.2.5.RELEASE</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework</groupId>
  8. <artifactId>spring-context</artifactId>
  9. <version>4.2.5.RELEASE</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework</groupId>
  13. <artifactId>spring-webmvc</artifactId>
  14. <version>${spring.version}</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.springframework.data</groupId>
  18. <artifactId>spring-data-jpa</artifactId>
  19. <version>1.10.1.RELEASE</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.hibernate</groupId>
  23. <artifactId>hibernate-entitymanager</artifactId>
  24. <version>${hibernate.version}</version>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.hibernate</groupId>
  28. <artifactId>hibernate-c3p0</artifactId>
  29. <version>${hibernate.version}</version>
  30. </dependency>
  31. <dependency>
  32. <groupId>com.mchange</groupId>
  33. <artifactId>c3p0</artifactId>
  34. <version>0.9.5.2</version>
  35. </dependency>
  36. <dependency>
  37. <groupId>javax.servlet</groupId>
  38. <artifactId>jstl</artifactId>
  39. <version>1.2</version>
  40. </dependency>
  41. <dependency>
  42. <groupId>mysql</groupId>
  43. <artifactId>mysql-connector-java</artifactId>
  44. <version>5.1.39</version>
  45. </dependency>

另外,如果你pom.xml文件中build属性标签中没有关于maven编译打包的插件maven-compiler-plugin这一项,你还需要添加一个关于它的配置,因为没有它你的Maven是没办法给你编译项目源代码的,但是如果有的话你可以自动忽略掉,配置内容如下:

  1. <build>
  2. <finalName>springmvcdemo</finalName>
  3. <plugins>
  4. <plugin>
  5. <groupId>org.apache.maven.plugins</groupId>
  6. <artifactId>maven-compiler-plugin</artifactId>
  7. <configuration>
  8. <source>1.8</source>
  9. <target>1.8</target>
  10. </configuration>
  11. </plugin>
  12. </plugins>
  13. </build>

2.web.xml文件的配置

对于一个Web项目,web.xml是这个项目的整体配置文件,需要在这个文件中添加相关的一些配置,例如DispatcherServlet配置、字符集编码设置过滤器、错误跳转页面等等,其中DispatcherServlet做为框架的入口,是使用SpringMVC必需的配置;encodingFilter过滤器是为了处理请求中的中文,防止出现乱码。

配置代码如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app>
  3. <display-name>Archetype Created Web Application</display-name>
  4. <!--根目录跳转-欢迎页面-->
  5. <welcome-file-list>
  6. <welcome-file>index.jsp</welcome-file>
  7. </welcome-file-list>
  8. <!--编码过滤器-->
  9. <filter>
  10. <filter-name>encodingFilter</filter-name>
  11. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  12. <init-param>
  13. <param-name>encoding</param-name>
  14. <param-value>UTF-8</param-value>
  15. </init-param>
  16. <init-param>
  17. <param-name>forceEncoding</param-name>
  18. <param-value>true</param-value>
  19. </init-param>
  20. </filter>
  21. <filter-mapping>
  22. <filter-name>encodingFilter</filter-name>
  23. <url-pattern>/*</url-pattern>
  24. </filter-mapping>
  25. <!--错误页面跳转-->
  26. <error-page>
  27. <!-- 路径不正确 -->
  28. <error-code>404</error-code>
  29. <location>/WEB-INF/errorpage/404.jsp</location>
  30. </error-page>
  31. <error-page>
  32. <!-- 没有访问权限,访问被禁止 -->
  33. <error-code>405</error-code>
  34. <location>/WEB-INF/errorpage/405.jsp</location>
  35. </error-page>
  36. <error-page>
  37. <!-- 内部错误 -->
  38. <error-code>500</error-code>
  39. <location>/WEB-INF/errorpage/500.jsp</location>
  40. </error-page>
  41. <!--SpringMVC入口配置-->
  42. <servlet>
  43. <servlet-name>spring-mvc</servlet-name>
  44. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  45. <!--此处后面会有说明-->
  46. <!--<init-param>
  47. <param-name>contextConfigLocation</param-name>
  48. <param-value>/WEB-INF/springmvc-servlet.xml</param-value>
  49. </init-param>-->
  50. <load-on-startup>1</load-on-startup>
  51. </servlet>
  52. <servlet-mapping>
  53. <servlet-name>spring-mvc</servlet-name>
  54. <url-pattern>/</url-pattern>
  55. </servlet-mapping>
  56. </web-app>

3.SpringMVC自身xml文件配置

SprignMVC自身也存在一个配置文件,如果你的项目中不包含这个配置文件,可以通过IDEA自带的方式去生成,步骤如下图所示:



(1)在WEB-INF根目录下点击右键

(2)点击New在右侧找到XML Configuration File

(3)点击后找到Spring Config

(4)为XML配置文件命名,例如:XXX-servlet.xml即可,命名时需要注意SpringMVC会默认去找/WEB-INF/XXX-servlet.xml这个XML,其中XXX是上述Web.xml中所配置的servlet-name名称,如果不想用这个作为配置文件的名称,且不想用-servlet为后缀,就需要在Web.xml中配置contextConfigLocation来指定文件路径,例如:

  1. <!--SpringMVC入口配置-->
  2. <servlet>
  3. <servlet-name>spring-mvc</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>/WEB-INF/springmvc-servlet.xml</param-value>
  9. </init-param>
  10. <load-on-startup>1</load-on-startup>
  11. </servlet>
  12. <servlet-mapping>
  13. <servlet-name>spring-mvc</servlet-name>
  14. <url-pattern>/</url-pattern>
  15. </servlet-mapping>

新建了配置文件,IDEA并不会默认生成所有配置,我们最终还是看到一个空空的XML文件,需要对其配置进行手动添加,添加之前首先搞清楚这个配置文件到底能有啥用途呢?

(1)配置自动扫描的包路径,通过这项配置,自动扫描某个包下的Controller控制器,方便管理Bean,并在请求的时候快速定位Controller并访问。

(2)注解映射支持配置即注解开关,只有配置了这一项,注解才能有效果。

(3)配置视图解析器,通过视图解析器可以给请求页面添加前缀和后缀,而不用每次SpringMVC返回视图的时候再去单独指定前缀、后缀,例如:

  1. <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
  2. <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
  3. <property name="prefix" value="/WEB-INF/pages/"/>
  4. <property name="suffix" value=".jsp"/>
  5. </bean>

(4)配置静态资源文件的访问,如果 DispatcherServlet 拦截了所有的请求,同时对.js,.jpg的访问也会被拦截,导致运行时跳转后的页面无法加载静态资源文件,这时需要对静态资源文件的访问进行配置。

(5)配置上传文件数据解析器,方便管理上传数据的信息,包括文件的格式、最大最小数据量等等,例如:

  1. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  2. <property name="maxUploadSize" value="10485760"/>
  3. <property name="defaultEncoding" value="UTF-8"/>
  4. </bean>

(6)配置全局异常处理器,针对异常处理做统一的处理和维护,并对一些特殊异常做特殊处理,例如:

  1. <!-- 全局异常处理器,实现HandlerExceptionResolver接口就是全局异常处理器-->
  2. <bean class="com.eurasia.exception.CustomExceptionResolver"></bean>

(7)自定义参数类型绑定,SpringMVC框架可以实现传参到Controller请求方法中返回视图和参数的功能,在Controller中可以完成对于参数的处理,例如你的参数是一个实体类,其中的某个字段需要转换为Date,这时可以通过配置自定义转换器来实现参数转换,例如:

  1. <bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper">
  2. <property name="dateFormat">
  3. <bean class="java.text.SimpleDateFormat">
  4. <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" />
  5. </bean>
  6. </property>
  7. </bean>

明确了这些用途,在来看看文件中应该如何具体的进行配置,配置内容如下(上述某些用途的配置在当前小项目中没有用到,所以未提供相关配置):

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context
  9. http://www.springframework.org/schema/context/spring-context.xsd
  10. http://www.springframework.org/schema/mvc
  11. http://www.springframework.org/schema/mvc/spring-mvc.xsd">
  12. <!--指明 controller 所在包,并扫描其中的注解-->
  13. <context:component-scan base-package="hello"/>
  14. <!-- 静态资源(js、image等)的访问 -->
  15. <mvc:default-servlet-handler/>
  16. <!-- 开启注解 -->
  17. <mvc:annotation-driven/>
  18. <!--ViewResolver 视图解析器-->
  19. <!--用于支持Servlet、JSP视图解析-->
  20. <bean id="jspViewResolver"
  21. class="org.springframework.web.servlet.view.UrlBasedViewResolver"
  22. <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
  23. <property name="prefix" value="/WEB-INF/pages/"/>
  24. <property name="suffix" value=".jsp"/>
  25. </bean>
  26. </beans>

注意:如果你生成的配置文件在加入这些标签时报错,记得检查你的xmlns:mvc和xmlns:context头信息,把它们补全即可

4.创建我们的Controller控制器

在src/main目录下新建包名,例如com.hello这样,然后在下面新建一个java文件HiController.java,这个就是我们新建的第一个Contrller控制器,通过这个控制器,就可以向前台传递ModelAndView,当然你也可以指定view路径最终呈现给用户一个展示的界面。

前面我们已经启用了SpringMVC提供的注解功能,那我们在这里就可以直接用注解来注释我们的控制器,这样才能识别到这个控制器,代码呈上:

  1. @Controller
  2. @RequestMapping("/hello")
  3. public class HiController {
  4. /**
  5. * 测试返回指定的view文件名
  6. * @return
  7. */
  8. @RequestMapping("/welcome")
  9. public String helloWorld() {
  10. return "welcome";
  11. }
  12. /**
  13. * 测试返回带有数据的ModelAndView对象
  14. * @return
  15. */
  16. @RequestMapping("/view")
  17. public ModelAndView getView() {
  18. String message = "<br><div style='text-align:center;'>"
  19. + "<h3>我叫胖达,来自HiController.java(公众号:Java知识共享)</h3>";
  20. return new ModelAndView("welcome", "message", message);
  21. }
  22. }

这里Controller最终是要向前台的界面返回数据或者调起某个界面的,所以必须在前台也要指定一个页面,我在webapp下的WEB-INF中创建了一个pages文件夹专门存放前台的页面,这里暂时先放一个welcome.jsp页面,给大家打个招呼,页面内容如下:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. Hi!
  11. ${message}</body>
  12. </html>

根据前台和后台的这两段代码,看懂的小伙伴应该知道了我的演示效果,等我启动起来项目再展示哈。

5.配置Tomcat,启动小项目

我已经迫不及待的要启动我的项目了,IDEA中配置tomcat的步骤其实很简单,如果你pom.xml中引入maven-tomcat插件,可能会更简单,这里我用传统外部tomcat的方式吧。

首先点击右上角的edit Configurations按钮:



这样就打开了run/debug Configurations窗口,在这个窗口继续操作如下:



特别注意:第四个步骤是为了选择本地的tomcat路径哈,直接选择自己的外部tomcat,选择根路径即可。

然后还有一步就是需要选择tomcat启动的时候需要Deployment也就是要发布的应用,按照下述步骤1-6即可:



到此,tomcat配置成功,直接点击右上角,启动我们的小项目即可。



由于前面配置了欢迎界面,当系统启动成功后我会自动访问index.jsp欢迎页面,并成功展示HelloWorld字样,接下来我们要依次访问一下我们控制器中写的两个方法:

第一个方法

访问路径:

http://localhost:8088/SpringMVCStarter/hello/welcome

访问结果:



结论:在上面后端的代码中会发现,我只是指定了一个view的路径welcome,结果会自动跳转出welcome.jsp的原有内容,说明我们的调用成功了

第二个方法

访问路径:

http://localhost:8088/SpringMVCStarter/hello/view

访问结果:



结论:与第一个不同的是,这个方法会跳转同一个界面welcome.jsp,但是后台我返回的是ModelAndView对象,这样的话,后台会将数据和视图经过渲染后一并呈现给用户,如上图黑色字体为后台传递到前台的数据。

三、 SpringMVC的几种注解

提及SpringMVC,不得不顺便啰嗦一下它的注解,确实非常好用,常用的几个重要注解如下:

1.Controller

这个可以说是最重要的一个注解了,主要用于标识是Controller处理器类.表示把我的控制器对象交给Spring来创建。

2.RequestMapping

请求映射的注解,也就是标记请求路径名的重要注解,就比如我们小项目中的hello和welcome用法,当然还有指定其他参数的用法,例如请求方式是post还是get,都可以在这个注解中标明。

3.RequestParam

这个注解的功能主要是给参数设置默认值,或者给参数定义别名,只要别名和页面传递参数匹配即可传递成功,例如:

  1. @RequestParam(defaultValue="1",value="myid")

它的配置项主要包含:

(1) value:参数名字,即入参的请求参数名字,如value=“studentid”表示请求的参数区中的名字为studentid的参数的值将传入;

(2) required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报400错误码;

(3) defaultValue:默认值,表示如果请求中没有同名参数时的默认值

4.Redirect

通过这个注解,Contrller方法返回结果重定向到一个url地址,例如redirect:/user/add.do即可跳转到这个add.do指定的相应页面。

5.Forward

利用这个注解,Controller方法执行后还会继续执行另一个controller方法,例如return “forward:/user/userlist.do”;,就会去执行其他的userlist这个方法

6.RequestBody/ResponseBody

如果要用到json传递数据,那这个注解是非常重要的,其实也是日常开发必须的一个注解。

其中@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容转换为json、xml等格式的数据并绑定到controller方法的参数上。

@RequestBody注解实现接收http请求的json数据,将json数据转换为java对象,但是@RequestBody/@ResponseBody一般要依赖Jackson使用。

四、总结

关于SpringMVC的整个访问流程在上篇文章中简单介绍了一下,这篇文章也通过搭建流程、创建配置文件的方式做了一个简单的介绍,假想我们从访问一个Controller控制器的url出发,首先通过web.xml中的入口DispatchServlet进入了SpringMVC这个框架的流程,再通过框架内的HandlerMapping、HandlerAdapter找到我们提前通过注解注入的Controller方法,执行完成后返回带着数据的ModelAndView对象,在通过我们配置的ViewResolver给我们view路径添加上前缀后缀,最终做一些数据和视图的渲染工作,就可以将一个期待的效果页面展现给我们了,这个过程是不是很清晰?其实虽然写了那么多,但是对于SpringMVC内部的处理情况还是有一点点疑问,以后有机会我会带着疑问跟大家一起去撸一遍源码,或许通过源码才能更加深入的了解到SpringMVC这个神奇的框架,期待ING!!!

整合SSM框架必备基础—SpringMVC(下)的更多相关文章

  1. 整合SSM框架必备基础—SpringMVC(上)

    01 MVC概述 在Web系统开发中一般按照视图(View).模型(Model).控制(Controller)三层设计模式进行构建,视图层负责模型数据的渲染,将数据用一定的形式展现给用户:模型层负责监 ...

  2. shiro权限控制(一):shiro介绍以及整合SSM框架

    shiro安全框架是目前为止作为登录注册最常用的框架,因为它十分的强大简单,提供了认证.授权.加密和会话管理等功能 . shiro能做什么? 认证:验证用户的身份 授权:对用户执行访问控制:判断用户是 ...

  3. IDEA+Maven 整合SSM框架实现简单的增删改查(新手入门,傻瓜操作)

    原博客地址:https://blog.csdn.net/khxu666/article/details/79851070 选用SSM框架的原因在目前的企业级Java应用中,Spring框架是必须的.S ...

  4. 用Maven整合SSM框架

    前述 Maven 是专门用于构建和管理Java相关项目的工具,利用 Maven 的主要目的是统一维护 jar 包.关于 Maven 的安装在这篇里面就不说了. SSM(Spring+SpringMVC ...

  5. shiro框架整合ssm框架

    下面我通过一个web的maven项目来讲解如何将shiro整合ssm框架,具体结构如下图 一.引入依赖的jar包 <?xml version="1.0" encoding=& ...

  6. Maven整合SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

    使用SSM(Spring.SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方.之前没有记录SSM整合 ...

  7. ssm框架(Spring Springmvc Mybatis框架)整合及案例增删改查

    三大框架介绍 ssm框架是由Spring springmvc和Mybatis共同组成的框架.Spring和Springmvc都是spring公司开发的,因此他们之间不需要整合.也可以说是无缝整合.my ...

  8. 使用IDEA整合SSM框架

    一.安装环境和开发工具 在整合Spring,SpringMVC 和 MyBatis 的过程中,很容易遇到一些小问题,因此记录下整合过程. 首先是安装环境和开发工具,如下: Window 7 Jdk 1 ...

  9. 一步步教你整合SSM框架(Spring MVC+Spring+MyBatis)详细教程重要

    前言 SSM(Spring+SpringMVC+Mybatis)是目前较为主流的企业级架构方案,不知道大家有没有留意,在我们看招聘信息的时候,经常会看到这一点,需要具备SSH框架的技能:而且在大部分教 ...

随机推荐

  1. 推荐一些C#相关的网站、资源和书籍 (转载自http://blog.csdn.net/chinacsharper/article/details/17514923)

    一.网站 1.http://msdn.microsoft.com/zh-CN/ 微软的官方网站,C#程序员必去的地方.那里有API开发文档,还有各种代码.资源下载. 2.http://social.m ...

  2. uni-app中vue组件父子值传递

    一.父组件向子组件传递数据(props) <template> <view class="container" style="background: # ...

  3. 30212Java_数组

    数组 1.综述 数组是相同类型数据的有序集合.数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成. 其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们. 数组的三个 ...

  4. kubernetes使用http rest api访问集群之使用postman工具访问 apiserver

    系列目录 前面一节我们介绍了使用curl命令行工具访问apiserver,命令行工具快速高效,但是对于输出非常长的内容查看不是特别方便,尤其终端界面输入的东西非常多的时候,过长的内容不是特别容易通过滚 ...

  5. webpack 编译ES6

    虽然js的es6是大势之趋,但很多浏览器还没有完全支持ES6语法,webpack可以进行对es6打包编译 需要安装的包有 npm init // 初始化 npm install babel-loade ...

  6. 前后端开发(2):浏览器与PHP程序的交互

    上一节介绍怎么在mac电脑上启用PHP程序,并且演示了一个简单的例子,这个例子运行时,涉及了浏览器.apache以及PHP程序的交互,这三者的关系大概是这样的: 一般来说,浏览器(或者类似功能的程序) ...

  7. spark 2.x在windows环境使用idea本地调试启动了kerberos认证的hive

    1 概述 开发调试spark程序时,因为要访问开启kerberos认证的hive/hbase/hdfs等组件,每次调试都需要打jar包,上传到服务器执行特别影响工作效率,所以调研了下如何在window ...

  8. Adboe Flash远程代码执行_CVE-2018-4878漏洞复现

    Adboe Flash远程代码执行_CVE-2018-4878漏洞复现 一.漏洞描述 该漏洞可针对windows用户发起定向攻击.攻击者可以诱导用户打开包含恶意Flash代码文件的Microsoft ...

  9. PATB 1032 挖掘机技术哪家强(20)

    #include <cstdio> #include <vector> using namespace std; const int N = 100001; vector &l ...

  10. 关于Lombok和自动生成get set方法

    在Java开发的项目里面免不了要用很多的get set 以及toString之类的方法,有时候确实是很繁琐而且做着重复共同工作,我们有没有办法来简化这个过程呢,当然有. Lombok就可以很好的解决这 ...