Ανάπτυξη ιστοτόπου σε περιβάλλον Debian/Σχεδιαστικοί μέθοδοι-πρακτικές

Με τον όρο Μοντέλο-Απεικονιστής-Ελεγκτής(Model Viewer Controller) αναφερόμαστε σε αρχιτεκτονικό πρότυπο σχεδιάσης εφαρμογών.

Η (Object-Relational mapping -γνωστή και σαν O/RM, ORM, και O/R απεικόνιση)Είναι προγραμματιστική τεχνική που επιτρέπει την διασύνδεση και επικοινωνία ανάμεσα σε ένα οντοκεντρικό πρόγραμμα και μια σχεσιακή βάση δεδομένων.

  • Ποτέ μην δείχνεις ιστοσελίδες απαντώντας σε POST
  • Πάντα να φορτώνεις σελίδες με GET
  • Πλοηγήσου από POST σε GET με χρήση REDIRECT

Ένα πολύ σημαντικό σχεδιαστικό πρότυπο που πρέπει να ενσωματώσουμε στους ιστοτόπους μας είναι το αίτημα Post/Redirect/Get (PRG). το οποίο είναι κάποιοι σχεδιαστικοί κανόνες που εφόσον ακολουθήσουμε αποφεύγουμε το πρόβλημα των πολλαπλών υποβολών φορμών, και επιτρέπει μια ποιό εύλογη συμπεριφορά του πλοηγού σε ανταπόκριση του κουμπίου reload - back -forward και των αγαπημένων .

Μετά την υποβολή μιας φόρμας από ένας χρήστη , ο εξυπηρετητής τυπικά παράγει μια html σελίδα σαν απάντηση , η οποία μοίαζει σαν απλή ιστοσελίδα αλλά επειδή δημιουργήθηκε από μια http POST αίτηση δεν μπορεί να γίνει σελιδοδείκτης , και οποιαδήποτε προσπάθεια για επαναφόρτωση της θα είχε σαν αποτέλεσμα να ξανασταλθεί το ίδιο POST αίτημα στον server κάτι που θα μπορούσε να προκαλέσει μη-αναμενόμενα αποτελέσματα.(πχ διπλή αγορά!).

Για να αποφύγουμε αυτό το πρόβλημα ακολουθούμε το PRG πρότυπο , και αντί να επιστρέψει ο εξυπηρετητής κατευθείαν μια html σελίδα επιστρέφει αντίθετα επιστρέφει μια εντολή ανακατεύθυνσης (χρησιμοποιώντας τον HTTP 303 κωδικό απόκρισης -ή 302 μερικές φορές) μαζί με μία επικεφαλίδα HTTP "Location" , η οποία δίνει εντολή στον πλοηγό να φορτώσει μια διαφορετική σελίδα χρησιμοποιώντας μια αίτηση HTTP GET. Η τελική αυτή σελίδα που θα πάρει ο πλοηγός μπορεί με ασφάλεια να γίνει σελιδοδείκτης ή να επαναφορτωθεί χωρίς παρενέργειες.


Το να μπορείτε να ανανεωσετε μια ιστοσελιδα σε έναν πλοηγό διαδικτυου ειναι ενα σημαντικο χαρακτηριστικο της χρηστικοτητας. Επισης, ειναι μια περίπτωση χρήσης του MVC : η ιστοσελιδα ειναι μια όψη του υποκειμενου μοντελο, ειναι ενα παραθυρο μεσω του οποιου ο χρηστης κοιταζει τα δεδομενα.

Δυο δημοφιλη προγραμματα περιηγησης: MSIE και Netscape / Mozilla εχουν διαφορετικα ονοματα για τη σελιδα λειτουργια ανανεωσης. IE χρησιμοποιει περισσοτερο φιλικη προς το χρηστη "ανανεωσης", ενω οι περισσοτερες τεχνικες χρησεις Netscape "επαναφορτισης". Προτιμω "επαναφορτιση" ως πιο σωστο ορος, αλλα, στην πραγματικοτητα, τοσο επαναφορτιση και ανανεωση λαμβανουν χωρα οταν ενας χρηστης προσπαθει να ανανεωσει τη σελιδα στο προγραμμα περιηγησης.

Πολυ συχνα, ενας χρηστης αγνοει οτι ο φυλλομετρητης ξαναστέλνει πληροφοριες στο διακομιστη κατα τη διαρκεια της επαναφορτισης σελιδα. Ακομα και εαν ενα προγραμμα περιηγησης προειδοποιει το χρηστη οτι οι πληροφοριες θα πρεπει να ξανασταλθούν στον server, ο χρηστης συχνα δεν μπορεί να καταλαβει την τεχνικη εννοια της προειδοποιησης. Ας δούμε τι συμβαινει κατα τη διαρκεια μιας τυποποιημενης υποβολης μια φόρμας.

  • Η πρωτη σελιδα που περιεχει μια φορμα εισοδου θα μπορουσε να ληφθει απο το διακομιστη χρησιμοποιωντας ειτε GET η POST. Αν χρησιμοποιήθηκε GET ο χρηστη στη συνεχεια, μπορει να ανανεωσετε αυτη τη σελιδα χωρις να βλεπουμε το ενοχλητικό μήνυμα "Οι πληροφοριες πρεπει να ξανασταλθούν" μηνυμα. Ακομη, αν αυτο το GET εχει επισυναψει παραμετρους, θα πρεπει να ξανασταλθούν στον server.
  • Αφου ο χρηστης συμπληρωνει την φορμα, το αιτημα αυτο υποβαλλεται στο διακομιστη. Η μέθοδος POST χρησιμοποιείται συνήθως για την αποστολη εντυπων.
  • Ο Server απαντα με τα αποτελεσματα σελιδας.

Το αποτελεσμα μπορει να φαινεται εντελως αθώο, μονο βαρετά αποτελεσματα απο τη βαση δεδομενων. Για οποιονδηποτε απλό χρήστη του διαδικτυου φαινεται εντελώς απλό και εύκολο να ανανεώσει αυτη τη σελιδα. Οι περισσοτεροι ανθρωποι νομιζουν οτι η λεξη "ανανεωση" σημαινει ακριβως αυτο που ακουγεται: επαναφορτωση της σελιδας με τα δεδομενα απο το διακομιστη.

Ομως, στην πραγματικοτητα, το να ανανεώσετε τη σελιδα των αποτελεσμάτων θα σήμαινε να ξανασταλεί το ιδιο αιτημα στον server που χρησιμοποιηθηκε για να αποκτησετε την σελιδα σε πρωτη φαση. Αυτο σημαινει, να γίνει το POST αίτημα παλι. Εδω ενας χρηστης βλεπει το μήνυμα "Πληροφοριες πρεπει να ξανασταλθούν" .Ξαναστέλνωντας τις πληροφορίες μπορει να παραχθούν ανεπιθυμητα η ασυνεπειες σε τροποποιησεις των στοιχειων της βάσης μας. Έτσι, αυτες οι εκ νεου αποστολές αιτημάτων πρεπει να αντιμετωπιστούν σωστά απο τον ελεγκτη και το μοντελο.

Τωρα θα εχουμε το εξής προβλημα: θα πρεπει να επαναλαβετε το συνολο του αρχικου αιτηματος για να αποκτησετε την σελιδα αποτελεσμάτων.Όμως η λειτουργία της ανανεωσης δεν ειναι πραγματικα συμμορφούμενη με το πρότυπο MVC - επειδη δεδομενα χρηστη αποστελλονται στο server. Η λυση του προβληματος ειναι η απλη - ανακατεύθυνση.

ΤΗν τεχνικη αυτη την αποκαλούμε μοτίβο αιτήματος PRG, γιατι αποτελειται απο τρια βασικα μερη: Post Redirect Get. Το πρωτη δεν ειναι απαραιτητα POST, αυτο ακριβως το POST επιο συχνα χρησιμοποιειται για την αποστολη δεδομενων χρηστη στο server. Το τελευταιο πρεπει να ειναι GET ώστε να μην δουμε ενοχλητικά μηνυματα. Το PRG αιτημα λειτουργει σε δυο σταδια:

  • Πρωτον ενας χρηστης συμπληρωνει εντυπο-φόρμα και το αποστελλει στο διακομιστη χρησιμοποιωντας ειτε τη μεθοδο POST η GET. Ο διακομιστής-Server αποθηκευει τις πληροφοριες, ενημερωνει την βαση δεδομενων και το μοντελο δεδομενων, και απαντάει με REDIRECT στέλνωντας μας σε άλλη σελιδα(των αποτελεσμάτων).
  • Ο Browser φορτώνει την σελίδα των αποτελεσμάτων χρησιμοποιωντας GET,χωρίς ο χρήστης να αποστελλει δεδομένα στον server σε αυτο το σημειο.

Τωρα εχουμε μια καθαρη λυση MVC. Οταν ενας χρηστης προσπαθει να ανανεωσει αποτελεσμα σελιδα ο περιηγητης ξαναστέλνει στον server "αδειο" GET αιτημα. Ολα τα δεδομενα που απαιτουνται ειναι ηδη στο διακομιστη, ωστε διακομιστη γεμιζει μονο με την σελιδα και να στελνει πισω στο χρηστη.

Τι γινεται με το κουμπι πισω; Αυτο λειτουργει επιστρεφοντάς μας ενα βημα προς τα πισω, προς την σελιδα με την φορμα. Αυτο το εντυπο μπορει να ανανεωθει. Εαν εχει ληφθει χρησιμοποιωντας GET, τοτε χρηστης δεν θα προειδοποιητικο μηνυμα.

Η σελίδα ανανεωσης λειτουργει τελεια με την ανακατευθυνση. Εχουμε να κανουμε το roundtrip στον browser, αλλα για ενα δευτερολεπτο που δαπανωνται για την ανακατευθυνση σημαινει λιγα για διαδραστικες εφαρμογες.

Το μονο πραγμα που πρεπει να αντιμετωπιστει ειναι εσκεμμενη μορφη επανακαταχωρησης η οποια συμβαινει οταν ενας χρηστης επιστρεφει στην πρωτη σελιδα χρησιμοποιωντας το κουμπί Επιστροφη κουμπι και υποστηριζει φορμα ξανα. Αυτο θα πρεπει να ελεγχεται απο τον ελεγκτη και είναι μοντελο και ειναι εκτος του πεδιου εφαρμογης του παροντος προτυπου.

Συνοπτικά: το PRG προτυπο παρεχει τα ακολουθα πλεονεκτηματα:

  • Διαχωριζει τις ενημερωσεις του μοντέλου από αυτές των όψεων·
  • Η ανανέωση της σελίδας αποτελεσματων δεν προκαλει επανακαταχωρηση-επαναυποβολή στοιχείων·
  • Η ανανεωση της σελίδας γινεται χρησιμοποιωντας GET, ετσι ωστε να μην εμφανιζονται μηνυματα σε χρηστη