MVC2 - Класът на контролера не обслужва правилната JSP страница, след като към него са предадени валидни параметри на заявката

Това е първото ми MVC приложение. Имам файл Controller.java, 3 JSP файла и един JavaBean. В моя контролер имам условен израз, който изпраща потребителя към невалидна страница с дата, когато въведе дата ‹ или = днешна дата. Проблемът е, че когато потребителят натисне бутона за връщане назад в браузъра и въведе валидна дата, единствената страница, която продължава да се обслужва от моя контролер, е страницата с невалидна дата. какво правя грешно Опитах се да потърся отговор онлайн, но не успях да намеря подобен проблем (или поне аз лично не можах да намеря такъв).

Ето моя файл Controller.java:

public class Controller extends HttpServlet {
public static final String BOOKING="booking";
/** 
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
 * @throws javax.servlet.ServletException
 * @throws java.io.IOException
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    HttpSession session = request.getSession();
    ServletContext servletContext = getServletContext();
    String address;
    String hikeName = request.getParameter("hikeName");
    String duration = request.getParameter("dur");
    String hikeDate = request.getParameter("hikeDate");

    Booking b = (Booking) session.getAttribute(BOOKING);
    if (b == null) {
        b = new Booking();
        session.setAttribute(BOOKING, b);
        address = "/bookingView.jsp";
        RequestDispatcher dispatcher = servletContext.getRequestDispatcher(address);
        dispatcher.forward(request, response);  
    }
    else {
        if (b.dateCompare(hikeDate)) {              
            b.calculateCost(duration, hikeDate);
            RequestDispatcher dispatcher;
            dispatcher = servletContext.getRequestDispatcher("/quoteView.jsp");
            dispatcher.forward(request, response);
        } else {
            session.getAttribute(BOOKING);
            RequestDispatcher dispatcher1 = servletContext.getRequestDispatcher("/index.jsp");
            dispatcher1.forward(request, response);

        }
    }
}

Ето моят JavaBean:

public class Booking {
private String hikeName;
private String begDate;
private String endDate;
private String dur;
private int baseRate = 60;
private int duration = 0;
private int cost = 0;
private double premiumRate = baseRate * 1.5;
private DateTime jbegDate = new DateTime();
private DateTime jendDate = new DateTime();
private Boolean success = true;
private DateTime today = new DateTime();
DateTimeFormatter f = DateTimeFormat.forPattern("MM/dd/YYYY");
private LocalDate myDate = new LocalDate();
private LocalDate myDate2 = new LocalDate();

public void setHikeName(String hikeName) {
    this.hikeName = hikeName;
}
public String getHikeName() {
    return hikeName;
}
public void setBaseRate(int baseRate){
    this.baseRate = baseRate;
}
public int getBaseRate(){
    return baseRate;
}
public void setPremiumRate(int premiumRate){
    this.premiumRate = premiumRate;
}
public double getPremiumRate(){
    return premiumRate;
}
public void setDur(String dur){
    this.dur = dur;       
}
public String getDur(){
    return dur;
}
public void setBegDate(String begDate){
    this.begDate = begDate;
}
public String getBegDate(){
    return begDate;
}
public void setEndDate(String dur, String begDate){
    duration = Integer.parseInt(dur);
    this.begDate = begDate;
    DateTime dateOfHike = f.parseDateTime(begDate);
    jendDate = dateOfHike.plusDays(duration - 1);
    endDate = jendDate.toString(f);  
    this.endDate = endDate;
}
public String getEndDate(){
    return endDate;
}
public Boolean dateCompare(String begDate){
    myDate = f.parseLocalDate(begDate);
    if (myDate.isBefore(myDate2) || myDate.isEqual(myDate2))
        success = false;
return success;
}
public Boolean getSuccess(){
    return success;
}
public int getCost() {
    return cost;
}
public int calculateCost(String dur, String begDate){
   duration = Integer.parseInt(dur);
   this.begDate = begDate;
   DateTime dateOfHike = f.parseDateTime(begDate);  
   jendDate = dateOfHike.plusDays(duration - 1);
   int premiumDays = 0;
   int normalDays = 0;

   while (dateOfHike.isBefore(jendDate)) {
        int dayOfWeek = dateOfHike.getDayOfWeek();
        if (dayOfWeek == 6 || dayOfWeek == 7) {
            premiumDays++;
        } else {
            normalDays++;
        }
        dateOfHike = dateOfHike.plusDays(1);
    }
    if (jendDate.getDayOfWeek() == 6 || jendDate.getDayOfWeek() == 7) {
        premiumDays++;
    } else {
        normalDays++;
    }
    cost = (int) (normalDays * baseRate + premiumDays * premiumRate);
    return cost;
}

}

В страницата с JSP формуляр (bookingView.jsp) просто събирам 3 параметъра, използвайки текстово поле и две падащи менюта. Тук използвам метод GET.

В страницата quoteView.jsp представям на потребителя таблица, която съдържа 3-те параметъра заедно с изчислена крайна дата и изчислена цена на пътуването. Това е мястото, където администраторът трябва да изпрати потребителя, като приеме, че е въвел валидни данни във формуляра.

Ако не са въвели валидна дата, виждат формуляра index.jsp, който просто им казва да се върнат и да въведат валидна дата. Това е мястото, където кодът се забива (което означава, че след като отиде на тази страница, той остава на тази страница, независимо дали потребителят въвежда валидни данни или не). При всяка следваща заявка виждам, че данните, които избирам във формуляра, се предават при SUBMIT в адресната лента с помощта на HTTP GET. Но моят контролер не използва параметрите на заявката, за да актуализира моя изглед...


person Mash    schedule 08.08.2014    source източник
comment
Ако не показвате jsps, трябва да кажете за всеки дали съдържа формуляр и дали формулярът има метод get или post и с няколко думи какъв идентификатор показва.   -  person Serge Ballesta    schedule 08.08.2014
comment
Как и къде актуализирате вашия bean? Как наричате метода processRequest?   -  person Serge Ballesta    schedule 09.08.2014


Отговори (1)


Добре, разбирам какво се обърка. Стойността на моя метод setSuccess() не се актуализира след кодовия блок else. Чрез нулиране на стойността му обратно на TRUE точно преди края на кодовия блок else, той позволи на контролера да влезе, за да оцени if (b.dateCompare(hikeDate)) всеки път, когато нова заявка беше изпратена до сървъра от браузъра. Надяваме се, че може да помогне на някой друг noob в бъдеще.

person Mash    schedule 09.08.2014