2016-02-13 39 views
0

编辑:被标记为重复(Servlet returns "HTTP Status 404 The requested resource (/servlet) is not available")我在第一次设置servlet时没有任何问题,一切正常,当我提交时正确加载结果。重复项显示了如何设置xml和jsp,并以相同的方式设置它们。如果我没有填写他们一次,我有正常的重试,但第二次,无论是否正确的url变成.../one/one/main,产生404.带包的servlet无法正常工作,并且在url中复制包两次

如果我设置的XML类型的名称没有包(在示例<url-pattern>/servlet</url-pattern>中),servlet甚至不会在第一次正确尝试时启动。不管url模式和从表单引用,在url模式上我有/one/Main,表单one/Main。在重复任何形式的例子中,我在提交后尝试了404结果。 我试图删除xml servlet配置,并使用这个(@WebServlet(description = "Main", urlPatterns = { "/one/Main" }))从servlet中使用@WebServlet,我有同样的问题,第一次工作,第二次尝试它是one/one/Main中的url。

在这个简单的servlet中,每当我使用一个包时,它会将url更改为../one/one/Main,当我第二次填充两个输入文本字段时。

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); 
} 

JSP形式部分

<form action="one/Main" method="post">..</form> 

XML servlet映射

<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> 

我试图的类相应复制one封装外部,并重新配置form标签和XML(组servlet类到Main,模式/Main和jsp行动到Main),在这一点上它完美的作品,我可以错过填充字段多少次我想要的,它会继续重新加载消息,但一旦servlet和User javabean在一个包当我运行并错过输入两次,URL更改为双包/Main,我有一个404.

回答

1

问题是,您在JSP中使用相对路径来提交表单。一旦JSP与您的servlet不在相同的基本路径上,您在提交表单后就拥有不同的基本路径。

你应该阅读5.1.2 Relative URLs了解相对URL是如何工作的:

相对URL(在RFC1808定义)不包含任何协议 或机器的信息。其路径通常是指与当前文档相同的机器上的资源。相对URL可能包含 相对路径组件(".."表示由路径定义的层次结构 中的一级),并且可能包含片段标识符。

使用基本URL将相对URL解析为完整URL。 RFC1808 定义了这个过程的规范算法。

作为相对URL解析的一个示例,假设我们有基本URL http://www.acme.com/support/intro.html。在 下面的标记相对URL的超文本链接:

<A href="suppliers.html">Suppliers</A> 

将扩展为完整的URL http://www.acme.com/support/suppliers.html,而相对URL 下面的标记的图像

<IMG src="../icons/logo.gif" alt="logo"> 

将扩大到完整的网址http://www.acme.com/icons/logo.gif

相关问题