何时使用正斜杠以及何时不使用正斜杠?

时间:2012-03-07 21:18:56

标签: jsp servlets

我正在使用JSP和Servlets尝试基本登录,并且不了解如何使用forwardslashes来指示路径。

login.JSP位于LoginApp / WebContent / login.jsp

LoginServlet.java位于LoginApp / src / org / koushik / javabrains / LoginServlet.java

我的login.jsp文件中包含以下代码 -

 <form action="login" method="post">

 <br>User ID  input type="text" name="userId" />
 <br>Password <input type="password" name="password" />
 <br><input type="submit" />

 </form>

相应的servlet代码是

  @WebServlet("/login")  // <-- forwardslash here
  public class LoginServlet extends HttpServlet 
   {
     private static final long serialVersionUID = 1L;

     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
      {
         String userId, password;

         userId = request.getParameter("userId");
         password = request.getParameter("password");

                 // more code here
      }

    }

如果我们看到表单操作,则在“login”之前没有forwardslash,而如果我们看到servlet注释,则在“login”之前有一个forwardslash。为何如此区别?

1 个答案:

答案 0 :(得分:3)

@WebServlet("/login")

/login是一个网址格式,是contextPath

的相对应用程序

e.g。如果您的应用程序的上下文路径为webapp,则请求

http://localhost:8080/webapp/login会加载LoginServlet

在你的jsp中表单动作

相对于jsp页面本身不是 contextPath。

但是因为你的jsp位于webroot文件夹(你的jsp和WEB-INF文件夹所在的顶级文件夹)

http://localhost:8080/webapp/login.jsp

然后是

形式的action="login"属性

将解析到该位置

http://localhost:8080/webapp/login

提交表单时会调用LoginServlet

如果将jsp移动到子文件夹(例如folder1),则action=login将不会调用登录servlet

因为jsp现在位于

http://localhost:8080/webapp/subfolder/login.jsp 所以action=login

现在将解决 http://localhost:8080/webapp/subfolder/login

并且找不到servlet(记住登录servlet是相对于上下文根的,这就是@WebServlet("/login")中的/表示)

将表单操作更改为

<form action="../login" method="post">

会起作用。

避免在网页表单中进行此操作

大多数人会将表单操作更改为

<form action="${pageContext.request.contextPath}/login" method="post">

所以jsp位于el表达式

的位置

${pageContext.request.contextPath}/login

将解析到与使用url pattern / login

定义的servlet相同的位置

有关el表达式的更多信息,请参阅What does this expression language ${pageContext.request.contextPath} exactly do in JSP EL?

希望这有帮助