学JavaWeb一年,小谈一些基础知识的理解<转>

Servlet简介:Servlet是Sun公司提出的一套规范,规范了Java如何开发动态网站。它提供了对服务器端Java开发的支持,也是JavaWeb技术的基础。

一个Servlet就是一个Java类,但它不是一个Applet(Java应用程序),因为Servlet没有main方法,他不能独立执行,必须要由Servlet容器去调用、管理,控制Servlet的创建、执行、销毁等生命周期阶段。

Servlet的工作方式:服务端启动,客户端发出请求,通过计算机网络将请求发送给服务端,服务端创建Servlet,并根据客户端请求调用相应方法(doPost、doGet……)处理请求后返回响应(response对象)给客户端。

Web容器:也叫作Web服务器,Tomcat就是Web容器,我们刚刚提到的Servlet容器是Web容器的一部分。客户端发出的HTTP请求会首先经过Web容器,Web容器会将HTTP请求解析成一个request对象交给服务端Servlet,服务端处理请求后返回的response对象也需要被Web容器解析成HTTP报文才能返回给客户端。浏览器解析HTTP报文,并将响应结果展示给用户。

这里提到了浏览器:现在主流的网络程序开发架构已经由C/S转向B/S,其中B就是指Brower浏览器。浏览器是Html、CSS、JavaScript等负责页面显示的脚本语言的解释器;它支持url并可以通过url发出HTTP请求、解析HTTP请求;浏览器还支持各种图片、视频、音频的显示;现在的浏览器还支持更多的功能,如Cookie、缓存、多种网络协议……总之,浏览器是当今web应用开发中绝对不可或缺的一部分。

JSP:JSP的出现是为解决动态响应视图问题,如CGI程序,当需要动态的返回响应页面时,只能通过response.getWriter().write()方法一行一行的输出HTML脚本返回给客户端,十分繁琐,而且Servlet作为控制层与视图层耦合,不符合MVC架构思想;而有了JSP,我们可以直接响应一个.jsp视图或映射到一个.jsp视图的逻辑视图(Struts2中会用到),在JSP中可以写Html、CSS、JS代码,可以嵌入Java代码、JSP支持的JSTL标签,Struts2等框架支持的OGNL标签等,以实现根据响应数据动态显示视图的功能,十分方便,而且Servlet只负责业务逻辑的控制,JSP负责视图层工作(与用户交互,向服务器发出请求,接收服务器响应,由响应数据不同动态显示视图),若再使用JavaBean的封装数据模型就实现了一个简单的MVC架构。

JavaBean:如果我们为了使用服务端的响应数据而在JSP中嵌入了大量的Java代码,我们的代码看起来会非常混乱难以维护。我们期望实现页面静态化(只包含静态内容,如Html,CSS,JS等),所以我们将为完成某一业务逻辑所需要的参数封装成JavaBean,在JSP中使用JavaBean组件标签替换Java代码,以保证页面的静态组成。JavaBean其实就是一个Java类,具有私有属性,一般包括有参和无参的构造方法与各属性的get、set方法。

我刚刚一直说的MVC架构:是一种Web开发模式,将Web应用分为三层

M——Model模型层,一般是指我们开发中的数据库表与entity(pojo)、dao、persistence包下的内容,主要负责数据模型的封装与数据库的相关操作;

V——View视图层,一般是指页面如JSP、Html等,主要负责与用户交互,向服务器发出请求、接收响应,由响应数据不同动态显示视图。

C——Controller控制层,一般是指项目中servlet、action、controller包下的内容,主要负责接收客户端请求,调用模型层相关方法处理请求,然后返回响应给客户端。

Service\ServiceImpl——这里需要说明的是,在实际开发中,控制层一般不会直接调用模型层方法进行数据操作,往往通过调用业务层Service,在ServiceImpl中调用模型层方法实现业务。因为一个功能可能是由多个基本的数据库操作加上一些特殊的逻辑判断才能完成的,所以通过Service\ServiceImpl这样的面向接口设计,来进一步使控制层与模型层解耦,使程序结果更清晰,更易维护与扩展。

MVC的优势在于分层使程序清晰,使各层开发人员可以专注于自己的模块,易于开发;程序解耦使程序更易维护与拓展;视图层的独立使多个业务可共用一个视图做为响应,增强了代码的可重用性。常见的MVC框架有Struts2,SpringMVC等(更确切的说这些框架只是负责MVC中的一部分,Struts2与SpringMVC的作用更多体现在控制层,而Hibernate与Mybatis等持久层框架就是用来处理模型层数据库操作的)。

学习Javaweb逃不开三个技术:过滤器、拦截器、监听器

过滤器:先于Servlet与JSP执行,也就是依赖于Web容器实现。当客户端发出一个请求时(无论是请求Action还是资源的直接定位),都可以被过滤器过滤到。我们使用过滤器大多是进行一些通用的处理,比如非法url的过滤、字符编码的设置或用户权限的确定Struts2的核心类就是一个名叫StrutsPrepareAndExcuteFilter的过滤器。

而拦截器:与过滤器功能类似,但不依赖于Web容器实现。拦截器是Struts2的核心功能,是一种AOP的概念。拦截器同样可以拦截请求进行预处理,但它只能拦截Action而不能拦截资源的直接定位,这个范围差别是我们选择使用过滤器与拦截器的一个重要考量因素。拦截器的功能较过滤器更为强大,他可以访问到Action上下文ActionContex以获取request、response、session等内容。

拦截器与过滤器的区别还体现在设计思想上:过滤器重在过滤,得到合格的请求或响应;拦截器重在拦截,拦截不合理的请求或响应。

监听器:并不常用,可以监听session、Servlet上下文,往往用于一些特定的功能比如一些初始化配置工作,如在Servlet启动时配置数据库连接与连接池。

刚刚说拦截器是一种AOP的概念,那AOP是什么呢?如下这段话是我看过得最易懂的一段AOP的解释。

面向切面编程(AOP是Aspect Oriented Program的首字母缩写),我们知道,面向对象的特点是继承、多态和封装。而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配。实际上也就是说,让不同的类设计不同的方法。这样代码就分散到一个个的类中去了。这样做的好处是降低了代码的复杂程度,使类可重用。

但是人们也发现,在分散代码的同时,也增加了代码的重复性。什么意思呢?比如说,我们在两个类中,可能都需要在每个方法中做日志。按面向对象的设计方法, 我们就必须在两个类的方法中都加入日志的内容。也许他们是完全相同的,但就是因为面向对象的设计让类与类之间无法联系,而不能将这些重复的代码统一起来。

也许有人会说,那好办啊,我们可以将这段代码写在一个独立的类独立的方法里,然后再在这两个类中调用。但是,这样一来,这两个类跟我们上面提到的独立的类 就有耦合了,它的改变会影响这两个类。那么,有没有什么办法,能让我们在需要的时候,随意地加入代码呢?这种在运行时,动态地将代码切入到类的指定方法、 指定位置上的编程思想就是面向切面的编程。

一般而言,我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。

这样看来,AOP其实只是OOP的补充而已。OOP从横向上区分出一个个的类来,而AOP则 从纵向上向对象中加入特定的代码。有了AOP,OOP变得立体了。如果加上时间维度,AOP使OOP由原来的二维变为三维了,由平面变成立体了。从技术上 来说,AOP基本上是通过代理机制实现的。

AOP在编程历史上可以说是里程碑式的,对OOP编程是一种十分有益的补充。

Spring的AOP是做的最成功的,但现阶段可能我们使用更多的是Spring的其他特性,控制反转(IOC)与依赖注入(DI):

IOC是一种叫做“控制反转”的设计思想。

较浅的层次——从名字上解析

“控制”就是指对 对象的创建、维护、销毁等生命周期的控制,这个过程一般是由我们的程序去主动控制的,如使用new关键字去创建一个对象(创建),在使用过程中保持引用(维护),在失去全部引用后由GC去回收对象(销毁)。

“反转”就是指对 对象的创建、维护、销毁等生命周期的控制由程序控制改为由IOC容器控制,需要某个对象时就直接通过名字去IOC容器中获取。

更深的层次——提到DI,依赖注入,是IOC的一种重要实现

一个对象的创建往往会涉及到其他对象的创建,比如一个对象A的成员变量持有着另一个对象B的引用,这就是依赖,A依赖于B。IOC机制既然负责了对象的创建,那么这个依赖关系也就必须由IOC容器负责起来。负责的方式就是DI——依赖注入,通过将依赖关系写入配置文件,然后在创建有依赖关系的对象时,由IOC容器注入依赖的对象,如在创建A时,检查到有依赖关系,IOC容器就把A依赖的对象B创建后注入到A中(组装,通过反射机制实现),然后把A返回给对象请求者,完成工作。

IOC的意义何在?

IOC并没有实现更多的功能,但它的存在使我们不需要很多代码、不需要考虑对象间复杂的耦合关系就能从IOC容器中获取合适的对象,而且提供了对 对象的可靠的管理,极大地降低了开发的复杂性。

时间: 2024-11-17 05:01:19

学JavaWeb一年,小谈一些基础知识的理解<转>的相关文章

学JavaWeb必看文章!为什么我们会使用struts2,springMVC和spring这样的框架?

(我们学Javaweb中这样那样的框架为的是什么?它们为什么这么流行?它们给我们带来了什么?Servlet为我们做了什么?MVC的实战意义?Spring的存在有多么重要?如何从思想上理解这些问题,理解Javaweb,答案都在这篇文章中,ImportNew年度好文,希望更多的人看到!转载自http://www.importnew.com/15831.html) 今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架

小谈学生团队管理

我是觉得我想创业的话,最好就是从校园开始.刚开始我只是认为,在学校创业,各种风险低,压力小:往后点觉得学校创业的最大优势是人力资源:后来发现,其实学校创业需要的其他资源也很充足.当然无论在哪创业,成功率都是居下不高,我们需要做的,是持久的规划and坚强地执行. 我本身并不属于管理控,但没办法,需要有人站出来,并且喊一句:"兄弟,我想这样这样,一起干怎么样?",然后拉起一小支队伍,为革命事业,为改变世界,抱团前进. 如何拉起学生团队 俗话说得好,"兵马未动,粮草先行"

小白学 Python(21):生成器基础

人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变量基础操作 小白学 Python(5):基础运算符(上) 小白学 Python(6):基础运算符(下) 小白学 Python(7):基础流程控制(上) 小白学 Python(8):基础流程控制(下) 小白学 Python(9):基础数据结构(列表)(上) 小白学 Python(10):基础数据结构(

小白学 Python(23):Excel 基础操作(上)

人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变量基础操作 小白学 Python(5):基础运算符(上) 小白学 Python(6):基础运算符(下) 小白学 Python(7):基础流程控制(上) 小白学 Python(8):基础流程控制(下) 小白学 Python(9):基础数据结构(列表)(上) 小白学 Python(10):基础数据结构(

浅谈vr基础视频教程 改变技术革命

对于VR技术的发展应用,是有目共睹的,一个新的技术领域的诞生,现在千锋给大家浅谈vr基础视频教程,改变技术革命. 认知革命发生在几万年前的上古时期,是一个很哲学的话题,聊起来很不接地气.这里讲的认知革命是人们对信息认知方式的革新,比如几千年前人类发明文字时,开启了除语言外的另一种交流工具,这就是认知革命;再如上个世纪互联网的诞生,这是一种通过虚拟介质进行信息交流的方式,也是认知革命. 人们把信息放在网络上,相比写在纸上,是一个跨越式的进步,因为并不是所有的信息.资料都能展现在像纸这样的实体材质上

小谈VS使用技巧

引言 作为一名合格的程序员,常用的开发工具的熟练使用是我们必须掌握的.而作为一名优秀的程序员,我们不仅要能熟练的使用,而且还要去高效的使用.而作为.Net平台专门定制的开发工具VS那当然是我们必须要熟练掌握,而且还要去高效的使用的. VS是Visual Studio 的简称.VisualStudio是微软公司推出的开发环境.是最流行的Windows平台应用程序开发环境.功能非常的强大,现在已经更新到了V2013的版本.关于具体的VS介绍在这里就不赘述了,如果有感兴趣的朋友可以到网上自己查询.今天

[转载]小谈网络游戏同步

小谈网络游戏同步 同步在网络游戏中是非常重要的,它保证了每个玩家在屏幕上看到的东西大体是一样的.其实呢,解决同步问题的最简单的方法就是把每个玩家的动作都向其他玩家广播一遍,这里其实就存在两个问题:1,向哪些玩家广播,广播哪些消息.2,如果网络延迟怎么办.事实上呢,第一个问题是个非常简单的问题,不过之所以我提出这个问题来,是提醒大家在设计自己的消息结构的时候,需要把这个因素考虑进去.而对于第二个问题,则是一个挺麻烦的问题,大家可以来看这么个例子: 比如有一个玩家A向服务器发了条指令,说我现在在P1

小谈一下JavaScript中的JSON

一.JSON的语法可以表示以下三种类型的值: 1.简单值:字符串,数值,布尔值,null 比如:5,"你好",false,null JSON中字符串必须用双引号,而JS中则没有强制规定. 2.对象 比如: 1 { 2 "name":"蔡斌", 3 "age":21, 4 "isRich":false, 5 "school":{ 6 "name":"广东工业大

小谈二分法 三分法

二分法,三分法主要是空间图形的不同,二分法主要解决的是在某个区间之间单调增或减的图形,而三分法主要解决的是凸形,或者凹形的图形,这样的用三分法比较方便些. 二分法模板, 整数类型的有以下大致模板: <span style="font-size:14px;">int low=0,high=n,mid,x,res=-1; while(low<high) { mid=(high+low)/2; if(num[mid]==x)//其中x是我们想要寻找的元素,num数组单调递增