Javaweb入门

花了三个星期,从零开始学习Javaweb的搭建,并第一次上手一个框架,踩过了无数的坑,但收获还是很大


看本文的读者最好有以下基础

  • Java基础
  • 对HTTP和HTML有所了解
  • Linux基本操作
  • 对web运作流程有了解
  • 数据库,如MySQL

当然如果不了解也没事,和我一样头铁就是干!

web历史概述

我们简单回顾一下Web应用的发展

1991年Web页面在Internet上的首次登场,最早Web主要被一帮科学家们用来共享和传递信息,浏览器中主要展现的是静态的文本或图像信息。不过大家很快就不仅仅满足于访问放在Web服务器上的静态文件,1993年CGI(Common Gateway Interface)出现了,CGI定义了Web服务器与外部应用程序之间的通信接口标准,因此Web服务器可以通过CGI执行外部程序,让外部程序根据不同的Web请求生成动态内容。而在Java Web开发中的Servlet,其原理与CGI是类似的。那个时候编写CGI程序的主要是Perl和C等语言,在程序中输出大片的HTML字符串,可读性和维护性是个大问题。为了处理更复杂的应用,一种方法是把HTML页面中固定的部分存起来(称之为模版),把动态部分打上标记,处理Web请求时,后端程序生成动态的内容然后填充进到模板中去,形成最终返回的HTML。于是1994年PHP诞生了,PHP可以把程序(动态内容)嵌入到HTML(模版)中,不仅能更好的组织Web应用的内容,而且执行效率比CGI还更高。之后96年出现的ASP和98年出现的JSP本质上也都可以看成是一种支持某种脚本语言编程(分别是VB和Java)的模版引擎。

Web开发脚本语言,搭配上后端数据库技术,Web开始大杀四方,类似电子商务系统这样的复杂应用也开始出现在互联网上。如第一部分所述,这时MVC的概念被引入到Web开发中来了。这时一个典型的Java Web应用从架构上看起来应该是这个样子:
web架构

  • Web浏览器发送HTTP请求到服务端,被Controller(Servlet)获取并进行处理(例如参数解析、请求转发)
  • Controller(Servlet)调用核心业务逻辑——Model部分Model进行数据库存取操作,并将操作结果返回给Model
  • Controller(Servlet)将业务逻辑处理结果交给View(JSP),动态输出HTML内容动态生成的HTML内容返回到浏览器显示

web架构
Spring MVC提供了一个DispacherServlet(Spring MVC是以Servlet技术为基础的),这个Servlet把Web应用中Servlet中经常要实现的功能封装起来并提供一层公共抽象,想象对应于一个Web请求后端要做的事情,比如:

  • URL映射(对应HTTP URL和方法,应该调用什么代码)
  • 权限验证(当前的URL是否允许当前用户访问)
  • 参数解析(如何从Servlet中获得参数)
  • 数据绑定(如何将Servlet中的参数,绑定到业务逻辑对象中)
  • 数据验证(判断数据是否符合业务规则,比如邮件格式是否正确)
  • 视图解析(使用哪个视图模板进行渲染)
  • 模型传递与视图渲染(将数据传递给模板,并且在模板中引用)

有了Spring MVC,你只需写简单的POJO代码(如图所示,用POJO实现Controller),或者实现Spring MVC给你提供的接口(比如实现Interceptor做权限判断),就能完成这些繁琐的功能

而ORM的作用就非常直观了,无须赘述,如图所示它提供了与数据库操作的一层中间抽象,这样Model的代码自然会更加简单。Spring MVC基本可以帮你屏蔽Servlet的API,ORM则可以帮你屏蔽JDBC的API了,也就是说你在更高的抽象层次上写程序了,更高的抽象层次一般意味着以更符合我们思维的方式来思考,自然效率更高。这事实上是软件技术发展的一个重要驱动力之一。你想想,从汇编语言发展出高级语言,从文件系统发展出数据库,其实本质规律是类似的

那Spring的作用是什么呢? 看到图中大量的箭头没有? 图中的每一个小方块其实都是大量的Java类来实现,Controller与Model之间,Model与数据访问对象之间的这些箭头,意味这些Java类之间存在大量复杂的依赖关系。Spring的核心功能依赖注入,正是用于管理Java对象之间的依赖关系,所以第一部分我们说Spring是一个一站式的粘合框架,它像神奇的胶水一样,可以以松耦合的方式有机的粘合在一起

回到历史,Web开始大杀四方之时,大型应用在分布式、安全性、事务性等方面的要求进一步催生了J2EE(现在已更名为Java EE)平台在1999年的诞生。但是J2EE的组件技术EJB(Enterprice Java Beans)非常笨重,Spring的初衷是为了替代EJB,让Java EE开发更加简单灵活。它起源于Rod Jahnson 2002年出版的著作《Expert One-on-One J2EE Design and Development》,那本书中分析了Java EE的开发效率和实际性能等方面的问题,从实践和架构的角度探讨了简化开发的原则和方法。以此为基础,他实现了一个名为interface21的轻量级开发框架,成为Spring框架的前身。2004年,Spring正式发布1.0版本,同年Rod Jahnson推出了另一部影响深远的经典著作《Expert one-on-one J2EE Development without EJB》,Spring开始逐步在Java领域流行。现在Spring框架的版本已经演化到了4.x,它已经成为Java开发框架的一种事实标准,对Java EE规范本身也产生了重要影响。比如EJB规范就在发展中逐渐引入了众多Spring框架的优秀特征

好了,你现在应该可以从更高和更广的技术视野来看待这几个框架了吧。看到一门技术的发规律和发展历程,这是一种技术修养的体现,跟人文修养是类似。但是同时我们也应该具有一定的深度,因为我们往往已经站在比较高的抽象层次,比如今天你写几行代码就能把数据库创建好,增删改查的功能也自动生成好了,但是成为高手需要你对底层的原理机制有更透彻的理解,真正遇到问题的时候才能抽丝剥茧迎刃而解

架构

先讲讲一些大体上的架构吧!
Java EE体系结构

服务器端三层被称为经典三层结构,即web层(表现层)、业务逻辑层、数据持久层,出现了很多结合三层JavaEE的设计模式,DAO模式就是数据持久层的设计模式

实际上MVC和JavaEE经典三层结构是由两拨人分别提出的,两者间可以有着如下的对应:

  • 业务层、数据持久层 —- Model
  • web层 JSP —- View
  • web层 Servlet —- Controller

Javaweb的传统架构都是模块化的设计逻辑,如Views、Controller、Service和Dao,如果要进行水平扩展,则将应用部署到不同的服务器,并通过Nginx进行负载均衡(即反向代理)
传统架构
现流行的微服务框架则在传统应用架构上,将业务拆分为更细颗粒的服务,每个服务都是一个应用,并对为提供公共API,图中每个API都是一个传统应用架构
微服务架构

申明这次开发所用的环境(包括版本信息)真的很重要,因为我第一次在云服务器上部署tomcat时,所安装的jdk版本是1.7.0,而tomcat是8.5.5,产生的问题就是能顺利打开tomcat自带的界面,却不可以打开我自己部署的项目,这个问题还是我使用一个jsp文件去测试也打不开,才意识到可能是java没有安装成功,所以今后一定要注意版本的问题,不要随便安装。

所用开发工具

  • jdk版本:云服务器上安装的是jdk1.8.0,本地则是安装的jdk9.0.1,当然最好即使安装相同的版本,不然最后部署出现问题,会很“开心”的
  • tomcat 8.5.5
  • MySQL 8.0.13
  • 集成开发环境:IDEA
  • 其他小工具:FileZilla(用于将本地文件传到云服务器上),Navicat(MySQL可视化,连接云端数据库),虚拟机centos7(连接云服务器执行命令)
  • 腾讯云服务器
  • 还是要提醒自己也是提醒读者,版本信息也是一个关注点,我反正长记性了

目标

  • 实现一个登陆和增删改查的简单web,并将其部署到云服务器上
  • 对Spring框架的认识,并对项目涉及到的知识进行深入剖析
  • 掌握几种设计模式(如模板设计模式)
  • 对Java语言深入认识和回顾
  • 锻炼自己的调BUG的能力,如何快速定位出错的原因和位置
  • 我觉得我在这个项目中认识到的最最重要的一点就是一定要记录每次出错,并进行排错的过程步骤,这样不仅知道哪一步骤出错,还能方便回头写总结文档

步骤

接下来不啰嗦,进行第一步,选择创建的是maven项目

这里提一句maven是什么,中文名是行家(有点意思),但其实是犹太语,意思是知识的积累,是一个软件项目管理工具,在我们这个项目中就是可以通过一个配置文件pom.xml来引入开发需要的包,而不用自己去下载去引入,只要写一个简单的配置文件maven就可以从本地或者中央存储库(点这里哦!)中将jar包导入这个项目中,除此之外可以自动部署到tomcat上、自动生成war包等等,覆盖了一个项目完整的生命周期,很有用也很好用!

上图看步骤
第一步
点击Next,GroupId填的一般是域名,以此区别其他人的开发项目,和Java包的命名方式类似,artifactId就是项目名称(不过artifact是人工制品的意思??),填完之后就是一路点
第二步
点击Finish,之后在等待创建项目的时候,右下角会出现这个标签,选择Enable Auto-Import,这样当pom.xml配置文件改变的时候,maven就会自动更改
第三步

创建好后的初始文件目录
第四步

之后先去配置tomcat,如下图
第五步
第六步
第七步
选择”demo::war exploder”包,这样一个简单的网页就算完成了
第八步
点击”run”运行第一个网页吧!
第九步

将项目部署到云端服务器上
先安装jdkyum install jdk-1.8.0-*
在安装tomcat 先下载tomcat安装包,再把安装包传输到服务器上,并运行,在将整个项目文件传到tomcat文件下

第二步:修改 $TOMCAT_HOME\conf 下的server.xml文件
在server.xml文件中新增节点,一个节点代表一个web应用
path:指定访问该Web应用的URL入口。 如“/HelloApp1/”
docBase:指定Web应用的文件路径,可以给定绝对路径,可以给定相对路径。。如应用HelloApp1的文件路径为/webapps/HelloApp1
reloadable:如果这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF,lib目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用。

相关文章:《Spring揭秘》