JSP的前生今世:Jsp以前就是用来在HTML里写java的,最后jsp会被编译成Servlet来执行。以前,Jsp的开发是在html里嵌入java代码,这样杂乱无章持续了段时间,发现,写的太累了。因为HTML和Java的混合,导致ux不能参与进来,java部分看不懂,而java的开发,对html又不精通,更别说,项目大了以后,各种代码的混乱。所以,后来Jsp干脆直接用来做了表示层。
Jsp的3个编译指令:include ,page
Jsp的forward:用于跳到另一个页面的处理逻辑,跟include && die 一样
Jsp的几个变量:
application,全局共享的,一般存放跟应用相关的信息。
config,用于从web.xml中获取配置信息。
pageContext,页面级别的变量,仅仅在当前页面生效,出页面销毁
request,相当于php中的$_GET和$_POST等,从客户端传递过来的信息
session,在当前的回话session中有效
response,用于响应用户的请求。
柑橘Jsp就和php很像,从request中拿到用户post过来的数据,然后进行处理和展示,还能随时把信息,存入数据库中。不就这些事情吗?但是与php不同的是,他的变量(属性),在下一次请求的时候,依然保持有效。
例如上面这段代码,刷新一次,i值就加1,跟php相当不同。
因为这个jsp会被写成一个Servlet,然后i作为他的一个属性值。而这个对象在请求开始的时候,由容器(tomcat等)生成对象,而在容器关闭的时候,才清理,所以这个Servlet是多个请求共享的。
感觉Jsp没什么好说的,边学边用就可以了。
那么剩下的就是Spring里的IoC,控制反转,其实也叫依赖注入,讲的是对象生成的故事。
做过开发的都知道,面向对象最难得是,生成对象。对象A持有B,对象B又持有C,对象C又持有D,这么一圈圈的关系,你要获得对象就必须要new 一个对象吧,这样如果有一天对象的构造方法改了,你还的改代码,这是Java比较忌讳的。之所以面向接口编程,就是为了将经常改动的和不经常改动尽可能的分离。有很强的扩展性和灵活性。
那么Java是怎么解决这个问题的呢?他通过配置,将依赖关系写入配置中,然后用的时候,自动加载。这边是IoC的核心了。在Spring里,对象一般叫做Bean,由IoC容器来统一管理这些Bean,掌管他们的生成、销毁,你再也不用new 了。
注入方式有两种:设值注入、构造注入
设值注入:
1. 设值xml值,将依赖的持有的bean,使用属性定义出来
2. 使用的时候,需要一个函数,代码中是setAxe,然后Sping会主动的把对象注入进去
3. 具体用的时候,只需要:
直接getBean,就可以已经注入了的对象。
构造注入:
1.xml配置这里与上面不同
xml里通过constructor-arg来指出需要注册的bean
2. 与上面不同的是,不需要set方法了,而是放在构造函数里了
Spring会自动将bean注入到里面去的。
通过以上不同的方式,我能可以看到区别在于注入的时机不同,一个在构造函数,一个是set中,显然,如果需要尽早的得到注入的bean,那么就要放在构造函数中,否则就要放在set中为妙。
第二个问题,要注入的bean,是怎么来的呢?怎么生成的呢?一共有三种方式,构造器、静态工厂、实例工厂。
构造器:
待注入的bean其实没什么特别,在实现的时候,通过构造方法来构造对象,仅此而已
二、通过静态工厂
然后工厂的实现:
没什么特别之处吧,也非常容易理解,比较符合java的思维,因为以前,没有依赖注入,最容易想到的就是工厂生成对象了。
三、实例工厂
实例工厂与静态工厂的唯一不同是,一个是静态方法,直接调用,而实例工厂,需要有工厂的实例的。
正如上面代码所示,有实例,那么这个工厂也会是一个bean了,所以你需要实现这个bean
而剩下的事情,就不要你来关心了,说实话,还是比较方便的,就是如果最初搞不清楚的话,非常痛苦,Java就是配置文件太多了,得一个一个了解,学习成本比较高。