Η Java λέγεται συχνά ότι είναι πολύ περίπλοκη και απαιτεί πολύ χρόνο για την κατασκευή απλών εφαρμογών. Παρ 'όλα αυτά, η Java παρέχει μια σταθερή πλατφόρμα με ένα πολύ ώριμο οικοσύστημα γύρω από αυτό, γεγονός που το καθιστά μια θαυμάσια επιλογή για την ανάπτυξη ισχυρού λογισμικού.
Το Άνοιξη Πλαίσιο, ένα από τα πολλά ισχυρά πλαίσια στο Ιάβα Το οικοσύστημα, συνοδεύεται από μια συλλογή μοντέλων προγραμματισμού και διαμόρφωσης με στόχο την απλοποίηση της ανάπτυξης εφαρμογών και δοκιμών σε Java.
Σε αυτό το σεμινάριο, θα αναλάβουμε την πρόκληση της δημιουργίας μιας απλής εφαρμογής που θα λειτουργεί ως βάση δεδομένων του προγραμματιστές λογισμικού χρησιμοποιώντας το Spring Framework και το Java Persistence API (JPA).
Η εφαρμογή ακολουθεί μια τυπική αρχιτεκτονική MVC. Θα έχει έναν ελεγκτή (κλάση ContractsController), προβολές (βάσει προτύπων Thymeleaf) και ένα μοντέλο (αντικείμενο χάρτη Java). Για λόγους απλότητας, θα χρησιμοποιήσουμε μια βάση δεδομένων στη μνήμη πίσω από το JPA για να διατηρήσουμε δεδομένα κατά την εκτέλεση της εφαρμογής.
Για να δημιουργήσουμε μια εφαρμογή με βάση την άνοιξη, θα χρειαστεί να χρησιμοποιήσουμε ένα από τα ακόλουθα εργαλεία κατασκευής:
Σε αυτό το σεμινάριο, θα χρησιμοποιήσουμε το Maven. Εάν δεν είστε εξοικειωμένοι με κανένα από αυτά τα εργαλεία, ένας εύκολος τρόπος για να ξεκινήσετε είναι να κατεβάσετε το Spring Tool Σουίτα . Η σουίτα είναι αφιερωμένη στο Spring Framework και διαθέτει τη δική της Εκλειψη βασισμένο στο IDE.
Στο Spring Tool Suite, δημιουργούμε ένα νέο έργο επιλέγοντας 'Spring Starter Project' από το μενού 'Αρχείο> Νέο'.
Μόλις δημιουργηθεί ένα νέο έργο, θα χρειαστεί να επεξεργαστούμε το αρχείο διαμόρφωσης Maven, ' pom.xml Και προσθέστε τις ακόλουθες εξαρτήσεις:
org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-thymeleaf org.springframework.boot spring-boot-starter-data-jpa com.h2database h2 org.springframework.data spring-data-commons
Αυτές οι αναφερόμενες εξαρτήσεις θα φορτώσουν το Spring Boot Web, το Thymeleaf, το JPA και το H2 (τα οποία θα χρησιμεύσουν ως βάση δεδομένων στη μνήμη μας). Όλες οι απαραίτητες βιβλιοθήκες θα τραβηχτούν αυτόματα.
Για να μπορέσουμε να αποθηκεύσουμε πληροφορίες σχετικά με προγραμματιστές και τις δεξιότητές τους, θα πρέπει να ορίσουμε δύο κατηγορίες οντοτήτων: Προγραμματιστής ' και ' Επιδεξιότητα '.
Και τα δύο αυτά ορίζονται ως απλές τάξεις Java με ορισμένους σχολιασμούς. Προσθέτοντας το '@Entity' πριν από τα μαθήματα, κάνουμε τις παρουσίες τους διαθέσιμες στο JPA. Αυτό θα διευκολύνει την αποθήκευση και ανάκτηση παρουσιών από τη μόνιμη αποθήκευση δεδομένων όταν χρειάζεται. Επιπλέον, οι σχολιασμοί '@Id' και '@GeneratedValue' μας επιτρέπουν να υποδείξουμε το πεδίο μοναδικού αναγνωριστικού για την οντότητα και να δημιουργηθεί αυτόματα η αξία του όταν αποθηκεύεται στη βάση δεδομένων.
Καθώς ένας προγραμματιστής μπορεί να έχει πολλές δεξιότητες, μπορούμε να ορίσουμε μια απλή σχέση πάρα-προς-πολλά χρησιμοποιώντας τον σχολιασμό '@ManyToMany'.
@Entity public class Developer { @Id @GeneratedValue(strategy=GenerationType.AUTO) private long id; private String firstName; private String lastName; private String email; @ManyToMany private List skills; public Developer() { super(); } public Developer(String firstName, String lastName, String email, List skills) { super(); this.firstName = firstName; this.lastName = lastName; this.email = email; this.skills = skills; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public List getSkills() { return skills; } public void setSkills(List skills) { this.skills = skills; } public boolean hasSkill(Skill skill) { for (Skill containedSkill: getSkills()) { if (containedSkill.getId() == skill.getId()) { return true; } } return false; } }
@Entity public class Skill { @Id @GeneratedValue(strategy=GenerationType.AUTO) private long id; private String label; private String description; public Skill() { super(); } public Skill(String label, String description) { super(); this.label = label; this.description = description; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } }
Με το JPA μπορούμε να ορίσουμε μια πολύ χρήσιμη διεπαφή DeveloperRepository και διεπαφή SkillRepository, που επιτρέπουν εύκολες λειτουργίες CRUD. Αυτές οι διεπαφές θα μας επιτρέψουν να έχουμε πρόσβαση σε αποθηκευμένους προγραμματιστές και δεξιότητες μέσω απλών μεθόδων κλήσεων, όπως:
Για να δημιουργήσουμε αυτές τις διεπαφές, το μόνο που χρειάζεται να κάνουμε είναι να επεκτείνουμε τη διεπαφή CrudRepository.
public interface DeveloperRepository extends CrudRepository { }
public interface SkillRepository extends CrudRepository { public List findByLabel(String label); }
Λειτουργικότητα για την πρόσθετη μέθοδο ' findByLabel «Δηλώνεται εδώ θα παρέχεται αυτόματα από την JPA.
Στη συνέχεια, μπορούμε να εργαστούμε στον ελεγκτή για αυτήν την εφαρμογή. Ο ελεγκτής θα χαρτογραφήσει URI αιτήματος για προβολή προτύπων και για να πραγματοποιήσει όλη την απαραίτητη επεξεργασία στο μεταξύ.
@Controller public class DevelopersController { @Autowired DeveloperRepository repository; @Autowired SkillRepository skillRepository; @RequestMapping('/developer/{id}') public String developer(@PathVariable Long id, Model model) { model.addAttribute('developer', repository.findOne(id)); model.addAttribute('skills', skillRepository.findAll()); return 'developer'; } @RequestMapping(value='/developers',method=RequestMethod.GET) public String developersList(Model model) { model.addAttribute('developers', repository.findAll()); return 'developers'; } @RequestMapping(value='/developers',method=RequestMethod.POST) public String developersAdd(@RequestParam String email, @RequestParam String firstName, @RequestParam String lastName, Model model) { Developer newDeveloper = new Developer(); newDeveloper.setEmail(email); newDeveloper.setFirstName(firstName); newDeveloper.setLastName(lastName); repository.save(newDeveloper); model.addAttribute('developer', newDeveloper); model.addAttribute('skills', skillRepository.findAll()); return 'redirect:/developer/' + newDeveloper.getId(); } @RequestMapping(value='/developer/{id}/skills', method=RequestMethod.POST) public String developersAddSkill(@PathVariable Long id, @RequestParam Long skillId, Model model) { Skill skill = skillRepository.findOne(skillId); Developer developer = repository.findOne(id); if (developer != null) { if (!developer.hasSkill(skill)) { developer.getSkills().add(skill); } repository.save(developer); model.addAttribute('developer', repository.findOne(id)); model.addAttribute('skills', skillRepository.findAll()); return 'redirect:/developer/' + developer.getId(); } model.addAttribute('developers', repository.findAll()); return 'redirect:/developers'; } }
Η χαρτογράφηση των URI σε μεθόδους γίνεται μέσω απλών σχολιασμών '@RequestMapping'. Σε αυτήν την περίπτωση, κάθε μέθοδος του ελεγκτή αντιστοιχίζεται σε ένα URI.
Η παράμετρος μοντέλου αυτών των μεθόδων επιτρέπει τη μετάδοση δεδομένων στην προβολή. Στην ουσία, αυτοί είναι απλοί χάρτες κλειδιών για τιμές.
Κάθε μέθοδος ελεγκτή επιστρέφει είτε το όνομα του προτύπου Thymeleaf για χρήση ως προβολή, είτε μια διεύθυνση URL σε ένα συγκεκριμένο μοτίβο ('ανακατεύθυνση:') για ανακατεύθυνση. Για παράδειγμα, οι μέθοδοι 'προγραμματιστής' και '_developersList_' επιστρέφουν το όνομα ενός προτύπου, ενώ οι 'προγραμματιστές Προσθήκη' και 'προγραμματιστέςAddSkill' επιστρέφουν διευθύνσεις URL για ανακατεύθυνση.
Μέσα στον ελεγκτή, οι σχολιασμοί '@Autowired' εκχωρούν αυτόματα μια έγκυρη παρουσία του καθορισμένου αποθετηρίου μας στο αντίστοιχο πεδίο. Αυτό επιτρέπει την πρόσβαση σε σχετικά δεδομένα από τον ελεγκτή χωρίς να χρειάζεται να ασχοληθείτε με πολλούς κωδικούς πλακών.
Τέλος, πρέπει να ορίσουμε ορισμένα πρότυπα για τις προβολές που θα δημιουργηθούν. Γι 'αυτό χρησιμοποιούμε το Thymeleaf, μια απλή μηχανή templating. Το μοντέλο που χρησιμοποιήσαμε στις μεθόδους ελεγκτή είναι διαθέσιμο απευθείας στα πρότυπα, δηλαδή όταν συνάψουμε συμβόλαιο στο ' σύμβαση 'Κλειδί σε ένα μοντέλο, θα έχουμε τη δυνατότητα πρόσβασης στο πεδίο ονόματος ως' contract.name 'μέσα από το πρότυπο.
Το Thymeleaf περιέχει ορισμένα ειδικά στοιχεία και χαρακτηριστικά που ελέγχουν τη δημιουργία HTML. Είναι πολύ διαισθητικοί και απλοί. Για παράδειγμα, για να συμπληρώσετε τα περιεχόμενα ενός στοιχείου span με το όνομα μιας δεξιότητας, το μόνο που χρειάζεται να κάνετε είναι να ορίσετε το ακόλουθο χαρακτηριστικό (υποθέτοντας ότι το κλειδί ' επιδεξιότητα 'Ορίζεται στο μοντέλο):
Ομοίως για να ορίσετε το ' href 'Χαρακτηριστικό ενός στοιχείου αγκύρωσης, το ειδικό χαρακτηριστικό' ου: href ' μπορεί να χρησιμοποιηθεί.
Στην εφαρμογή μας, θα χρειαστούμε δύο απλά πρότυπα. Για λόγους σαφήνειας, θα παραλείψουμε όλα τα χαρακτηριστικά στυλ και κατηγορίας (συγκεκριμένα Bootstrap) εδώ στον ενσωματωμένο κώδικα προτύπου.
Developers database Name:
Email:
Skills:
- Skill
Το Spring περιέχει μια μονάδα εκκίνησης. Αυτό μας επιτρέπει να ξεκινήσουμε εύκολα τον διακομιστή από τη γραμμή εντολών ως εφαρμογή Java γραμμής εντολών:
@SpringBootApplication public class Application implements CommandLineRunner { @Autowired DeveloperRepository developerRepository; @Autowired SkillRepository skillRepository; public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
Δεδομένου ότι χρησιμοποιούμε μια βάση δεδομένων στη μνήμη, είναι λογικό να κάνετε bootstrap τη βάση δεδομένων με ορισμένα προκαθορισμένα δεδομένα κατά την εκκίνηση. Με αυτόν τον τρόπο θα έχουμε τουλάχιστον ορισμένα δεδομένα στη βάση δεδομένων όταν ο διακομιστής είναι σε λειτουργία και λειτουργεί.
@Override public void run(String... args) throws Exception { Skill javascript = new Skill('javascript', 'Javascript language skill'); Skill ruby = new Skill('ruby', 'Ruby language skill'); Skill emberjs = new Skill('emberjs', 'Emberjs framework'); Skill angularjs = new Skill('angularjs', 'Angularjs framework'); skillRepository.save(javascript); skillRepository.save(ruby); skillRepository.save(emberjs); skillRepository.save(angularjs); List developers = new LinkedList(); developers.add(new Developer('John', 'Smith', ' [email protected] ', Arrays.asList(new Skill[] { javascript, ruby }))); developers.add(new Developer('Mark', 'Johnson', ' [email protected] ', Arrays.asList(new Skill[] { emberjs, ruby }))); developers.add(new Developer('Michael', 'Williams', ' [email protected] ', Arrays.asList(new Skill[] { angularjs, ruby }))); developers.add(new Developer('Fred', 'Miller', ' [email protected] ', Arrays.asList(new Skill[] { emberjs, angularjs, javascript }))); developers.add(new Developer('Bob', 'Brown', ' [email protected] ', Arrays.asList(new Skill[] { emberjs }))); developerRepository.save(developers); }
Το Spring είναι ένα ευέλικτο πλαίσιο που επιτρέπει την κατασκευή εφαρμογών MVC. Η δημιουργία μιας απλής εφαρμογής με το Spring είναι γρήγορη και διαφανής. Η εφαρμογή μπορεί επίσης να ενσωματωθεί σε μια βάση δεδομένων εύκολα χρησιμοποιώντας JPA.
Ο πηγαίος κώδικας ολόκληρου του έργου είναι διαθέσιμο στο GitHub .