SpringBoot集成struts2,mybatis

昨天在网上搜了一下没有SpringBoot集成过struts2的案例而且springBoot官网也没有提供参考。所以今天自己实现了一下。

首先我们需要考虑的是如果使用SpringBoot集成Struts2,可是没有web项目的web.xml配置文件,当时struts2又必须需要配置struts2的核心拦截器才能访问,所以这里我使用自己创建Bean的方法来实现集成struts2。

首先使用maven下载jar包

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>cn.et</groupId>
  <artifactId>SSMSA</artifactId>
  <version>0.0.1-SNAPSHOT</version>
 	 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
    </parent>
	<dependencies>
		<!-- 表示可以发布web程序 自动启动一个tomcat -->
	    <dependency>
	        <groupId>org.springframework.boot</groupId>
	        <artifactId>spring-boot-starter-web</artifactId>
	    </dependency>
		<!-- mybatis集成 -->
		<dependency>
		  <groupId>org.mybatis.spring.boot</groupId>
		  <artifactId>mybatis-spring-boot-starter</artifactId>
		  <version>1.2.1</version>
		</dependency>
		<!-- 操作数据源 -->
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<!-- 添加转译jsp的jar -->
	    <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-jasper</artifactId>
			<scope>provided</scope>
		</dependency>
		<!-- 自动监听配置文件和jsp -->
		<dependency>
	        <groupId>org.springframework.boot</groupId>
	        <artifactId>spring-boot-devtools</artifactId>
	        <optional>true</optional>
	    </dependency>
		<dependency>
		    <groupId>oracle</groupId>
		    <artifactId>oracle</artifactId>
		    <version>3.2.8</version>
			<scope>system</scope>
		    <systemPath>C:\app\Administrator\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.jar</systemPath>
		</dependency>
		<!-- dbcp数据源 -->
	    <dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>1.4</version>
		</dependency>
		<dependency>
		  <groupId>org.apache.struts</groupId>
		  <artifactId>struts2-core</artifactId>
		  <version>2.3.28</version>
		</dependency>
		<dependency>
		  <groupId>org.apache.struts</groupId>
		  <artifactId>struts2-spring-plugin</artifactId>
		  <version>2.3.28</version>
		</dependency>
		<dependency>
		  <groupId>org.apache.struts</groupId>
		  <artifactId>struts2-convention-plugin</artifactId>
		  <version>2.3.28</version>
		</dependency>
		<dependency>
		  <groupId>net.sf.json-lib</groupId>
		  <artifactId>json-lib</artifactId>
		  <version>2.2</version>
		  <classifier>jdk15</classifier>
		</dependency>
	</dependencies>
</project>


实现struts2拦截器的配置类

package cn.et.ssmsa.utils;

import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 这个类是集合SpringBoot集成struts2的关键
 * 
 * 注解Configuration表示当前类是一个配置类 主要功能是用于创建Bean实例
 * 
 * 注解Bean表示返回值类型的实例创建Bean
 * SpringBoot的标准是 方法名与返回值类型  相同,首字母小写
 * @author Administrator
 *
 */
@Configuration
public class ServletFilterConfig {
	
	/**
	 * 因为这里是使用main方法加载的所以没有配置文件这里需要将struts2的核心拦截器实例
	 * 否则无法访问struts2
	 * 而web项目中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中配置的拦截器类创建这样才实现了struts2的核心配置
	 * 而路径如果不配置的话默认的就是拦截所有路径
	 * @return
	 */
	@Bean
	public StrutsPrepareAndExecuteFilter strutsPrepareAndExecuteFilter(){
		return new StrutsPrepareAndExecuteFilter();
	}
	
}

struts需要扫描Action配置文件或者注解,所以这里我们需要配置struts.xml

<?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">

<struts>
	<!-- 表示从cn包下开始扫描 -->
	<constant name="struts.convention.package.locators.basePackage" value="cn"></constant>
	<!-- 表示从cn包下开始加载注解 -->
	<constant name="struts.convention.package.locators" value="cn"></constant>
	<!-- 表示struts的工厂类交给Spring实例 -->
	<constant name="struts.objectFactory" value="spring"></constant>
	<!-- 
		SpringBoot集成struts2这个必须要配置  
		表示不把SpringBoot内置Tomcat的类加载器排除在外  
		 默认是true 将类加载器排除了所以就算上面配置
		如果这个没有配置就算运行不报错但是Action还是访问不了 
	-->
	<constant name="struts.convention.exclude.parentClassLoader" value="false"></constant>
</struts>

当然SpringBoot的资源文件application.properties是必不可少的了

#数据库操作的四要素
spring.datasource.url=jdbc\:oracle\:thin\:@localhost\:1521\:orcl
spring.datasource.username=scott
spring.datasource.password=tiger
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
#开发时建议使用DEBUG模式 可以用于定位错误
logging.level.root=DEBUG
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=DEBUG
#用于打印数据库执行的SQL语句
spring.jpa.show-sql=true

接下来创建程序入口

package cn.et.ssmsa;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * 使用SpringBoot加载SpringBoot内置的Tomcat容器
 * @author Administrator
 *
 */
//定义全局事务
@EnableTransactionManagement
@SpringBootApplication
public class MainApplication {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		SpringApplication.run(MainApplication.class, args);
	}

}

控制层的action类

package cn.et.ssmsa.control;


import java.io.IOException;
import java.io.OutputStream;
import java.util.List;

import net.sf.json.JSONArray;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import cn.et.ssmsa.entity.Emp;
import cn.et.ssmsa.entity.PageEntity;
import cn.et.ssmsa.services.EmpService;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
 * Controll层 
 * @author Administrator
 * 因为这里需要解决对Oracle数据中EMP表的CRUD所以我定义了一个实体类
 * 根据页面传入的值,这里需要使用模型驱动
 * curPage则是分页    表示当前页
 * 这里整合了Ajax 而stuts2又不能直接返回值
 * 所以这里我使用了JSONArray将最后的结果转换为Json数组
 * OutputStream对象将结果返回给页面
 */
@Controller
public class SpringMvcAction extends ActionSupport implements ModelDriven<Emp>{
	
	@Autowired
	private EmpService sms;
	//实体类对象
	private Emp emp;
	//当前页
	private int curPage;
	
	/**
	 * 查询方法
	 * @return
	 * @throws IOException
	 */
	@Action(value="/query")
	public String query() throws IOException{
		//获取 输出流
		OutputStream os=ServletActionContext.getResponse().getOutputStream();
		if(emp.getEname()==null){
			emp.setEname("");
		}
		//获取所有的员工信息
		emp.setEname("%"+emp.getEname().trim().toUpperCase()+"%");
		//获取查询出来经过处理的分页结果
		PageEntity page=sms.query(emp.getEname(),curPage);
		//将分页结果转换为json数组并且转换为字符串
		String json=JSONArray.fromObject(page).toString();
		//将结果返回给页面
		os.write(json.getBytes("UTF-8"));
		
		return NONE;
		
	}
	
	/**
	 * 修改方法
	 * @throws IOException
	 */
	@Action(value="/update")
	public void update() throws IOException{
		OutputStream os=ServletActionContext.getResponse().getOutputStream();
		try {
			sms.update(emp);
			os.write("1".getBytes());
		} catch (Exception e) {
			os.write("2".getBytes());
		}
	}
	
	/**
	 * 删除方法
	 * @throws IOException
	 */
	@Action(value="/del")
	public void delete() throws IOException{
		OutputStream os=ServletActionContext.getResponse().getOutputStream();
		try {
			sms.delete(emp.getEmpno().toString());
			os.write("1".getBytes());
		} catch (Exception e) {
			os.write("2".getBytes());
		}
		
	}
	
	/**
	 * 增加方法
	 * @throws IOException
	 */
	@Action(value="/add")
	public void add() throws IOException{
		OutputStream os=ServletActionContext.getResponse().getOutputStream();
		try {
			sms.save(emp);
			os.write("1".getBytes());
		} catch (Exception e) {
			os.write("2".getBytes());
		}
	}
	
	@Action(value="/deptno")
	public List queryDeptno(){
		
		return sms.queryDeptno();
	}

	public int getCurPage() {
		return curPage;
	}

	public void setCurPage(int curPage) {
		this.curPage = curPage;
	}

	public Emp getModel() {
		if(emp==null){
			emp=new Emp();
		}
		return emp;
	}
}

这里服务层的代码就不写出来了,最后将mybatis的模型层代码展示出来

package cn.et.ssmsa.dao;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import cn.et.ssmsa.entity.Emp;

/**
 * 这个类为Mybatis的映射接口类
 * 这里我使用的是纯注解方式来对数据库进行操作
 * @author Administrator
 *
 */
//这里必须使用Mapper注解否则无法实例
@Mapper
public interface EmpDao {
	
	/**
	 * 查询方法
	 * @param ename
	 * @return
	 */
	@Select("select * from (select e.*,rownum rn from emp e where ename like #{ename}) where rn>=#{startIndex} and rn<=#{endIndex}")
	public List<Emp> query(@Param("ename")String ename,
			@Param("startIndex")int startIndex,
			@Param("endIndex")int endIndex);
	
	/**
	 * 删除方法
	 * @param empno
	 */
	@Delete("delete emp where empno=#{0}")
	public void delete(String empno);
	
	/**
	 * 修改方法
	 * @param emp
	 */
	@Update("update emp set ename=#{emp.ename},job=#{emp.job},mgr=#{emp.mgr},hiredate=#{emp.hiredate},sal=#{emp.sal},comm=#{emp.comm},deptno=#{emp.deptno} where empno=#{emp.empno}")
	public void update(@Param("emp")Emp emp);
	
	/**
	 * 插入方法
	 * @param emp
	 */
	@Insert("insert into emp values(#{emp.empno},#{emp.ename},#{emp.job},#{emp.mgr},sysdate,#{emp.sal},#{emp.comm},#{emp.deptno})")
	public void addEmp(@Param("emp")Emp emp);
	/**
	 * 查询部门编号方法
	 * @return
	 */
	@Select("select deptno from emp group by deptno")
	public List queryDeptno();
	
	/**
	 * 查询数据总记录条数
	 * @param ename
	 * @return
	 */
	@Select("select count(rowid) from emp where ename like #{ename}")
	public int queryTotal(@Param("ename")String ename);
	
}

执行结果

最后希望能帮助到有需要的朋友


猜你喜欢

转载自blog.csdn.net/qq1105515654/article/details/73744349