96SEO 2026-02-23 15:18 4
。

所有的不甘#xff0c;因为还心存梦想#xff0c;所以在你放弃之前#xff0c;好好拼一把#xff0c;只怕心老#xff0c;不怕路长。
三、设计数据库四、后端篇1、环境搭建2、SSM整合(配置文件编写)2.1
和水果库存进阶版这两个版本的区别是基础版是使用javaSE的知识进阶版是使用了Spring框架技术特别是合理的理由了IOC(控制反转)进行重构如果有兴趣的小伙伴可以点击对应链接查看详情。
而编写本篇文章目的是为了把页面以网页的形式展现出来。
而该篇文章适合人群是刚学会SSM框架但是不太懂怎么整合的小伙伴也适合不知道前端和后端怎么联调开发流程的小伙伴。
所以本系统会从0到1完整的开发流程进行讲解。
以上就是本系统使用到技术栈如果你已经学习了以上知识但是又不知道怎么运用那么本篇文章会一一进行讲解。
由上图所示可以知道我们的项目是以maven的形式进行搭建的。
系统架构使用了常见的MVC三层架构进行实现。
本项目不是使用前后端分离的而是使用了模板引擎Thymeleaf进行页面渲染。
然后就是功能分析本系统实现了常见的CRUD功能。
就是查询水果库存包含分页新增水果库存修改水果库存和删除水果库存。
不过在开发功能之前我们要先做一些准备工作首先得有存数据的仓库—
本系统的数据库设计比较简单就一个表就可以了我这里把该表名为t_fruit该表设计如下
字段名数据类型非空自增键注释fidintyesyes主键编号fnamevarchar(20)yesno-名称priceintnono-单价fcountintnono-数量remarkvarchar(50)nono-广告词producervarchar(10)nono-产地SQL语句如下所示
CHARSETutf8;通过以上的SQL语句就可以创建一个数据库和数据表现在有了数据表那么接下来就要开始从后端到前端的开发了。
我们先从后端开始
后端的任何功能的开始都必须有一个环境所以我们先来搭建一个SSM环境出来。
本系统IDE使用IDEA进行开发而且是基于maven的具体搭建步骤如下
以上步骤就已经创建了一个基础maven项目。
接下来要配置一下maven
由于我们本系统的页面是网页的形式所以我们还需要在maven上添加web模块具体步骤如下
项目创建完毕之后那么就该导入依赖了和我们以前导入Jar包是一个意思。
之前是我们自己导入每一个Jar包但是有了maven之后那么我们只要导入对应的坐标依赖就行了至于Jar包maven会帮我们下载下来。
依赖导入是在pom.xml文件中进行编写本系统使用到的依赖有如下
--dependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.3.20/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-jdbc/artifactIdversion5.3.20/version/dependency!--
--dependencygroupIdorg.springframework/groupIdartifactIdspring-aspects/artifactIdversion5.3.20/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-tx/artifactIdversion5.3.20/version/dependency!--
--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.22/version/dependency!--
--dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.7/version/dependency!--
--dependencygroupIdorg.mybatis/groupIdartifactIdmybatis-spring/artifactIdversion2.0.6/version/dependency!--
--dependencygroupIdorg.thymeleaf/groupIdartifactIdthymeleaf-spring5/artifactIdversion3.0.15.RELEASE/version/dependency/dependencies!--
--buildresourcesresourcedirectorysrc/main/java/directoryincludesinclude**/*.properties/includeinclude**/*.xml/include/includesfilteringfalse/filtering/resourceresourcedirectorysrc/main/resources/directoryincludesinclude**/*.properties/includeinclude**/*.xml/include/includesfilteringfalse/filtering/resource/resources/build到此本项目的构建已经初步完成了但是到真正编写功能模块还得配置几个文件才可以项目有些基础的小伙伴已经知道接下来要做的步骤了那就是整合SSM。
接下来就是SSM整合本质上就是进行一些xml配置文件的配置而我们需要怎么配置呢我们这里可以分成6个文件分别为database.properties(数据库参数文件)、mybatis-config.xml(Mybatis核心配置文件)、spring-dao.xml(Mybatis与Spring整合文件/持久层配置文件)、spring-service.xml(业务层配置文件)、spring-mvc.xml(SpringMVC控制层配置文件)和applicationContext.xml(整合配置文件)。
好了废话不多说直接开干~
jdbc.drivercom.mysql.cj.jdbc.Driver
jdbc.urljdbc:mysql://localhost:3306/fruitdb?useSSLtrueuseUnicodetruecharacterEncodingutf8serverTimezoneUTC
3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd
valueSTDOUT_LOGGING//settings!--
xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd!--
locationclasspath:database.properties/!--
这里的数据源使用Spring的没有使用第三方池化技术--bean
classorg.springframework.jdbc.datasource.DriverManagerDataSourceproperty
classorg.mybatis.spring.SqlSessionFactoryBeanproperty
valueclasspath:mybatis-config.xml//bean!--
4、配置dao接口扫描包动态的实现了DAO接口可以注入到Spring容器中
classorg.mybatis.spring.mapper.MapperScannerConfigurer!--
xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd!--
xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instance
xmlns:mvchttp://www.springframework.org/schema/mvcxmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd!--
location/WEB-INF/pages/css//mvc:resources
location/WEB-INF/pages/js//mvc:resources
location/WEB-INF/pages/images//!--
classorg.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver!--
value/WEB-INF/pages//property!--
classorg.thymeleaf.spring5.SpringTemplateEngineproperty
reftemplateResolver/property/bean!--
classorg.thymeleaf.spring5.view.ThymeleafViewResolverproperty
reftemplateEngine/property/bean
xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd!--
resourceclasspath:spring-dao.xml/import
resourceclasspath:spring-service.xml/import
resourceclasspath:spring-mvc.xml/
/beans本文件配置的目的是为了把三个文件整合起来变成一个文件到后面启动项目的时候利用Tomcat初始化配置把该文件作为接口加载即可。
☆☆☆本文件特别重要如果本文件没有配置那么当访问页面的时候会出现404。
原因是本配置是暴露给浏览器的。
本文件是在WEB-INF目录下具体配置如下所示
xmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsdversion4.0!--
--servletservlet-namespringmvc/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-classinit-param!--
--param-namecontextConfigLocation/param-nameparam-valueclasspath:applicationContext.xml/param-value/init-param!--
当值为0或者大于0时表示容器在应用启动时就加载这个servlet;反则需要时加载
--load-on-startup1/load-on-startup/servlet!--
--servlet-mappingservlet-namespringmvc/servlet-nameurl-pattern//url-pattern/servlet-mapping!--
--filterfilter-nameencodingFilter/filter-namefilter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-classinit-paramparam-nameencoding/param-nameparam-valueutf-8/param-value/init-param/filter!--
--filter-mappingfilter-nameencodingFilter/filter-nameurl-pattern/*/url-pattern/filter-mapping!--
--session-configsession-timeout15/session-timeout/session-config
/web-app到此本系统的所有配置就已经完毕SSM整合也到此完成了接下来就可以开始后端功能的编写了。
我们先来编写持久层也就是操作数据库的功能不过在编写之前我们得先创建一个与数据表对应的实体类
producer;}//getting、settingpublic
org.apache.ibatis.annotations.*;
org.apache.ibatis.session.RowBounds;
数据库实现了id自增策略不用写id;字段名要和数据库一致不用写别名
t_fruit(fname,price,fcount,remark,producer)
(#{name},#{price},#{count},#{remark},#{producer}))int
price#{price},fcount#{count},remark#{remark},producer#{producer}
fruit);//根据水果名称查询水果信息Select(select
到了业务层由于本系统的业务还是比较简单的直接调用持久层就可以了
org.apache.ibatis.session.RowBounds;
org.springframework.stereotype.Service;
org.springframework.transaction.annotation.Propagation;
org.springframework.transaction.annotation.Transactional;
RowBounds((pageNum-1)*5,5);return
fruitMapper.findAll(rowBounds);}/***
return*/OverrideTransactional(propagation
fruitMapper.addFruit(fruit);return
fruit*/OverrideTransactional(propagation
Propagation.REQUIRED,rollbackFor
fruitMapper.findByName(fruitName);return
org.springframework.stereotype.Controller;
org.springframework.web.bind.annotation.*;
return*/RequestMapping(/index)public
return*/GetMapping(/all/{pageNum})public
fruitService.fruitPages(pageNum);model.addAttribute(fruitList,fruitList);//查询总条数int
fruitService.fruitCount();model.addAttribute(count,count);//页数model.addAttribute(pageNum,pageNum);System.out.println(model.getAttribute(fruitList));return
application/json;charsetUTF-8防止响应数据乱码*
application/json;charsetUTF-8)ResponseBodypublic
添加水果库存成功;//在添加水果库存之前查询一下水果名称是否唯一Fruit
fruitService.findByName(fruit.getName());if
fruitService.saveFruit(fruit);if
application/json;charsetUTF-8)ResponseBodypublic
null){//在添加水果库存之前查询一下水果名称是否唯一Fruit
fruitService.findByName(fruit.getName());System.out.println(传进来:fruit\n数据库中:dbFruit);//校验水果名称是否已注册但排除本身if
fruit.getId()){//存在//响应提示语给前端msg
fruitService.updateFruit(fruit);if
水果库存修改成功;}System.out.println(水果fruit);return
application/json;charsetUTF-8)ResponseBodypublic
后端代码已经编写完毕了接下来就是前端页面了我们先把页面结构编写出来而前端的所有代码在本项目中是存放在web\WEB-INF\pages本系统页面一共有2个分别是index首页和food主体页面具体HTML页面代码如下所示~
charsetUTF-8title水果库存系统/titlestyleh1{padding:
th:href{/fruit/all/1}进入水果库存详情页/a/h2
xmlns:thhttp://www.thymeleaf.org
Thymeleaf的声明有语法提示th开头的都是Thymeleaf语法
xmlns:thhttp://www.thymeleaf.orgheadmeta
initial-scale1.0title水果库存/title!--
th:class|name${item.count}|西瓜/tdtd
th:class|price${item.count}|3/tdtd
th:class|count${item.count}|60/tdtd
th:class|remark${item.count}|描述/tdtd
th:class|producer${item.count}|产地/tdtdimg
th:if${#lists.isEmpty(fruitList)}td
colspan6对不起暂无数据/td/tr/tbodytfoottrtd
th:text${pageNum}1/spannbsp;页nbsp;nbsp;nbsp;nbsp;/spana
th:href{/fruit/all/{pageNum}(pageNum${pageNum}-1)}上一页/aa
th:disabledtrue上一页/aspannbsp;nbsp;|nbsp;nbsp;/spana
th:href{/fruit/all/{pageNum}(pageNum${pageNum}1)}下一页/aspannbsp;nbsp;总条数strong
th:text${count}/strong/span/td/tr/tfoot/tablehr
idadd_fruit_tbltrtd名称/tdtdinput
idcount//td/trtrtd广告词/tdtdinput
idremark//td/trtrtd产地/tdtdinput
classaddBtn//th/table/div/div/div
/html【说明】以上都是使用了Thymeleaf模板引擎我们再把CSS样式编写完毕就可以访问一下页面试试效果了。
0;background:url(../images/bg.jpg)
center;line-height:45px;margin-left:
以上就是编码到目前为止的页面效果了数据的展示是我已经在数据库中添加了一些数据然后由于我们使用Thymeleaf遍历后端传来的数据所以有数据显示也由此查询分页功能也就完成了。
接下来就到最后一步了那就是把剩下的新增、修改和删除功能利用Ajax技术与后端联调就可以了。
不过在联调之前我们在本系统的数据展示模块利用js写点附属功能上去需求是这样的**当鼠标悬浮到对应的的行的时候会更换颜色当鼠标移除的时候会变回原本的颜色。
**具体实现如下所示
alert(event.srcElement.tagName)//
alert(window.event.srcElement.tagName);//判断是否存在该元素if
window.event.srcElement.tagName
td.parentElement;//设置样式tr.style.backgroundColor
window.event.srcElement.tagName
td.parentElement;//设置样式tr.style.backgroundColor
th:src{/js/jquery-3.3.1.min.js}/script然后我们在到html对应的标签中添加鼠标悬浮和移除事件
onmouseover鼠标悬浮显示背景颜色onmouseout鼠标移除清除背景颜色
addFruit(){$(#addOrUpdateBtn).click(function(){if
$(#producer).val()},dataType:text,
//后端是String返回所以为文本形式表示json格式success:function
(data){//响应数据alert(data);//页面刷新location.reload();}});}});
$(#idid).val();//调用修改水果库存函数updateFruit(id,fid1);break;case
$(#idid).val();updateFruit(id,fid2);break;case
$(#idid).val();updateFruit(id,fid3);break;case
$(#idid).val();updateFruit(id,fid4);break;case
$(#idid).val();updateFruit(id,fid5);break;}
updateFruit(id,fid){//获取水果库存各属性值$(#name).val($(.nameid).text());$(#price).val($(.priceid).text());$(#count).val($(.countid).text());$(#remark).val($(.remarkid).text());$(#producer).val($(.producerid).text());//把‘添加’按钮值改为‘修改’$(#addOrUpdateBtn).val(修改);//点击修改按钮进行相应操作$(#addOrUpdateBtn).click(function
$(#producer).val()},dataType:text,
//后端是String返回所以为文本形式表示json格式success:function
(data){//响应数据alert(data);//页面刷新location.reload();}});}return
showData(this.id)把id值传参这里就可以实现数据显示了
onclickshowData(this.id)/tr我们来看一下功能效果
(result){//确定执行删除操作$.ajax({url:
$(#idnum).val(),},dataType:text,
//后端是String返回所以为文本形式表示json格式success:function
(data){//响应数据alert(data);//页面刷新location.reload();}});}else
οnclickdelFruit(this.id)传入的参数是id值
至此本系统的功能实现完毕了。
本系统是使用了后端SSM框架模板引擎Thymeleaf前端使用了HTMLCSSJQuery技术。
另外本人技术有限可能在本篇内容中有不足之地各方道友可私聊畅谈一二~~
最后关于本系统使用到的静态资源可以可以使用自己的也可以从源码中获取。
本系统的源码已上传到码云。
链接为https://gitee.com/originnan/fruit
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback