我正在使用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。为何如此区别?
答案 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?
希望这有帮助