以教务管理的成绩单查询为例,SSM整合开发过程详解(spring、springmvc、mybatis)

2002年时,我使用PowerBuilder开发过一套教务管理系统,数据库是Oracle的。基于C/S模式。多年之后,被淘汰弃用了。但是里面的一些成绩,还是时常有需要查询的需求。这次就以成绩单查询为例,来详细说明一下SSM整合开发WEB应用的过程。给使用SSM框架进行WEB开发的初学者提供一个参考,或者可以当成实践指南。

实现目标

  • 基于B/S模式实现成绩单查询的基本功能
  • 整合SSM框架
  • 充分利用三层架构和MVC模式来提供系统的扩展性和灵活性,以达到
    • 在不改动代码的情况下,可以基于Oracle和Mysql数据库(或其他数据库类型)
    • 可以使用B/S模式,也可以直接使用控制台命令行模式
  • 使用Git进行版本管理
    • 使用gitee.com和github.com为远程仓库

先导知识

本文需要对以下知识有一定的了解:

  • Java基础
  • Java JDBC开发
  • Maven
  • Mybatis
  • Spring
  • Java Web应用开发(servlet)
  • SpringMVC

如果对部分知识有所欠缺,可以通过以下链接进行学习。
Java 基础
Java JDBC开发
Maven
Mybatis
Spring
Java Web开发
SpringMVC

数据库表结构

最初数据库是采用的oracle。这里先继续使用oralce数据库来进行开发,但后面,可以将数据导出到mysql数据库中,并说明数据库替换后,代码上会有什么样的调整(目标:遵循开闭原则,不需要对代码修改,而只需要扩展,即增加一个mysql数据库的DAO实现类。)。

启动oralce数据库服务

  1. 要将oracle的服务启动

net start OracleServiceORCL

在这里插入图片描述

  1. 启动oralce的监听

net start OracleOraDB12Home1TNSListener

在这里插入图片描述
也可以直接打开“服务”GUI工具,打开上面两个服务。
在这里插入图片描述

查看表结构

  1. sqlplus连接oracle

sqlplus /nolog

在这里插入图片描述
2. 连接用户
我的oracle用户名是forest,密码这里设置为123456

conn forest/123456

在这里插入图片描述
3. 查看表结构
原来的系统有100多个表,但是成绩单查询,只需要其中的三个表:

  • 学生表(t_xs0100)
    可以使用desc命令查看表结构

desc t_xs0100

名称                                      是否为空? 类型
----------------------------------------- -------- --------------
XH                                        NOT NULL VARCHAR2(20)
YXSH                                               VARCHAR2(6)
XM                                                 VARCHAR2(30)
XMPY                                               VARCHAR2(60)
CYM                                                VARCHAR2(30)
ZYH                                                VARCHAR2(8)
ZYKLM                                              VARCHAR2(2)
PYFSM                                              VARCHAR2(2)
XSLBM                                              VARCHAR2(2)
YJFXM                                              VARCHAR2(2)
DSZGH                                              VARCHAR2(8)
HDXLFSM                                            VARCHAR2(1)
XFZXSZK                                            VARCHAR2(1)
XZ                                                 NUMBER(3,1)
RXNY                                               VARCHAR2(6)
NJ                                                 VARCHAR2(2)
BH                                                 VARCHAR2(10)
SFZH                                               VARCHAR2(18)
XBM                                                VARCHAR2(1)
XXM                                                VARCHAR2(1)
CSRQ                                               VARCHAR2(8)
CSDM                                               VARCHAR2(6)
JGM                                                VARCHAR2(6)
MZM                                                VARCHAR2(2)
ZJXY                                               VARCHAR2(20)
GATQM                                              VARCHAR2(1)
JKZKM                                              VARCHAR2(2)
HYZKM                                              VARCHAR2(1)
XZZ                                                VARCHAR2(60)
HKSZD                                              VARCHAR2(60)
HKXZM                                              VARCHAR2(1)
GBM                                                VARCHAR2(3)
TC                                                 VARCHAR2(4000)
LXDH                                               VARCHAR2(30)
TXDZ                                               VARCHAR2(60)
YZBM                                               VARCHAR2(6)
DZXX                                               VARCHAR2(30)
ZYDZ                                               VARCHAR2(60)
ZP                                                 BLOB
  • 课程表(t_jx0101)
名称                                      是否为空? 类型
----------------------------------------- -------- ---------------
KCH                                       NOT NULL VARCHAR2(8)
KCMC                                               VARCHAR2(60)
KCYWMC                                             VARCHAR2(180)
WSJXZK                                             VARCHAR2(1)
KCJJ                                               VARCHAR2(4000)
KCYQ                                               VARCHAR2(4000)
ZXS                                                NUMBER(3)
JSXS                                               NUMBER(3)
SJXS                                               NUMBER(3)
XTXS                                               NUMBER(3)
SYXS                                               NUMBER(3)
GXKZT                                              VARCHAR2(1)
KSFSM                                              VARCHAR2(1)
KSH                                                VARCHAR2(11)
  • 成绩表(t_xs1500)
名称                                      是否为空? 类型
----------------------------------------- -------- ------------
XH                                        NOT NULL VARCHAR2(20)
XN                                        NOT NULL VARCHAR2(9)
XQM                                       NOT NULL VARCHAR2(1)
KSRQ                                               VARCHAR2(8)
KCH                                       NOT NULL VARCHAR2(8)
KCLBM                                              VARCHAR2(1)
KSFSM                                              VARCHAR2(1)
KSXZM                                     NOT NULL VARCHAR2(1)
KSLBM                                              VARCHAR2(1)
FSLKSCJ                                            NUMBER(5,1)
DJLKSCJ                                            VARCHAR2(20)
XF                                                 NUMBER(4,1)
JF                                                 VARCHAR2(1)
DY                                                 VARCHAR2(1)
JFCS                                               NUMBER(2)
DYCS                                               NUMBER(2)

创建视图

从上面的表结构可以看出,字段较多,而对于成绩单查询来说,并不需要这么多的字段,我们需要的主要包括:

  • 学生表(t_xs0100):xh(学号),xm(姓名),xn(学年),xqm(学期名)
  • 课程表(t_jx0101):kch(课程号),kcmc(课程名称),zxs(总学时)
  • 成绩表(t_xs1500):xh(学号),kch(课程号),fslkscj(分数类考试成绩),djlkscj(等级类考试成绩),xf(学分)

因此,为了方便后面的开发,可以创建一个视图,这个视图包含以上的各字段信息。其语法是:

create view v_kscj as
select xs.xh,xs.xm,xn,xqm,ks.kch,kc.kcmc,kc.zxs,fslkscj,djlkscj,xf
from t_xs0100 xs,t_xs1500 ks,t_jx0101 kc
where xs.xh = ks.xh
and ks.kch = kc.kch

在这里插入图片描述
视图v_kscj创建成功,其表结构如下:

名称                                      是否为空? 类型
----------------------------------------- -------- --------------
XH                                        NOT NULL VARCHAR2(20)
XM                                                 VARCHAR2(30)
XN                                        NOT NULL VARCHAR2(9)
XQM                                       NOT NULL VARCHAR2(1)
KCH                                       NOT NULL VARCHAR2(8)
KCMC                                               VARCHAR2(60)
ZXS                                                NUMBER(3)
FSLKSCJ                                            NUMBER(5,1)
DJLKSCJ                                            VARCHAR2(20)
XF                                                 NUMBER(4,1)

创建实践用表

这后面的开发,我们就以v_kscj视图为基础了。因为同学们没有以上这些表,所以,也可以直接使用下面的语句,创建一个名称叫t_kscj的表。

create table t_kscj(
XH VARCHAR2(20) NOT NULL,
XM VARCHAR2(30),
XN VARCHAR2(9) NOT NULL ,
XQM VARCHAR2(1) NOT NULL,
KCH VARCHAR2(8) NOT NULL,
KCMC VARCHAR2(60),
ZXS NUMBER(3),
FSLKSCJ NUMBER(5,1),
DJLKSCJ VARCHAR2(20),
XF NUMBER(4,1)
);

在这里插入图片描述

创建唯一索引

因为一个学生在一个学期中,只可能有一个课程号的成绩,所以,需要创建唯一索引。

create unique index u_cj on t_kscj(xh,kch,xn,xqm);

在这里插入图片描述

添加实践数据

为了方便开发和调试,可以为该表添加一些数据。

insert into t_kscj values('20210870','张三','2021-2022','1','L010904 ','大学物理实验2 ',0,74, '', 1.8);
insert into t_kscj values('20210870','张三','2021-2022','2','L000005 ','广告学', 18,87, '', 1.8);
insert into t_kscj values('20210870','张三','2021-2022','1','L000037 ','文献检索', 12,90, '', 1.8);
insert into t_kscj values('20210870','张三','2021-2022','1','L010110 ','工程制图及CAD ', 80,90, '',10);
insert into t_kscj values('20210870','张三','2021-2022','2','L010301 ','化工原理',118,65, '', 7.6);
insert into t_kscj values('20210870','张三','2021-2022','1','L010301 ','化工原理',118,81, '', 7.4);
insert into t_kscj values('20210865','李四','2021-2022','2','L010304 ','胶粘剂与涂料', 27,77, '', 3.6);
insert into t_kscj values('20210865','李四','2021-2022','1','L010309 ','天然有机化学', 30,86, '', 9.2);
insert into t_kscj values('20210865','李四','2021-2022','2','L010310 ','香料与色素', 35,84, '', 4.4);
insert into t_kscj values('20210865','李四','2021-2022','1','L010318 ','分离工程', 18,92, '', 3);
insert into t_kscj values('20210865','李四','2021-2022','1','L010322 ','化工环保', 13,89, '', 4);
insert into t_kscj values('20210865','李四','2021-2022','2','L010338 ','化工设备机械基础课程设计', 20,90, '', 2);
insert into t_kscj values('20210865','李四','2021-2022','1','L010504 ','电工与电子技术2 ', 54,90, '', 6.8);

在这里插入图片描述

开发前的准备

开发之前,我们需要搞清,我们要做什么,怎么做。
我们是要开发一个B/S模式的应用,并使用SSM框架。

SSM是什么

SSM在这里是指:

  • SpringMVC
  • Spring
  • Mybatis。

三层架构是什么

B/S模式的应用,典型架构是三层架构,即将整个应用分为:

  • 界面层:负责用户的请求和结果的展示
  • 业务层:负责业务逻辑的处理
  • 持久层:负责数据持久化到数据库中

三层架构与SSM的关系

那三层架构与SSM框架之间的关系是什么样的呢?我们说

  • SpringMVC:界面层,负责接收用户请求,显示处理结果。
  • Spring:主要是业务层,管理处理业务的service类,也还管理持久层的数据访问接口Dao的实现类,以及工具类的对象的创建和管理。
  • Mybatis:持久层:访问数据库,实现关系表与对象之间的映射(ORM,Object Relational Mapping),即当业务层需要读取数据时,把关系数据库中的表记录转变成适合业务层对象访问的java对象,同时,当业务层需要保存对象时,把对象转变成数据库中的关系表记录,也就是将对象持久化到关系数据库中。

所以,B/S模式的处理过程是这样。

用户发起请求-----> SpringMVC(控制器Controller)接收----->Spring容器中的业务处理类Service类对象----->Mybatis从数据库中得到数据

Mybatis从数据库中得到的数据映射成为对象----->Spring容器中的业务处理类Service类对象----->SpringMVC(控制器Controller)接收对象并组织数据(Model),并跳转到视图(View),向用户显示请求结果。

在这里插入图片描述
如上图所示,实际上,SpringMVC虽然是处理三层架构中界面层的工作,但自身又实现了MVC模式,所以,又会分成三层,即可以理解为三层架构中的界面层又分三层,分别是:

  • C(Controller),控制层,负责主要两个工作:
    • 将用户的请求和数据转发到合适的业务层对象;
    • 当业务层处理完后,控制层会将处理结果转发到合适的视图(View),向用户展示处理结果。
  • V(View),视图层,负责显示结果页面,可以是jsp或其他类型的页面。向用户展示处理结果。
  • M(Model),数据模型,即由控制层得到业务层处理完后返回的数据后,组织成为Model数据模型,转发给视图层,便于视图层展示处理结果。

在本例中,Model即可以做为Mybatis进行对象持久化的实体类,也可以做为业务处理service的处理对象。同时,也是SpringMVC跳转到视图时,传给视图的数据模型(Model)。这三处都可以使用成绩类(Grade),其属性与成绩视图(v-kscj)或成绩表(t_kscj)的字段一致。

但有时候,可能需要单独定义比如值对象(VO)做为Model。比如表中字段太多,这样实体类如果直接作为Model使用,有许多的属性用不上。这时,可能会定义属性较少的一个值对象类。

SSM整合

SSM整合,即将SpringMVC、Spring、Mybatis三大框架整合在一起。这里主要是要整合两个容器。

  1. 第一个容器SpringMVC容器,管理层面层的Controller控制器对象。
  2. 第二个容器Spring容器,管理业务层的Service对象和持久层的Dao对象,还有一些工具类对象。

我们需要将开发过程中的一些类对象交给合适的容器来创建和管理。比如:

  • 把Controller类对象交给SpringMVC容器
  • 把一些Web开发的其他资源或对象也交给SpringMVC容器
  • 业务处理Service对象交给Spring容器
  • Dao接口实现类对象交给Spring容器

在要整合这两个容器时,就存在一个问题,比如Spring容器中的Service对象要访问Dao实现类对象,这是很容易的,因为大家在一个容器中,但是SpringMVC容器中的Controller对象需要访问Spring容器中的Service对象,因为Controller要将请求转发到Service,交给Service来处理业务逻辑。那么,这两个容器如何才能互相访问呢?

SpringMVC容器是Spring容器的子容器,所以,SpringMVC容器中的对象可以直接访问Spring容器中的对象。
在这里插入图片描述

开发

实现步骤

  1. 新建maven web项目
  2. 加入依赖
    • springmvc,spring,mybatis三大框架依赖
    • jackson依赖
    • oracle(mysql)依赖
    • druid连接池依赖
    • jsp,servlet依赖
  3. 编写web.xml
    • 注册DispatcherServlet,目的是:
      • 创建springmvc容器对象,才能由该容器自动创建和管理Controller对象
      • DispatcherServlet是Servlet,能接收用户请求
    • 注册spring的监听器:ContextLoaderListener,目的是:创建spring的容器对象,才能创建service,dao对象等。
    • 注册字符集过滤器,解决post请求乱码问题
  4. 创建包,controller包,service包,dao包,domain(实体类)包
  5. 编写springmvc,spring,mybatis配置文件
    • springmvc配置文件
    • spring配置文件
    • mybatis主配置文件
    • 数据库的属性配置文件
  6. 编写代码:dao接口,mapper文件,service接口和实现类,controller,实体类
  7. 编写jsp页面(用户请求页,结果展示页)

创建maven web项目

打开IDEA,新建一个项目(File->New->Project)
在这里插入图片描述
项目名取名为grade。
在这里插入图片描述
可以设置用户设置文件和本地仓库,比如可以设置镜像仓库到阿里云Maven镜像仓库中。如果在后面添加依赖,下载依赖包不成功时, 可以考虑设置镜像仓库。我这里保持默认设置。

阿里云maven镜像配置指南

打开 maven 的配置文件( windows 机器一般在 maven 安装目录的 conf/settings.xml ),在标签中添加 mirror 子节点:

<mirror>
  <id>aliyunmaven</id>
  <mirrorOf>*</mirrorOf>
  <name>阿里云公共仓库</name>
  <url>https://maven.aliyun.com/repository/public</url>
</mirror>

在这里插入图片描述

构建目录结构

我们要在main目录下,构建两个目录,一个是java源代码目录 ,一个是resources资源目录,直接在main目录下鼠标右键选新建目录,在新目录容器中,直接双击下面的Maven源目录类型来构建这两个目录。
在这里插入图片描述
完整目录结构如下:
在这里插入图片描述
注意,不是自己输入目录名称,如果是自己输入目录名,还需要设置目录类型。不如在新建目录列表中直接双击选择。
在这里插入图片描述

添加依赖

修改pom.xml文件,依赖可以在https://mvnrepository.com/中查找最新依赖包。也可以直接复制我这里依赖配置代码。

  1. 修改JDK编译版本号,将原来的1.7修改为1.8
  <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>
  </properties>
  1. 添加各依赖
	<!-- servlet依赖 -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>
    <!-- jsp依赖 -->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.2.1-b03</version>
      <scope>provided</scope>
    </dependency>
    <!-- springMVC依赖 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.14</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>5.3.14</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.3.14</version>
    </dependency>
    <!-- 转换为json数据格式用的jackson依赖 -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.13.1</version>
    </dependency>
    <!-- 转换为json数据格式用的jackson依赖 -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.13.1</version>
    </dependency>
    <!-- mybatis依赖 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.9</version>
    </dependency>
    <!-- mybatis与spring整合依赖 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.0.6</version>
    </dependency>
    <!-- Oracle数据库驱动 -->
    <dependency>
      <groupId>com.oracle.database.jdbc</groupId>
      <artifactId>ojdbc8</artifactId>
      <version>21.4.0.0.1</version>
    </dependency>
    <!-- 阿里的druid连接池 -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.2.8</version>
    </dependency>
  1. 添加<resources>标签
    保证在构建(build)项目时,一些配置文件以及属性文件等资源文件也会被自动拷贝到classes类路径下,以保证软件运行成功。
    <resources>标签内容拷贝到<build>标签中
<resources>
    <!-- 把src/main/java下的所有.xml文件拷贝到classes类路径下 -->
    <resource>
      <directory>src/main/java</directory>
      <includes>
        <include>**/*.xml</include>
      </includes>
    </resource>

    <!-- 把src/main/resources下的所有.xml文件拷贝到classes类路径下 -->
    <resource>
      <directory>src/main/resources</directory>
      <includes>
        <include>**/*.xml</include>
        <include>**/*.properties</include>
      </includes>
    </resource>
  </resources>

创建springmvc配置文件

在resources资源目录下创建一个conf目录,专门用于存放诸多配置文件,首先在其中创建springMVC的配置文件springmvc.xml。
在这里插入图片描述
其配置信息在后面再添加

创建spring配置文件

按上面的指南,在conf目录下创建spring配置文件,命名为applicationContext.xml
在这里插入图片描述
其配置信息在后面再添加

编写web.xml文件

提升dtd文件版本

原有的web.xml文件中的dtd版本号有些低,功能有些弱。
在这里插入图片描述
可以进行提高。方法如下:
点击工程设置
在这里插入图片描述
点击工程结构
在这里插入图片描述
在这里插入图片描述
删除原有的web.xml
再点击“+”号添加新的web.xml文件
技巧:添加时,文件名为web1.xml文件,然后再在工程目录结构中,再将新添加的web1.xml文件改名为web.xml文件。(因为如果直接取名web.xml文件名,刚修改不会成功,会保持原来web.xml的内容)
在这里插入图片描述
修改后,web.xml文件内容如下:
在这里插入图片描述

注册DispatcherServlet

    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>

这样注册,该对象是在第一次用户请求时才创建对象,但我们希望在Tomcat服务器启动时就创建该对象。所以,添加<load-on-startup>标签。

服务器启动时自动创建DispatcherServlet对象

    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        
        <!--在tomcat启动后,创建Servlet对象
        该标签的值表示tomcat启动后创建对象的顺序,整数,值越小,创建时间越早,一般大于等于0的整数
		-->
        <load-on-startup>1</load-on-startup>
    </servlet>

指定springmvc配置文件信息

springMVC创建容器对象时,读取的配置文件默认是/WEB-INF/<servlet-name>-servlet.xml
一般我们可以自定义配置文件的位置

    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <!--springmvc配置文件的位置属性-->
            <param-name>contextConfigLocation</param-name>
            <!--指定自定义文件的位置,使用类路径,类路径根目录是resources目录-->
            <param-value>classpath*:conf/springmvc.xml</param-value>
        </init-param>
        <!--在tomcat启动后,创建Servlet对象-->
        <load-on-startup>1</load-on-startup>
    </servlet>

指定自定义文件的位置,使用类路径,类路径根目录是resources目录。
在这里插入图片描述

设置url-pattern

    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

使用springMVC框架时,url-pattern常使用两种设置:

  1. 使用扩展名,语法:*.xxxx,其中xxxx为自定义的扩展名,常用的为*.do,*.action,*.mvc等。
    表示,只要扩展名为上述,就交由springmvc对象即DispatcherServlet处理
    例如:http://localhost:8080/myweb/some.do
  2. 使用斜杠 “/”
    这里使用*.do,表示,只要请求的扩展名为.do,则该请求将交由DispatcherServlet处理。即交给SpringMVC框架来处理。

注册spring的监听器

目的是当tomcat启动时,自动创建spring的容器对象,这样,方便后面利用spring容器对象来创建和管理service和dao对象。

    <!--    注册spring监听器-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:conf/applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

注册字符集过滤器

字符集过滤器可以解决post方法提交请求时,参数中有中文的乱码问题。

    <!--    注册字符集过滤器-->
    <filter>
        <filter-name>characterEncodingFilter</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>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

字符集编码设置为utf-8,强制请求和响应都使用该字符集。对所有请求都使用该字符集过滤器。

创建包结构

在编写spring和springwmc配置文件时,需要配置组件扫描器扫描包路径,所以,先按下图创建相应的包结构。
在这里插入图片描述
在WEB-INF目录下创建视图文件目录jsp
在这里插入图片描述

编写springmvc配置文件springmvc.xml

  1. 申明组件扫描器,即指定扫描的包路径,该包路径下的所有Controller类会自动创建对象并在容器中被管理。
    <context:component-scan base-package="com.javaoldman.controller" />
  1. 声明视图解析器,即自动会为逻辑视图名称添加上路径前缀和扩展名后缀。
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
  1. 加载注解驱动,比如响应异步请求时,返回json数据格式以及解决静态资源访问问题等都需要注解驱动。
    <mvc:annotation-driven />

注意:<mvc:annotation-driven />有多个同名的,在加载时,需要加载http://www.springframework.org/schema/mvc

编写spring配置文件applicationContext.xml


  • 未完侍续
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java Man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值