Spring_day01总结
今日任务
Ø 使用Spring完成对客户的保存操作
教学导航
教学目标
教学方法
案例驱动法
CRM系统中客户信息管理模块功能包括:
新增客户信息
客户信息查询
修改客户信息
删除客户信息
本功能要实现新增客户,页面如下:
Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EEDevelopment and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。
EE开发分成三层结构:
* WEB层:Spring MVC.
* 业务层:Bean管理:(IOC)
* 持久层:Spring的JDBC模板.ORM模板用于整合其他的持久层框架.
Expert One-to-One J2EE Design andDevelopment :J2EE的设计和开发:(2002.EJB)
Expert One-to-One J2EE Development withoutEJB :J2EE不使用EJB的开发.
方便解耦,简化开发
Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理
AOP编程的支持
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程
方便程序的测试
Spring对Junit4支持,可以通过注解方便的测试Spring程序
方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持
降低JavaEE API的使用难度
Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低
Spring 3.X 和 Spring4.X
IOC:Inversion ofControl 控制反转. 指的是 对象的创建权反转(交给)给Spring.
作用是实现了程序的解耦合.
官网:http://spring.io/
下载地址:http://repo.springsource.org/libs-release-local/org/springframework/spring解压:(Spring目录结构:)
* docs :API和开发规范.
* libs :jar包和源码.
* schema :约束.
log4j.properties
applicationContext.xml
引入约束:
spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
public interface UserDao {
public void sayHello();
}
public class UserDaoImpl implements UserDao {
@Override
public voidsayHello() {
System.out.println("HelloSpring...");
}
}
<!-- Spring的入门案例================-->
<bean id="userDao" class="cn.itcast.spring.demo1.UserDaoImpl"></bean>
@Test
// Spring的方式:
public void demo2(){
// 创建Spring的工厂类:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 通过工厂解析XML获取Bean的实例.
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
userDao.sayHello();
}
IOC :控制反转,将对象的创建权交给了Spring.
DI :DependencyInjection 依赖注入.需要有IOC的环境,Spring创建这个类的过程中,Spring将类的依赖的属性设置进去.
ApplicatioContext接口有两个实现类:
ClassPathXmlApplicationContext :加载类路径下Spring的配置文件.
FileSystemXmlApplicationContext :加载本地磁盘下Spring的配置文件.
BeanFactory :是在getBean的时候才会生成类的实例.
ApplicationContext :在加载applicationContext.xml时候就会创建.
复制路径:
* http://www.springframework.org/schema/beans/spring-beans.xsd
查找XML Catalog:
点击Add..
id :Bean起个名字. 在约束中采用ID的约束:唯一. 必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号 id:不能出现特殊字符.
<bean id=”bookAction”>
name:Bean起个名字. 没有采用ID的约束. name:出现特殊字符.如果<bean>没有id的话 , name可以当做id使用.
* 整合struts1的时候:
<bean name=”/loginAction”>
* singleton :默认值,单例的.
* prototype :多例的.
* request :WEB项目中,Spring创建一个Bean的对象,将对象存入到request域中.
* session :WEB项目中,Spring创建一个Bean的对象,将对象存入到session域中.
* globalSession :WEB项目中,应用在Porlet环境.如果没有Porlet环境那么globalSession相当于session.
通过配置<bean>标签上的init-method作为Bean的初始化的时候执行的方法,配置destroy-method作为Bean的销毁的时候执行的方法。
销毁方法想要执行,需要是单例创建的Bean而且在工厂关闭的时候,Bean才会被销毁.
【构造方法的方式注入属性】
<!-- 第一种:构造方法的方式 -->
<bean id="car" class="cn.itcast.spring.demo4.Car">
<constructor-arg name="name" value="保时捷"/>
<constructor-arg name="price" value="1000000"/>
</bean>
【set方法的方式注入属性】
<!-- 第二种:set方法的方式 -->
<bean id="car2" class="cn.itcast.spring.demo4.Car2">
<property name="name" value="奇瑞QQ"/>
<property name="price" value="40000"/>
</bean>
<!-- 注入对象类型的属性 -->
<bean id="person" class="cn.itcast.spring.demo4.Person">
<property name="name" value="会希"/>
<!-- ref属性:引用另一个bean的id或name -->
<property name="car2" ref="car2"/>
</bean>
第一步:引入p名称空间
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
第二步:使用p名称空间.
* 普通属性: p:属性名称=””
* 对象类型属性: p:属性名称-ref=””
<!-- p名称空间的属性注入的方式 -->
<bean id="car2"class="cn.itcast.spring.demo4.Car2" p:name="宝马7"p:price="1200000"/>
<bean id="person"class="cn.itcast.spring.demo4.Person"p:name="思聪" p:car2-ref="car2"/>
SpEL:Spring Expression Language.
语法:#{ SpEL }
<!-- SpEL的注入的方式 -->
<bean id="car2" class="cn.itcast.spring.demo4.Car2">
<property name="name" value="#{'奔驰'}"/>
<property name="price" value="#{800000}"/>
</bean>
<bean id="person"class="cn.itcast.spring.demo4.Person">
<property name="name"value="#{'冠希'}"/>
<property name="car2"value="#{car2}"/>
</bean>
<bean id="carInfo"class="cn.itcast.spring.demo4.CarInfo"></bean>
引用了另一个类的属性
<bean id="car2"class="cn.itcast.spring.demo4.Car2">
<!-- <property name="name"value="#{'奔驰'}"/> -->
<propertyname="name" value="#{carInfo.carName}"/>
<propertyname="price" value="#{carInfo.calculatePrice()}"/>
</bean>
<!-- Spring的复杂类型的注入===================== -->
<bean id="collectionBean" class="cn.itcast.spring.demo5.CollectionBean">
<!-- 数组类型的属性 -->
<property name="arrs">
<list>
<value>会希</value>
<value>冠希</value>
<value>天一</value>
</list>
</property>
<!-- 注入List集合的数据 -->
<property name="list">
<list>
<value>芙蓉</value>
<value>如花</value>
<value>凤姐</value>
</list>
</property>
<!-- 注入Map集合 -->
<property name="map">
<map>
<entry key="aaa" value="111"/>
<entry key="bbb" value="222"/>
<entry key="ccc" value="333"/>
</map>
</property>
<!-- Properties的注入 -->
<property name="properties">
<props>
<prop key="username">root</prop>
<prop key="password">123</prop>
</props>
</property>
</bean>
一种:创建工厂的时候加载多个配置文件:
ApplicationContext applicationContext = newClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml");
二种:在一个配置文件中包含另一个配置文件:
<importresource="applicationContext2.xml"></import>
WEB层使用Struts2:
* Struts2开发的基本的包
Spring进行Bean管理:
*Spring开发的基本的包
Struts2:
*web.xml
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
*struts.xml
Spring:
*applicationContext.xml
*log4j.properties
<struts>
<package name="crm"extends="struts-default" namespace="/">
<action name="customer_*"class="cn.itcast.crm.web.action.CustomerAction"method="{1}">
</action>
</package>
</struts>
将业务层类配置到Spring中:
<bean id="customerService"class="cn.itcast.crm.service.impl.CustomerServiceImpl">
</bean>
在Action中获取业务层类:
public String save(){
System.out.println("Action中的save方法执行了...");
System.out.println(customer);
// 传统方式:
/*CustomerService customerService = new CustomerServiceImpl();
customerService.save(customer);*/
// Spring的方式进行操作:
ApplicationContextapplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
CustomerServicecustomerService = (CustomerService) applicationContext.getBean("customerService");
customerService.save(customer);
return NONE;
}
**** 每次请求都会创建一个工厂类,服务器端的资源就浪费了,一般情况下一个工程只有一个Spring的工厂类就OK了.
* 将工厂在服务器启动的时候创建好,将这个工厂放入到ServletContext域中.每次获取工厂从ServletContext域中进行获取.
*ServletContextLinstener :监听ServletContext对象的创建和销毁.
配置监听器:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
/**
* 保存客户的执行的方法:save
*/
public String save(){
// 传统方式:
/*CustomerServicecustomerService = new CustomerServiceImpl();
customerService.save(customer);*/
// Spring的方式进行操作:
/*ApplicationContextapplicationContext = newClassPathXmlApplicationContext("applicationContext.xml");
CustomerService customerService = (CustomerService)applicationContext.getBean("customerService");*/
WebApplicationContext applicationContext =WebApplicationContextUtils.getWebApplicationContext(ServletActionContext.getServletContext());
CustomerService customerService = (CustomerService) applicationContext.getBean("customerService");
System.out.println("Action中的save方法执行了...");
System.out.println(customer);
customerService.save(customer);
return NONE;
}
<bean id="customerDao"class="cn.itcast.crm.dao.impl.CustomerDaoImpl">
</bean>
public classCustomerServiceImpl implementsCustomerService {
private CustomerDao customerDao;
public voidsetCustomerDao(CustomerDao customerDao) {
this.customerDao = customerDao;
}
…
}
<bean id="customerService"class="cn.itcast.crm.service.impl.CustomerServiceImpl">
<property name="customerDao"ref="customerDao"/>
</bean>
