3

我在这里遇到了一个奇怪的问题,我真的被困住了,需要好好完成这项工作。

所以我有一个页面说 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);
     }

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

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

我不想要上面的url,因为我根据用户登录状态转发到两个不同的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 文件夹之外的资源

他们还有其他什么好方法我可以完成这项任务吗?

我试图找到有关此的信息,但无法弄清楚。

任何帮助将不胜感激。

4

2 回答 2

8

您基本上已经指示您的网络浏览器向该 URL 发送请求。转发不会更改 URL。它完全是服务器端。除了使用response.sendRedirect()instead - 这将丢弃当前请求,包括其所有属性,并在给定的 URL 上创建一个全新的请求 - ,您还可以将链接更改为<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 的情况下直接查看它们。您还可以得到更好的 URL。

于 2011-06-09T21:22:04.307 回答
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");
于 2016-10-25T10:09:55.653 回答