Java框架SpringIOC笔记.docx
《Java框架SpringIOC笔记.docx》由会员分享,可在线阅读,更多相关《Java框架SpringIOC笔记.docx(19页珍藏版)》请在冰点文库上搜索。
Java框架SpringIOC笔记
Day01:
梁建全:
liangjq@
=================
1.框架学习
a.框架有什么作用,能帮我们做什么
b.帮我做了哪些事,需要我们配合做哪些事
c.熟悉框架的设计思想,至于如何实现
以后再去考虑
d.练习时多练习几遍,掌握开发主要步骤
======Spring框架========
1.Spring框架作用
*a.SpringCore(IOC功能)
b.SpringAOP功能
(管理组件对象,维护对象关系,目的:
降低组件耦合度)
c.SpringWebMVC功能
(MVC设计,
目的:
架构一个MVC结构的Web程序)
d.Spring整合其他技术,例如JDBC,MyBatis,Hibernate,Struts等
Spring-->整合API-->调用原有技术API
在Spring中使用整合API编程
Spring-->JdbcTemplate-->Connection,StatemenJdbcTemplate.update(sql,params);
请求-->Servlet-->Service-->多个Dao-》JSP
EmpService
EmpDaodao=newEmpDao();
dao.save();
2.SpringIOC应用
a.管理对象
创建、初始化、释放资源、销毁
b.维护对象关系
采用注入方式建立对象关系.
DependencyInjection(DI)依赖注入
依赖注入:
set方法注入,构造器注入
c.搭建SpringIOC开发环境
--引入相关jar包
--在src添加applicationContext.xml
ApplicationContext容器对象
-->applicationContext.xml-->
List-->存取对象的集合
a.创建List对象
b.往List添加对象元素
c.从List取对象元素
Spring容器-->管理组件及对象关系
a.创建ApplicationContext对象
b.向applicationContext.xml配置
c.利用ApplicationContext对象getBean()
2.Spring创建Bean对象的控制
*a.控制对象创建方式(使用范围)
在元素中使用scope属性控制
scope可以支持singleton或prototype
默认值是singleton
该组件在Spring
容器里只有一个bean对象
该组件每次
ac.getBean("id");都返回一个新的对象.
b.指定对象初始化方法
利用元素的init-method指定。
当创建对象后自动执行init-method方法
c.指定对象销毁方法
利用元素的destroy-method指定。
满足下面条件才有效
--组件对象为单例模式
--调用AbstractApplicationContext容器
对象的close()方法
d.控制单例对象创建时机
在默认情况下,单例对象是Spring容器创建时实例化;可以使用元素的
lazy-init=true属性将创建时机推迟到
getBean()方法调用时.
IOC概念:
InversionofControl控制反转或反向控制
控制反转:
改变了对象获取方式.之前编码方式采用new构造器方式获取对象;ioc中
采用由容器创建对象之后注入进来使用。
只要修改配置就可以改变对象关系
Day02:
1.自动注入
用于指定自动注入规则.可以使用byType,byName,constructor等.用于简化注入配置.
使用byType类型匹配注入需要注意,有2个及其以上匹配会出异常。
2.各种类型信息的注入配置格式
*a.注入字符串,数值单个数值
*b.注入bean对象
c.注入集合*list,set,map,*properties
d.spring表达式注入
#{表达式}
#{id名.属性}或#{id名.key}
如果是对象属性,需要有getXXX方法
3.利用注解配置应用IOC
在JDK5.0时追加一些新特性
List
for(Strings:
list)
Integeri=10;
注解:
在类定义,方法定义,成员变量定义前面使用,格式为@注解标记名
publicvoidf1(String..s)
a.组件自动扫描
可以按指定的包路径,将包下所有组件扫描,如果发现组件类定义前有以下标记,
会将组件扫描到Spring容器.
@Component//其他组件
@Controller//控制层组件
@Service//业务层组件xxxService
@Repository//数据访问层组件xxxDao
@Named(需要引入第三方标准包)
@Scope控制对象创建.默认单例
@PostConstruct指定init-method
@PreDestroy指定destroy-method
b.注入注解
@Resource:
可以在变量定义前或setXX方法前应用
@Autowired:
可以在变量定义前或setXX方法前应用
一般使用时,功能等价,都可以实现注入。
如果不存在多个匹配类型,使用@Resource
或@Autowired都可以。
如果存在多个匹配类型,建议按名称注入
@Resource(name="指定名称")或
@Autowired
@Qualifier("p")
如果指定名称注入,不会再按类型匹配注入。
Day03:
xx
listid="">
setid="">
mapid="">
propertiesid="">
#{bean对象id.属性}-->属性getXXX
#{map对象id.key}
#{map对象id['key']}
#{List对象id[0]}
@Resource(name="xxx")//强制按名称
@Autowired
@Qulifier("xxx")//强制按名称
@ResourcesetXxx
@AutowiredsetXxx(Stringxx)
使用建议:
set注入建议用@Resource构造器建议用Autowired
SpringIOC应用:
自己编写的组件建议使用注解配置;框架API只能用XML配置
IOC:
以注入方式应用对象,实现组件解耦
=========SpringWebMVC==========
SpringWebMVC需要使用IOC功能。
用于开发MVC结构的Web程序。
1.MVC思想
将程序组件分为模型,视图,控制器三部分。
2.Spring如何实现MVC
*3.SpringWebMVC处理流程
案例:
hello示例
/hello.do--springwebmvc-->/WEB-INF/hello.jsp
/hello.do
-->DispatcherServlet(配置)
-->HanlderMapping(配置)
-->HelloController(编写+配置)
-->ViewResolver(配置)
-->/WEB-INF/hello.jsp(编写)
a.搭建SpringWebMVC开发环境
--引入ioc,webmvc开发包
--src下添加applicationContext.xml
b.编写HelloController实现规则:
实现Controller接口
====================
2.显示登录页面
/tologin.do
-->DispatcherServlet
-->handlermappping
-->ToLoginController
-->ViewResolver
-->/WEB-INF/login.jsp
3.单击登录按钮处理
/login.do(提交表单)
-->DispatcherServlet
-->handlermapping
-->LoginController
(获取提交的用户名和密码,如果用户名为root,密码为1234认为正确,否则错误)
-->ViewResolver
-->错误进入/WEB-INF/login.jsp
正确进入/WEB-INF/ok.jsp
Day04:
======SpringWebMVC注解应用=======
a.RequestMappingHanlderMapping组件
@RequestMapping("/login.do")
该标记用在Controller业务方法前
b.Controller编写和配置
取消了实现Controller接口及方法约定
可以允许程序员按需要灵活定义业务方法
publicModelAndView或String
方法名(根据需要定义request,session,response)
(Controller需要扫描到Spring容器,必须使用@Controller)
/hello.do
-->DispatcherServlet
-->HandlerMapping
-->HelloController
-->ViewResolver
-->hello.jsp
//进入登录页面
/tologin.do
-->DispatcherServlet
-->Handlermapping
-->LoginController.toLogin
-->ViewResolver
-->login.jsp
/login.do
-->DispatcherServlet
-->Handlermapping
-->LoginController.checkLogin
-->ViewResolver
-->错误login.jsp/正确ok.jsp
========================
1.Controller如何接收请求参数
a.利用HttpServletRequest
*b.利用业务方法参数
--方法参数名与请求参数key保持一致
--利用@RequestParam("key")
*c.利用实体对象当方法参数
使用建议:
少量参数使用b;大量参数使用c
如果客户端表单数据没有格式检查,
遇到非字符串类型参数建议使用a
2.Controller如何向响应JSP传值
*a.利用HttpServletRequest
b.利用ModelAndView做返回值
*c.利用ModelMap方法参数
d.使用@ModelAttribute("key")
publicStringcheckLogin(
@ModelAttribute("user")Stringusername){
return"ok";//ok.jsp使用${user}
}
@ModelAttribute("user")
publicStringgetName(){
return"tom";
}
model.put("user",getName());//${user}
3.Controller如何使用Session
publicStringcheckLogin(
HttpServletRequestrequest){
HttpSessionsession=request.getSession();
session.setAttribute(key,value);
}
publicStringcheckLogin(
HttpSessionsession){
session.setAttribute(key,value);
}
========================
案例:
列表显示功能
/list.do
-->DispatcherServlet
-->Handlermapping
-->ListController
(构建一个List,传递到list.jsp)
-->ViewResolver
-->/WEB-INF/list.jsp(JSTLforeach>)
Listlist=newArrayList();
for(inti=0;i<10;i++){
Useruser=newUser();
user.setUsername("tom"+i);
user.setPassword("1234"+i);
list.add(user);
}
Day05:
1.任务:
实现登录功能
采用技术:
SpringMVC,SpringIOC,dbcp连接池
SpringMVC:
快速构建MVC结构的程序利用它实现接收请求分发处理的控制
SpringIOC:
管理程序Controller,Dao组件实现解耦
dbcp:
用于管理connection连接
可以控制连接数;
可以避免频繁创建和释放连接
============================
a.搭建开发环境
--jar包
--xml配置文件src/applicationContext.xml
b.设计请求--响应处理流程
/login.do
-->DispatcherServlet(配置)
-->HanlderMapping(配置)
-->LoginController.checkLogin(编写+配置)
-->UserDao(编写+配置)
-->DataSource(dbcp)(配置)
-->user表(查询)
-->ViewResolver(配置)
-->ok.jsp/login.jsp(编写)
c.实现UserDao
--实体类
--UserDao接口及其实现
--配置UserDao-->DataSource
--测试
d.实现LoginController
--编写实现
--配置Controller
--测试
e.配置MVC处理
--配置DispatcherServlet
--配置HanlderMapping
--配置ViewResolver
d.JSP实现
请求-->Filter-->Servlet-->Controller
==========================
2.中文POST提交乱码问题
a.Controller接收乱码
解决方法:
web.xml配置CharacterEncodingFilter
b.写入数据库乱码
解决方法:
url连接字符串,添加
xxx?
useUnicode=true&characterEncoding=utf8
c.查看建表语句,设置建表编码
showcreatetablexxx;//查看
createtablexxx...
defaultcharset=utf8;
3.MVC异常处理
*a.全局异常处理
所有Controller异常都可以交给
SimpleMappingExceptionResolver
*b.局部异常处理
处理某一个Controller异常
在Controller中定义下面方法
@ExceptionHanlder
publicStringxxx(
HttpServletRequestrequest,
Exceptionex){
//异常处理逻辑
return"异常页面名";
}
Day06:
1.Spring与JDBC整合应用
a.提供了编写DAO的工具类
JdbcTemplate
JdbcTemplate.update("insert..",参数);
JdbcTemplate.query();
JdbcTemplate.queryForObject();
selectcount(*)fromemp
introws=JdbcTemplate.queryForInt();
b.提供了AOP式事务管理
(不需要在方法中追加事务提交和回滚)
c.提供了统一的异常处理
DataAccessException
2.Spring整合JDBC步骤
a.搭建spring+jdbc开发环境
引入spring(ioc,aop,dao)开发包
添加src/applicationContext.xml
数据库驱动,dbcp连接池
*b.编写实体类Emp
*c.编写EmpDAO组件
*d.在applicationContext.xml中
扫描EmpDAO,注入JdbcTemplate对象
DBCP()-->JdbcTemplate()
-->EmpDao(扫描)
=======单独使用JDBC=======
a.引入驱动包
b.编写DBUtil
c.编写实体类Emp
d.编写EmpDao
==========================
createtablecost(
cost_idintprimarykey,
namevarchar(50)notnull,
base_durationlong,
base_costdouble,
unit_costdouble,
statuschar
(1),
descrvarchar(100),
creatimedate,
startimedate,
cost_typechar
(1)
);
INSERTINTOCOSTVALUES(1,'5.9元套餐',20,5.9,0.4,0,'5.9元20小时/月,超出部分0.4元/时',DEFAULT,DEFAULT,NULL);
INSERTINTOCOSTVALUES(2,'6.9元套餐',40,6.9,0.3,0,'6.9元40小时/月,超出部分0.3元/时',DEFAULT,DEFAULT,NULL);
INSERTINTOCOSTVALUES(3,'8.5元套餐',100,8.5,0.2,0,'8.5元100小时/月,超出部分0.2元/时',DEFAULT,DEFAULT,NULL);
INSERTINTOCOSTVALUES(4,'10.5元套餐',200,10.5,0.1,0,'10.5元200小时/月,超出部分0.1元/时',DEFAULT,DEFAULT,NULL);
INSERTINTOCOSTVALUES(5,'计时收费',null,null,0.5,0,'0.5元/时,不使用不收费',DEFAULT,DEFAULT,NULL);
INSERTINTOCOSTVALUES(6,'包月',null,20,null,0,'每月20元,不限制使用时间',DEFAULT,DEFAULT,NULL);
INSERTINTOCOSTVALUES(7,'mm',10,5,null,0,'',DEFAULT,DEFAULT,NULL);
INSERTINTOCOSTVALUES(8,'nn',10,7,null,0,'',DEFAULT,DEFAULT,NULL);
INSERTINTOCOSTVALUES(9,'qq',10,4,null,0,'',DEFAULT,DEFAULT,NULL);
COMMIT;
Day07:
======MyBatis框架=========
1.MyBatis简介
MyBatis-->iBatis
MyBatis:
封装了JDBC应用,简化了JDBC编程。
--封装了连接获取,生成statement,
执行sql,释放连接过程
--封装了将查询结果转换成实体对象
(需要字段名和实体属性名对应)
--封装了实体对象参数跟SQL中?
映射过程
insertintouser(username,pwd,name)
values(#{属性名},#{属性名},#{属性名})
--封装了根据Mapper接口(Dao)生成实现组件过程
使用MyBatis开发者只需要做一下工作
--搭建MyBatis开发环境
--编写SQL语句
--编写Mapper接口
--使用SqlSession对象触发增删改查操作
2.MyBatis使用
createtablecost(
cost_idintprimarykeyauto_increment,
namevarchar(50)notnull,
base_durationlong,
base_costdouble,
unit_costdouble,
statuschar
(1),
descrvarchar(100),
creatimedate,
startimedate,
cost_typechar
(1)
)defaultcharset=utf8;
a.搭建Mybatis开发环境
--引入mybatis.jar和数据库驱动包
--src下添加主配置文件SqlMapConfig.xml
b.获取SqlSession对象资源
c.对表做操作
--编写实体类
--定义SQL语句
--利用SqlSession操作SQL
selectcost_id,name
fromcostwherecost_id=1;
d.Mapper映射器接口(规范)
--方法名与SQL定义的id属性一致
--方法参数类型与SQl定义的parameterType属性一致
--方法返回类型参考SQL定义的resultType
--在SQL定义文件的
namespace指定对应的接口类型