【问题标题】:Can we somehow change the url in addressbar after dispatching request from servlet to jsp将请求从 servlet 发送到 jsp 后,我们能否以某种方式更改地址栏中的 url
【发布时间】:2011-06-09 21:16:19
【问题描述】:

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

所以我有一个页面说 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 分页时,当我单击下一步时,网址将更改为 s/results.jsp 在这种情况下,我可以使用 ../

访问资源

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

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

访问 s 文件夹之外的资源

他们还有其他我可以完成任务的好方法吗..

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

任何帮助将不胜感激。

【问题讨论】:

    标签: java jsp servlets requestdispatcher


    【解决方案1】:

    您基本上已经指示您的网络浏览器向该 URL 发送请求。转发不会更改 URL。它完全是服务器端。除了使用 response.sendRedirect() 代替 - 这将丢弃当前请求,包括其所有属性,并在给定 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。

    【讨论】:

    • cvc-complex-type.2.4.d:发现以元素“url-pattern”开头的无效内容。此时不需要子元素。当我在 web.xml /results/s/results 中添加这些行时,eclipse 显示此错误
    • 呃,你把它放在&lt;servlet-mapping&gt; 中了吗?你不应该把它放在随意的地方。它旨在替换您的旧&lt;url-pattern&gt;/servlet&lt;/url-pattern&gt;
    【解决方案2】:
    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");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 2014-02-25
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 2015-07-26
      • 2013-05-09
      相关资源
      最近更新 更多