和ssmaboot不一样的地方
pom.xml
<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">
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
</parent>
<dependencies>
<!-- 表示可以发布web程序 自动启动一个tomcat -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 集成struts2 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.3</version>
</dependency>
<!-- 集成mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.1</version>
</dependency>
<!-- 自动监听配置文件和jsp
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</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>
<!-- 配置本地的jar -->
<dependency>
<groupId>ojdbc</groupId>
<artifactId>objdc1</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>
<!-- 添加数据源 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
</dependency>
<!-- json的jar -->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.3</version>
<classifier>jdk15</classifier>
</dependency>
</dependencies>
<modelVersion>4.0.0</modelVersion>
<groupId>cn.et</groupId>
<artifactId>ssmaboot</artifactId>
<version>0.0.1-SNAPSHOT</version>
</project>
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>
<!-- <package name="day0609" extends="struts-default">
<action name="queryPaginEmp" class="cn.et.day20170606.controller.EmpJaxaAction" method="queryPagingEmp">
</action>
<action name="insertEmp" class="cn.et.day20170606.controller.EmpJaxaAction" method="insertEmp">
</action>
<action name="updateEmp" class="cn.et.day20170606.controller.EmpJaxaAction" method="updateEmp">
</action>
<action name="deleteEmp" class="cn.et.day20170606.controller.EmpJaxaAction" method="deleteEmp">
</action>
</package>
<package name="Struts2_AJAX_DEMO" extends="json-default">
<action name="JsonPlugin" class="cn.et.day20170606.controller.EmpJaxaAction">
<result type="json" />
</action> #struts.convention.package.locators.disable=false
#struts.convention.action.disableScanning=false
</package>-->
<!-- 有时候不扫描注解 要用这个 因为它的类加载器过滤了Tomcat扫描到的类-->
<constant name="struts.convention.exclude.parentClassLoader" value="false" />
<constant name="struts.convention.action.suffix" value="Action"></constant>
<constant name="struts.convention.package.locators.basePackage" value="cn"></constant>
<constant name="struts.convention.package.locators" value="cn"></constant>
<constant name="struts.convention.package.locators.disable" value="false"/>
<constant name="struts.convention.action.disableScanning" value="false"/>
<constant name="struts.objectFactory" value="spring"/>
</struts>
连接四要素
mysource.url=jdbc:oracle:thin:localhost:1521:orcl
mysource.username=scott
mysource.password=tiger
mysource.driverClassName=oracle.jdbc.OracleDriver
创建bean
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 相当于标示 该类是一个bean的容器
* @author Administrator
* @Configuration 标示这个类用来创建bean的
*/
@Configuration
public class BeanContainer {
/**
* 表示调用该方法产生一个bean
* 方法名是bean的id
* @return
*/
@ConfigurationProperties(prefix="mysource")
@Bean
public DataSource dataSource(){
BasicDataSource dataSource=new BasicDataSource();
return dataSource;
}
@Bean
public StrutsPrepareAndExecuteFilter strutsPrepareAndExecuteFilter(){
StrutsPrepareAndExecuteFilter s=new StrutsPrepareAndExecuteFilter();
return s;
//如果要知道拦截什么用这个可以知道拦截什么
/*FilterRegistrationBean registration = new FilterRegistrationBean(s);
registration.setEnabled(false);
//可以拦截多个所以就是一个集合
List<String> list=new ArrayList<String>();
list.add("/*");
list.add("*.action");
registration.setUrlPatterns(list);
return registration;*/
}
}
Controller
import java.io.IOException;
import java.util.List;
import net.sf.json.JSONObject;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;
/**
*
* @RestController 目标就是配置
* 消息转换器 jackson
* 在action上添加 @ResponseBody
* 没有ajax(无刷新)可以用Controller
* @author Administrator
*http://localhost:8080/day0606/queryEmp
*/
/**
* 用ajax用至二个注解@RestController
*/
@Controller
@Namespace(value="/day0609")
public class EmpJaxaAction extends ActionSupport implements ModelDriven<EmpEntity>,Preparable{
@Autowired
private EmpJaxaService empService;
private EmpEntity emp;
private Integer pagin;
/**
*查询数据库的分页数据方法
*/
/*@Action(value="/queryPaginEmp")
public PagingEntity queryPagingEmp(){
PagingEntity p=empService.queryPaginEmp(emp.getEname(), pagin);
return p;
}
@Action(value="/queryPaginEmp")
public JSONObject queryPagingEmp(){
//获取解耦他的application对象
Map<String,Object> map=ActionContext.getContext().getApplication();
PagingEntity p=empService.queryPaginEmp(emp.getEname(), pagin);
JSONObject json=JSONObject.fromObject(p);
return json;
}*/
@Action(value="/queryPaginEmp")
public void queryPagingEmp(){
PagingEntity p=empService.queryPaginEmp(emp.getEname(), pagin);
JSONObject json=JSONObject.fromObject(p);
try {
ServletActionContext.getResponse().getWriter().print(json.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
*查询数据库的数据方法
*/
@Action(value="/queryEmp")
public List queryEmp(){
return empService.queryEmp(emp.getEname());
}
/**
*新增数据库的数据方法
*成功返回1 失败返回0
* @throws IOException
*/
@Action(value="/insertEmp")
public void insertEmp() throws IOException{
try{
empService.insertEmp(emp);
ServletActionContext.getResponse().getWriter().print("1");
}catch (Exception e) {
ServletActionContext.getResponse().getWriter().print("0");
}
}
/**
*更新数据库的数据方法
* @throws IOException
*/
@Action(value="/updateEmp")
public void updateEmp() throws IOException{
try{
empService.updateEmp(emp);
ServletActionContext.getResponse().getWriter().print("1");
}catch (Exception e) {
ServletActionContext.getResponse().getWriter().print("0");
}
}
/**
* 删除数据库数据的方法
* @throws IOException
*/
@Action(value="/deleteEmp")
public void deleteEmp() throws IOException{
try{
empService.deleteEmp(emp.getEmpno());
ServletActionContext.getResponse().getWriter().print("1");
}catch (Exception e) {
ServletActionContext.getResponse().getWriter().print("0");
}
}
public EmpJaxaService getEmpService() {
return empService;
}
public void setEmpService(EmpJaxaService empService) {
this.empService = empService;
}
public void prepare() throws Exception {
if(emp==null){
emp=new EmpEntity();
}
}
public EmpEntity getModel() {
return emp;
}
public Integer getPagin() {
return pagin;
}
public void setPagin(Integer pagin) {
this.pagin = pagin;
}
}
jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript">
var path="${pageContext.request.contextPath}/day0609";
//根据id获取对象
function $(id){
return document.getElementById(id);
}
//和div赋值
function toUpdate(empno,ename,job,mgr,hiredate,sal,comm,deptno){
$('updateDiv').style.display='block';
$('empNoId').value=empno;
$('updateEname').value=(ename=='null'?'':ename);
$('updateJob').value=(job=='null'?'':job);
$('updateMgr').value=mgr;
$('updateHiredate').value=(hiredate=='null'?'':hiredate);
$('updateSal').value=sal;
$('updateComm').value=comm;
$('updateDeptno').value=deptno;
}
/**
封装ajax
**/
function sendAjax(method,url,callback,param){
var xmlHttp=new XMLHttpRequest();
//向服务器发出请求
//规定请求的类型、URL 以及是否异步处理请求。
//method:请求的类型;GET 或 POST
//url:文件在服务器上的位置
//async:true(异步)或 false(同步)
xmlHttp.open(method,url,true);
//设置响应的回调 当后台的json返回后 自动调用xhr.onreadystatechange指定的函数
xmlHttp.onreadystatechange=function(){
if(xmlHttp.readyState==4 && xmlHttp.status==200){
//成功后调用第三个函数
callback(xmlHttp.responseText);
}
}
//post 在send里面带参数 get直接带 post一定要设置setRequestHeader
if(method=="POST"){
xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlHttp.send(param);
}else{
xmlHttp.send();
}
}
//和action交互的方法 用于更新
function toUpdate1(){
document.getElementById('updateDiv').style.display='none'
var empno=$('empNoId').value;
var ename=$('updateEname').value;
var job=$('updateJob').value;
var mgr=$('updateMgr').value;
var hiredate=$('updateHiredate').value;
var sal=$('updateSal').value;
var comm=$('updateComm').value;
var deptno=$('updateDeptno').value;
//参数
var param="ename="+ename+"&job="+job+"&mgr="+mgr+"&hiredate="+hiredate+"&sal="+sal+"&comm="+comm+"&deptno="+deptno+"&empno="+empno
//调用ajax好action交互
sendAjax("POST",path+"/updateEmp",function(message){
if(message==1){
alert("操作成功");
toQuery(current);
}else{
alert("操作失败");
}
},param)
}
//和action交互的方法 用于新增
function toAdd(){
document.getElementById('addDiv').style.display='none'
var xmlHttp=new XMLHttpRequest();
var ename=$('a1').value;
var job=$('a2').value;
var mgr=$('a3').value;
var hiredate=$('a4').value;
var sal=$('a5').value;
var comm=$('a6').value;
var deptno=$('a7').value;
var param="ename="+ename+"&job="+job+"&mgr="+mgr+"&hiredate="+hiredate+"&sal="+sal+"&comm="+comm+"&deptno="+deptno;
sendAjax("POST",path+"/insertEmp",function(message){
if(message==1){
alert("操作成功");
toQuery(current);
}else{
alert("操作失败");
}
},param)
}
//和action交互的方法 用于删除
function toDelete(empno){
var param="empno="+empno;
sendAjax("POST",path+"/deleteEmp",function(message){
if(message==1){
alert("操作成功");
toQuery(current);
}else{
alert("操作失败");
}
},param)
}
//分页的一些参数
var current=1;
var sum=0;
var trail=0;
var last=0;
var next=0;
////和action交互的方法 用于查询
function toQuery(pagin){
var xmlHttp=new XMLHttpRequest();
var tb=$("tb");
var td=$("td");
var ename=$("ename").value;
xmlHttp.open("GET",path+"/queryPaginEmp?ename="+ename+"&pagin="+pagin,true);
xmlHttp.onreadystatechange=function(){
if(xmlHttp.readyState==4&&xmlHttp.status==200){
//获取action响应的内容
var json=xmlHttp.responseText;
//var json1=json.toString();
//把它转成json对象
var jsonall=JSON.parse(json);
//给分页的一些参数赋值
current=jsonall.current;
sum=jsonall.sum;
trail=jsonall.trail;
last=jsonall.last;
next=jsonall.next;
$("p1").innerHTML=current;
$("p2").innerHTML=trail;
$("p3").innerHTML=sum;
var jsonObj=jsonall.list;
//无刷新在此查询的时候把整个tbody删除
tb.removeChild(td);
var tdRow=document.createElement("tbody");
tdRow.setAttribute("id","td");
//把tbody加到table里面去
tb.appendChild(tdRow);
for ( var i = 0; i < jsonObj.length; i++) {
var el = jsonObj[i];
//创建节点
var trRow=document.createElement("tr");
var tdRow1=document.createElement("td");
var tdRow2=document.createElement("td");
var tdRow3=document.createElement("td");
var tdRow4=document.createElement("td");
var tdRow5=document.createElement("td");
var tdRow6=document.createElement("td");
var tdRow7=document.createElement("td");
var tdRow8=document.createElement("td");
var tdRow9=document.createElement("td");
tdRow1.innerHTML=el.empno;
tdRow2.innerHTML=el.ename;
tdRow3.innerText=el.job;
tdRow4.innerText=el.mgr;
tdRow5.innerHTML=el.hiredate;
tdRow6.innerHTML=el.sal;
tdRow7.innerHTML=el.comm;
tdRow8.innerHTML=el.deptno;
tdRow9.innerHTML="<button onclick='toDelete("+el.empno+")'>删除</button><button onclick=toUpdate('"+el.empno+"','"+el.ename+"','"+el.job+"','"+
el.mgr+"','"+el.hiredate+"','"+el.sal+"','"+el.comm+"','"+el.deptno+"')>更新</button>";
//把节点tdRow1加到trRow
trRow.appendChild(tdRow1);
trRow.appendChild(tdRow2);
trRow.appendChild(tdRow3);
trRow.appendChild(tdRow4);
trRow.appendChild(tdRow5);
trRow.appendChild(tdRow6);
trRow.appendChild(tdRow7);
trRow.appendChild(tdRow8);
trRow.appendChild(tdRow9);
tdRow.appendChild(trRow);
}
}
}
xmlHttp.send();
}
</script>
</head>
<body onload="toQuery(1)">
<!-- http://localhost:8080/day20170609/emp.jsp -->
ename<input type="text" name="ename" id="ename"/>
<input type="button" value="查询" onclick="toQuery(current)"/>
<input type="button" value="新增" onclick="document.getElementById('addDiv').style.display='block'"/><br/>
<table id="tb">
<thead>
<tr>
<td>empno</td>
<td>ename</td>
<td>job</td>
<td>mgr</td>
<td>hiredate</td>
<td>sal</td>
<td>comm</td>
<td>deptno</td>
<td>操作</td>
</tr>
</thead >
<tbody id="td">
</tbody>
</table>
<input type="image" src="${pageContext.request.contextPath}/day20170609/image/18.gif" onclick="toQuery(1)"/>
<input type="image" src="${pageContext.request.contextPath}/day20170609/image/20.gif" onclick="toQuery(last)"/>
当前<span id="p1"></span>页 总<span id="p2"></span>页 总:<span id="p3"></span>
<input type="image" src="${pageContext.request.contextPath}/day20170609/image/16.gif" onclick="toQuery(next)"/>
<input type="image" src="${pageContext.request.contextPath}/day20170609/image/14.gif" onclick="toQuery(trail)"/>
<!-- 新增的div-->
<div id="addDiv" style="display:none;position: absolute;left: 65%;top: 14%;width: 300px;height:200px;background:linear-gradient(to bottom,skyblue,gray);border: 1px solid black;">
ENAME:<input type='text' name='ename' id='a1'>
<br/>
JOB:<input type='text' name='job' id='a2'>
<br/>
MGR:<input type='text' name='mgr' id='a3'>
<br/>
HIREDATE:<input type='text' name='hiredate' id='a4'>
<br/>
SAL:<input type='text' name='sal' id='a5'>
<br/>
COMM:<input type='text' name='comm' id='a6'>
<br/>
DEPTNO:<input type='text' name='deptno' id='a7'>
<br/>
<input type='button' value="新增" onclick="toAdd()">
<input type='button' value="关闭" onclick="document.getElementById('addDiv').style.display='none'">
</div>
<!-- 修改的div-->
<div id="updateDiv" style="display:none;position: absolute;left: 65%;top: 14%;width: 300px;height:200px;background:linear-gradient(to bottom,skyblue,gray);border: 1px solid black;">
<input type='hidden' name='empno' id='empNoId'>
ENAME: <input type='text' id="updateEname" name='ename'>
<br/>
JOB: <input type='text' id="updateJob" name='job'>
<br/>
MGR: <input type='text' id="updateMgr" name='mgr'>
<br/>
HIREDATE: <input type='text' id="updateHiredate" name='hiredate'>
<br/>
SAL: <input type='text' id="updateSal" name='sal'>
<br/>
COMM: <input type='text' id="updateComm" name='comm'>
<br/>
DEPTNO: <input type='text' id="updateDeptno" name='deptno'>
<br/>
<input type='button' value='修改' onclick="toUpdate1()">
<input type='button' value="关闭" onclick="document.getElementById('updateDiv').style.display='none'">
</div>
</body>
</html>