基于已构建S2SH项目配置全注解方式简化配置文件

如果还不熟悉s2sh项目搭建的朋友可以先阅读

eclipse环境下基于已构建struts2项目整合spring+hibernate

这两篇文章熟悉一下。

本文是基于以上两篇文章的基础构建的,以下给出全注解方式配置S2SH项目的参考步骤。

第一步:实体类映射数据库表,简化hibernate通过xml配置文件映射

首先我们新建实体类作为测试,包结构如图所示:

新建User到model包下,实体类字段信息如下所示:

package wjt.com.test.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.GenericGenerator;

import java.util.Date;

@Entity
@Table(name="wjt_user")
public class User {

    @Id
    @Column(name="ID",length=32)
    //主键生成策略
    @GeneratedValue(generator = "paymentableGenerator")
    //hibernate的主键生成策略,name属性与@GeneratedValue的generator = "paymentableGenerator"对应,
    //strategy 指定具体生成器的类名(指定生成策略)
    @GenericGenerator(name="paymentableGenerator",strategy="uuid")
    private String id;

    private String name;

    private String types;

    @Temporal(value=TemporalType.DATE)
    private Data date;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTypes() {
        return types;
    }

    public void setTypes(String types) {
        this.types = types;
    }

}

hibernate各注解的用途及其属性参考前辈的文章:

hibernate用注解配置实体类的映射

实体类准备完毕,我们需要将其交给hibernate工厂扫描映射到数据库表,需要在hibernate的session工厂中配置packagesToScan属性,给出applicationContect.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:task="http://www.springframework.org/schema/task" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
">

    <!-- 数据源配置 -->
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url"
            value="jdbc:mysql://localhost:3306/wjt_test?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull&amp;autoReconnect=true" />
        <property name="username" value="root" />
        <property name="password" value="wujingtao" />

    </bean>

    <!-- 配置hibernate session工厂 -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
                <prop key="hibernate.show_sql">false</prop>
                <prop key="hibernate.format_sql">true</prop>
            </props>
        </property>

        <!-- 扫描实体类映射数据库表的包 -->
        <property name="packagesToScan">
            <list>
                <value>com.wjt.model</value>
            </list>
        </property>

    </bean>

</beans>

第二步:基于注解方式配置IOC

在原项目中service层、dao层中实现类添加注解完成bean对spring容器的注册,去掉采用set访问器属性注入的方式,增加注解声明,代码改写如下:

dao层:

package wjt.com.test.dao.impl;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import wjt.com.test.dao.TestDaoI;

@Repository("testDao")//这里是bean注册到spring容器
public class TestDaoImpl implements TestDaoI{

    @Autowired//这里是将声明的bean注入,其中sessionFactory依旧是在配置文件中注册的
    private SessionFactory sessionFactory;

    private Session getCurrentSession() {
        try {
            return sessionFactory.getCurrentSession();
        } catch (HibernateException e) {
            return sessionFactory.openSession();
        }
    }

    @Override
    public void testDaoMethod() {
        System.out.println("dao层测试方法...");
        if(getCurrentSession()!=null) {
            System.out.println("session工厂注入成功!");
        }

    }

}

service层:

package wjt.com.test.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import wjt.com.test.dao.TestDaoI;
import wjt.com.test.service.TestServiceI;

@Service("testService")
public class TestServiceImpl implements TestServiceI{

    @Autowired
    private TestDaoI testDao;

    @Override
    public void testServiceMethod() {
        System.out.println("service层测试方法...");
        testDao.testDaoMethod();
    }

}

action层:

package wjt.com.test.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.beans.factory.annotation.Autowired;

import com.opensymphony.xwork2.ActionSupport;

import wjt.com.test.service.TestServiceI;

@Namespace("/")
@Action(value = "testAction", results = {
        @Result(name = "success", location = "/index.jsp"),
    })
public class TestAction extends ActionSupport {

    @Autowired
    private TestServiceI testService;

    public String execute() throws Exception {
        System.out.println("struts==========================");
        testService.testServiceMethod();
        return "success";
    }
}

TestAction类名上方的注解在后文中有解释,这里先挂问号。

到这里还需要在applicationContext.xml中声明spring对注解的支持以及spring容器对已注册bean进行扫描完成属性的注入从而达到控制反转的目的,

在<beans></beans>节点下增加如下配置:

    <!-- 注解支持 -->
    <context:annotation-config />
    <!-- 扫描注册bean并注入属性 -->
    <context:component-scan base-package="wjt.com.**"></context:component-scan>

其中*号表示扫描wjt.com包及其子包下所有注册的bean。到这里spring+hibernate注解方式配置已全部完成,对上述注解不太熟悉的可以参考前辈文章:

Spring 注解详解

第三步:struts2中action的注解方式配置

首先我们需要引入struts2对注解支持的jar包:

这个时候需要我们在TestAction类名上方添上刚才挂问号的注解,对于Action注解的解释请参考:

Struts2注解详解

我们这里注解的意义为当TestAction中默认方法返回“success”时页面跳转到index.jsp

接着我们需要简化struts2的配置文件,给出简化后的配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
            "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
            "http://struts.apache.org/dtds/struts-2.3.dtd"><!-- 这里要和struts2版本号统一 -->

<struts>

    <!-- 告知Struts2运行时使用Spring来创建对象 -->
    <constant name="struts.objectFactory" value="spring" />

    <package name="default" namespace="/" extends="struts-default">

    </package>

</struts>

第三步:测试

到这里一个完整的基于全注解方式配置s2sh项目就完成了,启动项目测试是否达到我们的要求:

一、项目启动数据库应当已建立一张wjt_user表

二、访问TestAction时应当跳转到index.jsp页面

为了验证测试我们在index.jsp的body标签内写入“这是Mr至简的第一个全注解方式配置S2SH项目”。

启动项目后数据库截图如下:

浏览器地址栏输入:http://localhost:8080/SSHDemo/testAction 请求后截图如下:

以上就是关于S2SH项目全注解配置的参考方案,有不合理的地方还请各位读者指出。

时间: 2024-10-09 21:10:27

基于已构建S2SH项目配置全注解方式简化配置文件的相关文章

eclipse环境下基于已构建struts2项目整合spring+hibernate

本文是基于已构建的struts2项目基础上整合 spring+hibernate,若读者还不熟悉struts2项目,请先阅读 实现步骤: 第一步:引入spring所需jar包,如下图所示: 第二步:导入hibernate所需jar包,如下图中被选中jar文件: 第三步:导入struts-spring整合包,暂且就这么称呼吧 第四步:导入MySQL驱动包: 第五步:所有准备工作就绪后,接下来创建spring与hibernate配置文件,命名为applicationContext.xml,配置如下所

【1】springmvc4 + servlet3 零配置全注解入门项目helloword

自从servlet3.0支持注解,使得javaweb项目使用全注解成为可能. 注解化将成为javaweb的发展方向.包括spring去年推出的spring-boot也是全部使用注解. 代码:https://github.com/heikehuan/learning-technology-code/tree/master/springmvc-annotation-web

全注解方式配置SpringMVC

1.在J2EE三层的注解: 表现层:@Controller 业务层: @Service 持久层: @Repository 其他: @Component 注解起效需要几方: 1.需要一个注解 2.直接贴在什么地方 3.第三的扫描程序. 步骤: 1.开启注解扫描 <context:component-scan base-package="com._520it.springmvc.hello"/>  扫描哪个地方,这个是扫描一个包(如果扫描全部怎么配) 2.在对应的类上贴对应的注

springmvc3.2+spring+hibernate4全注解方式整合(一)

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.

spring3.0定时器 xml配置和注解方式

1.xml配置方式 web.xml <!-- 配置spring监听器和配置文件路径 -->     <context-param>         <param-name>contextConfigLocation</param-name>         <param-value>classpath:applicationContext.xml</param-value>     </context-param>    

springmvc3.2+spring+hibernate4全注解方式整合(四)

以上是工程文件,下面开始测试 package test.testservice; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.t

springmvc3.2+spring+hibernate4全注解方式整合(三)

service接口 package com.fangjian.core.platform.service; import com.fangjian.core.platform.po.User; public interface UserService { void saveUser(User user); } service实现 package com.fangjian.core.platform.service.impl; import org.springframework.beans.fa

ThinkPHP多应用/项目配置技巧(使用同一配置文件)--(十六)

原文:ThinkPHP多应用/项目配置技巧(使用同一配置文件)--(十六) ThinkPHP多应用配置技巧(没有使用分组,这是通过入口文件产生的Home.Admin)----很实用! 比如:现在有Home.Admin应用 问题:前台后台使用数据库的时候,都得各自配置自己的config文件 需求:现在想HOME/Aamin都使用一个公共文件配置文件,统一修改好维护 步骤: 1--在项目根文件夹下(入口文件同级目录下),创建一个公共的config.php文件 <?php -->这里写了配置文件前后

springmvc3.2+spring+hibernate4全注解方式整合(二)

jdbc.properties #hibernate settings hibernate.show_sql=true hibernate.format_sql=true hibernate.cache.use_query_cache=true hibernate.cache.provider_class=net.sf.ehcache.hibernate.SingletonEhCacheProvider #mysql version database setting jdbc.driver=co