全球移民热线 400-123-4567 众多Java刚开始学习的人,一开始就去学Spring Boot,最终连请求是怎样被处理的都没办法弄明白,这个有关新闻发布的系统恰好击中了这个让人困扰的点,它运用最为原生态的方式向你表明,一个Web应用究竟是如何运行起来的。
点开此项目的代码,你能够清晰瞅见三个层级的分工,浏览器发送过来的请求首先会被JSP页面接纳,于此之处运用request.getParameter()获取前端传递过来的数据,这便是视图层所从事的事务,而后你会瞧见诸如NewsDao这般的类,其内部尽是JDBC原生代码,承担着与数据库进行交互的职责,这便是模型层。那些处于中间位置进行连接的Servlet,或者是直接被写在JSP里面的Java代码,它们就是控制器呀 ,而这个控制器呢,会去从运行的数据库取到相应的新闻列表 ,之后再把这些新闻列表塞进存在的request对象之中 ,最后运用request.getRequestDispatcher().forward()进行特定的跳转操作从而来到展示页面。这种分工的方式虽然显得比较简单 ,但MVC的精髓实际上全部都在里面呢。
2023年,我于一所二本院校瞅见他们的Java Web课程设计,三十多个学生中间,有一半居然仍在运用这个架构。有个学生所做的校园新闻系统,其代码里头连连接池都未曾使用,每一次访问之时都会重新加载驱动,然而人家却能将PreparedStatement防止SQL注入的原理讲述得明明白白,这相较于直接着手MyBatis可要强出太多了。
新手常常会觉得JSP颇显神秘莫测,实际上它不过是个能够自行编写Servlet的模板罢了,你于<% %>之中所书写的Java代码和那些${}表达式,在Tomcat启动以后都会被转化成Java文件,就以新闻详情页为例来讲,你所写的<%=news.getTitle()%>,到最后会演变成像是out.print(news.getTitle())这样的Java语句。这个过程,于Tomcat的work目录之下,能够被看得极为清晰明白,每一个JSP,皆对应着一个Java类,以及编译之后的class文件。
有一个细节,它特别能够说明问题,那就是:要是你在JSP当中写了逻辑错误,在Tomcat报错的时候,它会把翻译之后的Java文件路径以及行号告知给你。我曾经见到过一个培训班学员,他一直都没有办法想通,为何JSP里的变量必须重新声明?后来,当他看到翻译之后的源码时,这才明白过来,原来JSP页面的内容都被放置进了_jspService()方法里面。
这个新闻系统的数据库设计呈现出一种克制的状态,然而该具备的内容均已完备。news表作为核心,其字段涵盖了自增的id主键,还有title标题,content正文,create_time发布时间,并且存在一个category_id外键,它指向category表。category表仅有两个字段,分别是id和name,用于存储新闻分类。admin表更为简易,仅仅存储管理员的用户名以及经过MD5加密后的密码。用来创建表格的语句所采用的是InnoDB这种引擎,它具备支持事务的特性,字符集被指定为utf8mb4,就连emoji这样的符号都能够进行存储。
一个创业团队,去年我帮其优化过类似项目,早期其结构也是如此。新闻表中的create_time字段,添加了索引,原因是首页要按时间倒序进行展示;content字段采用了text类型,恰好足以存储普通新闻正文。最令我感到意外的是,他们在建表之时就考虑到了软删除,增添了一个tinyint类型的deleted字段,这般设计意识甚佳。
项目讲解中特地表明于两类系统里测试通畅,此背后暗藏诸多难题。于Linux下开展部署需先给catalina.sh赋予执行权限,借chmod +x达成,接着凭借./startup.sh启动。在MySQL导入数据之际要留意大小写敏感问题,表名尽大可能全部采用小写形式。而Windows操作则相对简便,直接双击startup.bat即可,但路径分隔符需变更为反斜杠,连接URL里的时区设置同样得予以添加。
曾有一个真实的教训发生,在2019年时,某高校机房部署学生所创作的作品,在Windows系统之下运行得相当良好,然而当把它迁移至Linux服务器之时,却报出数据库连接错误。最终经过查找发现,原来是连接字符串里面使用了localhost ,在Linux系统下其被解析成IPv6地址,可MySQL并未开启IPv6监听。随后将其改成127.0.0.1 ,问题立马就得到了解决,像这样的细节在书本上根本是学不到的。
这个项目的精粹全都存在于JDBC的那几行代码当中,Class.forName("com.mysql.jdbc.Driver")用于加载驱动,DriverManager.getConnection()负责获取连接,而后创建Statement或者PreparedStatement去执行SQL。最为让人备受煎熬的是遍历ResultSet,逐个运用getString()来获取字段,并且还需要手动处理SQLException。可是,恰恰是这般折磨使得人记住,每次用完连接之后,务必要在finally那一块区域里进行close()操作,不然的话,数据库连接资源极快就会被耗尽了。
瞧见过一个极为极端的事例:存在一个新手于DAO当中撰写了try-with-resources,自以为一切安然无恙,然而却遗漏了知道ResultSet究其也是需要实施关闭动作的资源。在进行压测之际察觉到连接数急剧攀升,对此展开排查历经两日方才找出这个潜藏的BUG。所以在这个项目里那些看起来颇为啰嗦的finally块呢,其确实事实上在每一个方面都是蕴含实践经验得来的见解。
当你键入http://localhost:8080/news/list.jsp这个网址时,浏览器会率先对域名localhost开展解析,随后建立起前往127.0.0.1的TCP连接,紧接着发送GET请求。Tomcat在接收到该请求之后,依据web.xml中的相关配置寻觅到对应的JSP,进而执行其中所包含的Java代码,最终将生成的HTML借助HTTP响应予以返回。在整个这一过程当中,你根本无法感受到服务器的存在,而这便是B/S架构所具备的魅力所在了。
几天前调试一个年代久远的系统,我借助Chrome开发者工具查看了一下网络面板,发觉有一个请求耗费时间达到2秒多。点击进入查看,原来是JSP页面当中编写了一个循环查询数据库的操作,每一次循环都会新建连接。之后改成批量查询,响应时间一下子降低到200毫秒。这使我回想起这个新闻系统里着重强调的“请求 - 处理 - 响应”模型,实在是万变不离其宗。
瞅完这个项目的介绍之后,你认为针对当下的Java初学者而言,是应当径直去学 Spring Boot 迅速搞出东西从而树立信心呢,还是要先将这种原始项目彻底钻研透以此打好基础呢?欢迎于评论区去分享你的观点,点赞并转发好使更多正处于纠结状态的人能够看到。