引言:当你想入门java web后,一定会查阅到很多相关的名词:Servlet,HTML,Spring...等等之类的,但是对于他们之间的关系总是比较混乱的,这篇文章就是理清这些名词的关系。
什么是web应用?
web应用是一种可以通过Web访问的应用程序。在J2EE领域下,web应用就是遵守基于JAVA技术的一系列标准的应用程序。
最简单的web应用什么样?
2个文件夹、1个xml文件就能成为一个web应用
第一个文件夹:应用名,如test
第二个文件夹:在test文件夹中创建名为WEB-INF的文件夹
XML文件:在WEB-INF文件夹下创建web.xml文件,文件内容只需<web-app></web-app>
Servlet规范
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
Servlet是J2EE 规范中的一种,主要是为java程序提供一个统一的web应用的规范,方便程序员统一的使用这种规范来编写程序,应用容器可以使用提供的规范来实现自己的特性。
因此,基本上所有的java web应用都是基于Servlet规范,哪些常用框架如Struts,Spring MVC只是对Servlet规范的封装而已。
web.xml
web.xml学名叫部署描述符文件,是在Servlet规范中定义的,是web应用的配置文件。由web容器(如Tomcat)读取加载。
web.xml配置详解
web.xml加载过程:
启动WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.先读取
<context-param></context-param>
节点。紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文.
容器将
<context-param></context-param>
转化为键值对,并交给ServletContext.-
容器创建
<listener></listener>
中的类实例,即创建监听。在监听中会有contextInitialized(ServletContextEvent args)
的初始化方法,在这个方法中可以获得context-param
节点的参数:ServletContext = ServletContextEvent.getServletContext(); context-param的值 = ServletContext.getInitParameter("context-param的键");
得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早.换句话说,这个时候,你对<context-param>
中的键值做的操作,将在你的WEB项目完全启动之前被执行。举例.你可能想在项目启动之前就打开数据库.那么这里就可以在<context-param>
中设置数据库的连接方式,在监听类中初始化数据库的连接.
web.xml节点加载顺序:
可以肯定的是,节点的加载顺序与它们在 web.xml 文件中的先后顺序无关。即不会因为 filter 写在 listener 的前面而会先加载 filter。
加载顺序是:[context-param -> listener -> filter -> servlet] ,而同类型节点之间的实际程序调用的时候的顺序是根据对应的 mapping 的顺序进行调用的。
Servlet
这里的Servlet是指Java语言实现的一个接口,也就是Servlet规范的实现。
通过下面一个例子体会一下Servlet(实现接口的对象)的作用:
一个网络请求的过程
有这样一个场景:当用户向浏览器地址栏输入一个网址
1、 浏览器使用ip:port(端口号)连接服务器;
2、 浏览器将请求数据按照http协议打成一个数据包(请求数据包)发送给服务器, 请求数据包的内容包含了请求资源路径(如:/helloweb/sayHello?name=zs),另外,在请求数据包当中,还会包含浏览器自动生成的一些信息;
3、 服务器(web容器,如Tomcat)创建两个对象:请求对象(Request)和响应对象(Response)服务器解析请求数据包,将解析之后的数据存放到请求对象里面,方便servlet读取请求数据(因为servlet不用解析请求数据包,如果要解析,需要理解http协议)。请求对象是HttpServletRequest接口的一个实现。响应对象是HttpServletResponse接口的一个实现,响应对象由于存放servlet处理的结果;
4、 依据请求资源路径找到相应的servlet配置,通过反射创建servlet实例。然后调用其service()方法;在调用service()方法时,会将事先创建好的请求对象(request)和响应对象(response)作为参数进行传递。在servlet内部,可以通过request获得请求数据,或者通过response设置响应数据,在这里完成你所需要的操作并放回结果;
5、服务器从response中获取数据,按照http协议打成一个数据包(响应数据包)。发送 给浏览器;
6、浏览器会解析响应数据包,取出相应的数据,生成相应的界面。
filter
也即Servlet过滤器,它具有客户端(浏览器)请求的功能,Servlet过滤器可以改变请求中的内容来满足实际开发中的需求。
它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如JSP,Servlet,静态图片文件或静态HTML文件进行拦截,从而实现一些特殊功能。例如实现URL级别的权限控制、过滤敏感词汇、压缩响应信息等一些高级功能。
著名框架Struts就是基于filter实现的。
listener
监听器的作用是监听Web容器的有效事件,他是由容器管理的,可以监听Application、Session、Request对象,当这些对象发生变化就会调用对应的监听方法。
Struts2
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
Spring
Spring 框架的核心特性可以用于开发任何 Java 应用程序,但是在 Java EE 平台上构建 web 应用程序是需要扩展的。 Spring 框架的目标是使 J2EE 开发变得更容易使用,通过启用基于 POJO 编程模型来促进良好的编程实践。
控制反转——Spring通过一种称作控制反转(IoC)的技术促进了低耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
Spring MVC
Spring MVC 是一个模型 - 视图 - 控制器(MVC)的Web框架建立在中央前端控制器servlet(DispatcherServlet),它负责发送每个请求到合适的处理程序,使用视图来最终返回响应结果的概念。Spring MVC 是 Spring 产品组合的一部分,它享有 Spring IoC容器紧密结合Spring松耦合等特点,因此它有Spring的所有优点。
Servlet是一个java web应用的核心,而我们访问网页看到的界面可不是完全由java代码生成的,这个页面是由HTML+CSS构成,但这只能是静态页面,动态的页面由JavaScript,JSP等技术提供支持。
HTML
超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。“超文本”就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。超文本标记语言的结构包括“头”部分(英语:Head)、和“主体”部分(英语:Body),其中“头”部提供关于网页的信息,“主体”部分提供网页的具体内容。
简单点说就是页面的结构是怎样的,这里显示一张图片,那边是一个按钮。
CSS
层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。
其实也就是控件的样式了,比如按钮是什么颜色,什么大小之类的。
JavaScript
JavaScript(也可以简写为js)一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能,可以把静态页面转变成支持用户交互并响应应用实践的动态页面。经常应用JavaScript进行数据验证、控制浏览器以及生成时钟、日历和时间戳文档等。
js主管动作,减轻后台的操作,可以很简单的就实现对输入的数据的验证。比如说注册的时候,用js中的ajax到后台实时验证本用户名是否已经被注册,验证码是否正确或者用来实现异步更新,为用户带来更好的体验。用jquery来验证密码的合法性,输入密码与确认密码是否一样,从而反馈到html页面上,可以通过操控css或者html页面内容来确认输入内容是否有错。但是ajax和jquery都是js的一个库。
JSP
SUN首先发展出Servlet,其功能比较强劲,体系设计也很先进,只是,它输出HTML语句还是采用了老的CGI方式,是一句一句输出,所以,编写和修改HTML非常不方便,并且不能把网站的逻辑和页面的输出分开。为了解决Java Servlet的这种缺点, 推出了类似于ASP的镶嵌型的JSP,把JSP TAG镶嵌到HTML语句中,这样,就大大简化和方便了网页的设计和修改,这就是Java Server Pages—JSP。
JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它[1] 是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(.htm,.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。
JSP文件会被编译器编译成Servlet的class类,所以我的理解是:为了方便编写页面设计的另一形式的java代码编写方式。
最后就是是数据相关的技术,在网站上注册的用户,肯定是记录下来的,不然下次就不能登录了,数据存储使用了数据库。java层要访问数据库就需要用到JDBC。
JDBC
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。
Hibernate
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
MyBatis
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合。