数据表自定义删除列
Datatable custom delete column
我有包含多部电影(行)的数据表,在每一行的末尾,都有用于删除的自定义列。
这是我的数据表:
HTML
<table id="moviesTable1" class="table table-striped table-bordered">
<thead>
<tr>
<th>Title</th>
<th>Duration</th>
<th>Distributor</th>
<th>Origin country</th>
<th>Year of production</th>
<th></th>
</tr>
</thead>
<tbody id="moviesTbody">
</tbody>
</table>
jquery(我也有添加电影,getAll 效果很好)
var MoviesManager = {
getAll : function() {
$.get('MoviesServlet', function(data) {
$('#moviesTable1').DataTable({
"paging": false,
"info": false,
"searching": false,
"columns": [
null,
null,
null,
null,
null,
{
"data": null,
render:function(data, type, row)
{
return '<button id="deleteMovie">Delete</button>'
},
"targets": -1
}
]
});
for(m in data.movies) {
$('#moviesTable1').dataTable().fnAddData ([
data.movies[m].title,
data.movies[m].duration,
data.movies[m].distributor,
data.movies[m].originCountry,
data.movies[m].yearOfProduction
]);
}
});
},
deleteMovie : function() {
var rowSelector = $(this).closest('tr');
var id = $('#moviesTable1').dataTable().row(rowSelector).data().id;
params = {
'action': 'delete',
'id': id
}
$.post('MoviesServlet', params, function(data){
console.log(data);
});
}
}
$(document).ready(function() {
MoviesManager.getAll();
$('#deleteMovie').click(function(e) {
MoviesManager.deleteMovie();
});
});
我正在尝试从所选行(数据库中的 ID)获取 ID 并将其发送到 servlet。我失败了,点击没有任何反应。
这是接收 id
的 servlet
public class MoviesServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<Movie> movies = MovieDAO.getAll();
Map<String, Object> data = new HashMap<>();
data.put("movies", movies);
ObjectMapper mapper = new ObjectMapper();
String jsonData = mapper.writeValueAsString(data);
response.setContentType("application/json");
response.getWriter().write(jsonData);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String action = request.getParameter("action");
try {
switch(action) {
case "add": {
String title = request.getParameter("title");
String duration = request.getParameter("duration");
String distributor = request.getParameter("distributor");
String originCountry = request.getParameter("originCountry");
String yearOfProduction = request.getParameter("yearOfProduction");
Movie movie = new Movie();
movie.setTitle(title);
movie.setDuration(duration);
movie.setDistributor(distributor);
movie.setOriginCountry(originCountry);
movie.setYearOfProduction(Integer.parseInt(yearOfProduction));
MovieDAO.addMovie(movie);
break;
}
case "delete": {
Integer id = Integer.parseInt(request.getParameter("id"));
MovieDAO.delete(id);
break;
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
最后执行 SQL 查询的 DAO
public static boolean delete(Integer id) {
Connection con = ConnectionManager.getConnection();
PreparedStatement ps = null;
try {
String query = "DELETE FROM movies WHERE id = ?";
ps = con.prepareStatement(query);
ps.setInt(1, id);
return ps.executeUpdate() == 1;
}catch (Exception ex){
ex.printStackTrace();
}finally {
try {ps.close();} catch (Exception ex1) {ex1.printStackTrace();}
try {con.close();} catch (Exception ex1) {ex1.printStackTrace();}
}
return false;
}
[更新]
我正在制作一个草稿,我在其中为每个按钮添加了一个唯一的 data-id 属性。
您的服务器代码似乎没问题!所以在应用这些小的更改之后,我认为一切都应该正常工作。
这里是 Fiddle 使用静态数据集
var MoviesManager = {
getAll: function () {
$.get('MoviesServlet', function (data) {
$('#moviesTable1').DataTable({
paging: false,
info: false,
searching: false,
columns: [
null,
null,
null,
null,
null, {
"data": null,
render: function (data, type, row) {
return '<button id="deleteMovie" data-id="' + data.id + '">Delete</button>'
},
"targets": -1
}
],
createdRow: function( row, data, dataIndex ) {
$( row ).find('td:eq(5)').attr('data-id', data.id));
}
});
for (m in data.movies) {
$('#moviesTable1').dataTable().fnAddData([
data.movies[m].title,
data.movies[m].duration,
data.movies[m].distributor,
data.movies[m].originCountry,
data.movies[m].yearOfProduction
]);
}
});
},
deleteMovie: function (ID) {
params = {
'action': 'delete',
'id': ID
}
$.post('MoviesServlet', params, function (data) {
console.log(data);
});
}
}
$(document).ready(function () {
MoviesManager.getAll();
$('body').on('click', '#deleteMovie', function(e){
var id= $(this).attr("data-id");
MoviesManager.deleteMovie(id);
});
});
这是到达 jquery
的数据
{"movies":[
{ "id":1,
"title":"The Irishman",
"duration":"03:37",
"distributor":"Netflix",
"originCountry":"United States",
"yearOfProduction":2019
},
{ "id":2,
"title":"The Lion King",
"duration":"01:58",
"distributor":"Walt Disney Studios",
"originCountry":"United States",
"yearOfProduction":2019}
]}
我有包含多部电影(行)的数据表,在每一行的末尾,都有用于删除的自定义列。
这是我的数据表:
HTML
<table id="moviesTable1" class="table table-striped table-bordered">
<thead>
<tr>
<th>Title</th>
<th>Duration</th>
<th>Distributor</th>
<th>Origin country</th>
<th>Year of production</th>
<th></th>
</tr>
</thead>
<tbody id="moviesTbody">
</tbody>
</table>
jquery(我也有添加电影,getAll 效果很好)
var MoviesManager = {
getAll : function() {
$.get('MoviesServlet', function(data) {
$('#moviesTable1').DataTable({
"paging": false,
"info": false,
"searching": false,
"columns": [
null,
null,
null,
null,
null,
{
"data": null,
render:function(data, type, row)
{
return '<button id="deleteMovie">Delete</button>'
},
"targets": -1
}
]
});
for(m in data.movies) {
$('#moviesTable1').dataTable().fnAddData ([
data.movies[m].title,
data.movies[m].duration,
data.movies[m].distributor,
data.movies[m].originCountry,
data.movies[m].yearOfProduction
]);
}
});
},
deleteMovie : function() {
var rowSelector = $(this).closest('tr');
var id = $('#moviesTable1').dataTable().row(rowSelector).data().id;
params = {
'action': 'delete',
'id': id
}
$.post('MoviesServlet', params, function(data){
console.log(data);
});
}
}
$(document).ready(function() {
MoviesManager.getAll();
$('#deleteMovie').click(function(e) {
MoviesManager.deleteMovie();
});
});
我正在尝试从所选行(数据库中的 ID)获取 ID 并将其发送到 servlet。我失败了,点击没有任何反应。
这是接收 id
的 servletpublic class MoviesServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<Movie> movies = MovieDAO.getAll();
Map<String, Object> data = new HashMap<>();
data.put("movies", movies);
ObjectMapper mapper = new ObjectMapper();
String jsonData = mapper.writeValueAsString(data);
response.setContentType("application/json");
response.getWriter().write(jsonData);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String action = request.getParameter("action");
try {
switch(action) {
case "add": {
String title = request.getParameter("title");
String duration = request.getParameter("duration");
String distributor = request.getParameter("distributor");
String originCountry = request.getParameter("originCountry");
String yearOfProduction = request.getParameter("yearOfProduction");
Movie movie = new Movie();
movie.setTitle(title);
movie.setDuration(duration);
movie.setDistributor(distributor);
movie.setOriginCountry(originCountry);
movie.setYearOfProduction(Integer.parseInt(yearOfProduction));
MovieDAO.addMovie(movie);
break;
}
case "delete": {
Integer id = Integer.parseInt(request.getParameter("id"));
MovieDAO.delete(id);
break;
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
最后执行 SQL 查询的 DAO
public static boolean delete(Integer id) {
Connection con = ConnectionManager.getConnection();
PreparedStatement ps = null;
try {
String query = "DELETE FROM movies WHERE id = ?";
ps = con.prepareStatement(query);
ps.setInt(1, id);
return ps.executeUpdate() == 1;
}catch (Exception ex){
ex.printStackTrace();
}finally {
try {ps.close();} catch (Exception ex1) {ex1.printStackTrace();}
try {con.close();} catch (Exception ex1) {ex1.printStackTrace();}
}
return false;
}
[更新] 我正在制作一个草稿,我在其中为每个按钮添加了一个唯一的 data-id 属性。 您的服务器代码似乎没问题!所以在应用这些小的更改之后,我认为一切都应该正常工作。
这里是 Fiddle 使用静态数据集
var MoviesManager = {
getAll: function () {
$.get('MoviesServlet', function (data) {
$('#moviesTable1').DataTable({
paging: false,
info: false,
searching: false,
columns: [
null,
null,
null,
null,
null, {
"data": null,
render: function (data, type, row) {
return '<button id="deleteMovie" data-id="' + data.id + '">Delete</button>'
},
"targets": -1
}
],
createdRow: function( row, data, dataIndex ) {
$( row ).find('td:eq(5)').attr('data-id', data.id));
}
});
for (m in data.movies) {
$('#moviesTable1').dataTable().fnAddData([
data.movies[m].title,
data.movies[m].duration,
data.movies[m].distributor,
data.movies[m].originCountry,
data.movies[m].yearOfProduction
]);
}
});
},
deleteMovie: function (ID) {
params = {
'action': 'delete',
'id': ID
}
$.post('MoviesServlet', params, function (data) {
console.log(data);
});
}
}
$(document).ready(function () {
MoviesManager.getAll();
$('body').on('click', '#deleteMovie', function(e){
var id= $(this).attr("data-id");
MoviesManager.deleteMovie(id);
});
});
这是到达 jquery
的数据{"movies":[
{ "id":1,
"title":"The Irishman",
"duration":"03:37",
"distributor":"Netflix",
"originCountry":"United States",
"yearOfProduction":2019
},
{ "id":2,
"title":"The Lion King",
"duration":"01:58",
"distributor":"Walt Disney Studios",
"originCountry":"United States",
"yearOfProduction":2019}
]}