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+你的地址。