3

I am having a weird problem here, and I am really stuck, need to get this work badly.

so i have a page say index.jsp with a link say "a href=servlet?id=10". when I click on this link it will go to doGet() on my servlet and here is the code in my 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);
     }

So the above code works fine but after request forwarding, my browser shows the url as

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

I don't want the above url as i am forwarding to two different jsp's based on the user login status one is in 's' folder and other is outside of that. if user is logged in then i forward to 's/results.jsp' and if user is not logged in i am forwarding to 'results.jsp'.

in case of s/results.jsp i am accessing resources like images and scripts from outside of 's' folder by using ../ in the results.jsp.

as url is not changing to s/results.jsp , i am unable to access the resources with '../' and as i am using jsp pagination , when i click next the url is changing to s/results.jsp and in that case i am able to access resources using ../

one solution in my mind is to copy all resources in s folder , but that would increase redundancy.

one other solution in my mind is to create two different servlets for two jsp's but i don't know where to put the servlet so that it can access resources outside of s folder with ../

is their any other good way i can do the task..

I have tried to find information about this but haven't been able to figure it out.

Any help will be very much appreciated.

Mohammad Adil
  • 43,337
  • 17
  • 86
  • 109

2 Answers2

8

You have basically instructed your webbrowser to send a request to exactly that URL. The forward does not change the URL. It is entirely server side. Apart from using response.sendRedirect() instead -which would trash the current request, including all of its attributes, and create a brand new request on the given URL-, you could also just change your link to <a href="results?id=10">, or when the user is logged in, to <a href="s/results?id=10">.

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

Finally alter the servlet mapping accordingly so that it get invoked on those URLs.

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

You'll only miss the JSP extension. But JSPs which are to be used by a dispatcher belong in /WEB-INF folder anyway so that they cannot be viewed by the enduser directly without invoking the servlet first. You also end up with nicer URLs.

BalusC
  • 992,635
  • 352
  • 3,478
  • 3,452
  • cvc-complex-type.2.4.d: Invalid content was found starting with element 'url-pattern'. No child element is expected at this point. eclipse is showing this error when i am adding these lines in web.xml /results /s/results – Mohammad Adil Jun 09 '11 at 21:41
  • Uh, did you put it in the `` the usual way? You should not put it in random place. It was intented to replace your old `/servlet`. – BalusC Jun 09 '11 at 21:46
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);
 }

in the above code instead of using request dispatcher,

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

we can try with

response.sendRedirect(request.getContextPath()+"/address");
Paweł Hemperek
  • 1,090
  • 10
  • 18