SpringBoot集成struts2,mybatis
昨天在网上搜了一下没有SpringBoot集成过struts2的案例而且springBoot官网也没有提供参考。所以今天自己实现了一下。
首先我们需要考虑的是如果使用SpringBoot集成Struts2,可是没有web项目的web.xml配置文件,当时struts2又必须需要配置struts2的核心拦截器才能访问,所以这里我使用自己创建Bean的方法来实现集成struts2。
首先使用maven下载jar包
<project xmlns=".0.0" xmlns:xsi="" xsi:schemaLocation=".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"
".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);
}
执行结果