发表于: 2018-03-24 23:42:16
1 522
今天完成的事情:
今天看了springIOC
Ioc—Inversion of Control,即“控制反转”,是一种设计思想。
IOC由字面意思就知道,分为两个内容:“控制”和“反转”。
控制:在传统的程序设计中我们直接再程序的内部通过new来创建对象,是程序主动去创建依赖对象;而IoC有一个专门的容器来创建这些对象,即由IOC容器来控制对象的创建。
反转:传统应用程序是由我们自己在对象中主动控制去获取依赖对象,而现在由IOC容器来帮我们创建和注入依赖对象,这就是依赖对象的获取被反转了。
使用xml方式来实现
通常是有个接口:
interface IBookDAO {
String addBook(String bookname);
}
BookDAO实现类如下:
public class BookDAO implements IBookDAO {
public String addBook(String bookname) {
return "添加图书"+bookname+"成功!";
}
}
业务类BookService如下:
public class BookService {
IBookDAO bookDAO;
public BookService() {
//容器
ApplicationContext ctx=new ClassPathXmlApplicationContext("Beans.xml");
//从容器中获得id为bookdao的bean
bookDAO=(IBookDAO)ctx.getBean("bookdao");
}
public void storeBook(String bookname){
System.out.println("图书上货");
String result=bookDAO.addBook(bookname);
System.out.println(result);
}
}
配置文件Beans.xml
<bean id="bookdao" class="com.ycc.Spring.BookDAO"/>
接着我们在测试类中可以直接调用Book Service的storeBook()方法,存储图书。
还可以使用有参构造函数的方法实现
<bean id="tom" class="spring02.Student">
<constructor-arg name="name" value="张柏川"></constructor-arg>
<constructor-arg name="height" value="195"></constructor-arg>
</bean>
如果在使用构造方法时不想通过参数名称指定参数则可以直接使用索引,如:
<bean id="rose" class="spring02.Student">
<constructor-arg index="0" value="张柏芝"/>
<constructor-arg index="1" value="196"/>
</bean>
还可以通过属性赋值
<bean name="zhuhai" class="spring02.Address">
<property name="country" value="中国"></property>
<property name="city" value="珠海"></property>
</bean>
延迟初始化bean
ApplicationContext
实现的默认行为就是再启动时将所有 singleton bean提前进行实例化。 通常这样的提前实例化方式是好事,因为配置中或者运行环境的错误就会被立刻发现,否则可能要花几个小时甚至几天。如果你不想这样,你可以将单例bean定义为延迟加载防止它提前实例化。延迟初始化bean会告诉Ioc容器在第一次需要的时候才实例化而不是在容器启动时就实例化。
在XML配置文件中,延迟初始化通过<bean/>
元素的lazy-init
属性进行控制,比如:
<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"/>
<bean name="not.lazy" class="com.foo.AnotherBean"/>
SpringMvc整个的执行流程:
1、发起请求到前端控制器(DispatcherServlet )
2、前端控制器请求HandlerMapping查找Handler(可以根据xml、注解进行查找)
3、处理器映射器HandlerMapping向前端控制器DispatcherServlet 返回Handler
4、前端控制器DispatcherServlet 调用处理器适配器HandlerAdapter 执行Handler
5、处理器适配器HandlerAdapter 执行Handler
6、Handler执行完给处理器适配器返回ModelAndView
7、处理器适配器向前端控制器返回ModelAndView (ModelAndView 是SpringMvc的底层对象 包括model和view)
8、前端控制器请求视图解析器去解析视图
根据逻辑视图名解析成真正的视图(jsp)
9、视图解析器向前端控制器返回view
10、前端控制器进行视图渲染
视图渲染将模型数据(模型数据在ModelAndView对象中)填充到request域
11、前端控制器向用户响应结果
然后页面如果出现乱码
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>意义
第一阶段:将jsp编译成Servlet(.java)文件。
用到的指令是pageEncoding,根据pageEncoding=“XXX”的指示,找到编码的规则为“XXX”,服务器在将JSP文件编译成.java文件时会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8编码的JAVA源码(即.java)。
第二阶段:从Servlet文件(.java)到Java字节码文件(.class),从UTF-8到UTF-8。
在这一阶段中,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。JAVAC用UTF-8的encoding读取java源码,编译成UTF-8编码的二进制码(即.class),这是JVM对常数字串在二进制码(java encoding)内表达的规范。这一过程是由JVM的内在规范决定的,不受外界控制。
第三阶段:从服务器到浏览器,这在一过程中用到的指令是contentType。
服务器载入和执行由第二阶段生成出来JAVA二进制码,输出的结果,也就是在客户端可见到的结果,在这次输出过程中,由contentType属性中的charset来指定,将UTF8形式的二进制码以charset的编码形式来输出。如果没有人为设定,则默认的是ISO-8859-1的形式。
从以上过程可知:
pageEncoding :说明jsp内容的编码。
contentType:设置JSP源文件和响应正文的字符集编码及MIME类型, contentType的charset是指服务器发送给客户端时的内容编码。
page指令:交互作用
明天计划的事情:
继续学习springMVC
遇到的问题:
不知道怎么实现SpringMVC,明天要好好研究一波。
收获:
学习了IOC以及几种实现模式
进度:任务二步骤2
任务开始时间:3.10
预计demo时间:3.28
是否延期:否
禅道地址:http://task.ptteng.com/zentao/project-task-562.html
评论