zoukankan      html  css  js  c++  java
  • JavaWeb学习:Struts2与Spring的IOC练习

    需求:把客户信息存储到数据库中

    一、创建web项目,搭建基盘

      

    二、创建实体类

    public class Customer {
        private Long cust_id;
        private String cust_name;
        
        private String cust_source;
        private String cust_industry;
        private String cust_level;
        private String cust_phone;
        private String cust_mobile;

    三、搭建struts2环境

      ①、引入struts2的开发jar包

         

       ②、配置struts2的核心过滤器    

        <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    
        </filter>
    
        <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>

      ③、编写Action

    public class CustomerAction extends ActionSupport implements ModelDriven<Customer> {
        // 使用模型驱动获取页面上的值
        Customer customer=new Customer();
        
        @Override
        public Customer getModel() {
            
            return customer;
        }
        
        public String saveUI() {
        return "saveUI";
        }
    }

      ④、在src下新建strust.xml,添加以下内容

    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
    
    <struts>
        <package name="crm" extends="struts-default" namespace="/">
            <global-allowed-methods>regex:.*</global-allowed-methods>
            <action name="customer_*" class="com.xxx.crm.web.action.CustomerAction" method="{1}">
                <result name="saveUI">/jsp/customer/add.jsp</result>
            </action>
        </package>
    </struts>

      ⑤、测试struts2环境

    <A class=style2 href="${ pageContext.request.contextPath }/customer_saveUI.action" target=main>- 新增客户</A>

      ⑥、编写客户信息保存页面

    <FORM id=form1 name=form1
            action="${pageContext.request.contextPath }/customer_save.action"
            method=post>

      编写Action的save方法,需要实例化Service的接口实现类,这样的话Action与Service属于紧耦合,所以需要使用Spring解耦

    四、搭建Spring环境

      ①、引入jar包

        

      ②、通过配置将Service交给Spring,在src下新建applicationContext.xml 

    <?xml version="1.0" encoding="UTF-8"?>
    <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">
        
        <bean id="customerService" class="com.xxx.crm.service.impl.CustomerServiceImpl"></bean>
    
        
    </beans>

      ③、Action中调用Service

        public String save() {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        CustomerService customerService=(CustomerService) applicationContext.getBean("customerService");
        System.out.println("CustomerAction中的save方法执行了");
        customerService.save(customer);
        return NONE;
        }

      ④、Service接口和实现类

    //接口==============
    public interface CustomerService {
        public void save(Customer customer);
    }
    
    //实现类=============
    public class CustomerServiceImpl implements com.xxx.crm.service.CustomerService {
    
        @Override
        public void save(Customer customer) {
        System.out.println("CustomerService的save方法执行了");
        }
    }

    以上可以测试。

      ⑤、Service的接口实现类需要调用DAO层的方法,为了解耦DAO交给Spring管理

    <bean id="customerDao" class="com.xxx.crm.service.impl.CustomerDaoImpl"></bean>

      ⑥、DAO接口和实现类

    //接口==============
    public interface CustomerDao {
        public void save(Customer customer);
    }
    
    //实现类=============
    public class CustomerDaoImpl implements CustomerDao {
        public void save(Customer customer) {
        System.out.println("CustomerDao中的save方法执行了");
        }
    }

      ⑦、Service中使用DAO

        在Action使用Service时已经加载过applicationContext.xml了,就已经创建了Service和DAO了,所以就不需要再加载applicationContext.xml了。并且Service和DAO都是被Spring管理的,所以可以使用依赖注入的方式获取DAO的对象

        Ⅰ、编写Service实现类的方法

    public class CustomerServiceImpl implements com.xxx.crm.service.CustomerService {
    
        private CustomerDao customerDao;
        
        public void setCustomerDao(CustomerDao customerDao) {
            this.customerDao = customerDao;
        }
    
        @Override
        public void save(Customer customer) {
        System.out.println("CustomerService的save方法执行了");
        customerDao.save(customer);
        }
    }

        Ⅱ、Spring的属性注入(可以发现Spring的属性注入的前提:1、一个类要被另一个类使用,2、这两个类都必须是Spring管理的)

        <bean id="customerService" class="com.xxx.crm.service.impl.CustomerServiceImpl">
            <property name="customerDao" ref="customerDao"/>
        </bean>

    五、问题

    上述案例每次请求都会创建Spring的工厂,浪费服务器资源

    解决:

      在服务器启动的时候创建Spring的工厂

      将工厂存储到ServletContext中

      每次请求从ServletContext中获取

    使用Spring核心监听器(ContextLoaderListener)

    ①、引入jar包

    spring-web.jar

    ②、配置监听器

        <!-- 指定 Ioc容器(就是applicationContext.xml)的位置 -->
        <context-param>
            <!-- 监听器的父类ContextLoader中有一个属性contextConfigLocation,
            该属性值 保存着 容器配置文件applicationContext.xml的位置 -->
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </context-param>
        <listener>
            <!-- 配置spring-web.jar提供的监听器,此监听器 可以在服务器启动时 初始化Ioc容器。 
            初始化Ioc容器(applicationContext.xml) 
                 1.告诉监听器 此容器的位置:context-param 
                2.默认约定的位置 :WEB-INF/applicationContext.xml -->
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>

    ③、在Action中获取工厂

        public String save() {
        ServletContext servletContext=ServletActionContext.getServletContext();    
        WebApplicationContext applicationContext=WebApplicationContextUtils.getWebApplicationContext(servletContext);
        //ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        CustomerService customerService=(CustomerService) applicationContext.getBean("customerService");
        System.out.println("CustomerAction中的save方法执行了");
        customerService.save(customer);
        return NONE;
        }
  • 相关阅读:
    Educational Codeforces Round 20 D. Magazine Ad
    Educational Codeforces Round 20 C. Maximal GCD
    紫书第三章训练2 暴力集
    Educational Codeforces Round 20 B. Distances to Zero
    Educational Codeforces Round 20 A. Maximal Binary Matrix
    紫书第三章训练1 D
    紫书第一章训练1 D -Message Decoding
    HAZU校赛 Problem K: Deadline
    Mutual Training for Wannafly Union #8 D
    紫书第三章训练1 E
  • 原文地址:https://www.cnblogs.com/WarBlog/p/14098208.html
Copyright © 2011-2022 走看看