javaweb开发jsp页面一次性保存多条数据,批量保存数据!

7 篇文章 0 订阅
5 篇文章 0 订阅

先看我要做成什么效果?有空扫下我们的二维码呗!

一次性保存多条数据(批量保存)比较简单方便的做法就是使用json格式,具体看我的这篇文章,批量保存数据(json版),该篇文章详细的介绍了使用json来做批量保存!有图有代码有步骤!

       但是我本篇文章并没有使用json,我本篇文章使用的是字符串拼接的办法,这种办法比较笨,也比较麻烦一些,但是学习还是不要怕麻烦,一开始不要怕麻烦,等知道了解题思路后,我们再用简单实用的新办法取代旧的笨的办法,这样我们才能循序渐进一点一点的进步!

这是fieldTable.jsp页面

上面的图就是我们要做成的样子,点击加号按钮,就在页面上增加一行,然后在行里的文本框中填写数据,点击保存数据到数据库中的按钮,就会把页面上的每一行数据都保存到数据库中的fieldInfo(字段表)表中,也就是批量保存!

看下面的效果图!

这就是我们要开发的批量保存!OK,接下来贴上代码(代码写完后我还没有整理,所以某个函数中的代码比较多,本来按照代码规范来说的话,一个函数中的代码最多不要超过30行,这样也比较容易阅读!所以还请大家大家见谅!说实话,我写这个批量保存,也是一时头脑发热,临时起意,突然就想写一个批量保存的东西!因为有时候我会想,如果我在一个jsp页面中,同时编辑多条记录,编辑好之后,点击提交,把刚才编辑的多条记录一口气的保存到数据库中,我在想,如果同时编辑了50条记录,点击提交保存,一口气保存50条记录到数据库中,效率上会不会不高,本着这样的想法,所以我临时起意写的这个批量保存的功能!或者这么说把,将来我要是在某些jsp页面上有table表格,表格中有多行记录,我点击保存,要把表格中的每一行的每个单元格的数据都保存到数据库中,这时候我写的这个批量保存就可以派上用场了,到时候我把我现在写的批量保存的代码拿出来改造一下,做成一个通用的批量保存的函数,供其他页面或者其他地方调用,那不是很好嘛?)

好了好了,废话不多说了,还是上代码吧!刚才就是要上代码的,结果我又啰嗦了一大堆!

这是fieldTable.jsp页面的代码!

<strong><%@page import="com.jiongmeng.entity.GoodsType"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>囧萌网上书店,网上书城(于都县囧萌软件有限公司,江西省赣州市于都县)</title>
<link rel="stylesheet" type="text/css" href="background/css/body.css"
	media="all">
<link rel="stylesheet" type="text/css" href="background/css/mark.css">
<script type="text/javascript" src="background/js/ToolTip.js"></script>
<style type="text/css">
input {
	width: 300px;
	height: 30px;
	border: 2px solid #8E388E;
	border-radius: 4px; /*设置边框的4个直角变成圆角有弧度*/
	font-weight: bold; /*文本框中的文本字体加粗*/
	color: black;
	background-color: #F2F2F2;
}

input[type=button], input[type=submit]{
	width: auto;
	color: white;
	background-color: #8E388E;
}

</style>

<script type="text/javascript">

	//追加一行
	function addRow(){
		var tableNode =	document.getElementById("fieldTable");
		var trNodeList = tableNode.getElementsByTagName("tr");
//		for (var index = 0; index < trNodeList.length; index++) {
//			var tdNodeList = trNodeList[index].getElementsByTagName("td");
//			for (var i = 0; i < tdNodeList.length; i++) {
//					alert(tdNodeList[i].id);
//			}
//		}
		//得到最后一行(tr)的所有td
	var tdNodeList = trNodeList[trNodeList.length - 1].getElementsByTagName("td");
		var td_input_name = tdNodeList[0].getElementsByTagName("input")[0].name;
		var strIndex = td_input_name.indexOf("_");
		var number = td_input_name.substring(strIndex + 1)
		var trNode = document.createElement("tr");
		number++;
		var tdText = '';
		var td1_input_fieldName = '<td><input type="text" name="fieldName_' + number + '" value=""></td>';
		var td2_input_fieldType = '<td><input type="text" name="fieldType_' + number + '" value=""></td>';
		var td3_input_fieldLength = '<td><input type="text" name="fieldLength_' + number + '" value=""></td>';
		tdText = td1_input_fieldName + td2_input_fieldType + td3_input_fieldLength;
		trNode.innerHTML = tdText;
		tableNode.appendChild(trNode);
		//alert("追加一行");
	}

</script>

</head>
<body>
	<%
		/**
		jsp中有内置对象,平时我们java中使用对象需要1.先声明2创建,而内置对象不需要声明也不需要创建,可以直接拿来使用,jsp内
		置对象也叫隐藏对象或隐含对象或隐式对象
		
		*/

		//测试代码
		GoodsType goodsType = null;
		request.setAttribute("goodsType", goodsType);
		String hometown = "江西省赣州市于都县";
		session.setAttribute("hometown", hometown);
		System.out.println("我是test.jsp页面!");
	%>
	测试空实体对象.属性是否会报空指针异常=${requestScope.goodsType.goodsTypeId }
	<br> 家乡 = ${sessionScope.hometown}

	<%
		request.setAttribute("test", "jack");
		request.setAttribute("test", "jerry");
		out.print(request.getAttribute("test") + "<br>");
		pageContext.setAttribute("myHome", "江西省赣州市于都县");
		request.setAttribute("myHome", "于都县");
		out.println("myHome = " + pageContext.getAttribute("myHome"));
	%>
	<br> hometown:${requestScope.hometown }
	<form action="fieldTableServlet" method="post">
	<input type="submit" value="保存数据到数据库中">
	<input type="button" value="+(增加一行)" onclick="addRow()">
		<table id="fieldTable">
			<tr id="tr1">
				<th>字段名</th>
				<th>字段类型</th>
				<th>字段长度</th>
			</tr>
			<tr id="tr2">
				<td id="td1"><input type="text" name="fieldName_1" value="姓名"></td>
				<td id="td2"><input type="text" name="fieldType_1" value="字符串"></td>
				<td id="td3"><input type="text" name="fieldLength_1" value="40"></td>
			</tr>
			<tr id="tr3">
				<td id="td1"><input type="text" name="fieldName_2" value="籍贯"></td>
				<td id="td2"><input type="text" name="fieldType_2" value="字符串"></td>
				<td id="td3"><input type="text" name="fieldLength_2" value="120"></td>
			</tr>
		</table>
	</form>
<c:if test="${!(empty requestScope.message)}">
	<script type="text/javascript">
	showWindow("温馨提示", "${requestScope.message}", 500, 120, true);
	</script>
	</c:if>
</body>
</html></strong>


jsp页面上的form表单提交到一个servlet中,然后在servlet中去处理!我就在servlet中拼接的sql语句,然后在servlet中调用dao,规范的做法肯定不是这样做的,sql语句要写在dao层,我这里是为了省事图方便,所以才在servlet中写sql语句。

接下来看servlet中的代码,servlet的类名叫FieldTableServlet,FieldTableServlet类的url访问路径是fieldTableServlet,也就是我们fieldTable.jsp页面中的form表单的action要填写的地址,即action="fieldTableServlet"(注意:FieldTableServlet类中的saveFieldTable()函数中的代码我还没整理,小伙伴们凑合着看,你们自己去整理也可以哈,当然,你们也可以有不同的写法,思路对了就行!)

<strong>package com.jiongmeng.test;

import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.jiongmeng.db.JdbcTemplate;

@WebServlet("/fieldTableServlet")
public class FieldTableServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	JdbcTemplate jdbcTemplate = new JdbcTemplate();

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		try {
		int row = saveFieldTable(request, response);
		request.setAttribute("message", row > 0 ? "成功保存" + row + "条记录!" : "保存失败!");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		request.getRequestDispatcher("fieldTable.jsp").forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 处理中文乱码,可以使用过滤器
		request.setCharacterEncoding("utf-8");
		doGet(request, response);
	}

	protected int saveFieldTable(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException, ClassNotFoundException, SQLException {
		// 得到所有的请求参数名称
		Enumeration<String> parameterNames = request.getParameterNames();
		// 用来装所有的参数名称的后缀(即下划线后面的)
		List<String> parameterNamesSuffix = new ArrayList<String>();
		List<String> newParameterNamesSuffix = new ArrayList<String>();
		// 用来装所有的参数名称和参数值
		Map<String, String> parameterNamesAndValues = new HashMap<String, String>();
		List<String> parameterNameList = new ArrayList<String>();
		while (parameterNames.hasMoreElements()) {
			// 得到请求参数的名称
			String parameterName = parameterNames.nextElement();
			// 根据下划线拆分
			String[] myParameterName = parameterName.split("_");
			// 得到下划线后面的部分
			parameterNamesSuffix.add(myParameterName[myParameterName.length - 1]);
			// 保存参数名称和参数值
			parameterNamesAndValues.put(parameterName, request.getParameter(parameterName));

			parameterNameList.add(parameterName);
			String parameterValue = request.getParameter(parameterName);
			System.out.println(parameterName + " = " + parameterValue);
		}
		// 去重
		Set<String> set = new HashSet<String>();
		for (String parameterNameSuffix : parameterNamesSuffix) {
			if (set.add(parameterNameSuffix)) {
				newParameterNamesSuffix.add(parameterNameSuffix);
			}
		}

		System.out.println("--------请求参数的名称和参数值-------------------------");
		Set<Entry<String, String>> entrySetParameterNamesAndValues = parameterNamesAndValues.entrySet();
		Iterator<Entry<String, String>> it = entrySetParameterNamesAndValues.iterator();

		System.out.println("-------------请求参数的后缀--------------------");
		String[] fieldNames = new String[parameterNamesAndValues.size()];
		String[] fieldValues = new String[parameterNamesAndValues.size()];
		int elementIndex = 0;
		while (it.hasNext()) {
			Entry<String, String> entry = it.next();
			fieldNames[elementIndex] = entry.getKey();
			fieldValues[elementIndex] = entry.getValue();
			elementIndex++;
		}

		for (int i = 0; i < fieldNames.length; i++) {
			System.out.println(fieldNames[i] + "   -   " + fieldValues[i]);
		}
		System.out.println("------------------------------------");
		int successCount = 0;
		for (int i = 0; i < newParameterNamesSuffix.size(); i++) {
			FieldTable fieldTable = new FieldTable();
			StringBuffer sql = new StringBuffer(
					"INSERT  INTO fieldInfo ( fieldName , fieldType , fieldLength ) VALUES (");
			System.out.println(newParameterNamesSuffix.get(i));
			for (int index = 0; index < fieldNames.length; index++) {
				String[] field = fieldNames[index].split("_");
				if (newParameterNamesSuffix.get(i).equals(field[field.length - 1])) {
					System.out.println(
							newParameterNamesSuffix.get(i) + "  " + fieldNames[index] + "  " + fieldValues[index]);
					if ("fieldName".equals(field[0])) {
						fieldTable.setFieldName(fieldValues[index]);
					} else if ("fieldType".equals(field[0])) {
						fieldTable.setFieldType(fieldValues[index]);
					} else if ("fieldLength".equals(field[0])) {
						fieldTable.setFieldLength(fieldValues[index]);
					}

				}

			}
			sql.append(" '" + fieldTable.getFieldName() + "', ");
			sql.append(" '" + fieldTable.getFieldType() + "', ");
			sql.append(" '" + fieldTable.getFieldLength() + "' )");
			int row = jdbcTemplate.update(sql.toString());
			successCount += row;
			System.out.println(sql.toString());
		}
		System.out.println("共保存了" + successCount + "条数据!");
		return successCount;
	}

}
</strong>

fieldTable.jsp页面中有几行记录,就会生成几条INSERT插入语句,后台就会调用几次插入数据的函数,如下就是根据fieldTable.jsp页面中的记录行生成的INSERT的sql语句。

INSERT  INTO fieldInfo ( fieldName , fieldType , fieldLength ) VALUES ( '姓名',  '字符串',  '40' )

INSERT  INTO fieldInfo ( fieldName , fieldType , fieldLength ) VALUES ( '籍贯',  '字符串',  '120' )

INSERT  INTO fieldInfo ( fieldName , fieldType , fieldLength ) VALUES ( '年龄',  '整型',  '3' )

INSERT  INTO fieldInfo ( fieldName , fieldType , fieldLength ) VALUES ( '家庭地址',  '字符串',  '90' )

INSERT  INTO fieldInfo ( fieldName , fieldType , fieldLength ) VALUES ( '电话号码',  '字符串',  '11' )

等等等.......后面的sql语句我就不全部列举出来了!大家知道意思就行哈!

最后一个类就是实体类了,实体类的类名叫FieldTable,该类中就是一些属性,其实就是和数据库中fieldInfo表中的字段相互对应(属性包括fieldId,fieldName,fieldType,fieldLength)和set,get方法和构造方法!代码如下:

<strong>/**
* <p>Application Name: jmBookShop</p>
* <p>Application Description: 医疗管理系统产品</p>
* <p>Copyright: Copyright (c) 2017 版权归囧萌软件科技公司所有</p>
* <p>Time: 2017年11月23日下午11:29:25</p>
* <p>Company: 囧萌软件科技公司</p>
* @author 囧囧   E-mail:666888999@qq.com
* @author <a href="666888999@qq.com">囧囧</a>
* @version 1.0
*/
package com.jiongmeng.test;

/**
 * @Description: (这里用一句话描述这个类的作用)
 * @author 囧囧 E-mail:666888999@qq.com jerry
 * @date: 2017年11月23日 下午11:29:25
 *        <p>
 *        Copyright: Copyright (c) 2005-2017版权归囧萌软件科技公司所有
 *        </p>
 * @version 创建时间:2017年11月23日 下午11:29:25
 */
public class FieldTable {

	private int fieldId;
	private String fieldName;
	private String fieldType;
	private String fieldLength;
	/** 
	* <p>Title: </p> 
	* <p>Description: </p>  
	*/
	
	
	public FieldTable() {
		super();
	}
	/** 
	* <p>Title: </p> 
	* <p>Description: </p> 
	* @param fieldName
	* @param fieldType
	* @param fieldLength 
	*/
	
	
	public FieldTable(String fieldName, String fieldType, String fieldLength) {
		super();
		this.fieldName = fieldName;
		this.fieldType = fieldType;
		this.fieldLength = fieldLength;
	}
	/** 
	* <p>Title: </p> 
	* <p>Description: </p> 
	* @param fieldId
	* @param fieldName
	* @param fieldType
	* @param fieldLength 
	*/
	
	
	public FieldTable(int fieldId, String fieldName, String fieldType, String fieldLength) {
		super();
		this.fieldId = fieldId;
		this.fieldName = fieldName;
		this.fieldType = fieldType;
		this.fieldLength = fieldLength;
	}
	/**
	 * @return the fieldId
	 */
	public int getFieldId() {
		return fieldId;
	}
	/**
	 * @param fieldId the fieldId to set
	 */
	public void setFieldId(int fieldId) {
		this.fieldId = fieldId;
	}
	/**
	 * @return the fieldName
	 */
	public String getFieldName() {
		return fieldName;
	}
	/**
	 * @param fieldName the fieldName to set
	 */
	public void setFieldName(String fieldName) {
		this.fieldName = fieldName;
	}
	/**
	 * @return the fieldType
	 */
	public String getFieldType() {
		return fieldType;
	}
	/**
	 * @param fieldType the fieldType to set
	 */
	public void setFieldType(String fieldType) {
		this.fieldType = fieldType;
	}
	/**
	 * @return the fieldLength
	 */
	public String getFieldLength() {
		return fieldLength;
	}
	/**
	 * @param fieldLength the fieldLength to set
	 */
	public void setFieldLength(String fieldLength) {
		this.fieldLength = fieldLength;
	}
	
	

}
</strong>

 

批量保存的功能就介绍到这里了,其实我们只要保持对软件功能的好奇,我们就会在看到别人的软件的时候去思考,咦,这功能是怎么做出来的,咦,如果让我来做这个功能,我会怎么做,我会怎么写这个功能呢?咦,我这样写有没有比别人的写法执行效率更高,性能更好呢?咦,我写的代码有没有像写诗一样行云流水,阅读起来简单明了的感觉呢?如果还没有像写诗一样行云流水的感觉,就说明我们写的代码还不够好,不够精辟,不够清晰明了,不够通俗易懂,不够流畅,所以还有提高的空间,还有优化的空间,还有重构的空间,所以对程序保持好奇,这样我们才能不断的进步和提高自身的能力!

 

有空扫下我们的二维码呗!

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
如果您在 Servlet 中使用 `request.setAttribute()` 方法设置了请求属性,但是在 JSP 页面中无法获取到这些属性,可能有以下几个原因: 1. 请求转发时属性名称不一致:如果您在 Servlet 中使用 `request.setAttribute("name", value)` 方法设置了请求属性,但是在 JSP 页面中使用 `${otherName}` 表达式来获取属性值,则无法获取到正确的值。请确保在请求转发时属性名称一致,例如: ``` // Servlet 中设置属性 request.setAttribute("name", value); // 请求转发到 JSP 页面 request.getRequestDispatcher("page.jsp").forward(request, response); ``` ``` <!-- JSP 页面中获取属性 --> ${name} ``` 2. 属性作用域不一致:如果您在 Servlet 中设置了请求属性,但是在 JSP 页面中使用了错误的作用域名称,则无法获取到正确的值。默认情况下,`request.setAttribute()` 方法设置的属性作用域为请求作用域(request scope),这意味着属性只在当前请求中有效。如果您在 JSP 页面中使用了错误的作用域名称,例如 `${sessionScope.name}` 或 `${applicationScope.name}`,则无法获取到正确的值。请确保在 JSP 页面中使用正确的作用域名称,例如 `${requestScope.name}` 或 `${name}`。 3. 请求转发前未设置属性:如果您在请求转发前设置了请求属性,但是在 JSP 页面中无法获取到这些属性,可能是因为在请求转发前未设置属性。请确保在请求转发前设置请求属性,例如: ``` // Servlet 中设置属性 request.setAttribute("name", value); // 请求转发到 JSP 页面 request.getRequestDispatcher("page.jsp").forward(request, response); ``` 需要注意的是,在实际应用中,您可能需要根据具体的需求和上下文环境来选择适当的方法来设置和获取请求属性。如果您遇到了其他问题或有其他疑问,请提供更多的上下文信息,以便我们更好地理解您的需求和代码环境。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值