在 JSP 中更新数据库
Posted
技术标签:
【中文标题】在 JSP 中更新数据库【英文标题】:Updating database in JSP 【发布时间】:2015-11-12 06:21:46 【问题描述】:我为我的 JSP 页面编写了这个 Java 代码来更新用户的当前登录详细信息。代码未显示任何错误或异常,但未更新 mysql 数据库。
帮我实现这个功能;
我的代码:
<%
//variable declaration for encrypt and decrypt
byte [] input ;
byte [] keyBytes = "12345678".getBytes();
byte [] ivBytes ="input123".getBytes();
SecretKeySpec key = new SecretKeySpec(keyBytes,"DES");
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
Cipher cipher;
byte[] cipherText;
int ctLength=0;
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(CONN_STRING, USERNAME, PASSWORD);
if(request.getParameter("submit")!=null)
String cuser=request.getParameter("currentusername");
String user = request.getParameter("username");
String pwd = request.getParameter("password");
String cpwd = request.getParameter("confirmpassword");
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
input = pwd.getBytes();
key = new SecretKeySpec(keyBytes, "DES");
ivSpec = new IvParameterSpec(ivBytes);
cipher = Cipher.getInstance("DES/CTR/NoPadding","BC");
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
cipherText = new byte[cipher.getOutputSize(input.length)];
ctLength+=cipher.update(input, 0, input.length, cipherText, 0);
ctLength+= cipher.doFinal(cipherText, ctLength);
String enpwd = new String(cipherText);
String sql2 = "update webadmin set username=? ,password=? where username='"+cuser+"' ";
if((cuser!=null &&cuser.length()>0)
&& (user!=null &&user.length()>0)
&& (pwd!=null && pwd.length()>0)
&& cpwd!=null && cpwd.length()>0)
if((pwd.equals(cpwd)))
pst =conn.prepareStatement(sql2);
pst.setString(1, user);
pst.setString(2, enpwd);
pst.executeUpdate();
%>
<script language="javascript">
alert("Sucessfully Updated");
</script>
<%
else
%>
<script language="JavaScript">
alert("Passwords are not matching try again");
</script>
<%
%>
注意:我实现了对密码进行加密并将加密后的密码存储到数据库中。
html 表单;
<form id="login-form" action="adminpg-mysettings.jsp" method="post" role="form" style="display: block;">
<div class="form-group">
<input type="text" name="currentusername" id="currentusername" tabindex="1" class="form-control" placeholder="Current Username" value="" required="">
</div>
<div class="form-group">
<input type="text" name="username" id="username" tabindex="1" class="form-control" placeholder="New Username" value="" required="">
</div>
<div class="form-group">
<input type="password" name="password" id="password" tabindex="2" class="form-control" placeholder="New Password" required="">
</div>
<div class="form-group">
<input type="password" name="confirmpassword" id="password" tabindex="2" class="form-control" placeholder="Confirm New Password" required="">
</div>
<div class="form-group">
<div class="row">
<div class="col-sm-6 col-sm-offset-3">
<input type="submit" name="submit" id="submit" tabindex="4" class="form-control btn btn-login" value="Save">
</div>
</div>
</div>
</form>
【问题讨论】:
打印出查询并在广告控制台上试用。也许你得到的不是预期的数据。 检查调试条件,确保每个条件都满足进行更新。否则一定要确定db中存在什么cuser,否则sql条件不匹配。 为什么在 jsp 中?为什么连接用户名密码也在jsp中? 有什么异常吗?您是否也尝试在数据库控制台中触发相同的查询?有用吗? 作为以后的注释:将 JSP 和 Java 代码结合起来是一个非常糟糕的主意。这就是他们在 90 年代末/00 年代初所做的事情,因为他们并不了解更多。 【参考方案1】: public class UpdateController extends HttpServlet
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
response.setContentType("text/html;charset=UTF-8");
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
processRequest(request, response);
int id = Integer.parseInt(request.getParameter("id"));
request.setAttribute("id", new StudentDAO().getStudent(id));
request.getRequestDispatcher("update.jsp").forward(request, response);
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
processRequest(request, response);
int id = Integer.parseInt(request.getParameter("id"));
String name = request.getParameter("name");
Date dob = Date.valueOf(request.getParameter("dob")); // yyyy-mm-dd
String gender = request.getParameter("gender");
Student s = new Student();
s.setId(id);
s.setName(name);
s.setGender(gender);
s.setDob(dob);
StudentDAO db = new StudentDAO();
db.update(s);
response.sendRedirect("list");
request.setAttribute("students", new StudentDAO().getAll());
// request.getRequestDispatcher("list.jsp").forward(request, response);
public void update(Student s)
try
String sql = "UPDATE [dbo].[Student]\n"
+ " SET [name] = ?\n"
+ " ,[gender] = ?\n"
+ " ,[dob] = ?\n"
+ " WHERE id = ?";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, s.getName());
ps.setString(2, s.getGender());
ps.setDate(3, s.getDob());
ps.setInt(4, s.getId());
ps.executeUpdate();
catch (SQLException ex)
Logger.getLogger(StudentDAO.class.getName()).log(Level.SEVERE, null, ex);
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Update</title>
<% String id = request.getParameter("id");%>
</head>
<body>
<form action="update" method="post">
<table>
<tr>
<td>ID: <input type="text" name="id"
value="<%=id%>" readonly></td>
</tr>
<tr>
<td>Name: <input type="text" name="name"/></td>
</tr>
<tr>
<td>Gender: <input type="radio" name="gender" value="male"/> Male
<input type="radio" name="gender" value="female"/> Female </td>
</tr>
<tr>
<td>Dob: <input type="date" name="dob" /></td>
</tr>
</table>
<input type="submit" value="Create" />
</form>
</body>
【讨论】:
【参考方案2】:首先,就像每个人都会告诉你的那样,将 Java 放在 JSP 中是一个非常糟糕的主意。正确的操作方式是使用 Servlet 和存储在 session 中的请求。它将防止恶意sql injections。
其次,您的安全约束应该在web.xml
和Servlet
中处理,这对于后端维护是最好的。遵循良好的编程习惯可以防止您因错误日志而发疯。
我可以帮助您实现您尝试使用 Servlet 执行的操作,但在此之前,我需要了解以下内容:
显而易见:您有 Servlet 吗? 您使用 JDBC/JNDI 连接吗? 您有用户的实体和会话类吗? 您使用哪个 IDE/框架来开发您的应用程序? 您要部署到哪个服务器?这是实现您想要的最有效的方式。请提供答案,我会用一些代码更新我的答案:)
【讨论】:
以上是关于在 JSP 中更新数据库的主要内容,如果未能解决你的问题,请参考以下文章
Spring MVC - 如何使用 JSP 表更新数据库中的行?