2023年11月28日发(作者:)

快速⼊门SSM框架——实现前后端数据交互

刚开始学习SSM框架,看着各式各样的书,听着⼤佬们录的视频,貌似觉得很简单。但是亲⾃实践之后,就不会这么觉得了。

github上拉了很多个项⽬下来,⼀个个花⾥胡哨,SSM框架结构命名各式各样,⼀个jsp⽹页或者java类就有成百上千⾏代码,⽽我什么都看不懂。

其实那个时候我只想搞懂SSM环境配置的逻辑,以及前端⽹页如何读取数据库中的数据(即前端⽹页显⽰数据库数据),因为jsp⽹页⼀旦能成功显⽰数据库中的数据,其他功能

就可以以此类推,都是复制粘贴的事情了。

看不懂,没⼈教,然后⾯向搜索引擎的编程,最后写总结,已经是我长期以来的常态了。接着我就像做英语阅读那样,⼀⾏⼀⾏代码的去查,最后把意思串起来,得到了我的理

解。当然我的理解不⼀定准确,欢迎⼤佬指正。

总的思路:

前端⽹页显⽰数据库数据⼤概分为以下⼋个步骤:

1. 中,使⽤标签,设置默认打开的⽹页 /WEB-INF/views/login/

2. 在该前端⽹页 中增加⼀个按钮,按钮指向"<%=basePath%>/summary/"<%=basePath%>后⾯再说)。

3. 该地址被 中的DispatcherServlet(拦截器)所拦截,只剩下 /summary/test1

4. /summary/test1 传送到 ,接着去扫描其管辖的包下有没有对应的controller类。

5. controller类(后端Java类)中找到@RequestMapping(value = "/summary/test1")的⽅法,执⾏这个⽅法。

6. 在⽅法中,使⽤ribute(),像前端页⾯传送从数据库读取的数据,并且返回⼀个字符串"login/test"

7. 返回的字符串"login/test"的配置视图解析器(ViewResolver中,加上前缀"/WEB-INF/views/",加上后缀".jsp",即组成了⼀个完整的⽹页地址,浏览器访

问的就是这个地址,即"/WEB-INF/views/login/"

8. 前端⽹页 通过 ${msg} 来获取后端发来的数据。

完整代码放在最后⾯,先⼤概讲⼀下每⼀步的逻辑思路

第⼀步

/WEB-INF/views/login/

标签字⾯上看起来是欢迎⽂件列表的意思,实际上我猜是默认加载项⽬的⽹页的意思。配置好这个,使⽤Tomcat运⾏,就会⾸先加载这个界⾯。

第⼆步

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%

String path = textPath();

String basePath = eme() + "://" + verName() + ":" + verPort() + path;

%>

${msg}

ema()可以返回当前页⾯使⽤的协议: http

verName()可以返回当前页⾯所在的服务器的名字: localhost

verPort()可以返回当前页⾯所在的服务器使⽤的端⼝: 8080;

textPath()可以返回当前页⾯所在的应⽤的名字. /views/login/

总之就是要获取到该项⽬的⽹络路径。

接着,我们使⽤ href="<%=basePath%>/summary/" 指向这个地址。

第三步

dispatcherServlet

cherServlet

contextConfigLocation

classpath:spring/

dispatcherServlet

*.do

DispatcherServlet就是传说中的拦截器,他能把第⼆步传来的 /summary/ ,拦截下来,去掉后缀 .do,并且把他发送到配置⽂件

第四步

收到数据之后,扫描这个包下所有的类,寻找有没有和 /summary/test1 对应的⽅法

第五、六步

package ller;

import tMapping;

import eService;

@Controller

@RequestMapping(value = "/summary")

public class ArticleController {

@Autowired

private ArticleService articleService;

@RequestMapping(value = "/test1")

public String te(@RequestParam(value = "pageCode", defaultValue = "1", required = false) int pageCode, @RequestParam(value = "pageSize", defaultValue = "3", required = false) int pageSize, HttpServletRequest request, Model model) {

Summary summary = Id(23);

String str = _content();

ribute("msg",str);

return "login/test";

}

}

ller包的ArticleController类中,找到与之对应的⽅法te()因为这个类@RequestMapping(value = "/summary"),类下的te⽅法@RequestMapping(value =

"/test1"),组合起来就是 /summary/test1。所以执⾏这个⽅法。

先通过Id(23);即从Serive读取数据库的信息(后⾯会给完整代码),再获取Summary类中的contnt属性,通过ribute("msg",str);⽅法发送⾄前

端页⾯,前端页⾯可以通过"msg"这个键来获取到str这个值,最后向返回"login/test"这个字符串。

第七步

接收到返回来的"login/test"字符串,利⽤试图解析器(ViewResolver加上前缀后缀,组成完整的地址"/WEB-INF/views/login/",返回到,浏览器

正常读取打开,就正常打开。

第⼋步

代码见第⼆步,在第六步中已经说明,使⽤msg使⽤这个键来获取到str这个值,所以使⽤ ${msg} ,就获取到了后端传过来的str的值。

关于为什么要把原本的⽹址搞得这么花⾥胡哨,可能是为了保密吧,⽐如你知道主页的⽹页地址,那么你直接访问这个⽹址,就可以跳过登⼊了(可能是这样的吧,我猜的

登⼊地址XXXXX/views/

主页地址XXXXX/views/

那我们直接访问主页地址,就可以跳过登⼊了

相反现在:

登⼊地址XXXXX/views/

我们需要访问这个后端⽅法,返回主页

但是浏览器的⽹页还是显⽰

我们不知道主页的真正地址

所以可能⼤概也许就起到保密的作⽤了。

完整代码

路径: WEB-INF/views/login/

<%--

Created by IntelliJ IDEA.

User: zwz

Date: 2020/2/17 0016

Time: 7:39

To change this template use File | Settings | File Templates.

--%>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%

String path = textPath();

String basePath = eme() + "://" + verName() + ":" + verPort() + path;

%>

${msg}

路径:WEB-INF/

xmlns="/xml/ns/javaee"

xsi:schemaLocation="/xml/ns/javaee

/xml/ns/javaee/web-app_3_"

version="3.1">

/WEB-INF/views/login/

CharacterEncoding

terEncodingFilter

encoding

utf-8

contextConfigLocation

classpath:spring/spring-*.xml

tLoaderListener

dispatcherServlet

cherServlet

contextConfigLocation

classpath:spring/

dispatcherServlet

*.do

路径: src/main/resources/spring/

xmlns:xsi="/2001/XMLSchema-instance"

xmlns:aop="/schema/aop"

xmlns:tx="/schema/tx"

xmlns:mvc="/schema/mvc"

xmlns:context="/schema/context"

xsi:schemaLocation="/schema/beans

/schema/beans/

/schema/aop

/schema/aop/

/schema/context

/schema/context/

/schema/tx

/schema/context/

/schema/mvc

/schema/mvc/">

package ller;