2023年11月28日发(作者:)
快速⼊门SSM框架——实现前后端数据交互
刚开始学习SSM框架,看着各式各样的书,听着⼤佬们录的视频,貌似觉得很简单。但是亲⾃实践之后,就不会这么觉得了。
从github上拉了很多个项⽬下来,⼀个个花⾥胡哨,SSM框架结构命名各式各样,⼀个jsp⽹页或者java类就有成百上千⾏代码,⽽我什么都看不懂。
其实那个时候我只想搞懂SSM环境配置的逻辑,以及前端⽹页如何读取数据库中的数据(即前端⽹页显⽰数据库数据),因为jsp⽹页⼀旦能成功显⽰数据库中的数据,其他功能
就可以以此类推,都是复制粘贴的事情了。
看不懂,没⼈教,然后⾯向搜索引擎的编程,最后写总结,已经是我长期以来的常态了。接着我就像做英语阅读那样,⼀⾏⼀⾏代码的去查,最后把意思串起来,得到了我的理
解。当然我的理解不⼀定准确,欢迎⼤佬指正。
总的思路:
前端⽹页显⽰数据库数据⼤概分为以下⼋个步骤:
1. 在中,使⽤
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} 来获取后端发来的数据。
完整代码放在最后⾯,先⼤概讲⼀下每⼀步的逻辑思路
第⼀步
第⼆步
<%@ 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就是传说中的拦截器,他能把第⼆步传来的 /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">
路径: 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;


发布评论