Java基础知识Spring.docx
《Java基础知识Spring.docx》由会员分享,可在线阅读,更多相关《Java基础知识Spring.docx(17页珍藏版)》请在冰豆网上搜索。
Java基础知识Spring
====================框架==================
框架是基于很多技术,思想形成。
重点:
了解框架作用,什么时候用,怎么用
掌握:
帮我做了什么事,需要我们配合做哪些事
了解:
框架涉及技术和思想,如何实现以后考虑
多练习,掌握开发步骤
==============Spring============
1.了解Spring框架作用
Spring框架可以改善系统结构,提高系统灵活性.
--Spring提供了IOC和AOP机制,
可以降低程序组件之间的耦合度
--Spring提供了SpringWebMVC实现
可以快速开发MVC结构的Web程序
[MVC是一种设计模式
M----model(业务逻辑和业务数据)javabean
V----view(显示逻辑)html和jsp
C----controller(控制器)servlet]
--Spring提供了对JDBC,MyBatis,Hibernate,
Struts等其他技术的整合应用高内聚低耦合
Sping-->整合API-->调用原有技术API在Spring中使用整合API编程
Spring-->JdbcTemplate-->Connection,statement-->JdbcTemplate.update(sql,params);
请求---->Servlet--->Service---->多个Dao---->JSP
2.什么时候用
**降低程序组件耦合度
*WebMVC结构程序
3.怎么使用Spring
1)Spring容器IOC应用(Core核心)
a.创建组件对象
容器类型:
ApplicationContext和BeanFactory
容器对象创建:
ClassPathXmlApplicationContext
组件定义方法,有3种
**控制对象使用范围:
scope="singleton或prototype"
singleton:
一个,在容器中
只有一个对象
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.基本信息注入
字符串,数值等单个值.
**b.Bean对象注入(也可以自动装配)
**c.集合注入
List,Set,Map,Properties
**list>-->
set>-->
map>-->
**properties>-->
--**d.Spring表达式注入-->
可以将某个Bean对象或集合中的信息注入
#{id属性.属性}//调用getXXX方法
#{id属性[0]}//如果是list,set数组之类的,可以使用[1]下标
#{id属性.key}//map或properties访问,如果下标越界,就报错了
#{map["key"]}//Map里面存的是键值对,能取出来,但要存,在String只能是null但是可以map['key']
类似EL表达式,可以在value=""引号里面,也可以在标签里面
本质是调用get方法,所以编写bean时候,一定要写set/get方法
注入null或""
注入null,需要用到标签,其实我觉得不注入的话,那个属性就是null了,因为比较是
注意:
1.上面的值,能不能替换成对象,替换成bean
2.注入参数时候,如果需要引用其他bean最好少用ref属性和value属性被,最好使用标签
1).
2).两个bean必须在同一个文件夹,不然就报异常
3).ref=""属性
**5.组件自动扫描>
JDK5.0-->注解技术
注解技术是在类定义中追加标记
标记格式:
@标识符
@Component
@Service
@Resoruce
标记只能出现在类的定义前,方法定义前,
成员变量定义前
注解好处:
框架一般采用注解简化或替代
原有的XML文件配置。
在类名标记>
1.指定路径
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(配置)
web.xml
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:
applicationContext.xml
1
//加上为启动服务器时,实例化,不加为第一次请求时实例化
--转码-->
myfilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
--》HanlderMapping(配置)
--指定请求和controller对应关系-->
helloController
[注释版]>annotation-driven/>
--》HelloController(编写+配置)
--配置controller-->
[注释版]>component-scanbase-package="DAO"/>
--》ViewResolver(配置)
--配置viewresolvar-->
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:
prefix="/WEB-INF/"p:
suffix=".jsp">
--异常处理器-->
--视图名-->
error
--配置拦截器-->
interceptors>
interceptor>
--想栏谁-->
mappingpath="ok.do"/>
--放弃拦截-->
exclude-mappingpath="/tologin.do"/>
interceptor>
interceptors>
数据库链接>
--声明定义jdbcTemplate-->
p:
dataSource-ref="dbcp">
--DataSource-->
p:
username="root"p:
password=""p:
driverClassName="com.mysql.jdbc.Driver"
p:
url="jdbc:
mysql:
//localhost:
3306/jsd1507db">
publicclassEmpRowMapperimplementsRowMapper//第一个参:
rs第二个参:
第几行记录
//将当前rs指针指向的记录取出,封装成Emp返回
EmpDao
@Repository//扫描DAO
@Resource//注入
privateJdbcTemplatetemplate;
publicvoidsave(Empemp)template.update(sql,Object[]params);
publicvoiddelete(intid)
publicvoidmodify(Empemp)
publicListfindAll()Listlist=template.query(sql,EmpRowMapperrowMapper);
publicEmpfindByid(intid)Empemp=template.queryForObject(sql,EmpRowMapperrowMapper);
//多行查询用query()方法
//当行查询用queryForObject()方法
//单个查询用queryForInt()方法
/hello.do
-->DispaticherServlet(配置)
--》HanlderMapping(配置)
--》HelloController(编写+配置)
--》ViewResolver(配置)
--》/WEB-INF/hello.jsp(编写)
ModelAndViewmav=newModelAndView();
mav.setViewName("");//设置视图名字,根据页面名写
mav.getModel().put("mag","模型数据");
//等价于request.setAttribute("msg","模型数据");
@ExceptionHandler//局部异常处理
implementsHandlerExceptionResolver//将异常信息写入文件//跳转到错误界面
implementsHandlerInterceptor
//请求处理完毕输出之前afterCompletion
//Controller之后postHandle
//controller之前preHandlefalse表示拦截
--采用newGregorianCalendar(),构造方法-->
--采用Calendar.getInstance(),静态工厂方法-->
factory-method="getInstance">
--采用c2.getTime(),对象工厂方法-->
factory-method="getTime">
init-method="init"destroy-method="mydestroy"
class="test.ExampleBeann">
--信息注入set方法-->
--构造器注入-->
高
低
[p:
name="root"p:
age="18"p:
birth="2015-11-11">
tom
jack
]
[
--读取db.properties文件,形成一个properties对象-->
propertiesid="dbP"
location="classpath:
db.properties">
properties>
--定义List对象-->
listid="somelist">
小红
小白
list>
setid="someset">
上海
山东
set>
mapid="somemap">