资源描述
Java基础知识Spring
====================框架==================
框架是基于很多技术,思想形成。
重点: 了解框架作用,什么时候用,怎么用
掌握: 帮我做了什么事,需要我们配合做哪些事
了解: 框架涉及技术和思想,如何实现以后考虑
多练习,掌握开发步骤
==============Spring============
1.了解Spring框架作用
Spring框架可以改善系统结构,提高系统灵活性.
--Spring提供了IOC和AOP机制,
可以降低程序组件之间的耦合度
--Spring提供了Spring Web MVC实现
可以快速开发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.什么时候用
**降低程序组件耦合度
*Web MVC结构程序
3.怎么使用Spring
1) Spring容器IOC应用(Core核心)
a.创建组件对象
容器类型:
ApplicationContext和BeanFactory
容器对象创建:ClassPathXmlApplicationContext
组件定义方法,有3种
<bean id="" class="">
<bean id="" class="" factory-method="">
<bean id="" factory-bean="" factory-method="">
**控制对象使用范围:
scope="singleton或prototype"
singleton:一个<bean>,在容器中
只有一个对象
prototype:一个<bean>,每次调用
getBean都会产生一个新对象
指定初始化和销毁方法:
init-method和destroy-method属性
init-method:在对象创建后,自动调用
指定的初始化方法
destroy-method:仅对scope="singleton"
组件有效,在调用容器close方法
销毁时触发
指定Bean对象延迟实例化
单例组件,在Spring容器实例时自动
实例化;可以采用lazy-init="true"
将对象创建推迟到getBean()方法调用
b.维护组件对象关系(IOC思想)
IOC概念:Inversion of Controller
反向控制/控制反转
本质:改变了对象获取方式,由原有
自己创建对象应用,转为接收外界注入的
对象使用。由spring容器负责对象创建,
以及关系注入的控制。
Spring的IOC主要采用DI技术实现关系注入
Depedency Injection 依赖注入,
Spring的DI又分为set注入,构造器注入
**set注入应用
手机组件:TelePhone
属性:cup,ram
4.各种类型信息的注入
**a.基本信息注入
字符串,数值等单个值.
<property name="属性" value="值">
**b.Bean对象注入(也可以自动装配)
<property name="属性" ref="id值">
**c.集合注入
List,Set,Map,Properties
**<util:list> --> <list>
<util:set> --> <set>
<util:map> --> <map>
**<util: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).<ref bean="beanID"/>
2).<ref local="beanID"/> 两个bean必须在同一个文件夹,不然就报异常
3).ref="" 属性
<!**5.组件自动扫描>
JDK5.0 --> 注解技术
注解技术是在类定义中追加标记
标记格式:@标识符
@Component
@Service
@Resoruce
标记只能出现在类的定义前,方法定义前,
成员变量定义前
注解好处:框架一般采用注解简化或替代
原有的XML文件配置。
<!在类名标记>
1.指定路径
<context:component-scan base-package:"包名"/>
有时候需要一个统一的包名,不同的包需要被包在一个包里面,所以域名反写的规则最好遵守
组件自动扫描使用:
可以简化<bean>定义,按指定的包路径扫描
包内所有组件,如果组件类定义前出现以下
几个标记之一,就将组件声明定义到容器.
@Component //组件 通用注解
@Controller //控制组件xxxController
@Service //业务组件xxxService
@Repository //数据访问组件xxxDAO
@Named //需要引入第三方标准jar包
bean的命名
1).默认id 什么都不写,那么就是小写开头的类名
2).自定义 在注解后面("名字")
指定组件作用域
@Scope("作用域") 默认 单例的 singleton:一个<bean>,在容器中只有一个对象
<!指定初始化和销毁方法>
@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
public String xxx(
HttpServletRequest request,Exception ex)
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
<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>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<servlet-mapping>
<filter-name>
<url-pattern>
--》HanlderMapping(配置)
<bean id="hand" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<!-- 指定请求和controller对应关系 -->
<property name="mappings">
<props>
<prop key="/hello.do">helloController</prop>
</props>
</property>
</bean>
<![注释版]><mvc:annotation-driven />
--》HelloController(编写+配置)
<!-- 配置controller -->
<bean id="helloController" class="DAO.Controller.helloController"></bean>
<![注释版]><context:component-scan base-package="DAO"/>
--》ViewResolver(配置)
<!-- 配置viewresolvar -->
<bean id="viewresolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/" p:suffix=".jsp">
</bean>
<!-- 异常处理器 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!-- <prop key="异常类型">视图名</prop> -->
<prop key="java.lang.Exception">error</prop>
</props>
</property>
</bean>
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 想栏谁 -->
<mvc:mapping path="ok.do"/>
<!--放弃拦截-->
<mvc:exclude-mapping path="/tologin.do"/>
<bean class="org.tarena.controller.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
<!数据库链接>
<!-- 声明定义jdbcTemplate -->
<bean id="template" class="org.springframework.jdbc.core.JdbcTemplate"
p:dataSource-ref="dbcp">
</bean>
<!-- DataSource -->
<bean id="dbcp" class="mons.dbcp.BasicDataSource"
p:username="root" p:password="" p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://localhost:3306/jsd1507db">
</bean>
public class EmpRowMapper implements RowMapper<Emp>//第一个参:rs 第二个参:第几行记录
//将当前rs指针指向的记录取出,封装成Emp返回
EmpDao
@Repository //扫描DAO
@Resource //注入
private JdbcTemplate template;
public void save(Emp emp) template.update(sql,Object[] params);
public void delete(int id)
public void modify(Emp emp)
public List<Emp> findAll() List<Emp> list=template.query(sql, EmpRowMapper rowMapper);
public Emp findByid(int id) Emp emp=template.queryForObject(sql, EmpRowMapper rowMapper);
//多行查询用query()方法
//当行查询用queryForObject()方法
//单个查询用queryForInt()方法
/hello.do
-->DispaticherServlet(配置)
--》HanlderMapping(配置)
--》HelloController(编写+配置)
--》ViewResolver(配置)
--》/WEB-INF/hello.jsp(编写)
ModelAndView mav=new ModelAndView();
mav.setViewName("");//设置视图名字,根据页面名写
mav.getModel().put("mag", "模型数据");
//等价于request.setAttribute("msg","模型数据");
@ExceptionHandler//局部异常处理
implements HandlerExceptionResolver //将异常信息写入文件 //跳转到错误界面
implements HandlerInterceptor
//请求处理完毕 输出之前 afterCompletion
//Controller之后 postHandle
//controller之前 preHandle false表示拦截
<!-- 采用 new GregorianCalendar() ,构造方法-->
<bean id="c1" class="java.util.GregorianCalendar"></bean>
<!-- 采用Calendar.getInstance(),静态工厂方法 -->
<bean id="c2" class="java.util.Calendar"
factory-method="getInstance"></bean>
<!-- 采用c2.getTime(),对象工厂方法 -->
<bean id="date" factory-bean="c2"
factory-method="getTime"></bean>
<bean id="e1" scope="singleton" lazy-init="true"
init-method="init" destroy-method="mydestroy"
class="test.ExampleBeann"></bean>
<bean id="q1" class="test.q">
<!-- 信息注入 set方法-->
<property name="cpu" value="晓龙">
</property>
<property name="hdd" value="索尼">
</property>
<property name="mainbord" value="华硕">
</property>
</bean>
<bean id="p2" class="test.phone">
<!-- 构造器注入 -->
<constructor-arg index="0">
<value>高</value>
</constructor-arg>
<constructor-arg index="1">
<value>低</value>
</constructor-arg>
</bean>
[<bean id="msg" class="DAO.MessageBean"
p:name="root" p:age="18" p:birth="2015-11-11">
<property name="friends">
<list>
<value>tom</value>
<null/>
<value>jack</value>
</list>
</property>
</bean> ]
[<!-- 读取db.properties文件,形成一个properties对象 -->
<util:properties id="dbP"
location="classpath:db.properties">
</util:properties>
<!-- 定义List<String>对象 -->
<util:list id="somelist">
<value>小红</value>
<value>小白</value>
</util:list>
<util:set id="someset">
<value>上海</value>
<value>山东</value>
</util:set>
<util:map id="somemap">
<entry key="1003" value="java精通"></entry>
<entry key="1004" value="java掌握"></entry>
</util:map>
<util:properties id="somedb">
<prop key="username">#{dbP.user}</prop>
<prop key="password">#{dbP.password}</prop>
<prop key="driver">#{dbP.driver}</prop>
</util:properties>
<bean id="msg1" class="DAO.MessageBean" p:name="#{msg.name}"
p:friends-ref="somelist" p:cities-ref="someset"
p:books-ref="somemap" p:db-ref="somedb">
</bean> ]
<!--db.properties-->
[#key=value
user=root
password=12345
driver=com.mysql.jdbc.Driver
uri=jdbc:mysql://localhost:3306/test ]
<!--遍历Map的两种方法-->
[ System.out.println("Map----注入信息----");
Set<Entry<String,String>> booksSet=books.entrySet();//将map转换为set类型
for(Entry<String,String> e:booksSet){
System.out.println(e.getKey()+","+e.getValue());
}
System.out.println("Map----注入信息----");
Set<Object> keys=db.keySet();
for(Object key:keys){
System.out.println(key+","+db.getProperty(key.toString()));
} ]
String conf = "applicationContext.xml";
AbstractApplicationContext aContext = new ClassPathXmlApplicationContext(conf);
${ExampleBeann} ${e1} = aContext.getBean("${e1}",${ExampleBeann}.class);
${}
11 / 11
展开阅读全文