jsp,servlet,web.xml中地址url加不加斜杠/的区别

痛苦面具,跟着视频马上敲好,就是运行不对,这个斜杠的问题我一直没当回事,今天调了一个小时,总结一下吧。

首先你要知道你当前服务器的地址,正常情况下,都是http://localhost:8080,而我的就是脑子抽了不正常。

如何看正不正常,点编辑配置。

 

 

 

 看应用程序上下文是什么,比如我的是/j1,那我的根地址就是http://localhost:8080/j1.

然后现在说加不加“/”的事,一共就三种情况

①web.xml中<url-pattern>中加不加

web.xml中的地址必须加“/”,不加就报错,没什么说的。难的在后面两个

通常来说,不加斜杠的形式(如”example.jsp”)请求的是相对于当前页面路径的资源 http://localhost:8080/webapp/examole;

加斜杠的形式(”/example.jsp”)请求的是服务器根目录下的资源,完整的url是由服务器地址+/example构成的:http://localhost:8080/example。

对于我这个项目来说有个/j1,加上斜杠是http://localhost:8080/example,但是我应该是http://localhost:8080/j1/example。所以说我的地址应该是/j1/example.jsp。那么现在再看下面两个

②jsp中form表单的action加不加

先看我的代码。

<form action="servlet/login" method="post">
    <input type="text" name="username">
    <input type="submit">
</form>

我现在加斜杠,那么他提交的地址就是http://localhost:8080/servlet/login。

提交完后,他会去看web中的mapping,看跟谁一样,找到一样的再找到与其对应的servlet,就可以接着运行了,然后看我的web.xml代码。

    <servlet>
        <servlet-name>loginservlet</servlet-name>
        <servlet-class>servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>loginservlet</servlet-name>
        <url-pattern>/servlet/login</url-pattern>
    </servlet-mapping>

/serlet/login是不是感觉很像,但是这个实际上是http://localhost:8080/j1/servlet/login,多了个j1(因为上文提到了我的应用程序上下文是/j1)。所以jsp中提交的地址就没有与其对应的,那么就会返回404.

所以我们将jsp中的/去掉,那么提交的地址就是http://localhost:8080/j1/servlet/login。

③servlet重定向地址加不加

 这时候根据上述代码会去访问LoginServlet。代码如下:

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        System.out.println("进去Loginservlet");
        System.out.println(username);
        if(username.equals("admin")){
            req.getSession().setAttribute("USER_SESSION",req.getSession().getId());
            resp.sendRedirect("sys/success.jsp");
        }else{
            resp.sendRedirect("/j1/sys/error.jsp");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

我专门弄了两种情况,第一种就是没加/,第二个就是加/了。当前的地址使http://localhost:8080/j1/servlet/login。如果输入框中,输入了admin,看代码,没有/,那么就会进如当前目录加上后面的sys/success.jsp即http://localhost:8080/j1/servlet/sys/success.jsp.如图

 

 

 如果输入框输入的其他的比如abc,那么此时重定向的有/那么就是http://localhost:8080+/j1/sys/error.jsp,即http://localhost:8080/j1/sys/error.jsp。

 

 综上,你只要记住,没加斜杠相当于相对定义,就是当前目录加上地址,加上斜杠就是绝对定位,就是http://localhost:8080+你的地址。

posted @ 2022-03-12 20:16  塵暘  阅读(525)  评论(0编辑  收藏  举报