我正在尝试使用JSP和Servlet进行基本登录,但我不明白如何使用正斜杠来指示路径。
login.JSP位于LoginApp/WebContent/login.jsp
位于LoginApp/src/org/koushik/javabrains/LoginServlet.java中的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”之前有一个正斜杠。为什么会有这样的差异?
发布于 2012-03-08 06:37:24
在……里面
@WebServlet("/login")/login是相对于contextPath的应用程序的url模式
例如,如果您的应用程序的上下文路径为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和so 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相同的位置
有关el表达式的详细信息,请参阅What does this expression language ${pageContext.request.contextPath} exactly do in JSP EL?
希望这能有所帮助
https://stackoverflow.com/questions/9609222
复制相似问题