注册表单提交和Java servlet

时间:2016-03-05 19:16:05

标签: javascript java forms jsp servlets

我在我的网站上有一张注册表格。提交表单时,会调用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>

3 个答案:

答案 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

如果您不想重新加载页面,那么您应该:

  • 通过Javascript
  • 向您的servlet发送Ajax请求
  • 检查发送到您的Servlet的值,就像您现在正在做的那样,并按照我在上面的代码中提到的那样发送响应(您可以发送成功或失败的布尔值,以便稍后检入Javascript)
  • 您将收到Javascript中的响应数据作为Ajax响应
  • 现在您可以在特定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做。

相关问题