说句实话,很久都没使用SSH开发项目了,但是出于各种原因,再次记录一下整合方式,纯注解零配置。

一。前期准备工作

gradle配置文件:

group 'com.bdqn.lyrk.ssh.study'
version '1.0-SNAPSHOT' apply plugin: 'war' repositories {
mavenLocal()
mavenCentral()
} dependencies {
// https://mvnrepository.com/artifact/org.apache.struts/struts2-core
compile group: 'org.apache.struts', name: 'struts2-core', version: '2.5.14.1' // https://mvnrepository.com/artifact/org.apache.struts/struts2-spring-plugin
compile group: 'org.apache.struts', name: 'struts2-spring-plugin', version: '2.5.14.1'
// https://mvnrepository.com/artifact/org.springframework/spring-context
compile group: 'org.springframework', name: 'spring-context', version: '5.0.4.RELEASE'
// https://mvnrepository.com/artifact/org.springframework/spring-web
compile group: 'org.springframework', name: 'spring-web', version: '5.0.4.RELEASE' // https://mvnrepository.com/artifact/org.hibernate/hibernate-core
compile group: 'org.hibernate', name: 'hibernate-core', version: '5.2.12.Final'
// https://mvnrepository.com/artifact/org.hibernate/hibernate-validator
compile group: 'org.hibernate', name: 'hibernate-validator', version: '5.4.1.Final' // https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api
compile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
// https://mvnrepository.com/artifact/org.springframework/spring-orm
compile group: 'org.springframework', name: 'spring-orm', version: '5.0.4.RELEASE'
// https://mvnrepository.com/artifact/org.springframework/spring-tx
compile group: 'org.springframework', name: 'spring-tx', version: '5.0.4.RELEASE' // https://mvnrepository.com/artifact/com.zaxxer/HikariCP
compile group: 'com.zaxxer', name: 'HikariCP', version: '2.7.4'
// https://mvnrepository.com/artifact/org.apache.struts/struts2-convention-plugin
compile group: 'org.apache.struts', name: 'struts2-convention-plugin', version: '2.5.14.1' testCompile group: 'junit', name: 'junit', version: '4.11'
}

结构文件:

注意在classpath下创建META-INF/services/javax.serlvet.ServletContainerInitializer文件,那么在文件中定义的类在servlet容器启动时会执行onStartup方法,我们可以在这里编码创建servlet,fliter,listener等,文件内容如下:

com.bdqn.lyrk.ssh.study.config.WebInitializer

二。具体的集成实现方案

1.定义 MyAnnotationConfigWebApplicationContext

package com.bdqn.lyrk.ssh.study.config;

import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;

/**
* 自定义配置,为了在ContextLoaderListener初始化注解配置时使用
* @Author chen.nie
*/
public class MyAnnotationConfigWebApplicationContext extends AnnotationConfigWebApplicationContext { public MyAnnotationConfigWebApplicationContext(){
this.register(AppConfig.class);
}
}

2.定义WebInitializer

package com.bdqn.lyrk.ssh.study.config;

import org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter;
import org.springframework.orm.hibernate5.support.OpenSessionInViewFilter;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import javax.servlet.*;
import javax.servlet.annotation.HandlesTypes;
import javax.servlet.http.HttpServlet;
import java.util.EnumSet;
import java.util.Set; /**
* 自定义servlet容器初始化,请参考servlet规范
*/
@HandlesTypes({HttpServlet.class, Filter.class})
public class WebInitializer implements ServletContainerInitializer {
@Override
public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {
/*
创建struts2的核心控制器
*/
StrutsPrepareAndExecuteFilter strutsPrepareAndExecuteFilter = ctx.createFilter(StrutsPrepareAndExecuteFilter.class);
OpenSessionInViewFilter openSessionInViewFilter = ctx.createFilter(OpenSessionInViewFilter.class);
/*
向servlet容器中添加filter
*/
ctx.addFilter("strutsPrepareAndExecuteFilter", strutsPrepareAndExecuteFilter).
addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
FilterRegistration.Dynamic dynamic = ctx.addFilter("openSessionInViewFilter", openSessionInViewFilter);
dynamic.setInitParameter("flushMode", "COMMIT");
dynamic.setInitParameter("sessionFactoryBeanName","localSessionFactoryBean");
dynamic.setInitParameter("singleSession","true");
dynamic.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
/*
添加监听器
*/
ContextLoaderListener contextLoaderListener = new ContextLoaderListener();
ctx.addListener(contextLoaderListener);
ctx.setInitParameter("contextClass", "com.bdqn.lyrk.ssh.study.config.MyAnnotationConfigWebApplicationContext"); }
}

3.定义AppConfig

package com.bdqn.lyrk.ssh.study.config;

import com.zaxxer.hikari.HikariDataSource;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource;
import java.util.Properties; /**
* spring基于注解配置
*
* @author chen.nie
* @date 2018/3/21
**/
@Configuration
@ComponentScan("com.bdqn")
@EnableTransactionManagement
public class AppConfig { /**
* 定义数据源
* @return
*/
@Bean
public HikariDataSource dataSource() {
HikariDataSource hikariDataSource = new HikariDataSource();
hikariDataSource.setDriverClassName("com.mysql.jdbc.Driver");
hikariDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/MySchool?characterEncoding=utf-8&useSSL=false");
hikariDataSource.setUsername("root");
hikariDataSource.setPassword("root");
return hikariDataSource;
} /**
* 定义spring创建hibernate的Session对象工厂
* @param dataSource
* @return
*/
@Bean
public LocalSessionFactoryBean localSessionFactoryBean(@Autowired DataSource dataSource) {
LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
localSessionFactoryBean.setDataSource(dataSource);
localSessionFactoryBean.setPackagesToScan("com.bdqn.lyrk.ssh.study.entity");
Properties properties = new Properties();
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
properties.setProperty("hibernate.show_sql", "true");
localSessionFactoryBean.setHibernateProperties(properties);
return localSessionFactoryBean;
} /**
* 定义hibernate事务管理器
* @param localSessionFactoryBean
* @return
*/
@Bean
public HibernateTransactionManager transactionManager(@Autowired SessionFactory localSessionFactoryBean) {
HibernateTransactionManager hibernateTransactionManager = new HibernateTransactionManager(localSessionFactoryBean);
return hibernateTransactionManager;
} /**
* 定义hibernateTemplate
* @param localSessionFactoryBean
* @return
*/
@Bean
public HibernateTemplate hibernateTemplate(@Autowired SessionFactory localSessionFactoryBean) {
HibernateTemplate hibernateTemplate = new HibernateTemplate(localSessionFactoryBean);
return hibernateTemplate;
}
}

4.定义实体类

package com.bdqn.lyrk.ssh.study.entity;

import javax.persistence.*;

@Table(name = "student")
@Entity
public class StudentEntity { @GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
private Integer id; @Column(name = "stuName")
private String stuName; @Column(name = "password")
private String password; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getStuName() {
return stuName;
} public void setStuName(String stuName) {
this.stuName = stuName;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
}
}

5.定义service

package com.bdqn.lyrk.ssh.study.service;

import com.bdqn.lyrk.ssh.study.entity.StudentEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; @Service
public class StudentService { @Autowired
private HibernateTemplate hibernateTemplate; @Transactional
public int save(StudentEntity studentEntity){
hibernateTemplate.save(studentEntity);
return studentEntity.getId();
}
}

6.定义action 请大家留意关于struts2注解的注意事项

package com.bdqn.lyrk.ssh.study.action;

import com.bdqn.lyrk.ssh.study.entity.StudentEntity;
import com.bdqn.lyrk.ssh.study.service.StudentService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
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.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope; /**
* struts2注解配置,注意:
* 1.所在的包名必须以action结尾
* 2.Action要必须继承ActionSupport父类;
* 3.添加struts2-convention-plugin-xxx.jar
*
* @author chen.nie
* @date 2018/3/21
**/
@Scope("prototype")
@ParentPackage("struts-default") //表示继承的父包
@Namespace(value = "/") //命名空间
public class IndexAction extends ActionSupport { @Autowired
private StudentService studentService; @Action(value = "index", results = {@Result(name = "success", location = "/index.jsp")})
public String index() {
StudentEntity studentEntity = new StudentEntity();
studentEntity.setStuName("test");
studentEntity.setPassword("123");
studentService.save(studentEntity);
ActionContext.getContext().getContextMap().put("student", studentEntity);
return com.opensymphony.xwork2.Action.SUCCESS;
}
}

7.index.jsp

<%--
Created by IntelliJ IDEA.
User: chen.nie
Date: 2018/3/21
Time: 下午6:55
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>ssh基于零配置文件整合</title>
</head>
<body>
新增的学生id为:${student.id}
</body>
</html>

启动tomcat,访问http://localhost:8080/index得到如下界面:

总结:前面我写过ssm基于注解零配置整合,那么ssh其思路也大体相同,主要是@Configuration @Bean等注解的使用,但是大家请留意的是struts2的注解与servlet的规范(脱离web.xml,手动添加servlet filter listener等)

spring+hibernate+struts2零配置整合的更多相关文章

  1. SSH(struts+spring+hibernate)常用配置整理

    SSH(struts+spring+hibernate)常用配置整理 web.xml配置 <?xml version="1.0" encoding="UTF-8&q ...

  2. Spring4.X + spring MVC + Mybatis3 零配置应用开发框架搭建详解(1) - 基本介绍

    Spring4.X + spring MVC + Mybatis3 零配置应用开发框架搭建详解(1) - 基本介绍 spring集成 mybatis Spring4.x零配置框架搭建 两年前一直在做后 ...

  3. Spring 基于注解零配置开发

    本文是转载文章,感觉比较好,如有侵权,请联系本人,我将及时删除. 原文网址:< Spring 基于注解零配置开发 > 一:搜索Bean 再也不用在XML文件里写什么配置信息了. Sprin ...

  4. idea spring+springmvc+mybatis环境配置整合详解

    idea spring+springmvc+mybatis环境配置整合详解 1.配置整合前所需准备的环境: 1.1:jdk1.8 1.2:idea2017.1.5 1.3:Maven 3.5.2 2. ...

  5. Struts2 Convention Plugin ( struts2 零配置 )

    Struts2 Convention Plugin ( struts2 零配置 ) convention-plugin 可以用来实现 struts2 的零配置.零配置的意思并不是说没有配置,而是通过约 ...

  6. Spring+Hibernate+Struts(SSH)框架整合

    SSH框架整合 前言:有人说,现在还是流行主流框架,SSM都出来很久了,更不要说SSH.我不以为然.现在许多公司所用的老项目还是ssh,如果改成流行框架,需要成本.比如金融IT这一块,数据库dao层还 ...

  7. Spring+Hibernate+struts2+JPA 注解+跨域//完成手机端点击加载更多 下拉加载更多

    一.使用IDEA新建一个maven项目(student) 1.1.0编写pom文件,添加项目所需要的包 <?xml version="1.0" encoding=" ...

  8. 菜鸟学Struts2——零配置(Convention )

    又是周末,继续Struts2的学习,之前学习了,Struts的原理,Actions以及Results,今天对对Struts的Convention Plugin进行学习,如下图: Struts Conv ...

  9. Struts2零配置介绍(约定访问)

    从struts2.1开始,struts2 引入了Convention插件来支持零配置,使用约定无需struts.xml或者Annotation配置 需要 如下四个JAR包 插件会自动搜索如下类 act ...

随机推荐

  1. Something about SeekingJob---Resume简历

    这几天脑子里满满的装的都是offer.offer.offer快到碗里来,但是offer始终不是巧克力,并没那么甜美可口易消化. 找工作刚开始,就遇到了不小的阻力,看到Boss直聘上各种与IT相关的工作 ...

  2. 织梦dedecms默认网站地图sitemap.html优化

    网站地图对于网站优化很重要,搜索引擎就是靠网站地图去收录网站页面,本文主要讲解优化织梦自带的网站地图功能.     织梦自带的网站地图使用方法:织梦后台--生成--HTML更新--更新网站地图,可以在 ...

  3. mint-ui在vue中的使用。

    首先放上mint-ui中文文档 近来在使用mint-ui,发现部分插件在讲解上并不是很详细,部分实例找不到使用的代码.github上面的分享,里面都是markdown文件,内容就是网上的文档 刚好自己 ...

  4. 职场选择之大公司 VS 小公司

    其实这是个非常难回答的问题,很多职场新人都会有类似的顾虑和疑问. 这个问题就好比业界比较容易引起争议的编程语言哪个是最好的一样.大公司还是小公司里面发展,只有身处其中才能体会,如人饮水,冷暖自知. 笔 ...

  5. Andrew Ng机器学习第一章——初识机器学习

    机器学习的定义 计算机程序从经验E中学习,解决某一任务T.进行某一性能度量P,通过P测定在T上的表现因E而提高. 简而言之:程序通过多次执行之后获得学习经验,利用这些经验可以使得程序的输出结果更为理想 ...

  6. web api 如何通过接收文件流的方式,接收客户端及前端上传的文件

    服务端接收文件流代码: public async Task<HttpResponseMessage> ReceiveFileByStream() { var stream = HttpCo ...

  7. 使用 HttpClient 请求 Web Api

    1.获取 post 请求 body 内容 [HttpPost] public string GetId() { //如果方法参数里面有 [FromBody],则需要重新调整内容指针,再进行读取. // ...

  8. 新概念英语(1-123)A trip to Australia

    Who is the man with the beard?(胡须)A:Look, Scott. This is a photograph I took during my trip to Austr ...

  9. spring5——Aop的实现原理(动态代理)

    spring框架的核心之一AOP,面向切面编程是一种编程思想.我对于面向切面编程的理解是:可以让我们动态的控制程序的执行流程及执行结果.spring框架对AOP的实现是为了使业务逻辑之间实现分离,分离 ...

  10. 使用 C#/.NET Core 实现单体设计模式

    本文的概念内容来自深入浅出设计模式一书 由于我在给公司做内培, 所以最近天天写设计模式的文章.... 单体模式 Singleton 单体模式的目标就是只创建一个实例. 实际中有很多种对象我们可能只需要 ...