和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 οnclick='toDelete("+el.empno+")'>删除</button><button οnclick=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 οnlοad="toQuery(1)"> <!-- http://localhost:8080/day20170609/emp.jsp --> ename<input type="text" name="ename" id="ename"/> <input type="button" value="查询" οnclick="toQuery(current)"/> <input type="button" value="新增" οnclick="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" οnclick="toQuery(1)"/> <input type="image" src="${pageContext.request.contextPath}/day20170609/image/20.gif" οnclick="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" οnclick="toQuery(next)"/> <input type="image" src="${pageContext.request.contextPath}/day20170609/image/14.gif" οnclick="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="新增" οnclick="toAdd()"> <input type='button' value="关闭" οnclick="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='修改' οnclick="toUpdate1()"> <input type='button' value="关闭" οnclick="document.getElementById('updateDiv').style.display='none'"> </div> </body> </html>