我在我的网站上有一张注册表格。提交表单时,会调用Java Servlet。在Servlet中,如果已经使用了用户名或电子邮件,我会检查我的数据库。我希望Servlet在注册完成时做出响应,我希望我的客户收到此响应并采取相应措施。一个简单的结果可能是注册表格上面的文字说“#34;注册成功"或"电子邮件/用户名已在使用"。 如何让我的客户端收到来自Servlet的响应?
我的表单
<form id="registerForm" autocomplete="on">
<h1>Registrera</h1>
<p>
<label for="usernamesignup" class="uname" data-icon="u">Användarnamn</label>
<input id="usernamesignup" name="usernamesignup" required="required" type="text"
placeholder="användarnamn" />
</p>
<p>
<label for="emailsignup" class="youmail" data-icon="e">E-mail</label>
<input id="emailsignup" name="emailsignup" required="required" type="email"
placeholder="namn@mail.com" />
</p>
<p>
<label for="passwordsignup" class="youpasswd" data-icon="p">Lösenord</label>
<input id="passwordsignup" name="passwordsignup" required="required" type="password"
placeholder="lösenord" />
</p>
<p>
<label for="passwordsignup_confirm" class="youpasswd" data-icon="p">Upprepa lösenord</label>
<input id="passwordsignup_confirm" name="passwordsignup_confirm" required="required" type="password"
placeholder="lösenord" />
</p>
<p class="signin button">
<input type="submit" value="Registrera"/>
</p>
<p class="change_link">
Redan medlem? <a href="#tologin" class="to_register">Logga in</a>
</p>
</form>
我的Servlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("usernamesignup");
String email = request.getParameter("emailsignup");
String password = request.getParameter("passwordsignup");
try {
MysqlDataSource dataSource = new MysqlDataSource();
...
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM Users WHERE username = '" + username + "' OR email = '" + email + "'");
if (!rs.next()) {
stmt.executeUpdate("INSERT INTO Users VALUES('" + username + "', '" + password + "', '" + email + "')");
//Notify the client that the registration was successful!
} else {
//Notify the client that the registration failed!
}
...
}
}
我的解决方案
我找到了一个解决方案,我从我的Servlet发送重定向并附加状态参数。然后,核心JSTL检索此参数并相应地显示消息。我在我的Servlet中执行以下操作:
ResultSet rs = stmt.executeQuery("SELECT * FROM Users WHERE username = '" + username + "' OR email = '" + email + "'");
if (!rs.next()) {
stmt.executeUpdate("INSERT INTO Users VALUES('" + username + "', '" + password + "', '" + email + "')");
//Registration was successful!
response.sendRedirect ("pages/index.jsp?status=1");
} else {
//Registration failed
response.sendRedirect ("pages/index.jsp?status=2#toregister");
}
在我的JSP中我做了:
<div id="registerMessage">
<c:set var="status" value="${param.status}" />
<c:if test="${status == '1'}">
<p class="success">Du är nu registrerad och kan logga in!</p>
</c:if>
<c:if test="${status == '2'}">
<p class="fail">Användarnamnet eller email adressen finns redan!</p>
</c:if>
</div>
答案 0 :(得分:1)
一种简单的方法是以html:
的形式将响应发送回客户端response.setContentType("text/html");
PrintWriter out = response.getWriter(); //Returns a PrintWriter object that can send character text to the client
out.println("<h1>Registered successfully</h1>");
有关详细信息,请查看这些Tutorials
如果您不想重新加载页面,那么您应该:
现在您可以在特定div中相应地设置响应结果。
有关如何将Ajax与Servlet一起使用的更多信息,请参阅this答案。
答案 1 :(得分:0)
我假设您使用jsp作为注册表单。
已使用用户名的情况:
从servlet发送变量&#34;状态= 1&#34;通过网址..
class Example{
int first;
int second;
};
template<typename pointer, typename T, typename Functype>
void sort_array(pointer puntatore, T* obj, int dim, Functype pred){
T val;
for(int i=1; i<dim; i++){
val=obj[i];
for(int j=(i-1); j>=0; j--){
if(pred(obj[j].*puntatore, val.*puntatore)){
obj[j+1]=obj[j];
obj[j]=val;
}
}
}
}
int main(){
Example array[5]={{1,2},{2,4},{1,7},{5,3},{6,7}};
//now i sort the elements in the array by their first element in a decreasing order
sort_array(&Example::first, array, 5, [](int a, int b){return (a<b);});
}
如果注册成功从servlet发送变量&#34; status = 2&#34;通过网址
response.sendRedirect ("registration.jsp?status=1);
现在在jsp下的用户ID文本框代码或表单上方的任何特定div中使用此代码..
response.sendRedirect ("registration.jsp?status=2);
它应该可以正常工作。
答案 2 :(得分:0)
我能想到的最简单的方法,你可以在提交说明下的注册页面上的某些div中隐藏变量说 msg ,如 {msg} ,并填写此变量在servlet doget或dopost中使用值(你曾经使用过)
doGet(...){
//code for deal with db
if(succesfullRegistration)
request.setAttribute("msg", "Registration Succesfull! Please Login and Proceed..or what ever you want to show...");
else
request.setAttribute("msg", "User already Exists");
}
// forward the request to same registration page.
}
对于Asnyc,用ajax做。