Java基础知识Spring讲解Word格式文档下载.docx
《Java基础知识Spring讲解Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Java基础知识Spring讲解Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。
>
factory-method="
factory-bean="
**控制对象使用范围:
scope="
singleton或prototype"
singleton:
一个<
bean>
在容器中
只有一个对象
prototype:
每次调用
getBean都会产生一个新对象
指定初始化和销毁方法:
init-method和destroy-method属性
init-method:
在对象创建后,自动调用
指定的初始化方法
destroy-method:
仅对scope="
singleton"
组件有效,在调用容器close方法
销毁时触发
指定Bean对象延迟实例化
单例组件,在Spring容器实例时自动
实例化;
可以采用lazy-init="
true"
将对象创建推迟到getBean()方法调用
b.维护组件对象关系(IOC思想)
IOC概念:
InversionofController
反向控制/控制反转
本质:
改变了对象获取方式,由原有
自己创建对象应用,转为接收外界注入的
对象使用。
由spring容器负责对象创建,
以及关系注入的控制。
Spring的IOC主要采用DI技术实现关系注入
DepedencyInjection依赖注入,
Spring的DI又分为set注入,构造器注入
**set注入应用
手机组件:
TelePhone
属性:
cup,ram
4.各种类型信息的注入
**a.基本信息注入
字符串,数值等单个值.
propertyname="
属性"
value="
值"
**b.Bean对象注入(也可以自动装配)
ref="
id值"
**c.集合注入
List,Set,Map,Properties
**<
util:
list>
-->
set>
map>
properties>
props>
!
--**d.Spring表达式注入-->
可以将某个Bean对象或集合中的信息注入
#{id属性.属性}//调用getXXX方法
#{id属性[0]}//如果是list,set数组之类的,可以使用[1]下标
#{id属性.key}//map或properties访问,如果下标越界,就报错了
#{map["
key"
]}//Map里面存的是键值对,能取出来,但要存,在String只能是null但是可以map['
key'
]
类似EL表达式,可以在value="
引号里面,也可以在<
value>
标签里面
本质是调用get方法,所以编写bean时候,一定要写set/get方法
注入null或"
注入null,需要用到<
null/>
标签,其实我觉得不注入的话,那个属性就是null了,因为比较是
注意:
1.上面的值,能不能替换成对象,替换成bean
2.注入参数时候,如果需要引用其他bean最好少用ref属性和value属性被,最好使用标签
1).<
refbean="
beanID"
/>
2).<
reflocal="
两个bean必须在同一个文件夹,不然就报异常
3).ref="
属性
<
**5.组件自动扫描>
JDK5.0-->
注解技术
注解技术是在类定义中追加标记
标记格式:
@标识符
@Component
@Service
@Resoruce
标记只能出现在类的定义前,方法定义前,
成员变量定义前
注解好处:
框架一般采用注解简化或替代
原有的XML文件配置。
在类名标记>
1.指定路径
context:
component-scanbase-package:
包名"
有时候需要一个统一的包名,不同的包需要被包在一个包里面,所以域名反写的规则最好遵守
组件自动扫描使用:
可以简化<
定义,按指定的包路径扫描
包内所有组件,如果组件类定义前出现以下
几个标记之一,就将组件声明定义到容器.
@Component//组件通用注解
@Controller//控制组件xxxController
@Service//业务组件xxxService
@Repository//数据访问组件xxxDAO
@Named//需要引入第三方标准jar包
bean的命名
1).默认id什么都不写,那么就是小写开头的类名
2).自定义在注解后面("
名字"
)
指定组件作用域
@Scope("
作用域"
)默认单例的singleton:
在容器中只有一个对象
指定初始化和销毁方法>
@PostConstruct指定init-method
被这个标记的方法,会被作为初始化方法,实例化时候自动调用
@PreDestroy指定destroy-method
被被标记的方法,会在容器关闭,销毁对象时候调用
如果定义了全局的默认的初始化,销毁方法,也是以这个为优先的---------------------很少使用
@注入注解(在属性或setter方法上标记)>
@Resource:
会自动装配,并且按照先按name,后type的匹配方式注入如果怕发生错误,可以指定name或type(name="
bean名"
)(type=User.class)<
--可以在变量定义前或setXX方法前应用-->
@Autowired/@Qualifier:
默认使用type匹配注入可以使用另一个注解@Qualifier("
bean名字"
)指定bean名
注意:
可以省略掉set方法
都可以写在属性定义,或者setter方法上面
如果写了name,就不会再去找type匹配了
如果指定名称注入,不会再按类型匹配注入。
==================>
1.SpringMVC工作流程(理论)
a.浏览器发出一个HTTP请求
b.请求首先进入DispatcherServlet
主控制器
c.主控制器调用HandlerMapping组件
根据请求找映射的Controller处理
d.执行Controller处理方法,将返回
结果给ViewResolver组件
e.ViewResolver组件根据Cotroller返回
结果定位视图JSP,将模型数据传递给JSP
f.由JSP生成响应结果,给浏览器输出
2.SpringMVC开发过程(应用)
a.搭建SpringMVC开发环境
b.流程设计
请求(变化)
DispatcherServlet(固定)
HandlerMapping(固定)
Controller组件(变化)
ViewResolver(固定)
JSP组件(变化)
c.编写JSP,Controller组件
d.配置处理流程
request.setCharacterEncoding("
utf-8"
);
3.-如何接收请求参数(应用)
方法参数(参数名字与请求key保持一致)
方法参数(实体对象,实体属性与key保持一致)
-如何向页面传值
添加ModelMap方法参数
-如何使用session
添加HttpSession方法参数
=========================>
/list.do
-->
DispatcherServlet
HandlerMapping
ListController
ViewResolver
/WEB-INF/list.jsp
=====================
4.如何解决中文接收乱码问题
CharacterEncodingFilter(Spring-web.jar提供)
5.如何处理异常
*a.全局异常处理
SimpleMappingExceptionResolver
*b.局部异常处理
@ExceptionHandler
publicStringxxx(
HttpServletRequestrequest,Exceptionex)
c.自定义ExceptionResolver
HandlerExceptionResolver
6.如何实现登录权限检查
使用session进行约定值判断。
实现方法:
1.采用Filter;
2.采用拦截器
a.拦截器组件简介
拦截器组件是SpringMVC特有组件。
拦截器组件可以在Controller之前拦截;
也可以在Controller之后拦截;
还可以在JSP解析完毕给浏览器输出之前
拦截。
b.拦截器使用方法
首先编写一个拦截器组件(实现handlerInterceptor接口)
在约定方法中添加要插入的逻辑
然后在applicationContext.xml中配置
======================>
sessionScopu.session直接从session找
spring-webmvc-3.2.8.RELEASE.jar
web.xml
org.springframework.web.servlet.DispatcherServlet
applicationContext.xml
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
DispaticherServlet(配置)
servlet>
<
servlet-name>
springmvc<
/servlet-name>
servlet-class>
org.springframework.web.servlet.DispatcherServlet<
/servlet-class>
init-param>
<
param-name>
contextConfigLocation<
/param-name>
param-value>
classpath:
applicationContext.xml<
/param-value>
/init-param>
load-on-startup>
1<
/load-on-startup>
//加上为启动服务器时,实例化,不加为第一次请求时实例化
/servlet>
--转码-->
filter>
filter-name>
myfilter<
/filter-name>
filter-class>
org.springframework.web.filter.CharacterEncodingFilter<
/filter-class>
encoding<
UTF-8<
/filter>
servlet-mapping>
url-pattern>
--》HanlderMapping(配置)
hand"
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"
--指定请求和controller对应关系-->
mappings"
propkey="
/hello.do"
helloController<
/prop>
/props>
/property>
/bean>
[注释版]>
mvc:
annotation-driven/>
--》HelloController(编写+配置)
--配置controller-->
helloController"
DAO.Controller.helloController"
component-scanbase-package="
DAO"
--》ViewResolver(配置)
--配置viewresolvar-->
viewresolver"
org.springframework.web.servlet.view.InternalResourceViewResolver"
p:
prefix="
/WEB-INF/"
suffix="
.jsp"
--异常处理器-->
beanclass="
org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"
exceptionMappings"
--<
异常类型"
视图名<
java.lang.Exception"
error<
--配置拦截器-->
interceptors>
interceptor>
--想栏谁-->
mappingpath="
ok.do"
--放弃拦截-->
exclude-mappingpath="
/tologin.do"
org.tarena.controller.LoginInterceptor"
/mvc:
数据库链接>
--声明定义jdbcTemplate-->
template"
org.springframework.jdbc.core.JdbcTemplate"
dataSource-ref="
dbcp"
--DataSource-->
mons.dbcp.BasicDataSource"
username="
root"
password="
driverClassName="
com.mysql.jdbc.Driver"
url="
jdbc:
mysql:
//localhost:
3306/jsd1507db"
publicclassEmpRowMapperimplementsRowMapper<
Emp>
//第一个参:
rs第二个参:
第几行记录
//将当前rs指针指向的记录取出,封装成Emp返回
EmpDao
@Repository//扫描DAO
@Resource//注入
privateJdbcTemplatetemplate;
publicvoidsave(Empemp)template.update(sql,Object[]params);
publicvoiddelete(intid)
publicvoidmodify(Empemp)
publicList<
findAll()List<
list=template.query(sql,EmpRowMapperrowMapper);
publicEmpfindByid(intid)Empemp=template.queryForObject(sql,EmpRowMapperrowMapper);
//多行查询用query()方法
//当行查询用queryForObject()方法
//单个查询用queryForInt()方法
/hello.do
--》/WEB-INF/hello.jsp(编写)
ModelAndViewmav=newModelAndView();
mav.setViewName("
//设置视图名字,根据页面名写
mav.getModel().put("
mag"
"
模型数据"
//等价于request.setAttribute("
msg"
"
@ExceptionHandler//局部异常处理
implementsHandlerExceptionResolver//将异常信息写入文件//跳转到错误界面
implementsHandlerInterceptor
//请求处理完毕输出之前afterCompletion
//Controller之后postHandle
//controller之前preHandlefalse表示拦截
--采用newGregorianCalendar(),构造方法-->
c1"
java.util.GregorianCalendar"
--采用Calendar.getInstance(),静态工厂方法-->
c2"
java.util.Calendar"
getInstance"
--采用c2.getTime(),对象工厂方法-->
date"
getTime"
e1"
lazy-init="
init-method="
init"
destroy-method="
mydestroy"
test.ExampleBeann"
q1"
test.q"
--信息注入set方法-->
cpu"
晓龙"
hdd"
索尼"
mainbord"
华硕"
p2"
test.phone"
--构造器注入-->
constructor-argindex="
0"
高<
/value>
/constructor-arg>
1"
低<
[<
DAO.MessageBean"
name="
age="
18"
birth="
2015-11-11"
friends"
<
tom<
jack<
/list>
]
--读取db.properties文件,形成一个properties对象-->
propertiesid="
dbP"
location="
db.properties"
/util:
--定义List<
String>
对象-->
listid="
somelist"
小红<
小白<
setid="
someset"
上海<
山东<
mapid="
somemap"
entryk