编辑:被标记为重复(Servlet returns "HTTP Status 404 The requested resource (/servlet) is not available")我第一次设置servlet时没有任何问题,一切正常,当我提交它时,正确加载结果。副本显示了如何设置xml和jsp,我以相同的方式设置它们。如果我在正常重试后没有填写它们,但第二次无论它是否正确,网址都会变为.../one/one/main
,从而产生404。
如果我将xml的url模式设置为没有包的类名(在示例<url-pattern>/servlet</url-pattern>
中),则servlet甚至不会在第一次正确尝试时启动。无论网址格式和表单引用,在网址格式上我都有/one/Main
,格式为one/Main
。在副本中,我尝试的任何形式的示例都会在提交后生成404。
我试图删除xml servlet配置并使用{(1}})从servlet中使用@WebServlet
,我有同样的问题,第一次工作,第二次尝试它的一个/一个/主要在网址。
在这个简单的servlet中,每当我使用一个包时,当我第二次不填写两个输入文本字段时,它会将网址更改为@WebServlet(description = "Main", urlPatterns = { "/one/Main" })
。
../one/one/Main
jsp表单部分
public void doPost(HttpServletRequest request
, HttpServletResponse response) throws ServletException, IOException{
String action = request.getParameter("action");
String url = "/index.jsp";
if(action==null)
action="join";
if(action.equals("join"))
url="/index.jsp";
else if(action.equals("ok")){
String fName = request.getParameter("firstName");
String sName = request.getParameter("secondName");
if(fName==null||sName==null||fName.equals("")||sName.equals("")){
url = "/index.jsp";
request.getSession().setAttribute("message"
, "Please fill all the fields");
}
else{
url = "/thanks.jsp";
request.getSession().setAttribute("user"
, new User(fName, sName));
}
}
getServletContext().getRequestDispatcher(url)
.forward(request, response);
}
xml servlet mapping
<form action="one/Main" method="post">..</form>
我试图复制<servlet>
<servlet-name>Main</servlet-name>
<servlet-class>one.Main</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Main</servlet-name>
<url-pattern>/one/Main</url-pattern>
</servlet-mapping>
包之外的类,并相应地重新配置表单标记和xml(将servlet类设置为one
,将模式设置为Main
并将jsp操作设置为{{ 1}}),在那一点上它完美地工作,我可以错过填写字段我想要多少次,它将继续使用消息重新加载正确的页面,但是一旦servlet当我运行并错过输入两次时,/Main
javabean位于 one 包内,url更改为double package Main
,我有404。
答案 0 :(得分:1)
问题是您在JSP中使用相对路径来提交表单。一旦JSP与您的servlet不在同一个基本路径上,您在提交表单后就会有不同的基本路径。
您应该阅读5.1.2 Relative URLs以了解相对网址的工作原理:
相对网址(在RFC1808中定义)并不包含任何协议 或机器信息。它的路径通常指的是一个资源 与当前文档相同的机器。相对URL可能包含 相对路径组件(
".."
表示层次结构中的一个级别 由路径定义,并可能包含片段标识符。使用基本网址将相对网址解析为完整网址。 RFC1808 定义了此过程的规范算法。
作为相对URL解析的示例,假设我们有基本URL
http://www.acme.com/support/intro.html
。中的相对URL 以下是超文本链接的标记:<A href="suppliers.html">Suppliers</A>
会扩展为完整的网址
http://www.acme.com/support/suppliers.html
,而相对网址 在以下图像标记中<IMG src="../icons/logo.gif" alt="logo">
会扩展为完整的网址
http://www.acme.com/icons/logo.gif
。