(1)Bean的创建方式
有四种创建4种方式
①普通方式
<bean id="myBean" class="com.luo._09_createBean._01_base.MyBean"></bean>
②FactoryBean方式
普通方式注入都是通过new出来的,但是有时不希望是直接new出来的,就需要使用FactoryBean方式或者工厂方式
- 一个类实现了FactoryBean接口
- 根据这个类中的getObject方法再创建一个bean
- 根据类中getObjectType方法确定返回类型
xml配置
<!--
Spring会去创建这个FactoryBean,然后它会看这个东西是否实现FactoryBean接口
如果实现了这个接口,它会根据这个类中的方法再创建一个bean
类型就是 getObjectType() 返回的类型
值就是 getObject() 返回的值
这里创建了两个bean MyEntityManagerFactoryBean和MyEntityManagerFactory
-->
<bean id="entityManagerFactory" class="com.luo._09_createBean._02_factorybean.MyEntityManagerFactoryBean"></bean>
MyPersistence类
public class MyPersistence {
/*
* 创建MyEntityManagerFactory对象的方法
* */
public static MyEntityManagerFactory createMyEntityManagerFactory(){
return new MyEntityManagerFactory();
}
}
准备一个FactoryBean
public class MyEntityManagerFactoryBean implements FactoryBean<MyEntityManagerFactory>{
/*
* 返回的对象
* */
@Override
public MyEntityManagerFactory getObject() throws Exception {
return MyPersistence.createMyEntityManagerFactory();
}
/*
* 返回的类型
* */
@Override
public Class<?> getObjectType() {
return MyEntityManagerFactory.class;
}
/*
* 是否是单例
* */
@Override
public boolean isSingleton() {
return false;
}
}
③静态工厂方式
- 工厂中有一个静态方法
- 直接拿到这个方法中返回的对象(bean)
准备一个静态工厂
public class PhoneFactory {
public static Phone createPhone(){
return new Phone();
}
}
配置这个工厂对应的方法
<!--
PhoneFactory.createPhone()
factory-method:把这个方法返回的值变成一个bean
-->
<bean id="phone" class="com.luo._09_createBean._03_factory.PhoneFactory" factory-method="createPhone"/>
④实例(非静态)工厂方式
- 工厂中有一个非静态方法
- 先创建工厂,再拿到工厂方法中返回的对象(bean)
准备一个实例工厂
public class PhoneFactory {
public Phone createPhone(){
return new Phone();
}
}
配置这个工厂对应的方法
<!--配置工厂bean-->
<!--
PhoneFactory phoneFactory = new PhoneFactory();
phoneFactory.createPhone();
-->
<bean id="phoneFactory" class="com.luo._09_createBean._04_factory.PhoneFactory"/>
<bean factory-bean="phoneFactory" factory-method="createPhone"/>
(2)SSJ集成
①三大框架是什么?
- ssh -
struts/struts2+Spring+hibernate(比较少) - ssj - SpringMvc+Spring+jpa(今天的)
- sssdj - SpringMvc+Spring+SpringDataJpa(第二个项目)
- ssm - SpringMVC+Spring+MyBatis(用得最多,第三个项目)
②集成三大框架的步骤
- 导包
- 创建domain及实体类
- 创建db.properties 配置文件,引入时必须写classpath:
- 配置datasource连接池(数据源)
- 配置entityManagerFactory
- tx(事务)
- 创建dao层
- 创建service层
- 创建controller层(springmvc的配置,web.xml)
- 使用easyui
③导包
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!-- Spring对于web的支持 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<!-- 引入SpringMVC的支持 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<!--引入aop的织入包-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.8</version>
</dependency>
<!--Spring:只要操作数据库,就需要引入这个包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<!--Spring集成ORM[对象,关系,映射]框架需要引入这个包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<!--hibernate的核心包-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.8.Final</version>
</dependency>
<!--hiberante对象jpa的支持包-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.8.Final</version>
</dependency>
<!--数据库驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!--引入dbcp连接池的包-->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.2</version>
</dependency>
<!-- SpringMVC返回JSON需要的包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.6.5</version>
</dependency>
<!--spring的测试包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
④创建并配置jdbc.properties文件
applocationContext.xml中:
必须写classpath
<!--导入的时候不要忘了写classpath-->
<context:property-placeholder location="classpath:jdbc.properties"/>
jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///jpa
jdbc.username=root
jdbc.password=123456
⑤datasource配置
applicationContext.xml -> datasource连接池(数据源)
配置四大金刚和销毁方法
<!--配置连接池(数据源)-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!--配置四大金刚-->
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
⑥EntityManagerFactory配置
- alt+insert—>JPA—>只选最长那个
- packages(包)ToScan(扫描):JPA包的扫描
- 配置一个JPA的适配器(hibernate实现的)
- 适配器中配置方言、建表策略(true=update false啥也不做)、sql显示等…
applicationContext.xml–>EntityManagerFactory配置
<!-- 配置 EntityManagerFactory-->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<!--数据源-->
<property name="dataSource" ref="dataSource"/>
<!--packages(包)ToScan(扫描):JPA包的扫描-->
<property name="packagesToScan" value="com.luo.ssj.domain"/>
<!--
配置一个JPA的适配器:hibernate Adapter:适配器
jpaVendorAdapter:JPA是用哪一个框架来实现的
-->
<property name="jpaVendorAdapter">
<!-- 使用hiberante的适配实现 -->
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<!-- 方言 -->
<property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>
<!-- 建表策略 true=update false啥也不做-->
<property name="generateDdl" value="true"/>
<!-- 显示sql -->
<property name="showSql" value="true"/>
</bean>
</property>
</bean>
⑦dao层
- Spring中没有EntityManager的对象,所以无法使用@Autowired注入
- @PersistenceContext:持久化上下文(一个线程/一次请求)
到线程中去获到这个对象
1.如果拿到了就直接使用
2.如果拿不到,就帮你创建一个(把它放到上下文)
@Repository
public class EmployeeDaoImpl implements IEmployeeDao{
/**
* Spring中没有EntityManager的对象,所以无法使用@Autowired注入
* @PersistenceContext:持久化上下文(一个线程/一次请求)
* 到线程中去获到这个对象
* 1.如果拿到了就直接使用
* 2.如果拿不到,就帮你创建一个(把它放到上下文)
*/
@PersistenceContext
private EntityManager entityManager;
@Override
public void save(Employee employee) {
entityManager.persist(employee);
}
@Override
public void delete(Long id) {
entityManager.remove(findOne(id));
}
@Override
public List<Employee> findAll() {
return entityManager.createQuery("select o from Employee o").getResultList();
}
@Override
public Employee findOne(Long id) {
return entityManager.find(Employee.class,id);
}
@Override
public void update(Employee employee) {
entityManager.merge(employee);
}
}
引入context头,开启扫描dao包
<!-- 扫描dao层 -->
<context:component-scan base-package="com.luo.ssj.dao"/>
dao中拿到EntityManager
保证一个线程只用一个EntityManager对象
@PersistenceContext
private EntityManager entityManager;
⑧service层(及事务配置)
①事务配置
- 注意—>事务是开在service(业务层)
- 引入tx头和context头,扫描service包
- 准备JPA的事务管理器
- 让Spring支持事务注解
- 为service层实现类加上事务注解和传播机制注解
<!-- 扫描service层 -->
<context:component-scan base-package="com.luo.ssj.service"/>
<!-- 准备JPA的事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<!-- 让Spring支持事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
- 类上加上: @Transactional
- 如果某个方法不需要事务:@Transactional(readOnly = true,propagation = Propagation.SUPPORTS)
- 事务传播机制
②事务传播机制
- readOnly:只读
- propagation:事务传播机制
- Propagation.REQUIRED:必须有事务(默认)
如果访问我的时候有事务,就用原来的事务,如果没有,就创建一个新的- Propagation.REQUIRES_NEW:必须有新的事务
- Propagation.NEVER:绝不要事务
- Propagation.SUPPORTS : 支持
@Service
@Transactional
public class EmployeeServiceImpl implements IEmployeeService{
@Autowired
private IEmployeeDao employeeDao;
@Override
public void save(Employee employee) {
employeeDao.save(employee);
}
@Override
public void delete(Long id) {
employeeDao.delete(id);
}
/**
* readOnly:只读
* propagation:事务传播机制
* Propagation.REQUIRED:必须有事务(默认)
* 如果访问我的时候有事务,就用原来的事务,如果没有,就创建一个新的
* Propagation.REQUIRES_NEW:必须有新的事务
* Propagation.NEVER:绝不要事务
* Propagation.SUPPORTS : 支持
*/
@Override
@Transactional(readOnly = true,propagation = Propagation.SUPPORTS)
public List<Employee> findAll() {
return employeeDao.findAll();
}
@Transactional(readOnly = true,propagation = Propagation.SUPPORTS)
@Override
public Employee findOne(Long id) {
return employeeDao.findOne(id);
}
@Override
public void update(Employee employee) {
employeeDao.update(employee);
}
}
⑨Controller层()
①applocationContext-mvc.xml配置
创建applocationContext-mvc.xml并配置
- 引入context头和mvc头,扫描controller包
- 开启SpringMVC的注解支持
- 静态资源放行
- 配置视图解析器
- 上传解析器(暂缺)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
<!--1.扫描Controller层-->
<context:component-scan base-package="com.luo.ssj.controller"/>
<!--2.开启SpringMVC的注解支持-->
<mvc:annotation-driven/>
<!--3.静态资源放行-->
<mvc:default-servlet-handler/>
<!--视图解析器配置-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 上传解析器(暂缺) -->
</beans>
②web.xml配置
注意:web.xml文件的版本必须超过2.4
- 配置一个监听器启动Spring
- 读取Spring的配置文件
- 核心控制器配置
servlet对象是第一次访问时创建(希望这个servlet是跟着服务器的启动而创建)
filter过滤器是启动的时候创建 - servlet 初始化时读取SpringMVC的配置文件
- 配置编码过滤器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<!-- 配置一个监听器启动Spring -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 读取Spring的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applocationContext.xml</param-value>
</context-param>
<!--
核心控制器 servlet对象是第一次访问的时候创建(希望这个servlet是跟着服务器的启动而创建)
filter过滤器是启动的时候创建
-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 读取SpringMVC的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applocationContext-mvc.xml</param-value>
</init-param>
<!-- tomcat启动时创建 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!-- 这里使用斜杠:更加符合咱们的RESTful风格 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 配置编码过滤器 -->
<filter>
<filter-name>characterEncodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
③controller层代码
@Controller
@RequestMapping("/employee")
public class EmployeeController {
@Autowired
private IEmployeeService employeeService;
@RequestMapping("/index")
public String index(){
return "index";//查询后跳转index.jsp
}
@RequestMapping("/list")
@ResponseBody//返回json数据
public List<Employee> list(){
List<Employee> list = employeeService.findAll();
System.out.println(list);
return list;
}
}
(3)easyui回顾
easyui基本使用:
- 引入css、js核心文件、JQuery文件、国际化文件(easyui-lang-zh_CN.js)
- 之后再官方文档复制组件代码测试,是否成功
<%-- 引入easyui的样式 --%>
<link rel="stylesheet" type="text/css" href="/easyui/themes/default/easyui.css">
<%-- 引入easyui的图标的样式 --%>
<link rel="stylesheet" type="text/css" href="/easyui/themes/icon.css">
<%-- 引入jQuery --%>
<script type="text/javascript" src="/easyui/jquery.min.js"></script>
<%--easyui的核心文件--%>
<script type="text/javascript" src="/easyui/jquery.easyui.min.js"></script>
<%-- 引入一个国际化(zh)文件 --%>
<script type="text/javascript" src="/easyui/locale/easyui-lang-zh_CN.js"></script>