我在这里遇到一个奇怪的问题,我真的被困住了,需要把这项工作搞得很糟糕。
所以我有一个页面说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文件夹外的资源是他能做任务的其他好方法..
我试图找到有关此内容的信息,但未能弄明白。
非常感谢任何帮助。
答案 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");