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

时间:2011-06-09 21:16:19

标签: 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);
     }

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

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

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

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

由于url没有更改为s / results.jsp,我无法使用'../'访问资源 当我使用jsp分页时,当我点击下一步时,网址将更改为s / results.jsp 在这种情况下,我可以使用../

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

在我看来,另一个解决方案是为两个jsp创建两个不同的servlet 但我不知道在哪里放置servlet,以便它可以使用../

访问s文件夹外的资源

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

我试图找到有关此内容的信息,但未能弄明白。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:8)

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

<a href="${user.loggedin ? 's/' : ''}results?id=10">

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

<url-pattern>/results</url-pattern>
<url-pattern>/s/results</url-pattern>

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

答案 1 :(得分:1)

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

在上面的代码中,而不是使用请求调度程序,

RequestDispatcher dispatcher = request.getRequestDispatcher(address);
            dispatcher.forward(request,response);

我们可以试试

response.sendRedirect(request.getContextPath()+"/address");