Java 带有包的Servlet不';t工作并在url中复制包两次

Java 带有包的Servlet不';t工作并在url中复制包两次,java,html,jsp,url,servlets,Java,Html,Jsp,Url,Servlets,编辑:被标记为重复()我在第一次设置servlet时没有任何问题,一切正常,提交时正确加载结果。副本显示了如何设置xml和jsp,我用同样的方法设置了它们。如果我一次正常重试不填写,但第二次不管是否正确,url都会变成../one/one/main,结果是404 如果我将xml的url模式设置为没有包的类名(在示例/servlet),servlet甚至不会在第一次正确尝试时启动。不管url模式和表单引用如何,在url模式上我有/one/Main,在表单上有one/Main。在副本中,我尝试的任何

编辑:被标记为重复()我在第一次设置servlet时没有任何问题,一切正常,提交时正确加载结果。副本显示了如何设置xml和jsp,我用同样的方法设置了它们。如果我一次正常重试不填写,但第二次不管是否正确,url都会变成
../one/one/main
,结果是404

如果我将xml的url模式设置为没有包的类名(在示例
/servlet
),servlet甚至不会在第一次正确尝试时启动。不管url模式和表单引用如何,在url模式上我有
/one/Main
,在表单上有
one/Main
。在副本中,我尝试的任何表单示例在提交后都会产生404。 我试图删除xml servlet配置,并使用
@WebServlet
从servlet中删除(
@WebServlet(description=“Main”,urlPatterns={/one/Main“})
),我遇到了同样的问题,第一次有效,第二次尝试url中的one/one/Main

在这个简单的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
包之外,并相应地重新配置表单标记和xml(将servlet类设置为
Main
,将模式设置为
/Main
,将jsp操作设置为
Main
),在这一点上,它可以完美地工作,我可以错过填充字段的次数,它将继续用消息重新加载适当的页面,但是当我运行并两次错过输入时,只要servlet和
用户
javabean都在一个包中,url就会变为双包
/Main
,我就有一个404。

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

您应该阅读以下内容以了解相对URL的工作原理:

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

相对URL使用基本URL解析为完整URL。 定义此过程的标准算法

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

 <A href="suppliers.html">Suppliers</A>
将扩展到完整的URL
http://www.acme.com/icons/logo.gif

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