【问题标题】:When to use forwardslash and when not to use forwardslash?什么时候使用正斜杠,什么时候不使用正斜杠?
【发布时间】:2012-03-25 10:30:40
【问题描述】:

我正在尝试使用 JSP 和 Servlet 进行基本登录,但不明白如何使用正斜杠来指示路径。

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”之前没有正斜杠,而如果我们看到 servlet 注释,“login”之前有一个正斜杠。为什么会有这种差异?

【问题讨论】:

    标签: jsp servlets


    【解决方案1】:

    @WebServlet("/login")
    

    /login 是一个 url 模式,是相对于 contextPath 的应用程序

    例如如果您的应用程序的上下文路径为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 移动到子文件夹(例如文件夹 1)中,那么 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 模式 /login 定义的 servlet 相同的位置

    查看What does this expression language ${pageContext.request.contextPath} exactly do in JSP EL? 了解更多关于el 表达式的信息

    希望对你有帮助

    【讨论】:

    • 哇。这真的有帮助!谢谢!
    • 干杯老兄,我有点累,所以不太确定它是否有意义,很高兴它有帮助,我明天会尝试“整理”
    猜你喜欢
    • 2015-10-28
    • 2014-05-06
    • 2021-03-12
    • 2010-11-07
    • 2023-02-11
    • 2016-03-12
    • 2019-01-28
    相关资源
    最近更新 更多