加载依赖
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.et</groupId>
<artifactId>ssmb</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>
<dependency>
<!--表示可以发布web程序 并启动一个tomcat-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--添加转译jsp的jar 否则无法转译jsp -->
<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>
<!--集成mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
<!--操作数据源 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>oracle</groupId>
<artifactId>oracle</artifactId>
<version>3.2.8</version>
<scope>system</scope>
<systemPath>D:\app\Administrator\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.jar</systemPath>
</dependency>
<!--引入Struts2 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.3</version>
</dependency>
<!--引入 struts2-spring集成插件 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.3</version>
</dependency>
<!--引入struts2注解 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
<version>2.3.3</version>
</dependency>
<!--引入json -->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.3</version>
<classifier>jdk15</classifier>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
</project>
实例化Struts2的StrutsPrepareAndExecuteFilter过滤器
因为在springboot中是没有web.xml这个配置文件的,所有我们必须手动实例化Struts2的StrutsPrepareAndExecuteFilter过滤器
package cn.et.utils;
import java.util.ArrayList;
import java.util.List;
import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class WebXmlConfiguration {
@Bean
/**实体化 StrutsPrepareAndExecuteFilter 过滤器*/
public FilterRegistrationBean registration() {
//FilterRegistrationBean spring提供的专门用于集成Servlet的类
FilterRegistrationBean registration = new FilterRegistrationBean();
//设置过滤器
registration.setFilter(new StrutsPrepareAndExecuteFilter());
List list = new ArrayList();
list.add("/*");
list.add("*.action");
//设置过滤的路径
registration.setUrlPatterns(list);
return registration;
}
}
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>
<!--将Struts的Bean交由Spring管理 -->
<constant name="struts.objectFactory" value="spring"></constant>
<!-- 自动扫描 -->
<constant name="struts.convention.package.locators.basePackage" value="cn"/>
<constant name="struts.convention.package.locators" value="cn"/>
<!--开启父类类加载器 因为SpringBoot是通过内嵌的Tomcat扫描加载类 而Tomcat本身也属于一个进程
所以必须打开Struts的父类类加载器 否则Struts是无法扫描到类的
-->
<constant name="struts.convention.exclude.parentClassLoader" value="false" />
<!-- <package name="default" extends="struts-default">
<action name="queryEmp" class="cn.et.controller.EmpAction" method="query">
</action>
</package> -->
</struts>
mapper
package cn.et.mapper;
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.entity.Emp;
@Mapper
public interface EmpMapper {
@Select("select EMPNO, ENAME,JOB,MGR,to_char(HIREDATE,'yyyy-mm-dd') as HIREDATE,SAL,COMM,DEPTNO " +
"from emp where ename like #{ename}")
public List<Emp> selectEmp(@Param("ename") String ename);
@Select("select count(rowid) as TC from emp where ename like #{ename}")
public int queryEmpCount(@Param("ename") String name);
@Select("select EMPNO, ENAME,JOB,MGR,to_char(HIREDATE,'yyyy-mm-dd') as HIREDATE,SAL,COMM,DEPTNO " +
"from (select t.*,rownum rn from emp t where ename like #{ename}) where rn>=#{startIndex} and rn<=#{endIndex}")
public List<Emp> queryEmp(@Param("ename") String name,@Param("startIndex")int startIndex, @Param("endIndex")int endIndex);
@Insert("insert into emp(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO)"
+"values ((select max(empno)+1 from emp),#{ename,jdbcType=VARCHAR},#{job}," +
"#{mgr},#{hiredate,jdbcType=DATE},#{sal},#{comm},#{deptno})")
public void addEmp(Emp emp);
@Delete("delete from emp where empno=#{empNo}")
public void deleteEmp(@Param("empNo") String empNo);
@Update("update emp set ENAME=#{ename,jdbcType=VARCHAR},JOB=#{job,jdbcType=VARCHAR}," +
"MGR=#{mgr,jdbcType=NUMERIC},SAL=#{sal,jdbcType=NUMERIC},COMM=#{comm,jdbcType=NUMERIC}," +
" DEPTNO=#{deptno,jdbcType=NUMERIC} where EMPNO=#{empNo,jdbcType=NUMERIC}")
public void updateEmp(Emp emp);
}
service
要按照规范创建该类的接口,这里我就不发上来了
package cn.et.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import cn.et.entity.Emp;
import cn.et.mapper.EmpMapper;
import cn.et.service.EmpService;
import cn.et.utils.PagerEntity;
import cn.et.utils.PagerUtils;
/**
* Transactional 表示该类中的所有方法都使用事务
* @author Ma-PC
*/
@Transactional
@Service
public class EmpServiceImpl implements EmpService {
@Autowired
private EmpMapper mapper;
/**
* 分页的查询操作
*/
@Transactional(readOnly=true) //readOnly=true 表示不使用事务
public PagerEntity queryEmp(int curPage,String name){
if(name== null){
name="";
}else{
name = "%"+name+"%";
}
//获取数据总条数
int totalSize = mapper.queryEmpCount(name);
//分页数据填充
PagerEntity calc = PagerUtils.calc(curPage, 10, totalSize);
//获取开始索引
int startIndex = calc.getStartIndex();
//获取结束索引
int endIndex = calc.getEndIndex();
//根据索引到数据库中查询
List<Emp> list = mapper.queryEmp(name, startIndex, endIndex);
//将list 设置到 calc对象中
calc.setData(list);
return calc;
}
/* (non-Javadoc)
* @see cn.et.emp.service.EmpService#addEmp(cn.et.emp.object.User)
*/
public void addEmp(Emp emp){
mapper.addEmp(emp);
}
/* (non-Javadoc)
* @see cn.et.emp.service.EmpService#deleteEmp(cn.et.emp.object.User)
*/
public void deleteEmp(String empNo){
mapper.deleteEmp(empNo);
}
/* (non-Javadoc)
* @see cn.et.emp.service.EmpService#updateEemp(cn.et.emp.object.User)
*/
public void updateEemp(Emp emp){
mapper.updateEmp(emp);
}
}
controller
package cn.et.controller;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import javax.servlet.ServletOutputStream;
import net.sf.json.JSONObject;
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.entity.Emp;
import cn.et.service.EmpService;
import cn.et.utils.PagerEntity;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
@Controller
public class EmpAction extends ActionSupport implements ModelDriven<Emp>{
@Autowired
private EmpService service;
private Emp emp;
private Integer curPage;
public ServletOutputStream getOS() throws IOException{
return ServletActionContext.getResponse().getOutputStream();
}
/**
*
* 使用分页功能
* curPage表示要获取数据的当前页
* @param name
* @param os
* @throws IOException
* @throws UnsupportedEncodingException
*/
@Action(value="/queryEmp")
public String query() throws IOException{
PagerEntity pe = service.queryEmp(curPage, emp.getEname());
String str = JSONObject.fromObject(pe).toString();
getOS().write(str.getBytes("UTF-8"));
return NONE;
}
/**
* 删除数据的方法
* @param enpNo
* @param os
* @throws UnsupportedEncodingException
* @throws IOException
*/
@Action(value="/delemp")
public void delEmp() throws UnsupportedEncodingException, IOException{
OutputStream os=getOS();
try {
service.deleteEmp(emp.getEmpNo().toString());
//json接受的是字符串 不可以直接只用数字
os.write("1".getBytes("utf-8"));
} catch (Exception e) {
os.write("0".getBytes("utf-8"));
}
}
@Action(value="/addemp")
public void addEmp() throws UnsupportedEncodingException, IOException{
OutputStream os=getOS();
try {
service.addEmp(emp);
os.write("1".getBytes("UTF-8"));
} catch (Exception e) {
System.out.println(e);
os.write("0".getBytes("UTF-8"));
}
}
@Action(value="/update")
public void updateEmp() throws UnsupportedEncodingException, IOException{
OutputStream os=getOS();
try {
service.updateEemp(emp);
os.write("1".getBytes("UTF-8"));
} catch (Exception e) {
System.out.println(e);
os.write("0".getBytes("UTF-8"));
}
}
public Integer getCurPage() {
return curPage;
}
public void setCurPage(Integer curPage) {
this.curPage = curPage;
}
@Override
public Emp getModel() {
if(null==emp){
emp = new Emp();
}
return emp;
}
}
ajax.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'ajax.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript">
var contextPath = "${pageContext.request.contextPath}";
function $(id){
return document.getElementById(id);
}
function sendAjax(url,param,callbacks){
var xhr= new XMLHttpRequest();
xhr.open("post", url, true);
//post请求 必须要设置 请求头的参数 否则无法使用
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
//当ajax的回调状态为4 和 页面码为200 调用callbacks并传入响应内容
xhr.onreadystatechange=function(){
if(xhr.readyState==4 && xhr.status==200){
callbacks(xhr.responseText);
}
}
xhr.send(param);
}
function add_td(td_data){
var trTd=document.createElement("td");
//添加数据
trTd.innerHTML=td_data;
return trTd;
}
var Curpage=0;
//总页数
var totalPage=0;
//总条数
var totalCount=0;
//下一页
var nextPage=1;
//上一页
var prePage=1;
function query(curPage){
if(!curPage){
curPage=1;
}
//申请xhr对象
var xhr= new XMLHttpRequest();
var name =$("name").value;
//调用xhr.open方法初始化请求参数
/* open方法的第一个参数表示 发送请求的方式
第二个参数表示 发送到那个路径
第三个参数表示 异步(true)或者同步(false)
*/
xhr.open("GET", "${pageContext.request.contextPath}/queryEmp?ename="+name+"&curPage="+curPage, true);
//设置响应的回调,当后台返回JSON后,调用xhr.onreadystatechange指定的函数;
xhr.onreadystatechange=function(){
/**
ajax调用后台action会回调该方法 多次
xhr.readyState
0: 请求未初始化
1: 服务器连接已建立
2: 请求已接收
3: 请求处理中
4: 请求已完成,且响应已就绪
在第四种状态的时候获取到json
**/
if(xhr.readyState==4 && xhr.status==200){
//获取到的JSON是个字符串转换成json对象
var allJson = JSON.parse(xhr.responseText)
//转换成json对象
var jsonObj=allJson.data;
//获取当前页
Curpage=allJson.curPage;
//总页数
totalPage=allJson.pageCount;
//总条数
totalCount=allJson.totalSize;
//下一页
nextPage=allJson.nextPage;
//上一页
prePage=allJson.prePage;
$("surspan").innerText=Curpage;
$("sum").innerText=totalPage;
$("count").innerText=totalCount;
//往表格中填充数据
var tb=$("td");
var tr=tb.getElementsByTagName("tr");
//因无刷新技术中,不会自动清除数据。所以每次查询前都需要清空表格中的数据
var length = tr.length;
for(var i=1;i<length;i++){
tb.removeChild(tr[1]);
}
//开始填充数据
for(var i=0;i<jsonObj.length;i++){
//获取jsobObj的每一行的数据
var rowData=jsonObj[i];
//创建表格的行和列
var trRow=document.createElement("tr");
//调用add_td函数创建列并充填数据 在加入到tr中
trRow.appendChild(add_td(rowData.ename));
trRow.appendChild(add_td(rowData.job));
trRow.appendChild(add_td(rowData.mgr));
trRow.appendChild(add_td(rowData.hiredate));
trRow.appendChild(add_td(rowData.sal));
trRow.appendChild(add_td(rowData.comm));
trRow.appendChild(add_td(rowData.deptno));
var td = document.createElement("td");
var inp = td.innerHTML='<input type="button" value="X" οnclick=deleteEmp('+rowData.empNo+')><input type="button" value="U" οnclick=toUpdate('+rowData.empNo+',"'+rowData.ename+'","'+rowData.job+'","'+rowData.mgr+'","'+rowData.sal+'","'+rowData.comm+'","'+rowData.deptno+'")>';
trRow.appendChild(td);
//将tr加入到表格中
tb.appendChild(trRow);
}
}
}
//真正发起请求的sned()方法
xhr.send();
}
function toUpdate(empNo,ename,job,mgr,sal,comm,deptno) {
document.getElementById('updateDiv').style.display='block';
$("empNoId").value=empNo;
$("upEname").value=ename;
$("upJOB").value=job;
$("upMGR").value=mgr;
$("upSAL").value=sal;
$("upCOMM").value=comm;
$("upDEPTNO").value=deptno;
}
function updateEmp(){
var id = $("empNoId").value
var ename = $("upEname").value
var job = $("upJOB").value
var mgr = $("upMGR").value
var sal = $("upSAL").value
var comm = $("upCOMM").value
var deptno = $("upDEPTNO").value
var param = "empNo="+id+"&ename="+ename+"&job="+job+"&mgr="+mgr+"&sal="+sal+"&comm="+comm+"&deptno="+deptno;
sendAjax(contextPath+"/update",param, function(text) {
if(text==1){
document.getElementById('updateDiv').style.display='none';
alert("修改成功");
query(Curpage);
}else{
alert("修改失败");
}
})
}
function deleteEmp(EMPNO){
var url = contextPath+"/delemp";
var param = "empNo="+EMPNO;
sendAjax(url,param,function(text){
if(text==1){
alert("删除成功");
query(Curpage);
}else{
alert("删除失败");
}
})
}
function addEmp(){
var name = $("addEname").value;
var job = $("addJOB").value;
var mgr = $("addMGR").value;
var date = $("addHIREDATE").value;
var sal = $("addSAL").value;
var comm = $("addCOMM").value;
var deptno = $("addDEPTNO").value;
var param = "ename="+name+"&job="+job+"&mgr="+mgr+"&date="+date+"&sal="+sal+"&comm="+comm+"&deptno="+deptno;
sendAjax(contextPath+"/addemp",param,function(text){
if(text==1){
document.getElementById('addDiv').style.display='none';
alert("添加成功");
query(Curpage);
}else{
alert("添加失败");
}
})
}
</script>
</head>
<body οnlοad="query(1)">
<input type="text" name="name" id="name"/>
<input type="button" value="查询" οnclick="query(1)"/>
<input type="button" value="新增" οnclick="document.getElementById('addDiv').style.display='block'">
<table id="td">
<tr>
<td>员工名称11</td>
<td>员工职称</td>
<td>所属领导</td>
<td>入司时间</td>
<td>工资</td>
<td>奖金</td>
<td>所属部门</td>
<td>操作</td>
</tr>
</table>
<input type="image" src="${pageContext.request.contextPath}/image/18.gif" οnclick="query(1)"/>
<input type="image" src="${pageContext.request.contextPath}/image/20.gif" οnclick="query(prePage)"/>
当前 <span id="surspan"></span> 页 总 <span id="sum"></span> 页 总条数 <span id="count"></span>
<input type="image" src="${pageContext.request.contextPath}/image/16.gif" οnclick="query(nextPage)"/>
<input type="image" src="${pageContext.request.contextPath}/image/14.gif" οnchange="query(totalPage)"/>
<!-- 新增的div -->
<div id="addDiv" style="display:none;position: absolute;left: 35%;top: 40%;width: 300px;height:100px;background:linear-gradient(to bottom,skyblue,gray);border: 1px solid black;">
<input type="hidden" name="_method" value="post">
员工名称: <input type='text' id="addEname" name='user.ename'><Br/>
员工职称: <input type='text' id="addJOB" name='user.job'><Br/>
所属领导: <input type='text' id="addMGR" name='user.mgr'><Br/>
入司时间: <input type='text' id="addHIREDATE" name='user.hiredate'><Br/>
工资: <input type='text' id="addSAL" name='user.sal'><Br/>
奖金: <input type='text' id="addCOMM" name='user.comm'><Br/>
所属部门: <input type='text' id="addDEPTNO" name='user.deptno'><Br/>
<input type='button' οnclick="addEmp()" value="保存">
<input type='button' value="关闭" οnclick="document.getElementById('addDiv').style.display='none'">
</div>
<!-- 修改的div -->
<div id="updateDiv" style="display:none;position: absolute;left: 35%;top: 40%;width: 300px;height:100px;background:linear-gradient(to bottom,skyblue,gray);border: 1px solid black;">
<input type="hidden" name="_method" value="put"/>
<input type='hidden' id='empNoId' name='user.empNo'/>
员工名称: <input type='text' id="upEname" name='user.ename'><Br/>
员工职称: <input type='text' id="upJOB" name='user.job'><Br/>
所属领导: <input type='text' id="upMGR" name='user.mgr'><Br/>
工资: <input type='text' id="upSAL" name='user.sal'><Br/>
奖金: <input type='text' id="upCOMM" name='user.comm'><Br/>
所属部门: <input type='text' id="upDEPTNO" name='user.deptNo'><Br/>
<input type='button' value='保存' οnclick="updateEmp()">
<input type='button' value="关闭" οnclick="document.getElementById('updateDiv').style.display='none'">
</div>
</body>
</html>
Start 启动类
package cn.et;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableTransactionManagement //表示启动全局事务支持
@SpringBootApplication
public class Start {
public static void main(String[] args) {
// TODO Auto-generated method stub
SpringApplication.run(Start.class, args);
}
}