2014-04-22 42 views
0

我使用一個HTML表單將數據發送到一個servlet,該servlet會檢查提交的有效(對某些規則)的數據,並重新加載與新請求的頁面屬性返回結果。我幾乎可以保證這不是做這件事的最好方式,但我不認爲這是造成這個問題的原因。我認爲問題在於表單重定向到localhost:8080/Register而不是localhost:8080/project-context/Register。有沒有什麼方法可以在HTML中指定路徑?我可以用一些JSP表達式來完成嗎?我寧願不對項目路徑進行硬編碼,因爲它將來可能會改變。 HTML和相關的servlet代碼都低於:404 HTML表單提交給Servlet的

HTML:

<body> 

     <% String errorMessage = (String) request.getAttribute("ErrorMessage"); %> 

     <form name="Register" action="/Register" method="POST"> 

      <%= errorMessage %><br><br> 

      User name: <input type="text" name="username"><br> 
      Password: <input type="password" name="password"><br> 
      Verify Password: <input type="password" name="vPassword"><br> 
      Email: <input type="text" name="email"><br> 
      Verify Email: <input type="text" name="vEmail"><br><br> 
      <input type="submit" value="Register"> 

    </form> 

</body> 

的Servlet/Java的:

@WebServlet("/Register") 
public class UserRegistrationServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    public UserRegistrationServlet() { 

     super(); 

    } 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     try { 

      HttpSession session = request.getSession(false); 

      if (session == null) { 

       request.getRequestDispatcher("/"); 
       return; 

      } 

      request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response); 

     } 

     catch(Throwable errorMessage) { 

      request.setAttribute("ErrorMessage", errorMessage.getMessage()); 
      request.setAttribute("Error Cause", errorMessage.getCause()); 
      request.setAttribute("ErrorLocation", this.getServletName()); 
      request.setAttribute("ErrorStackTrace", errorMessage.getStackTrace()); 

      request.getRequestDispatcher("/WEB-INF/errorDisplay.jsp").forward(request, response); 

     } 

    } 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     try {  

      String ErrorMessage = ""; 

      //Check user name is supplied 

      if (request.getParameter("Username") == null) { 

       ErrorMessage = "You must enter a username!"; 

       request.setAttribute("ErrorMessage", ErrorMessage); 

       request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response); 

       return; 

      } 

      //Check user name for maximum length 

      if (request.getParameter("Username").length() > 16) { 

       ErrorMessage = "The username you entered was too long! Only 16 characters are allowed."; 

       request.setAttribute("ErrorMessage", ErrorMessage); 

       request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response); 

       return; 

      } 

      //Check password is supplied 

      if (request.getParameter("Password") == null) { 

       ErrorMessage = "You must enter a password!"; 

       request.setAttribute("ErrorMessage", ErrorMessage); 

       request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response); 

       return; 

      } 

      //Check password for complexity 

      /*-------------------------------------------------------- 
      (?=.*[0-9]) a digit must occur at least once 
      (?=.*[a-z]) a lower case letter must occur at least once 
      (?=.*[A-Z]) an upper case letter must occur at least once 
      (?=[\\S]+$) no whitespace allowed in the entire string 
      .{6,16} at least 6 to 16 characters 
      ---------------------------------------------------------*/ 

      Pattern passwordPattern = Pattern.compile("((?=.*[0-9])(?=.*[a-z]) (?=.*[A-Z])(?=[\\S]+$).{6,16})", Pattern.CASE_INSENSITIVE); 

      Matcher passwordMatcher = passwordPattern.matcher(request.getParameter("Password")); 

      if (passwordMatcher.find() == false) { 

       if (request.getAttribute("password") == request.getAttribute("vPassword")) {} 
       else { 

        ErrorMessage = "The passwords you entered do not match!"; 

        request.setAttribute("ErrorMessage", ErrorMessage); 

        request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response); 

        return; 

       } 

       ErrorMessage = "The password you entered does not abide by the strength rules!"; 

       request.setAttribute("ErrorMessage", ErrorMessage); 

       request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response); 

       return; 

      } 

      //Check email is supplied 

      if (request.getParameter("Email") == null) { 

       ErrorMessage = "You must enter an email!"; 

       request.setAttribute("ErrorMessage", ErrorMessage); 

       request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response); 

       return; 

      } 

      //Validate email - *@* 

      Pattern emailPattern = Pattern.compile("[email protected]+\\.[a-z]+", Pattern.CASE_INSENSITIVE); 

      Matcher emailMatcher = emailPattern.matcher(request.getParameter("Email")); 

      if (emailMatcher.find() == false) { 

       if (request.getAttribute("email") == request.getAttribute("vEmail")) {} 
       else { 

        ErrorMessage = "The emails you entered did not match!"; 

        request.setAttribute("ErrorMessage", ErrorMessage); 

        request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response); 

        return; 

       } 

       ErrorMessage = "The email you entered is not valid!"; 

       request.setAttribute("ErrorMessage", ErrorMessage); 

       request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response); 

       return; 

      } 

      UserRegistrationBean user = new UserRegistrationBean(); 
      user.setUsername(request.getParameter("Username")); 
      user.setPassword(request.getParameter("Password")); 
      user.setEmail(request.getParameter("Email")); 

      user = UserDAO.register(user); 

      if (user.getExists() == true) { 

       ErrorMessage = "The user name you entered has already been registered!"; 

       request.setAttribute("ErrorMessage", ErrorMessage); 

       request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response); 

       return; 

      } 

     } 

     catch(Throwable errorMessage) { 

      request.setAttribute("ErrorMessage", errorMessage.getMessage()); 
      request.setAttribute("Error Cause", errorMessage.getCause()); 
      request.setAttribute("ErrorLocation", this.getServletName()); 
      request.setAttribute("ErrorStackTrace", errorMessage.getStackTrace()); 

      request.getRequestDispatcher("/WEB-INF/errorDisplay.jsp").forward(request, response); 

     } 

    } 

} 

提前任何幫助,您可以提供謝謝!

回答

1

你需要在行動前的前綴context path

<form name="Register" action="${pageContext.servletContext.contextPath}/Register" method="POST"> 

明智的做法是,每當你指的是任何資源在應用程序中使用的contextPath。 如:

<link rel="stylesheet" type="text/css" ref="${pageContext.servletContext.contextPath}/css/test.css"/> 

<script type='text/javascript' src='${pageContext.servletContext.contxtPath}/js/test.js'></script> 

<img src="${pageContext.servletContext.contextPath}/images/test.jpg" alt="alt text"> 

這裏的contextPath已被用來指我的樣式表,JavaScript和圖像。

HttpServletRequest.getContextPath() $ {pageContext.request.contextPath}也可以用於檢索contextPath,但是ServletContext.getContextPath()因爲指定的原因here

+0

謝謝,這是我一直在尋找的方法! – TOFFster

0
<form name="Register" action="/project-context/Register" method="POST"> 

HTML表單中使用form元素的action屬性來指定目標URL。
如果你想從一個變量傳遞的網址,然後把下面的代碼在你的doGet方法:

request.setAttribute("actionAttr", variableWhichHoldsURL); 

這是給你,你這個變量。然後把它放在你的servlet代碼中:

<% String actionAttr = (String) request.getAttribute("actionAttr"); %> 
<form name="Register" action="<%= actionAttr %>" method="POST"> 

順便說一句。這正是你在代碼中用errorMessage所做的。

+0

我明白,但有反正我可以動態指定?項目路徑可能會多次更改。 – TOFFster