zoukankan      html  css  js  c++  java
  • SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>

    此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password.

      SSH,xml方式搭建文章链接地址:http://www.cnblogs.com/wkrbky/p/5912810.html

    一、Hibernate(数据层)的搭建:

    实现流程

    二、Spring(注入实例)的使用:

    实现流程

    三、Struts2(MVC)的搭建:

    实现流程

    这里注意一点问题:

      Struts2与Hibernate在一起搭建,antlr包,有冲突。MyEclipse9中有这样问题。朋友的MyEclipse10中没有这个问题。

     

      我选择把Struts中antlr包去掉。

    DB Browser中反转实体类:

    sequence自动增长ID实体类中配置连接:http://www.cnblogs.com/wkrbky/p/5917985.html

     编辑web.xml文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
        <display-name></display-name>
        
        <!-- 这是一只拦路虎 -->
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
    
        <!-- 读取applicationContext.xml文件 不写默认Spring需要读取 WebContentWEB-INFapplicationContext.xml -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <!-- 改变默认读取路径为src目录下的 applicationContext.xml 在改变的路径下还是没找到,便自动到默认路径查找 -->
            <param-value>classpath:applicationContext.xml</param-value>
        </context-param>
    
        <!-- 定义Spring监听器 class: spring 3.0 Web Libraries 下可以找到。 -->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        
        <!-- Struts2过滤器 -->
        <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>
    </web-app>

     配置applicationContext.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <!--  1.:需要导入的命名空间
            命名规范: 
                xsi:架构实例 
                beans:根节点 
                aop:事务 
                context:注解 
                tx:事务管理 
                xsi:schemaLocation 
        协议(一个命名规范对应一个协议) 注:若不知道自己使用的框架版本,可以把协议后的版本号去掉,此处已经去掉。 -->
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    
        <!-- 注解方式创建Bean
        <bean id="sessionFactory"
            class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
            <property name="configLocation" value="classpath:hibernate.cfg.xml">
            </property>
        </bean> -->
        
        <!-- 数据源连接池的写法
            注意:使用GUI创建的数据源,本地会话工厂改为注解会话工厂
            hibernate.dialect:方言改10g,默认9
            packagesToScan:注意一下,这里是导入实体类的映射信息。导入实体类的包。
         -->
        <bean id="dataSource"
            class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName"
                value="oracle.jdbc.driver.OracleDriver">
            </property>
            <property name="url"
                value="jdbc:oracle:thin:@localhost:1521:orcl">
            </property>
            <property name="username" value="root"></property>
            <property name="password" value="admin"></property>
        </bean>
        <bean id="sessionFactory"
            class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
            <property name="dataSource">
                <ref bean="dataSource" />
            </property>
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.dialect">
                        org.hibernate.dialect.Oracle10gDialect
                    </prop>
                    <prop key="hibernate.show_sql">true</prop>
                    <prop key="hibernate.format_sql">true</prop>
                </props>
            </property>
            <property name="packagesToScan">
                <list>
                    <value>com/entity</value>
                </list>
            </property>
        </bean>
        
        <!-- 2注解配置组件(代表声明开启注解模式,不加的话三个框架整合的话或许有些问题,或许识别不了标注组件@)-->
        <context:annotation-config />
        <!-- 3配置注解的自动扫描范围(多个包配置可配置多个context:component-scan)
            base-package:需要扫描的包
         -->
        <context:component-scan base-package="com.dao.impl"/>
        <context:component-scan base-package="com.service.impl"/>
        <context:component-scan base-package="com.action"/>
    
        <!-- 4第二种方法,在dao类中定义一个模板对象,这是外部的类不是我们创建的,所以要写在这里,如果不写,dao.iml中就找不到此模型 -->
        <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
            <property name="sessionFactory" ref="sessionFactory" ></property>
        </bean>
        
        <!-- (1)配置注解事务管理器 -->
        <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory"></property>
        </bean>
         <!-- (2)加入注解事务管理器 -->
        <tx:annotation-driven transaction-manager="txManager"/>
        
    </beans>

    配置struts.xml:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
    <struts>
    
       <!-- 是否启动动态方法调用
       <constant name="struts.enable.DynamicMethodInvocation"value="false" /> -->
    
       <!-- 开启开发者模式,作用,页面中报错信息会更加详细,默认false -->
       
       <constant name="struts.devMode" value="true" />
    
       <!-- 指定由spring负责action对象的创建(必选) -->
    
       <constant name="struts.objectFactory" value="spring" />
    
       <!-- 国际化设置,请求参数为utf-8编码(必选) -->
    
       <constant name="struts.i18n.encoding" value="utf-8" />
    
       <!-- 指定被struts2处理的请求后缀类型,如果有多个,用逗号隔开
    
       <constant name="struts.action.extension" value="action" /> -->
    
       <!-- 指定上传文件的大小上限
    
       <constant name="struts.multipart.maxSize" value="209715200" /> -->
    
       <!-- 当配置文件改动后是否重新加载,生产环境下需要设置为false
    
       <constant name="struts.configuration.xml.reload" value="false" /> -->
    
       <!-- 是否使用struts2的开发模式,生产环境下需要设置为false
    
       <constant name="struts.devMode" value="false" /> -->
    
       <!-- 浏览器是否缓存静态内容,生产环境下需要设置为true
    
       <constant name="struts.serve.static.browserCache" value="true" /> -->
    
       <!-- <includefile="example.xml"/> -->
    
    </struts>

    数据访问层dao接口:

    package com.dao;
    
    import com.entity.Users;
    
    /**
     * 用户接口
     * @author asus
     *
     */
    public interface UsersDao {
    
        /** 登陆验证 */
        Users loginCheck(Users user);
        
        /** 添加的方法 */
        int addUser(Users user);
    }

    数据访问层dao.impl实现类:

    package com.dao.impl;
    
    import java.util.List;
    
    import javax.annotation.Resource;
    
    import org.springframework.dao.DataAccessException;
    import org.springframework.orm.hibernate3.HibernateTemplate;
    import org.springframework.stereotype.Repository;
    
    import com.dao.UsersDao;
    import com.entity.Users;
    /**
     * 用户接口实现类
     * @author asus
     *HibernateTemplate、HibernateDaoSupport两种方法实现增删改查
     *第二种方法:(第一种在《SSH(Struts2+Spring+Hibernate)框架搭建流程》中有详细介绍)
        在dao类中定义一个HibernateTemplate类的对象,用该对象调用HibernateTemplate模板封装好的方法,如下:
     */
    @Repository(value="usersDaoImpl")//用于标注数据访问组件,即DAO组件,value属性可不写默认是类名首字母小写(观看顺序1)
    public class UsersDaoImpl implements UsersDao {
        
        //定义一个模板对象(使用注解不需要生成Get'Set方法,属性名必须类名首字母小写才能注解方式自动赋值)
        //@Autowired//注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。当找不到一个匹配的 Bean 时,抛出异常,这样的话就不友好了不是,所有Spring提供了一个配套使用的@Qualifier(完全自动)
        //@Qualifier(value="hibernateTemplate")//指定注入 Bean 的名称与@Autowired配套使用
        @Resource(name="hibernateTemplate")//spring组件setter方法注入(观看顺序2)
        private HibernateTemplate hibernateTemplate;
            
        @Override
        public Users loginCheck(Users user) {
            
            //得到一个集合
            List<Users> list = hibernateTemplate.find("from Users where name=? and password=? ",user.getName(),user.getPassword());
            
            //使用三元运算符,防止list.get(0)时报空指针。
            return (Users) (list.size()>0?list.get(0):null);
        }
    
        @Override
        public int addUser(Users user) {
            
            try {
                hibernateTemplate.save(user);
                return 1;
            } catch (DataAccessException e) {
                
                e.printStackTrace();
            }
            return 0;
        }
    
    }

    业务逻辑层接口service:

    package com.service;
    
    import com.entity.Users;
    
    /**
     * 用户业务逻辑层
     * @author asus
     *
     */
    public interface UsersService {
    
        /** 登陆验证 */
        Users loginCheck(Users user);
        
        /** 添加的方法 */
        int addUser(Users user);
    }

    数据访问层dao.impl实现类

    package com.service.impl;
    
    import javax.annotation.Resource;
    
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import com.dao.UsersDao;
    import com.entity.Users;
    import com.service.UsersService;
    /**
     * 用户业务逻辑层实现类
     * @author asus
     *
     */
    //@Transactional    //给实现类的所有添加事务(也可以个某一个方法添加此标注)
    @Service(value="usersServiceImpl")//用于标注业务层组件(观看顺序3)
    public class UsersServiceImpl implements UsersService {
    
        //这里以前是new的,现在不需要了,交给Spring来实例(使用注解不需要生成Get'Set方法)
        @Resource(name="usersDaoImpl")//spring组件setter方法注入(观看顺序4)
        private UsersDao udd;
        
        @Override
        public Users loginCheck(Users user) {
            
            return udd.loginCheck(user);
        }
    
        @Transactional//给单个方法添加事物(若类上添加了全体事物,则不需要添加此局部事物)
        @Override
        public int addUser(Users user) {
            
            return udd.addUser(user);
        }
    
    }

    控制器类Action:

    package com.action;
    
    import javax.annotation.Resource;
    
    import org.apache.struts2.convention.annotation.Action;
    import org.apache.struts2.convention.annotation.Namespace;
    import org.apache.struts2.convention.annotation.ParentPackage;
    import org.apache.struts2.convention.annotation.Result;
    import org.apache.struts2.convention.annotation.Results;
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Controller;
    
    import com.entity.Users;
    import com.opensymphony.xwork2.ActionSupport;
    import com.service.UsersService;
    /**
     * 用户控制器类
     * @author asus
     *
     */
    //Action类[观看顺序5]
    @Controller(value="usersAction")//用于标注控制层组件(如struts中的action)
    @Scope("prototype")//单列模式
    @ParentPackage("struts-default")
    @Namespace("/")
    /*    Results({}):集合,对应的结果有多个
     *     Result():一个结果
     *  name:Action return返回的值
     *  location:返回结果的页面
     */
    @Results({
        @Result(name="success",location="/success.jsp"),
        @Result(name="login",location="/login.jsp"),
        @Result(name="register",location="/register.jsp")
            })
    public class UsersAction extends ActionSupport {
    
        //接收页面的值
        private Users user;
        //一样交给Spring实例(使用注解不需要生成Get'Set方法)
        @Resource(name="usersServiceImpl")//spring组件setter方法注入(观看顺序6)
        private UsersService uss;
        
        public String execute(){
            
            return SUCCESS;
        }
        
        /** 判断用户输入的账号密码 */
        @Action("loginUser")//相当于sturts.xml中的action标签的name,表单提交的url地址(观看顺序7)
        public String login(){
            
            Users checkNum=null;
            if(user!=null){
                checkNum = uss.loginCheck(user);
            }
            
            return checkNum==null?LOGIN:SUCCESS;
        }
    
        /** 添加用户 */
        @Action("addUser")
        public String add(){
            
            int addResult=0;
            if(user!=null){
                addResult = uss.addUser(user);
            }
            
            return addResult==0?"register":SUCCESS;
        }
        //生成Get'Set
        public Users getUser() {
            return user;
        }
    
        public void setUser(Users user) {
            this.user = user;
        }
    
    }

    登陆页面:

      <body>
            <form action="loginUser.action" method="post" >
                用户名:<input type="text" name="user.name" />
                密码:   <input type="password" name="user.password" />
                <input type="submit" value="登录按钮" >
            </form>
      </body>

    注册页面:

        <body>
            <form action="addUser.action" method="post">
                用户名:
                <input type="text" name="user.name">
                <br>
                密码:
                <input type="password" " name="user.password">
                <br>
                <input type="submit" value="注册">
            </form>
        </body>

    成功页面:

      <body>
            操作成功!
      </body>
  • 相关阅读:
    ORA-28040: No matching authentication protocol
    kettle增量抽取数据--高效抽取方式
    为什么MySQL的索引要使用B+树而不是其它树形结构?比如B树?
    echarts饼图指示线文字换行
    数据库概论
    Java学习笔记
    案例分析
    软件工程作业3
    软件工程作业2
    软件工程作业1
  • 原文地址:https://www.cnblogs.com/wkrbky/p/5915910.html
Copyright © 2011-2022 走看看