Day62_SSJ集成

(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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值