在将请求从servlet发送到jsp之后,我们能以某种方式更改地址栏中的url

Moh*_*dil 3 java jsp servlets requestdispatcher

我在这里遇到一个奇怪的问题,我真的被困住了,需要把这项工作搞得很糟糕.

所以我有一个页面说index.jsp,链接说"a href = servlet?id = 10".当我点击这个链接时,它将转到我的servlet上的doGet(),这是我的servlet中的代码.

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
                 String action = request.getParameter("id");
                  // search database and create an arraylist
                        if(//user logged in)
                        address = "s/results.jsp";
                        else   
                        address = "results.jsp";
                   // set arraylist in session object
                RequestDispatcher dispatcher = request.getRequestDispatcher(address);
                dispatcher.forward(request,response);
     }
Run Code Online (Sandbox Code Playgroud)

所以上面的代码工作正常,但在请求转发后,我的浏览器显示网址为

http:// localhost/project/servlet?id = 10.

我不想要上面的网址,因为我根据用户登录状态转发到两个不同的jsp,一个位于's'文件夹中,而另一个位于该文件夹之外.如果用户已登录,则我转发到's/results.jsp',如果用户未登录,我将转发到'results.jsp'.

在s/results.jsp的情况下,我通过在results.jsp中使用../来访问's'文件夹外部的图像和脚本等资源.

由于url没有更改为s/results.jsp,我无法使用'../'访问资源,因为我正在使用jsp分页,当我点击下一步时,url正在更改为s/results.jsp并且我可以使用../访问资源

我认为一个解决方案是复制s文件夹中的所有资源,但这会增加冗余.

在我的脑海中另一个解决方案是为两个jsp创建两个不同的servlet但我不知道在哪里放置servlet以便它可以使用../访问s文件夹之外的资源

是他们能做任务的其他好方法..

我试图找到有关这方面的信息,但一直无法弄清楚.

任何帮助将非常感谢.

Bal*_*usC 8

您基本上已指示您的webbrowser向该URL发送请求.转发不会更改URL.它完全是服务器端.除了使用response.sendRedirect()- 它会丢弃当前请求(包括其所有属性)并在给定URL上创建全新请求之外,您还可以将链接更改为<a href="results?id=10">或在用户登录时更改<a href="s/results?id=10">.

<a href="${user.loggedin ? 's/' : ''}results?id=10">
Run Code Online (Sandbox Code Playgroud)

最后相应地更改servlet映射,以便在这些URL上调用它.

<url-pattern>/results</url-pattern>
<url-pattern>/s/results</url-pattern>
Run Code Online (Sandbox Code Playgroud)

你只会错过JSP扩展.但是调度程序使用的JSP /WEB-INF无论如何都属于文件夹,因此最终用户无法直接查看它们而无需先调用servlet.您最终还会获得更好的网址.