JavaWeb QQZone项目架构总结

这是学习JavaWeb过程中和以往相比做的比较复杂的小项目,是通过tymeleaf进行渲染的B/S(浏览器/服务器)小项目,课程链接:尚硅谷丨2022版JavaWeb教程(全新技术栈,全程实战),尚硅谷,yyds!!!
由于不想花过多的时间在前端上,所以HTML/CSS/JavaScript页面模板大多直接使用的课程资料,就自己模仿着做了一个添加日志和注册的页面。听视频介绍这个项目的主要目的就是手撕简约版Spring MVC框架,为了后面学习框架相对轻松一点。第一次实现了数据库、后台程序、前端页面的交互,还是很有意思,所以写下来理清自己的思路,为了自己更好的理解,也欢迎大家纠错更正。

一、开发环境:

jdk8+MySQL8+tomcat8.5(课程中用的数据库是MySQL5,由于版本不同有些细节不同也耽误了不少时间,下面会提到)

二、流程图:

三、主要模块

监听器和IOC容器:

一旦监听到服务器启动,开始调用BeanFactory创建容器,通过读取配置文件中的标签内容,将后续的Controller类、Service类、DAO类实例化保存。并且建立依赖关系,比如说操作日志相关内容的控制器TopicController里面用到了TopicService,那么直接将刚刚实例化的TopicService赋值到TopicController中,这就是“控制反转”和“依赖注入”。以往我们写程序,一个对象里面需要另一个对象我们就让前者自己直接new出来,但是这样会导致对象依赖和耦合严重,不利于代码维护。为了实现“高内聚,低耦合”的架构,我们现在把创建对象的权利全部交给第三方,即“控制反转”,然后再通过配置文件中的信息进行“依赖注入”,达到解除耦合的目的。

DispatcherServlet:

作为核心响应调度,它的工作是拦截获取到浏览器的(A.do?opetate=B)请求,通过字符串处理,在IOC容器中查找到处理该A请求的指定Controller类,再通过反射找到B方法,进行方法参数赋值调用方法。

把MVC中的V即“view‘也放在dispatcherServlet中,控制器进行操作后需要给dispatcherServlet返回一个字符串,dispatcherServlet通过该字符串判断下一步工作,是继续调用其他控制器,还是直接返回页面给浏览器。

Controller、Service、DAO:

Controller作为控制器提供一些方法供浏览器选择,比如说浏览器端需要执行日志(Topic)添加工作,那需要调用TopicController中的addTopic()方法,再比如需要执行登录操作,当用户点击“登录”按键时浏览器就调用了UserBasicController(UserBasic是用户信息类,登录时需要查询用户信息,所以调用它的Controller)中的login方法。Service就是业务方法,比如说Controller现在整理好了浏览器发来的日志添加内容,需要保存到数据库了,它就调用相应的Service方法,Service再看看有什么需要封装整理的,然后再调用DAO方法,至于DAO就是JDBC中的内容,应该很熟悉了。

四、遇到的主要问题

1、项目关联包问题

异常:java.lang.IllegalStateException: 启动子级时出错

注意操作顺序!一定要先关联上lib下的各种驱动包、添加上tomcat、然后再打包成Artifacts进行部署。刚开始就遇到了找不到MySQL驱动器的问题,原因是将新建的项目一开始就打包成了Artifacts,然后再关联,这样的话Artifacts进行部署时里面当然没有我们关联的驱动。出现这样的问题解决很简单,不需要你删除Artifacts后再添加,只需要Project Structer下面的problems就可以解决。

2、类加载器问题

异常:java.lang.NullPointerException
at java.util.Properties$LineReader.readLine(Properties.java:434)
at java.util.Properties.load0(Properties.java:353)
at java.util.Properties.load(Properties.java:341)

这个问题我解决了好久,抛出的异常就是在获取数据库链接的时候无法读到你的properties配置文件,无法获取链接。就是这一句出了问题:InputStream stream=ClassLoader.getSystemClassLoader().getResourceAsStream(“jdbc.properties”);

于是我做了个单元测试,在idea里面明明可以获取链接,但是到tomcat服务器上就不行。然后我在评论区下发现了一个留言,需要改成:InputStream stream =JDBCUtils.class.getClassLoader().getResourceAsStream(“jdbc.properties”),我一试果然成功,为什么出现这样的情况呢,说到底是路径问题:

你可以尝试在idea下和在tomcat环境下分别执行以上两句,你会发现在idea下两个得到的路径是相同的,都是当前项目的src下:

System.out.println(JDBCUtils.class.getClassLoader().getResource(""));
System.out.println(ClassLoader.getSystemClassLoader().getResource(""));


但是同样的代码在tomcat调用时:

会发现InputStream stream =JDBCUtils.class.getClassLoader().getResourceAsStream(“jdbc.properties”) 调用的路径是artifacts打包后的“src”目录,是正确的。而InputStream stream=ClassLoader.getSystemClassLoader().getResourceAsStream(“jdbc.properties”);得到的是null。

3、LocalDateTime类转化问题

异常:java.lang.IllegalArgumentException: Can not set java.util.Date field com.guoliang.qqzone.pojo.Topic.topicDate to java.time.LocalDateTime

当调用DAO时一旦发现异常can not set A to B,就是你不能把B类型赋值给A。

视频中老师讲的时候是没有这个问题的,因为老师用的是MySQL5,这个问题应该是MySQL8驱动引入的。该项目数据库中的Date全部是DateTime,对应的Java中是LocalDateTime或者TimeStamp,而我们Java中设定的全部是Date。

解决方法:1、将pojo类中的Date全部转化为LocalDateTime

​ 2、BaseDAO中加上以下代码进行转化

//LocalDateTime需要转化if (propertyValue.getClass().toString().equals("class java.time.LocalDateTime")) {propertyValue = Timestamp.valueOf((LocalDateTime) propertyValue);}

4、tymeleaf渲染问题

写好的前端页面展示出来发现与我们所想不一样,这个问题老师也遇到了,再上一个项目中老师一直没有发现,但是这个项目老师成功解决了这个问题。问题根源在于既然使用了tymeleaf,你就不能直接调用网页,必须经过DispactureServlet中的视图模块进行调用渲染,否则你页面上的所有“th:”都无法识别。

六、部分结果展示:




JavaWeb QQZone项目架构总结相关推荐

  1. javaweb学习记录-qqzone项目-结构分析

    回顾下之前学习的水果项目的mvc各层设计 qqzone项目结构 几个问题及分析 3. 系统启动时,我们访问的页面是: http://localhost:8080/pro23/page.do?opera ...

  2. JavaWeb小项目(二)- 完成品牌数据的增删改查(JSP/MVC/三层架构综合应用)

    JavaWeb小项目(二)- 完成品牌数据的增删改查(JSP/MVC/三层架构综合应用) 文章目录 JavaWeb小项目(二)- 完成品牌数据的增删改查(JSP/MVC/三层架构综合应用) 环境搭建 ...

  3. JavaWEB十五:QQzone项目的整体分析及web关键点总结

    QQzone项目的整体分析及web关键点总结 一.需求分析 1.熟悉QQZone业务需求 用户登录 登录成功,显示主界面.左侧显示好友列表:上端显示欢迎词.如果不是自己的空间,显示超链接:返回自己的空 ...

  4. JavaWeb完整项目要用到的专业技能

    完成JavaWeb项目用到哪些专业技能?在经典的JavaWeb的开发模式中,我们使用Jsp技术来作为展现层的实现,其实也就是所谓的前端.Web开发中经典的MVC模式,Model-View-Contro ...

  5. java kafka分布式_JavaWeb项目架构之Kafka分布式日志队列

    架构.分布式.日志队列,标题自己都看着唬人,其实就是一个日志收集的功能,只不过中间加了一个Kafka做消息队列罢了. kafka介绍 Kafka是由Apache软件基金会开发的一个开源流处理平台,由S ...

  6. Springboot项目架构设计

    导航 前言 流水线 架构的艺术 项目架构 理解阿里应用分层架构 superblog项目架构 结语 参考 本节是<Spring Boot 实战纪实>的第7篇,感谢您的阅读,预计阅读时长3mi ...

  7. 基于JDBC的JavaWeb开发项目之——网上教务系统

    基于JDBC的JavaWeb开发项目之--网上教务系统 在这个文章里,我会详细的解释JavaWeb其中的一个框架--MVC框架来完成网上教务系统这一个项目.这个项目是使用JDBC去连接数据库,使用了J ...

  8. 基于JavaWeb JSP SSM架构的网上求职招聘系统

    文件大小:788M 开发环境:Eclipse2020.JDK8.0.Tomcate 7.0.MySQL5.6 点击下载:点击下载 简要概述: 基于SSM架构的网上求职招聘系统 程序有前后台 数据库:m ...

  9. JavaWeb实战项目-登录审批功能-付强-专题视频课程

    JavaWeb实战项目-登录审批功能-134人已学习 课程介绍         在eclipse中进行web开发,熟练掌握HTML.Javaspript.CSS.JSP.Servlet.Oracle. ...

最新文章

  1. python学习day24 继承 派生
  2. Linux下Java开发环境的搭建Tomcat6+jdk6+eclipse3.5.2+Myeclipse9.0+mysql5.1.47
  3. vue 数据(data)赋值问题
  4. java代理的原理及应用
  5. python字符串创建_在Python上创建完整的字符串
  6. php时区问题,PHP中遇到的时区问题解决方法
  7. HA集群之三:corosync+pacemaker实现httpd服务的高可用
  8. matlab 集合操作
  9. Post传值时间特殊字符处理比如 p/p当作参数传递到后台
  10. 2021-04-26 Matlab遗传算法工具箱的使用及实例(线性规划)
  11. 2021年认证杯SPSSPRO杯数学建模C题(第一阶段)破局共享汽车求解全过程文档及程序
  12. 服装企业为什么要用湖州管家婆ERP管理软件?
  13. win10电脑新建Excel工作簿,后缀变成xlsm(正常本应该是xlsx)的解决办法
  14. es - elasticsearch mapping - parameters - norms
  15. pytho的虚拟环境
  16. 硬盘存储结构及分区简介
  17. 高中关于人工智能方面的课题_人工智能课题及其认识意义.doc
  18. 使用gcc参数-Wl,–gc-sections,不链接未用函数,减小可执行文件大小
  19. 网上流量卡这么便宜,线上申请的流量卡有虚标吗
  20. Node.js | 从前端到全栈的必经之路

热门文章

  1. 迪士尼2016年压轴巨作---《海洋奇缘》观后感
  2. 初学VUE 走马灯效果
  3. 51单片机与蜂鸣器实现摩斯密码转换。
  4. PCIe4.0的Add-in-Card(AIC)金手指layout建议
  5. Yahoo!创始人:杨致远的故事
  6. 视频号的播放量和互动率、完播率密不可分
  7. 无人驾驶数据库汇总(不断更新)
  8. 【C语言】文件操作详解
  9. 鸿蒙系统平板界面,首发预装鸿蒙OS!华为MatePad Pro 2系统界面曝光
  10. python中arcsec_如何使用Python将Gaia天体测量数据绘制成TESS图像?