欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

整合SSM框架必备基础—SpringMVC(下)

程序员文章站 2022-05-16 11:57:02
在上一篇文章 "《整合SSM框架必备基础—SpringMVC(上)》" 中,胖达介绍了关于SpringMVC的诞生、优势以及执行流程等理论知识点,这篇文章打算在实操中加深一下对SpringMVC的认识,毕竟实践才是学习技术最有效的方法嘛,Let's Go! 一、 首先来创建一个Web小项目吧 JDK ......

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

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

jdk版本:jdk1.7.0_07
开发环境:intellij idea v2018.03

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

1.创建新项目

整合SSM框架必备基础—SpringMVC(下)

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

整合SSM框架必备基础—SpringMVC(下)

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

整合SSM框架必备基础—SpringMVC(下)

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

整合SSM框架必备基础—SpringMVC(下)

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

整合SSM框架必备基础—SpringMVC(下)

6.生成的web项目目录

在上述步骤完成后,点击finish,即可成功利用模板生成了一个简易的web项目骨架,其生成的项目目录如下图所示:
整合SSM框架必备基础—SpringMVC(下)

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

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

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

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

<properties>
  <project.build.sourceencoding>utf-8</project.build.sourceencoding>
  <maven.compiler.source>1.7</maven.compiler.source>
  <maven.compiler.target>1.7</maven.compiler.target>
  <spring.version>4.2.6.release</spring.version>
  <hibernate.version>5.1.0.final</hibernate.version>
</properties>

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

<dependency>
    <groupid>org.springframework</groupid>
    <artifactid>spring-core</artifactid>
    <version>4.2.5.release</version>
</dependency>
<dependency>
    <groupid>org.springframework</groupid>
    <artifactid>spring-context</artifactid>
    <version>4.2.5.release</version>
</dependency>
<dependency>
    <groupid>org.springframework</groupid>
    <artifactid>spring-webmvc</artifactid>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupid>org.springframework.data</groupid>
    <artifactid>spring-data-jpa</artifactid>
    <version>1.10.1.release</version>
</dependency>
<dependency>
    <groupid>org.hibernate</groupid>
    <artifactid>hibernate-entitymanager</artifactid>
    <version>${hibernate.version}</version>
</dependency>
<dependency>
    <groupid>org.hibernate</groupid>
    <artifactid>hibernate-c3p0</artifactid>
    <version>${hibernate.version}</version>
</dependency>
<dependency>
    <groupid>com.mchange</groupid>
    <artifactid>c3p0</artifactid>
    <version>0.9.5.2</version>
</dependency>
<dependency>
    <groupid>javax.servlet</groupid>
    <artifactid>jstl</artifactid>
    <version>1.2</version>
</dependency>
<dependency>
    <groupid>mysql</groupid>
    <artifactid>mysql-connector-java</artifactid>
    <version>5.1.39</version>
</dependency>

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

<build>
    <finalname>springmvcdemo</finalname>
    <plugins>
        <plugin>
            <groupid>org.apache.maven.plugins</groupid>
            <artifactid>maven-compiler-plugin</artifactid>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

2.web.xml文件的配置

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

配置代码如下:

<?xml version="1.0" encoding="utf-8"?>
<web-app>
  <display-name>archetype created web application</display-name>
  <!--根目录跳转-欢迎页面-->
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <!--编码过滤器-->
  <filter>
    <filter-name>encodingfilter</filter-name>
    <filter-class>org.springframework.web.filter.characterencodingfilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceencoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingfilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!--错误页面跳转-->
  <error-page>
    <!-- 路径不正确 -->
    <error-code>404</error-code>
    <location>/web-inf/errorpage/404.jsp</location>
  </error-page>
  <error-page>
    <!-- 没有访问权限,访问被禁止 -->
    <error-code>405</error-code>
    <location>/web-inf/errorpage/405.jsp</location>
  </error-page>
  <error-page>
    <!-- 内部错误 -->
    <error-code>500</error-code>
    <location>/web-inf/errorpage/500.jsp</location>
  </error-page>
  <!--springmvc入口配置-->
  <servlet>
    <servlet-name>spring-mvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.dispatcherservlet</servlet-class>
    <!--此处后面会有说明-->
      <!--<init-param>
          <param-name>contextconfiglocation</param-name>
          <param-value>/web-inf/springmvc-servlet.xml</param-value>
      </init-param>-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>spring-mvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

3.springmvc自身xml文件配置

sprignmvc自身也存在一个配置文件,如果你的项目中不包含这个配置文件,可以通过idea自带的方式去生成,步骤如下图所示:
整合SSM框架必备基础—SpringMVC(下)
(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来指定文件路径,例如:

<!--springmvc入口配置-->
<servlet>
  <servlet-name>spring-mvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.dispatcherservlet</servlet-class>
  <!--此处就必须添加了-->
    <init-param>
        <param-name>contextconfiglocation</param-name>
        <param-value>/web-inf/springmvc-servlet.xml</param-value>
    </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>spring-mvc</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

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

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

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

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

<bean id="viewresolver" class="org.springframework.web.servlet.view.urlbasedviewresolver">
    <property name="viewclass" value="org.springframework.web.servlet.view.jstlview"/>
    <property name="prefix" value="/web-inf/pages/"/>
    <property name="suffix" value=".jsp"/>
</bean>

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

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

<bean id="multipartresolver" class="org.springframework.web.multipart.commons.commonsmultipartresolver">
  <property name="maxuploadsize" value="10485760"/>
  <property name="defaultencoding" value="utf-8"/>
</bean>

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

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

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

<bean id="objectmapper" class="com.fasterxml.jackson.databind.objectmapper">
  <property name="dateformat">
    <bean class="java.text.simpledateformat">
      <constructor-arg type="java.lang.string" value="yyyy-mm-dd hh:mm:ss" />
    </bean>
  </property>
</bean>

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

<?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:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemalocation="http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans.xsd

    http://www.springframework.org/schema/context

    http://www.springframework.org/schema/context/spring-context.xsd

    http://www.springframework.org/schema/mvc

    http://www.springframework.org/schema/mvc/spring-mvc.xsd">

        <!--指明 controller 所在包,并扫描其中的注解-->
        <context:component-scan base-package="hello"/>
        <!-- 静态资源(js、image等)的访问 -->
        <mvc:default-servlet-handler/>
        <!-- 开启注解 -->
        <mvc:annotation-driven/>
        <!--viewresolver 视图解析器-->
        <!--用于支持servlet、jsp视图解析-->
        <bean id="jspviewresolver"

        class="org.springframework.web.servlet.view.urlbasedviewresolver"

            <property name="viewclass" value="org.springframework.web.servlet.view.jstlview"/>
            <property name="prefix" value="/web-inf/pages/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
</beans>

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

4.创建我们的controller控制器

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

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

@controller
@requestmapping("/hello")
public class hicontroller {

    /**
     * 测试返回指定的view文件名
     * @return
     */
    @requestmapping("/welcome")
    public string helloworld() {
        return "welcome";
    }

    /**
     * 测试返回带有数据的modelandview对象
     * @return
     */
    @requestmapping("/view")
    public modelandview getview() {
        string message = "<br><div style='text-align:center;'>"
                + "<h3>我叫胖达,来自hicontroller.java(公众号:java知识共享)</h3>";
        return new modelandview("welcome", "message", message);
    }
}

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

<%@ page language="java" contenttype="text/html; charset=utf-8"
         pageencoding="utf-8"%>
<!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <title>insert title here</title>
</head>
<body>
hi!
${message}</body>
</html>

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

5.配置tomcat,启动小项目

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

首先点击右上角的edit configurations按钮:
整合SSM框架必备基础—SpringMVC(下)
这样就打开了run/debug configurations窗口,在这个窗口继续操作如下:
整合SSM框架必备基础—SpringMVC(下)
特别注意:第四个步骤是为了选择本地的tomcat路径哈,直接选择自己的外部tomcat,选择根路径即可。

然后还有一步就是需要选择tomcat启动的时候需要deployment也就是要发布的应用,按照下述步骤1-6即可:
整合SSM框架必备基础—SpringMVC(下)
到此,tomcat配置成功,直接点击右上角,启动我们的小项目即可。
整合SSM框架必备基础—SpringMVC(下)
由于前面配置了欢迎界面,当系统启动成功后我会自动访问index.jsp欢迎页面,并成功展示helloworld字样,接下来我们要依次访问一下我们控制器中写的两个方法:

第一个方法

访问路径:

http://localhost:8088/springmvcstarter/hello/welcome

访问结果:
整合SSM框架必备基础—SpringMVC(下)
结论:在上面后端的代码中会发现,我只是指定了一个view的路径welcome,结果会自动跳转出welcome.jsp的原有内容,说明我们的调用成功了

第二个方法

访问路径:

http://localhost:8088/springmvcstarter/hello/view

访问结果:
整合SSM框架必备基础—SpringMVC(下)
结论:与第一个不同的是,这个方法会跳转同一个界面welcome.jsp,但是后台我返回的是modelandview对象,这样的话,后台会将数据和视图经过渲染后一并呈现给用户,如上图黑色字体为后台传递到前台的数据。

三、 springmvc的几种注解

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

1.controller

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

2.requestmapping

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

3.requestparam

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

@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!!!