前言
表单提交到Servlet,是一个很简单的功能,可是其中涉及到的一些细节你注意到了吗?今天就大家可能出现问题的一个地方进行一个说明。
实现
首先我们需要一个Servlet
public class HelloServlet implements Servlet {
很简单,多余的代码我就不给出了,因为我们今天讨论的重点是路径问题,然后我们需要在web.xml中注册和映射这个Servlet
<!--注册 -->
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.study.javaweb.HelloServlet</servlet-class>
</servlet>
<!-- 映射 -->
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
//注意:这里的url-pattern配置的是当前Servlet对外的访问路径
<url-pattern>/hello</url-pattern>
</servlet-mapping>
Servlet已经配置好了,接下来我们写一个表单,这里创建一个login.html,内容如下
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/hello" method="post">
用户名:<label for="username"><input type="text" name="username"/></label> <br>
密码:<label for="password"><input type="password" name="password"/></label> <br>
<input type="submit"/>
</form>
</body>
</html>
这里form的action我们需要指定Servlet的访问路径,也就是hello,那么这个时候可能有人会有问题了,这个hello到底应该不应该加/呢,下面给大家放出测试的效果图,首先来个带斜杠的,也就是action=”/hello”
我们发现,加上斜杠以后报错了,找不到Servlet,此时浏览器的地址变成了http://localhost:8888/hello,很明显这个路径是错的,没有带上我们的项目名称
那么原因是什么呢?
原因
在JavaWeb中,斜杠(/)在不同地方代表的不同的路径,总结如下:
代表当前Web应用的根路径(/需要交给servlet处理),也就是localhost:8080/contextPath/
a:请求转发
b:web.xml中配置的
代表当前站点的跟路径(浏览器处理),localhost:8080
a:超链接
b:表单中的action
c:请求重定向
这下大家明白了没,这里如果我们加上写/,就相当于去站点的根目录下找hello这个Servlet,很显然没有,所以报错了,此时浏览器的地址栏为
http://localhost:8888/hello
,这个是有问题的,正确的应该是
http://localhost:8888/JavaWebStudy/hello
而要实现这样,我们就不能给action的路径中加入斜杠,或者这样写
<form action="/JavaWebStudy/hello" method="post">
也是可以的。