注解实现SSH

来源:互联网 发布:暴雨网络天书九卷官网 编辑:程序博客网 时间:2024/05/19 05:30

配置是转载的,但是忘了在那个链接了,文章还加了自己的注释

SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>

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

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

 先创建spring再创建hibernate

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

实现流程

先创建spring直接把hibernate的配置文件优化掉,即创建完spring后,点击exitsing

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

实现流程

 

三、Struts2(MVC)的搭建:

实现流程

 

这里注意一点问题:

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

  

  我选择把Strutsantlr包去掉。

DB Browser中反转实体类:

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

 

 编辑web.xml文件:

<?xml version="1.0"encoding="UTF-8"?>

<web-appversion="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需要读取WebContent\WEB-INF\applicationContext.xml -->

    <context-param>

        <param-name>contextConfigLocation</param-name>

        <!--改变默认读取路径为src目录下的 applicationContext.xml 在改变的路径下还是没找到,便自动到默认路径查找 -->

        <param-value>classpath:applicationContext.xml</param-value>

    </context-param>

 

    <!--定义Spring监听器 class: spring3.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

    协议(一个命名规范对应一个协议)注:若不知道自己使用的框架版本,可以把协议后的版本号去掉,此处已经去掉。 -->

<beansxmlns="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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd

        http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd

       http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd

       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

 

    <!--注解方式创建Bean

    <beanid="sessionFactory"

       class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

        <propertyname="configLocation"value="classpath:hibernate.cfg.xml">

        </property>

    </bean> -->

   

    <!--数据源连接池的写法

        注意:使用GUI创建的数据源,本地会话工厂改为注解会话工厂

        hibernate.dialect:方言改10g,默认9

        packagesToScan:注意一下,这里是导入实体类的映射信息。导入实体类的包。

     -->

    <beanid="dataSource"

        class="org.apache.commons.dbcp.BasicDataSource">

        <propertyname="driverClassName"

            value="oracle.jdbc.driver.OracleDriver">

        </property>

        <propertyname="url"

            value="jdbc:oracle:thin:@localhost:1521:orcl">

        </property>

        <propertyname="username" value="root"></property>

        <propertyname="password" value="admin"></property>

    </bean>

    <beanid="sessionFactory"

        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

        <propertyname="dataSource">

            <refbean="dataSource"/>

        </property>

        <propertyname="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>

        <propertyname="packagesToScan">

            <list>

                <value>com/entity</value>

            </list>

        </property>

 

      <!--对指定的类进行扫描

         <propertyname="annotatedClasses">

            <list>

               <value>com.entity</value>

            </list>

        </property>

         -->

    </bean>

   

    <!--2注解配置组件(代表声明开启注解模式,不加的话三个框架整合的话或许有些问题,或许识别不了标注组件@)-->

    <context:annotation-config/>

    <!--3配置注解的自动扫描范围(多个包配置可配置多个context:component-scan

        base-package:需要扫描的包

       需要扫描的包要在这里配置

     -->

    <context:component-scanbase-package="com.dao.impl"/>

    <context:component-scanbase-package="com.service.impl"/>

    <context:component-scanbase-package="com.action"/>

 

    <!--4第二种方法,在dao类中定义一个模板对象,这是外部的类不是我们创建的,所以要写在这里,如果不写,dao.iml中就找不到此模型 -->

    <beanid="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">

        <propertyname="sessionFactory" ref="sessionFactory"></property>

    </bean>

   

    <!--(1)配置注解事务管理器 -->

    <beanid="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

        <propertyname="sessionFactory" ref="sessionFactory"></property>

    </bean>

     <!-- (2)加入注解事务管理器 -->

    <tx:annotation-driventransaction-manager="txManager"/>

   

</beans>

配置struts.xml

<?xml version="1.0"encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC "-//ApacheSoftware Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">

<struts>

 

   <!--是否启动动态方法调用

   <constantname="struts.enable.DynamicMethodInvocation"value="false"/> -->

 

   <!--开启开发者模式,作用,页面中报错信息会更加详细,默认false -->

  

   <constantname="struts.devMode" value="true"/>

 

   <!--指定由spring负责action对象的创建(必选) -->

 

   <constantname="struts.objectFactory" value="spring"/>

 

   <!--国际化设置,请求参数为utf-8编码(必选)-->

 

   <constantname="struts.i18n.encoding" value="utf-8"/>

 

   <!--指定被struts2处理的请求后缀类型,如果有多个,用逗号隔开

 

   <constant name="struts.action.extension"value="action" /> -->

 

   <!--指定上传文件的大小上限

 

   <constantname="struts.multipart.maxSize" value="209715200" />-->

 

   <!--当配置文件改动后是否重新加载,生产环境下需要设置为false

 

   <constantname="struts.configuration.xml.reload" value="false" />-->

 

   <!--是否使用struts2的开发模式,生产环境下需要设置为false

 

   <constantname="struts.devMode" value="false" /> -->

 

   <!--浏览器是否缓存静态内容,生产环境下需要设置为true

 

   <constantname="struts.serve.static.browserCache" value="true" />-->

 

   <!--<includefile="example.xml"/> -->

 

</struts>

数据访问层dao接口:

package com.dao;

 

import com.entity.Users;

 

/**

 * 用户接口

 * @author asus

 *

 */

publicinterface UsersDao {

 

    /**登陆验证 */

    Users loginCheck(Usersuser);

   

    /**添加的方法 */

    int addUser(Users user);

}

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

package com.dao.impl;

 

import java.util.List;

 

import javax.annotation.Resource;

 

importorg.springframework.dao.DataAccessException;

importorg.springframework.orm.hibernate3.HibernateTemplate;

importorg.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)

publicclass UsersDaoImplimplements 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

    publicintaddUser(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

 *

 */

publicinterface UsersService {

 

    /**登陆验证 */

    Users loginCheck(Usersuser);

   

    /**添加的方法 */

    int addUser(Users user);

}

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

package com.service.impl;

 

import javax.annotation.Resource;

 

importorg.springframework.stereotype.Service;

importorg.springframework.transaction.annotation.Transactional;

 

import com.dao.UsersDao;

import com.entity.Users;

import com.service.UsersService;

/**

 * 用户业务逻辑层实现类

 * @author asus

 *

 */

//@Transactional    //给实现类的所有添加事务(也可以个某一个方法添加此标注)

@Service(value="usersServiceImpl")//用于标注业务层组件(观看顺序3

publicclass UsersServiceImplimplements 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

    publicintaddUser(Users user) {

       

        return udd.addUser(user);

    }

 

}

控制器类Action

package com.action;

 

import javax.annotation.Resource;

 

importorg.apache.struts2.convention.annotation.Action;

importorg.apache.struts2.convention.annotation.Namespace;

importorg.apache.struts2.convention.annotation.ParentPackage;

importorg.apache.struts2.convention.annotation.Result;

importorg.apache.struts2.convention.annotation.Results;

importorg.springframework.context.annotation.Scope;

importorg.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")

        })

publicclass UsersActionextends 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);

        }

       

        returnaddResult==0?"register":SUCCESS;

    }

    //生成Get'Set

    public Users getUser() {

        return user;

    }

 

    publicvoidsetUser(Users user) {

        this.user = user;

    }

 

}

登陆页面:

  <body>

        <formaction="loginUser.action"method="post">

            用户名:<inputtype="text" name="user.name"/>

            密码:  <input type="password" name="user.password"/>

            <inputtype="submit" value="登录按钮">

        </form>

  </body>

注册页面:

    <body>

        <formaction="addUser.action"method="post">

            用户名:

            <inputtype="text" name="user.name">

            <br>

            密码:

            <inputtype="password" " name="user.password">

            <br>

            <inputtype="submit" value="注册">

        </form>

    </body>

成功页面:

  <body>

        操作成功!

  </body>

 

 

注:

1.   Dao

首先定义dao层接口,如UsersDao,接着编写实现类UsersDaoImpl

实现类中类上方得标明注解,格式:@Repositoryvalue=” usersDaoImpl”)那么这个注解代表指向实现类,在service层通过接口对象指向实现类

2.   service

1)定义service层的接口,如UserService,编写实现类UserServiceImpl

实现类上方得标明注解,格式:@Servicevalue=” userServiceImpl”),这个注解代表指向实现类。

2)在service层中调用dao层的对象:

由第一步说明了,先定义dao层接口,UsersDao  usersDao,在对象上方写上指向实现类的注解,使用Resource注解指向,@Resourcevalue=” usersDaoImpl”),那么接口UsersDao对象指向实现类

3.controller

1controller层类必须有注解表明,为了其他controller调用,

如:@Controllervalue=”userAction”

2)每个方法必须有注解支持,比如login方法

@Action”login”//如果跳转的页面不在WEB-INF下是在单独的文件夹中那么方法注解应该写成@Action”/login”

3)一般而言controller层中是调用service层中的接口,接口指向实现类,声明service层接口对象UserService userService,在对象上面写上指向实现类的注解@Resourcevalue=” userServiceImpl”),那么就可以调用service层中的方法。

 

 

原创粉丝点击