我正在使用jsp将数据发布到servlet,但在发布数据后我想留下来查看jsp。 简述: 1)我有一个带有2个文本框的jsp。我使用javascript按钮点击将数据从一个复制到另一个。 2)我使用相同的按钮将数据发布到数据库。 3)我希望一次完成两个动作,不应该转到第三个jsp(servlet post结果),但是,应该转到我使用的另一个jsp。
我能够单独处理这两件事,但我无法做到这一点。数据在数据库中更新并在第一个文本中显示一个新行(这是我的错误,我正在使用重定向方式)或将数据从第一个文本框移动到另一个文本框并且不进行数据发布。请帮我解决这个问题。下面是我用来做的代码。
用于复制数据和发布数据的java脚本是:
function move(){
document.getElementById('tgt1').value = document.getElementById('Allocation').value;
document.getElementById('Allocation').value="";
document.getElementById("Send").disabled=true;
}
function invoke(but)
{
if(but==0)
{
document.myform.action="Alloc_Insert.do";
}
按钮的方法声明如下:
<table><tr><center><td><input type="Submit" value="Allocate" id="Send" onClick="invoke(0);move();" style="width:150px" style="font-size:100%"/></td></center></tr> </table>
我使用的servlet代码如下。
ResultSet rs=null;
String Add=request.getParameter("tgt1");
String user=(String) session.getAttribute("myusername");
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();Date d1 = new Date();
String d1_str = new SimpleDateFormat("yyyy-MM-dd").format(d1);
Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","system","tiger");
PreparedStatement ps=con.prepareStatement("UPDATE SCOPE1 SET ALLOCATED='"+d1_str+"', SPECIALIST='"+user+"' WHERE DBID='"+Add+"'");
con.setAutoCommit(true);
int i=ps.executeUpdate();
if(i==1)
{
String redirectURL= "Update_Counts.jsp";
response.sendRedirect(redirectURL);
}
else{
out.print("retry");
}
我想发布数据以及复制到第二个文本框中的文本框值相同,因为我将其用于我的进一步参考。
谢谢
答案 0 :(得分:1)
正如我在评论中提到的,考虑对你的servlet进行javascript异步调用(AJAX)。
在这种情况下,您的页面不会更改,您可以在后台与服务器进行所有交互。
如果您不是经验丰富的Javascript程序员,请考虑this JavaScript tutorial
JSP本质上是一个servlet,即它是服务器端代码,但是你可以将javascript嵌入到你的JSP页面,它可以在客户端的浏览器(客户端)上工作,并将数据包发送/接收到服务器后台,而不是将整个页面提交给服务器。
答案 1 :(得分:0)
你可以在你的jsp中调用ajax:
function test(tg1){
context = '${pageContext.request.contextPath}';
var http_request = getXMLHttpRequest();
if (!http_request) {
alert('Giving up :( Cannot create an XMLHTTP instance');
return false;
}
http_request.open("POST", context + "/ServletName?tgt1=" + tg1, true);
http_request.onreadystatechange = function() {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
var response = http_request.responseText;
//do something if you have a response from the servlet
}
}
};
http_request.send(null);
}
在您的servlet中,删除重定向代码。
ResultSet rs=null;
String Add=request.getParameter("tgt1");
String user=(String) session.getAttribute("myusername");
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();Date d1 = new Date();
String d1_str = new SimpleDateFormat("yyyy-MM-dd").format(d1);
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","system","tiger");
PreparedStatement ps=con.prepareStatement("UPDATE SCOPE1 SET ALLOCATED='"+d1_str+"', SPECIALIST='"+user+"' WHERE DBID='"+Add+"'");
con.setAutoCommit(true);
int i=ps.executeUpdate();
您可以使用response.getWriter().write("something");
答案 2 :(得分:0)
在您的代码中,我可以看到(部分)2个JavaScript函数move()
和invoke(but)
第一个将数据从一个DOM元素('Allocation')移动到另一个('tgt1')。
第二种是尝试将数据提交到服务器/ jsp页面。
这是正确的,你想要做什么?
顺便说一下:你应该按照move(); invoke(...);
的顺序调用它们,而不是其他方式,因为一旦提交了表单,move()就不会运行 - 客户端就不会发生任何事情,因为处理离开了页面
我注意到你在move()函数中禁用了DOM元素“发送”(document.getElementById("Send").disabled=true;
),这恰好是你的提交按钮。此操作将阻止提交表单,因此您应该删除该行。