Î ñàéòå Íà÷àëî Java Ñòóäåí÷åñêèé îòäåë êàäðîâ Ñòàòüè Êóðñû ïî Java Âîïðîñû/Îòâåòû
"Ñòóäåí÷åñêèé îòäåë êàäðîâ" â âèäå Enterprise-ïðèëîæåíèÿ

Ñòóäåí÷åñêèé îòäåë êàäðîâ

Ïîñîáèå ïî JAVA-òåõíîëîãèÿì

(ñ) AntonSaburov

 

«Ñòóäåí÷åñêèé îòäåë êàäðîâ» â âèäå Enterprise-ïðèëîæåíèÿ

 

Íó âîò ìû è äîáðàëèñü äî êîíå÷íîé öåëè íàøåãî îçíàêîìëåíèÿ ñ òåõíîëîãèåé EJB. Íåñîìíåííî ìû íå ðàññìîòðåëè äîâîëüíî ìíîãî äëÿ ýòîé òåõíîëîãèè, íî àâòîð ñòàâèë ñåáå öåëü îçíàêîìèòü, äàòü íåêóþ íèòî÷êó, çà êîòîðóþ âû ñàìè ñìîæåòå ðàññêðó÷èâàòü ýòó òåõíîëãèþ.

 

Ñäåëàþ òîëüêî îäíî çàìå÷àíèå – äëÿ áûñòðîãî îáíîâëåíèÿ èçìåíåíèé â êîäå ÿ ñîâåòóþ èñïîëüçîâàòü ïðàâóþ êíîïêó ìûøè – êëèêàåòå íà StudentsApp è âûáèðàåòå ïóíêò «Undeploy and Deploy»

 

×òîáû íå îòêëàäûâàòü â äîëãèé ÿùêè, íà÷íåì ñ òåêñòîâ. Ïîñëå êàæäîãî ôàéëà ÿ áóäó êîììåíòèðîâàòü îñîáî âàæíûå ó÷àñòêè êîäà. È íà÷íåì ìû ñ ôàéëîâ, êîòîðûå íàì ñãåíåðèë NetBeans ïî ñòðóêòóðå íàøèõ òàáëèö – Groups.java è Students.java

 

 

Groups.java

 

package students.entity;

 

import java.io.Serializable;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.Id;

import javax.persistence.NamedQueries;

import javax.persistence.NamedQuery;

import javax.persistence.Table;

 

@Entity

@Table(name = "groups")

@NamedQueries({

    @NamedQuery(name = "Groups.findByGroupId",

        query = "SELECT g FROM Groups g WHERE g.groupId = :groupId"),

    @NamedQuery(name = "Groups.findByGroupName",

        query = "SELECT g FROM Groups g WHERE g.groupName = :groupName"),

    @NamedQuery(name = "Groups.findByCurator",

        query = "SELECT g FROM Groups g WHERE g.curator = :curator"),

    @NamedQuery(name = "Groups.findBySpeciality",

        query = "SELECT g FROM Groups g WHERE g.speciality = :speciality")

})

   

public class Groups implements Serializable

{

    private static final long serialVersionUID = 1L;

    @Id

    @Column(name = "group_id", nullable = false)

    private Integer groupId;

    @Column(name = "groupName", nullable = false)

    private String groupName;

    @Column(name = "curator", nullable = false)

    private String curator;

    @Column(name = "speciality", nullable = false)

    private String speciality;

 

    public Groups() {

    }

 

    public Groups(Integer groupId) {

        this.groupId = groupId;

    }

 

    public Groups(Integer groupId, String groupName, String curator, String speciality) {

        this.groupId = groupId;

        this.groupName = groupName;

        this.curator = curator;

        this.speciality = speciality;

    }

 

    public Integer getGroupId() {

        return groupId;

    }

 

    public void setGroupId(Integer groupId) {

        this.groupId = groupId;

    }

 

    public String getGroupName() {

        return groupName;

    }

 

    public void setGroupName(String groupName) {

        this.groupName = groupName;

    }

 

    public String getCurator() {

        return curator;

    }

 

    public void setCurator(String curator) {

        this.curator = curator;

    }

 

    public String getSpeciality() {

        return speciality;

    }

 

    public void setSpeciality(String speciality) {

        this.speciality = speciality;

    }

 

    @Override

    public int hashCode() {

        int hash = 0;

        hash += (groupId != null ? groupId.hashCode() : 0);

        return hash;

    }

 

    @Override

    public boolean equals(Object object) {

        // TODO: Warning - this method won't work in the case the id fields are not set

        if (!(object instanceof Groups)) {

            return false;

        }

        Groups other = (Groups) object;

        if ((this.groupId == null && other.groupId != null) || (this.groupId != null && !this.groupId.equals(other.groupId))) {

            return false;

        }

        return true;

    }

 

    @Override

    public String toString() {

        return "students.entity.Groups[groupId=" + groupId + "]";

    }

}

 

 äàííîì ôàéëå âñå ñàìîå èíòåðåñíîå íàõîäèòñÿ â ñàìîì íà÷àëå – ýòî ñåêöèÿ, ãäå î÷åíü ìíîãî íàäïèñåé @NamedQuery. Âîîáùå-òî îíè ãåíåðÿòñÿ â îäíó ñòðîêó, íî ÿ äëÿ óäîáñòâà âîñïðèÿòèÿ ðàçäåëèë èõ íà íåñêîëüêî. Ýòî ìîæíî ñäåëàòü áåç êàêèõ-ëèáî ïðîáëåì. Ìû óâèäèì íåêîòîðûå èõ @NamedQuery ÷óòü íèæå. À ïîêà âàæíî óÿñíèòü ñëåäóþùåå – ýòî ñïîñîá, êîòîðûé ïîçâîëÿåò íàì ïèñàòü íà EJB-QL. EJB-QL – ýòî íåêîòîðûé àíàëîã SQL, òîëüêî äëÿ EJB. Åñëè âíèìàòåëüíî ïîñìîòðåòü íà çíà÷åíèÿ ñòðîê query, òî ìîæíî óâèäåòü, ÷òî ìû â êàêîé-òî ìåðå îáðàùàåìñÿ ê îáúåêòàì è èõ ïîëÿì. Âåäü íà ñàìîì äåëå â òàáëèöå groups íåò ïîëÿ groupId. Òàì åñòü group_id. Íî åñëè ïîñìîòðåòü ÷óòü íèæå, òî ìîæíî óâèäåòü äîïîëíèòåëüíóþ àííîòàöèþ, êîòîðàÿ «îáîðà÷èâàåò» ÷ëåíû íàøåãî êëàññà. È ýòî ïîçâîëÿåò íàì òàê êðàñèâî äåëàòü SELECT. Êðîìå òîãî ìîæíî óâèäåòü èìåíîâàííûå ïàðàìåòðû – îíè âûäåëÿþòñÿ òåì, ÷òî ïåðåä íèìè ñòàâèòñÿ äâîåòî÷èå. Èõ õîðîøî äîëæíî áûòü âèäíî.

Äóìàþ, ÷òî ïîëÿ, êîòîðûå îïèñàíû âîçëå @Column (name è nullable) äîñòàòî÷íî î÷åâèäíû. Òàêæå ìîæíî óâèäåòü àííîòàöèþ @Id âîçëå ïîëÿ group_id. Ïðîøó âàñ îòìåòèòü, ÷òî ýòî íå ýëåìåíòàðíûé òèï äàííûõ int, à ïîëíîöåííûé êëàññ Integer. Ò.å. îí ìîæåò áûòü ðàâåí null. Ïî÷åìó ýòî âàæíî ìû óâèäèì íåêîëüêî ïîçæå. À ïîêà çàïîìíèòå, ÷òî äàæå ID ìîæåò áûòü NULL.

 

Students.java

 

package students.entity;

 

import java.io.Serializable;

import java.util.Date;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.Id;

import javax.persistence.NamedQueries;

import javax.persistence.NamedQuery;

import javax.persistence.Table;

import javax.persistence.Temporal;

import javax.persistence.TemporalType;

 

@Entity

@Table(name = "students")

@NamedQueries({

    @NamedQuery(name = "Students.findByStudentId",

        query = "SELECT s FROM Students s WHERE s.studentId = :studentId"),

    @NamedQuery(name = "Students.findByFirstName",

        query = "SELECT s FROM Students s WHERE s.firstName = :firstName"),

    @NamedQuery(name = "Students.findBySurName",

        query = "SELECT s FROM Students s WHERE s.surName = :surName"),

    @NamedQuery(name = "Students.findByPatronymic",

        query = "SELECT s FROM Students s WHERE s.patronymic = :patronymic"),

    @NamedQuery(name = "Students.findByDateOfBirth",

        query = "SELECT s FROM Students s WHERE s.dateOfBirth = :dateOfBirth"),

    @NamedQuery(name = "Students.findBySex",

        query = "SELECT s FROM Students s WHERE s.sex = :sex"),

    @NamedQuery(name = "Students.findByGroupId",

        query = "SELECT s FROM Students s WHERE s.groupId = :groupId"),

    @NamedQuery(name = "Students.findByEducationYear",

        query = "SELECT s FROM Students s WHERE s.educationYear = :educationYear"),

    @NamedQuery(name = "Students.findByGroupAndYear",

        query = "SELECT s FROM Students s WHERE s.groupId = :groupId AND s.educationYear=:educationYear"),

    @NamedQuery(name = "Students.updateGroupAndYear",

        query = "UPDATE Students s SET s.groupId=:groupId, s.educationYear=:educationYear WHERE s.groupId = :oldGroupId AND s.educationYear=:oldEducationYear")

})

public class Students implements Serializable

{

    private static final long serialVersionUID = 1L;

    @Id

    @Column(name = "student_id", nullable = false)

    private Integer studentId;

    @Column(name = "firstName", nullable = false)

    private String firstName;

    @Column(name = "surName", nullable = false)

    private String surName;

    @Column(name = "patronymic", nullable = false)

    private String patronymic;

    @Column(name = "dateOfBirth", nullable = false)

    @Temporal(TemporalType.DATE)

    private Date dateOfBirth;

    @Column(name = "sex")

    private Character sex = 'Ì';

    @Column(name = "group_id", nullable = false)

    private int groupId;

    @Column(name = "educationYear", nullable = false)

    private int educationYear;

 

    public Students() {

    }

 

    public Students(Integer studentId) {

        this.studentId = studentId;

    }

 

    public Students(Integer studentId, String firstName, String surName, String patronymic, Date dateOfBirth, int groupId, int educationYear) {

        this.studentId = studentId;

        this.firstName = firstName;

        this.surName = surName;

        this.patronymic = patronymic;

        this.dateOfBirth = dateOfBirth;

        this.groupId = groupId;

        this.educationYear = educationYear;

    }

 

    public Integer getStudentId() {

        return studentId;

    }

 

    public void setStudentId(Integer studentId) {

        this.studentId = studentId;

    }

 

    public String getFirstName() {

        return firstName;

    }

 

    public void setFirstName(String firstName) {

        this.firstName = firstName;

    }

 

    public String getSurName() {

        return surName;

    }

 

    public void setSurName(String surName) {

        this.surName = surName;

    }

 

    public String getPatronymic() {

        return patronymic;

    }

 

    public void setPatronymic(String patronymic) {

        this.patronymic = patronymic;

    }

 

    public Date getDateOfBirth() {

        return dateOfBirth;

    }

 

    public void setDateOfBirth(Date dateOfBirth) {

        this.dateOfBirth = dateOfBirth;

    }

 

    public Character getSex() {

        return sex;

    }

 

    public void setSex(Character sex) {

        this.sex = sex;

    }

 

    public int getGroupId() {

        return groupId;

    }

 

    public void setGroupId(int groupId) {

        this.groupId = groupId;

    }

 

    public int getEducationYear() {

        return educationYear;

    }

 

    public void setEducationYear(int educationYear) {

        this.educationYear = educationYear;

    }

 

    @Override

    public int hashCode() {

        int hash = 0;

        hash += (studentId != null ? studentId.hashCode() : 0);

        return hash;

    }

 

    @Override

    public boolean equals(Object object) {

        // TODO: Warning - this method won't work in the case the id fields are not set

        if (!(object instanceof Students)) {

            return false;

        }

        Students other = (Students) object;

        if ((this.studentId == null && other.studentId != null) || (this.studentId != null && !this.studentId.equals(other.studentId))) {

            return false;

        }

        return true;

    }

 

    @Override

    public String toString() {

        return "students.entity.Students[studentId=" + studentId + "]";

    }

}

 

Ýòîò ôàéë óæå âûãëÿäèò çíàêîìûì. Åäèíñòâåííîå, ÷òî ìû â íåì ïîìåíÿëè – ýòî ñäåëàëè íåñêîëüêî ñòðîê äëÿ èìåíîâàííûõ çàïðîñîâ (NamedQuery) è ÄÎÁÀÂÈËÈ ñâîè – äâà ïîñëåäíèõ - "Students.findByGroupAndYear" è "Students.updateGroupAndYear". Îíè íàì ïðîñòî ïîíàäîáÿòñÿ, ïîòîìó è äîáàâèëè.

Ïåðâûé çàïðîñ îòëè÷àòåñÿ îò ñòàíäàðòíî ñãåíåðåííûõ òåì, ÷òî îí èñïîëüçóåò íå îäèí äîïîëíèòåëüíûé ïàðàìåòð, à äâà. Âòîðîé çàïðîñ åùå èíòåðåñíåå – îí íå âîçâðàùàåò äàííûå, îí èçìåíÿåò èõ. Íî â îñòàëüíîì íè÷åì îñîáûì íå âûäåëÿåòñÿ.

 

×òî åùå õîòåëîñü áû îòìåòèòü – âñå ýòè ñòðàøíûå àííîòàöèè èíòåðåñíû èìåííî Application Server’ó. Äëÿ òåõ, êòî íå èñïîëüçóåò èõ ýòî ñàìûå îáû÷íûå êëàññû ñ îáû÷íûìè ïîëÿìè. Èõ ìîæíî ñêîìïèëèðîâàòü è èñïîëüçîâàòü ãäå óãîäíî. Íî êàê òîëüêî îíè ïîïàäàþò ê AppServer’ó, òî ó òîãî ñðàçó ïîÿâëÿåòñÿ èíôîðìàöè î òîì, ê êàêîé òàáëèöå «ïðèâÿçàí» äàííûé êëàññ. È òåïåðü êàê òîëüêî ïðîèñõîäèò êàêàÿ-ëèáî ðàáîòà ñ áàçîé äàííûõ íàø êëàññ èñïîëüçóåòñÿ êàê õðàíèëèùå äëÿ äàííûõ èç ñòðîêè òàáëèöû. Ò.å. åñëè ìû âûòàùèì ìíîãî çàïèñåé èç òàáëèöû students, òî âñå îíè ëÿãóò â ñïèñîê, ýëåìåíòàìè êîòîðîãî áóäóò îáúåêòû êëàññà Students. È ýòî ìû óâèäèì ïðÿìî ñåé÷àñ. Íàñòàëî âðåìÿ îáðàòèòü âçîð ê îäíîìó èç âàæíåéøèõ íàøèõ êëàññîâ – ManagementSystemBean è åãî èíòåðôåéñó ManagementSystemLocal.

 

 

ManagementSystemLocal.java

 

package students.logic;

 

import java.util.List;

import javax.ejb.Local;

import students.entity.Groups;

import students.entity.Students;

 

@Local

public interface ManagementSystemLocal

{

    // Ïîëó÷èòü äàííûå îá îäíîì ñòóäåíòå

    Students getStudents(int studentId);

 

    // Ïîëó÷èòü ñïèñîê âñåõ ãðóïï

    List<Groups> getGroupsList();

 

    // Ïîëó÷èòü ñïèñîê ñòóäåíòîâ äëÿ êîíêðåòíîé ãðóïïû è êîíêðåòíîãî ãîäà îáó÷åíèÿ

    List<Students> getStudentsFromGroup(int groupId, int year);

 

    // Ïåðåìåñòèòü ñòóäåíòîâ èç îäíîé ãðóïïû â äðóãóþ. Ïðè÷åì ìû ó÷èòûâàåì è ãîä îáó÷åíèÿ

    void moveStudentsToGroup(int groupId, int year, int newGroupId, int newYear);

 

    // Äîáàâèòü íîâîãî ñòóäåíòà

    void insertStudents(Students st);

 

    // Èçìåíèòü äàííûå î ñòóäåíòå

    void updateStudents(Students st);

 

    // Óäàëèòü ñòóäåíòà

    void deleteStudents(int studentsId);

}

 

Çäåñü â îáùåì-òî íè÷åãî îñîáåííîãî íåò – îïèñàíû íåîáõîäèìûå íàì ìåòîäû. È èíòåðôåéñ èõ ñîäåðæèò. Åäèíñòâåííîå, ÷òî âàì ðåêîìåíäóåòñÿ ñäåëàòü – ýòî ïðî÷èòàòü êîììåíòàðèè äëÿ ÷åãî êàæäûé ìåòîä ïðåäíàçíà÷åí.

À âîò ðåàëèçàöèÿ ó íàñ çàéìåò íåñêîëüêî áîëüøå âíèìàíèÿ è ñèë. Èòàê:

 

ManagementSystemBean.java

 

package students.logic;

 

import java.sql.Ref;

import java.util.List;

import javax.ejb.Stateless;

import javax.persistence.EntityManager;

import javax.persistence.PersistenceContext;

import javax.persistence.Query;

import students.entity.Groups;

import students.entity.Students;

 

@Stateless (name="ManagementSystem")

public class ManagementSystemBean implements ManagementSystemLocal

{

    @PersistenceContext

    private EntityManager em;

 

    public void persist(Object object)

    {

        em.persist(object);

    }

 

    public Students getStudents(int studentId)

    {

        return em.find(Students.class, studentId);

    }

 

    public List<Groups> getGroupsList()

    {

        Query q = em.createQuery("SELECT g FROM Groups g");

        List<Groups> l= q.getResultList();

        return l;

    }

 

    public List<Students> getStudentsFromGroup(int groupId, int year)

    {

        Query q = em.createNamedQuery("Students.findByGroupAndYear");

        q.setParameter("groupId", groupId);

        q.setParameter("educationYear", year);

        List<Students> l= q.getResultList();

        return l;

    }

 

    public void moveStudentsToGroup(int groupId, int year, int newGroupId, int newYear)

    {

        Query q = em.createNamedQuery("Students.updateGroupAndYear");

        q.setParameter("groupId", newGroupId);

        q.setParameter("educationYear", newYear);

        q.setParameter("oldGroupId", groupId);

        q.setParameter("oldEducationYear", year);

       

        q.executeUpdate();

    }

 

    public void insertStudents(Students st)

    {

        em.persist(st);

    }

 

    public void updateStudents(Students st)

    {

        Students sOld = em.find(Students.class, st.getStudentId());

        sOld.setFirstName(st.getFirstName());

        sOld.setSurName(st.getSurName());

        sOld.setPatronymic(st.getPatronymic());

        sOld.setDateOfBirth(st.getDateOfBirth());

        sOld.setGroupId(st.getGroupId());

        sOld.setSex(st.getSex());

        sOld.setEducationYear(st.getEducationYear());

        em.persist(sOld);

    }

 

    public void deleteStudents(int studentsId)

    {

        Students sOld = em.find(Students.class, studentsId);

        em.remove(sOld);

    }

}

 

Âîò çäåñü íàì ïðèäåòñÿ ïîñìîòðåòü íà íåñêîëüêî ìåòîäîâ.

 

getGroupsList() – ýòîò ìåòîä ïîëó÷àåò ñïèñîê ãðóïï. Îáðàòèòå âíèìàíèå âîò íà ÷òî – çäåñü ìû èñïîëüçóåì EJB-QL «íàïðÿìóþ». Ò.å. ñîçäàåì çàïðîñ è âûïîëíÿåì åãî.  îñòàëüíûõ ñëó÷àÿõ èñïîëüçóþòñÿ èìåíîâàííûå çàïðîñû.

 

getStudentsFromGroup(int groupId, int year) – çäåñü ìû èñïîëüçóåì èìåíîâàííûé çàïðîñ (êîòîðûé ìû ñîçäàëè).  ïðèíöèïå êàêèõ-òî ñëîæíîñòåé â êîäå ÿ íå âèæó – âñå äîñòàòî÷íî î÷åâèäíî.

 

moveStudentsToGroup(int groupId, int year, int newGroupId, int newYear) – â ýòîì ìåòîäå åñòü òîëüêî îäèí òîíêèé ìîìåíò – çäåñü ìû èñïîëüçóåì íåñêîëüêî äðóãîé âûçîâ – executeUpdate.  äðóãèõ ñëó÷àÿõ ìû èñïîëüçîâàëè getResultList.

 

È âîò òóò ìû ïîäõîäèì ê ìåòîäàì, êîòîðûå ñîäåðæàò íåêóþ õèòðèíêó.

 

insertStudents(Students st) – ýòîò ìåòîä áóäåò ïðåêðàñíî ðàáîòàòü òîëüêî â îäíîì ñëó÷àå. ÅÑËÈ îáúåêò íå èìååò óñòàíîâëåííîãî ïîëÿ studentsId. Ïîìíèòå ÿ îáðàùàë âàøå âíèìàíèå íà òî, ÷òî òåïåðü ID óæå íå ýëåìåíòàðíûé òèï, à ðåàëüíûé êëàññ. Òàê âîò – åñëè îí ðàâåí NULL, òîãäà áóäåò ïðîèçâîëèòñÿ åãî âñòàâêà â òàáëèöó. Åñëè æå ó íåãî áóäåò óñòàíîâëåí ID – âñòàâêè íå áóäåò. Âåðíåå áóäåò, íî òîëüêî îäèí ðàç. Ýòî î÷åíü âàæíûé ìîìåíò.

Êîãäà ÿ ïåðâûé ðàç âñòàâëÿþ íîâîãî ñòóäåíòà ñ óñòàíîâëåííûì ID, òî ïðîèñõîäèò ñëåäóþùåå – PersistenceManager ïðîâåðÿåò – íåò ëè ñòóäåíòà ñ òàêèì çíà÷åíèåì ID. Åñëè íåò – òî îí åãî âñòàâëÿåò. Åñëè æå òàêîé ID áûë çàðåãåñòðèðîâàí, òî äàííûå ñòóäåíòà ïûòàþòñÿ îáíîâèòü. ×òî î÷åíü âàæíî – PersistenceManager íå äåëàåò îáíîâëåíèÿ ID ïðè âñòàâêå ó îáúåêòà, êîòîðûé ìû âñòàâëÿëè. ×òî åùå íåïðèÿòíåå – åñëè âû âñòàâèëè íîâîãî ñòóäåíòà ñ óñòàíîâëåííûì ID (íó òàê âûøëî), òî åñëè âû îïÿòü ïîïûòàåòåñü ýòî ñäåëàòü, òî íè÷åãî íå âûéäåò. PersistenceManager çàïîìèíàåò, ÷òî óæå òàêîé ID áûë, è îí ïîïûòàåòñÿ ïðîàïäåéòèòü ñòóäåíòà. È òóò ìû îáðàòèì íàø âçîð íà ìåòîä updateStudents.

 

updateStudents(Students st) – ïîñìîòðèòå íà êîä ýòîãî ìåòîäà.  ïåðâîé ñòðîêå ÿ äîëæåí âûòàùèòü ñòóäåíòà ïî ID, èçìåíèòü åãî ïîëÿ íà íîâûå çíà÷åíèÿ (êîòîðûå ÿ ïåðåäàë â àðãóìåíòå) è ñíîâà ñîõðàíèòü. Ò.å PersistenceManager äîëæåí èìåòü «ïðèâÿçàííûé» (attached) ê áàçå îáúåêò. ß ñåáå ïî÷åìó-òî ñðàçó ïðåäñòàâèë, ÷òî ìû «çà ðåçèíî÷êó» âûòàñêèâàåì ñòðóêòóðó, çàïîëíÿåì åå, à ïîòîì îòïóñêàåì. È PersistenceManager ñ óæå íîâûìè çíà÷åíèÿìè ïðèòÿãèâàåò «çà ðåçèíî÷êó» èçìåíåííûé îáúåêò è çàïèñûâàåò åãî â áàçó. Ìîæåò ó âàñ ïîÿâèòñÿ äðóãàÿ àññîöèàöèÿ – íî âîò ó ìåíÿ òàêàÿ ïîëó÷èëàñü. À ïðîñòî çàïîëåííûé îáúåêò – îí ïðîñòî çàïîëåííûé îáõåêò, êîòîðûé íå èìååò ñâÿçè ñ áàçîé è ïîòîìó ïðè ïîïûòêå åãî ñîõðàíåíèÿ âàì áóäåò âûäàíî ïðåäóïðåæäåíèå. Ïîïðîáóéòå â ìåòîäå çàêîììåíòèðîâàòü âñå ñòðîêè è âñòàâüòå âîò òàêóþ:

 

    public void updateStudents(Students st)

    {

        // Students sOld = em.find(Students.class, st.getStudentId());

        // sOld.setFirstName(st.getFirstName());

        // sOld.setSurName(st.getSurName());

        // sOld.setPatronymic(st.getPatronymic());

        // sOld.setDateOfBirth(st.getDateOfBirth());

        // sOld.setGroupId(st.getGroupId());

        // sOld.setSex(st.getSex());

        // sOld.setEducationYear(st.getEducationYear());

        em.persist(st);

    }

 

Ïîñìîòðèòå, ÷òî ïîëó÷èòñÿ.

 

deleteStudents(int studentsId) – çäåñü òà æå ñàìàÿ èäå «ðåçèíî÷êè». Âûòàñêèâàåì «ïðèâÿçàííûé» îáúåêò è óäàëÿåì.

 

Ôàéëû ñåðâëåòîâ ÿ êîììåíòèðîâàòü íå áóäó – îíè ïðîñòî î÷åíü ïîõîæè íà òå, ÷òî ìû äåëàëè â ×àñòü 9 - Ïðîñòîå WEB-ïðèëîæåíèå. Ïðîñòî ïðèâåäó òåêñò. Íå çàáóäüòå – îíè äîëæíû íàõîäèòñÿ â ïðîåêòå StudentsApp-war !

 

MainFrameServlet.java

 

package students.web;

 

import java.io.IOException;

import java.util.Calendar;

import java.util.Date;

import java.util.Iterator;

 

import java.util.List;

import javax.ejb.EJB;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import students.entity.Students;

import students.entity.Groups;

import students.logic.ManagementSystemLocal;

 

import students.web.forms.MainFrameForm;

import students.web.forms.StudentForm;

 

public class MainFrameServlet extends HttpServlet

{

    @EJB(name = "ManagementSystem")

    private ManagementSystemLocal ms;

 

    protected void processRequest(HttpServletRequest req, HttpServletResponse resp)

            throws ServletException, IOException

    {

        int answer = 0;

        answer = checkAction(req);

 

        if (answer == 1) {

            Students s = new Students();

            s.setStudentId(0);

            s.setDateOfBirth(new Date());

            s.setEducationYear(Calendar.getInstance().get(Calendar.YEAR));

            List<Groups> groups = ms.getGroupsList();

 

            StudentForm sForm = new StudentForm();

            sForm.initFromStudent(s);

            sForm.setGroups(groups);

            req.setAttribute("student", sForm);

            getServletContext().getRequestDispatcher("/StudentFrame.jsp").forward(req, resp);

            return;

        }

 

        if (answer == 2) {

            if (req.getParameter("studentId") != null) {

                int stId = Integer.parseInt(req.getParameter("studentId"));

                Students s = ms.getStudents(stId);

                List<Groups> groups = ms.getGroupsList();

 

                StudentForm sForm = new StudentForm();

                sForm.initFromStudent(s);

                sForm.setGroups(groups);

                req.setAttribute("student", sForm);

                getServletContext().getRequestDispatcher("/StudentFrame.jsp").forward(req, resp);

                return;

            }

        }

 

        String gs = req.getParameter("groupId");

        String ys = req.getParameter("year");

 

        if (answer == 3) {

            String newGs = req.getParameter("newGroupId");

            String newYs = req.getParameter("newYear");

 

            ms.moveStudentsToGroup(Integer.parseInt(gs), Integer.parseInt(ys), Integer.parseInt(newGs), Integer.parseInt(newYs));

            gs = newGs;

            ys = newYs;

        }

 

        int groupId = -1;

        if (gs != null) {

            groupId = Integer.parseInt(gs);

        }

        int year = Calendar.getInstance().get(Calendar.YEAR);

        if (ys != null) {

            year = Integer.parseInt(ys);

        }

 

        MainFrameForm form = new MainFrameForm();

 

        List<Groups> groups = ms.getGroupsList();

        if (groupId == -1) {

            Iterator<Groups> i = groups.iterator();

            groupId = i.next().getGroupId();

        }

        List<Students> students = ms.getStudentsFromGroup(groupId, year);

        form.setGroupId(groupId);

        form.setYear(year);

 

        form.setGroups(groups);

        form.setStudents(students);

 

        req.setAttribute("form", form);

        getServletContext().getRequestDispatcher("/MainFrame.jsp").forward(req, resp);

    }

 

    public void doGet(HttpServletRequest req, HttpServletResponse resp)

            throws ServletException, IOException {

        processRequest(req, resp);

    }

 

    public void doPost(HttpServletRequest req, HttpServletResponse resp)

            throws ServletException, IOException {

        processRequest(req, resp);

    }

 

    private int checkAction(HttpServletRequest req) {

        if (req.getParameter("Add") != null) {

            return 1;

        }

        if (req.getParameter("Edit") != null) {

            return 2;

        }

        if (req.getParameter("MoveGroup") != null) {

            return 3;

        }

        if (req.getParameter("Delete") != null) {

            if (req.getParameter("studentId") != null) {

                ms.deleteStudents(Integer.parseInt(req.getParameter("studentId")));

            }

            return 0;

        }

        return 0;

    }

}

 

 

StudetnFrameServlet.java

 

package students.web;

 

import java.io.IOException;

import java.sql.SQLException;

import java.text.SimpleDateFormat;

import java.text.ParseException;

import java.util.Calendar;

import java.util.Iterator;

 

import java.util.List;

import javax.ejb.EJB;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import students.entity.Groups;

import students.logic.ManagementSystemLocal;

import students.entity.Students;

 

import students.web.forms.MainFrameForm;

 

public class StudentFrameServlet extends HttpServlet

{

    @EJB(name = "ManagementSystem")

    private ManagementSystemLocal ms;

 

    private static final SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");

 

    protected void processRequest(HttpServletRequest req, HttpServletResponse resp)

            throws ServletException, IOException

    {

        String sId = req.getParameter("studentId");

        if (sId != null && req.getParameter("OK") != null) {

            try {

                if (Integer.parseInt(sId) > 0) {

                    updateStudent(req);

                } else {

                    insertStudent(req);

                }

            } catch (SQLException sql_e) {

                sql_e.printStackTrace();

                throw new IOException(sql_e.getMessage());

            } catch (ParseException p_e) {

                throw new IOException(p_e.getMessage());

            }

        }

        String gs = req.getParameter("groupId");

        String ys = req.getParameter("educationYear");

 

        int groupId = -1;

        if (gs != null) {

            groupId = Integer.parseInt(gs);

        }

        int year = Calendar.getInstance().get(Calendar.YEAR);

        if (ys != null) {

            year = Integer.parseInt(ys);

        }

 

        MainFrameForm form = new MainFrameForm();

 

        List<Groups> groups = ms.getGroupsList();

        if (groupId == -1) {

            Iterator<Groups> i = groups.iterator();

            groupId = i.next().getGroupId();

        }

        List<Students> students = ms.getStudentsFromGroup(groupId, year);

        form.setGroupId(groupId);

        form.setYear(year);

 

        form.setGroups(groups);

        form.setStudents(students);

 

        req.setAttribute("form", form);

        getServletContext().getRequestDispatcher("/MainFrame.jsp").forward(req, resp);

    }

 

    @Override

    public void doGet(HttpServletRequest req, HttpServletResponse resp)

            throws ServletException, IOException

    {

        processRequest(req, resp);

    }

 

    @Override

    public void doPost(HttpServletRequest req, HttpServletResponse resp)

            throws ServletException, IOException

    {

        processRequest(req, resp);

    }

 

    private void updateStudent(HttpServletRequest req) throws SQLException, ParseException

    {

        Students s = prepareStudent(req);

        ms.updateStudents(s);

    }

 

    private void insertStudent(HttpServletRequest req) throws SQLException, ParseException

    {

        Students s = prepareStudent(req);

        ms.insertStudents(s);

    }

 

    private Students prepareStudent(HttpServletRequest req) throws ParseException

    {

        Students s = new Students();

       

        // Çäåñü âàæíî îòìåòèòü, ÷òî äëÿ ID íåëüçÿ çàäàâàòü íè÷åãî åñëè íàäî äîáàâëÿòü

        // ID äîëæåí áûòü ðàâåí NULL

        if(Integer.parseInt(req.getParameter("studentId"))>0) {

            s.setStudentId(Integer.parseInt(req.getParameter("studentId")));

        }

        s.setFirstName(req.getParameter("firstName").trim());

        s.setSurName(req.getParameter("surName").trim());

        s.setPatronymic(req.getParameter("patronymic").trim());

        s.setDateOfBirth(sdf.parse(req.getParameter("dateOfBirth").trim()));

        if (req.getParameter("sex").equals("0")) {

            s.setSex('Ì');

        } else {

            s.setSex('Æ');

        }

        s.setGroupId(Integer.parseInt(req.getParameter("groupId").trim()));

        s.setEducationYear(Integer.parseInt(req.getParameter("educationYear").trim()));

 

        return s;

    }

}

 

 

MainFrameForm.java

 

package students.web.forms;

 

import java.util.Collection;

 

public class MainFrameForm

{

    private int year;

    private int groupId;

    private Collection groups;

    private Collection students;

 

    public void setYear(int year)

    {

        this.year = year;

    }

    public int getYear()

    {

        return year;

    }

 

    public void setGroupId(int groupId)

    {

        this.groupId = groupId;

    }

    public int getGroupId()

    {

        return groupId;

    }

 

    public void setGroups(Collection groups)

    {

        this.groups = groups;

    }

    public Collection getGroups()

    {

        return groups;

    }

 

    public void setStudents(Collection students)

    {

        this.students = students;

    }

    public Collection getStudents()

    {

        return students;

    }

}

 

 

StudetnForm.java

 

package students.web.forms;

 

import java.text.SimpleDateFormat;

import java.util.Collection;

 

import java.util.List;

import students.entity.Groups;

import students.entity.Students;

 

 

public class StudentForm

{

    private static SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");

 

    private int studentId;

    private String firstName;

    private String surName;

    private String patronymic;

    private String dateOfBirth;

    private int sex;

    private int groupId;

    private int educationYear;

    private List<Groups> groups;

 

    public void initFromStudent(Students st)

    {

        this.studentId = st.getStudentId();

        this.firstName = st.getFirstName();

        this.surName = st.getSurName();

        this.patronymic = st.getPatronymic();

        this.dateOfBirth = sdf.format(st.getDateOfBirth());

        if(st.getSex().equals(new Character('Ì'))) {

          this.sex = 0;

        }

        else {

          this.sex = 1;

        }

        this.groupId = st.getGroupId();

        this.educationYear = st.getEducationYear();

    }

 

    public String getDateOfBirth()

    {

      return dateOfBirth;

    }

    public void setDateOfBirth(String dateOfBirth)

    {

      this.dateOfBirth = dateOfBirth;

    }

 

    public int getEducationYear()

    {

      return educationYear;

    }

    public void setEducationYear(int educationYear)

    {

      this.educationYear = educationYear;

    }

 

    public int getGroupId()

    {

      return groupId;

    }

    public void setGroupId(int groupId)

    {

      this.groupId = groupId;

    }

 

    public int getStudentId()

    {

      return studentId;

    }

    public void setStudentId(int studentId)

    {

      this.studentId = studentId;

    }

 

    public String getFirstName()

    {

      return firstName;

    }

    public void setFirstName(String firstName)

    {

      this.firstName = firstName;

    }

 

    public String getPatronymic()

    {

      return patronymic;

    }

    public void setPatronymic(String patronymic)

    {

      this.patronymic = patronymic;

    }

 

    public String getSurName()

    {

      return surName;

    }

    public void setSurName(String surName)

    {

      this.surName = surName;

    }

 

    public int getSex()

    {

      return sex;

    }

 

    public void setSex(int sex)

    {

      this.sex = sex;

    }

 

    public void setGroups(List<Groups> groups)

    {

        this.groups = groups;

    }

    public Collection getGroups()

    {

        return groups;

    }

}

 

 

Íó è JSP ñòðàíè÷êè – âîò òàêèå.

 

 

MainFrame.jsp

 

<%@ page contentType="text/html; charset=windows-1251" %>

<%@ taglib uri="/WEB-INF/tld/c.tld" prefix="c" %>

<html>

    <head>

        <title>Ñïèñîê ñòóäåíòîâ</title>

    </head>

    <body>

       

        <form action='<c:url value="/main"/>' method="POST">

           

            <table>

                <tr>

                    <td>Ãîä:<input type="text" name="year" value="${form.year}"/><br/></td>

                    <td>Ñïèñîê ãðóïï:

                        <select name="groupId">

                            <c:forEach var="group" items="${form.groups}">

                                <c:choose>

                                    <c:when test="${group.groupId==form.groupId}">

                                        <option value="${group.groupId}" selected><c:out value="${group.groupName}"/></option>

                                    </c:when>

                                    <c:otherwise>

                                        <option value="${group.groupId}"><c:out value="${group.groupName}"/></option>

                                    </c:otherwise>

                                </c:choose>

                            </c:forEach>

                        </select>

                    </td>

                    <td><input type="submit" name="getList" value="Îáíîâèòü"/></td>

                </tr>

            </table>

           

            <p/><b>Ñïèñîê ñòóäåíòîâ äëÿ âûáðàííûõ ïàðàìåòðîâ:<b><br/>

            <table>

                <tr>

                    <th>&nbsp;</th>

                    <th>Ôàìèëèÿ</th>

                    <th>Èìÿ</th>

                    <th>Îò÷åñòâî</th>

                </tr>

                <c:forEach var="student" items="${form.students}">

                    <tr>

                        <td><input type="radio" name="studentId" value="${student.studentId}"></td>

                        <td><c:out value="${student.surName}"/></td>

                        <td><c:out value="${student.firstName}"/></td>

                        <td><c:out value="${student.patronymic}"/></td>

                    </tr>

                </c:forEach>

            </table>

           

            <table>

                <tr>

                    <td><input type="submit" value="Add" name="Add"/></td>

                    <td><input type="submit" value="Edit" name="Edit"/></td>

                    <td><input type="submit" value="Delete" name="Delete"/></td>

                </tr>

            </table>

           

            <p/><b>Ïåðåìåñòèòü ñòóäåíòîâ â ãðóïïó<b><br/>

            <table>

                <tr>

                    <td>Ãîä:<input type="text" name="newYear" value="${form.year}"/><br/></td>

                    <td>Ñïèñîê ãðóïï:

                        <select name="newGroupId">

                            <c:forEach var="group" items="${form.groups}">

                                <option value="${group.groupId}"><c:out value="${group.groupName}"/></option>

                            </c:forEach>

                        </select>

                    </td>

                    <td><input type="submit" name="MoveGroup" value="Ïåðåìåñòèòü"/></td>

                </tr>

            </table>

            

        </form>

       

    </body>

</html>

 

 

StudentFrame.jsp

 

<%@ page contentType="text/html; charset=windows-1251" %>

<%@ taglib uri="/WEB-INF/tld/c.tld" prefix="c" %>

<html>

    <head>

        <title>Ñïèñîê ñòóäåíòîâ</title>

    </head>

    <body>

       

        <form action='<c:url value="/edit"/>' method="POST">

           

            <input type="hidden" name="studentId" value="${student.studentId}"/>

           

            <table>

                <tr>

                    <td>Ôàìèëèÿ:</td><td><input type="text" name="surName" value="${student.surName}"/></td>

                </tr>

                <tr>

                    <td>Èìÿ:</td><td><input type="text" name="firstName" value="${student.firstName}"/></td>

                </tr>

                <tr>

                    <td>Îò÷åñòâî:</td><td><input type="text" name="patronymic" value="${student.patronymic}"/></td>

                </tr>

                <tr>

                    <td>Äàòà ðîæäåíèÿ:</td><td><input type="text" name="dateOfBirth" value="${student.dateOfBirth}"/></td>

                </tr>

                <tr>

                    <td>Ïîë:</td>

                    <td>

                        <c:choose>

                            <c:when test="${student.sex==0}">

                                <input type="radio" name="sex" value="0" checked>Ì</input>

                                <input type="radio" name="sex" value="1">Æ</input>

                            </c:when>

                            <c:otherwise>

                                <input type="radio" name="sex" value="0">Ì</input>

                                <input type="radio" name="sex" value="1" checked>Æ</input>

                            </c:otherwise>

                        </c:choose>

                    </td>

                </tr>

                <tr>

                    <td>Ãðóïïà:</td>

                    <td>

                        <select name="groupId">

                            <c:forEach var="group" items="${student.groups}">

                                <c:choose>

                                    <c:when test="${group.groupId==student.groupId}">

                                        <option value="${group.groupId}" selected><c:out value="${group.groupName}"/></option>

                                    </c:when>

                                    <c:otherwise>

                                        <option value="${group.groupId}"><c:out value="${group.groupName}"/></option>

                                    </c:otherwise>

                                </c:choose>

                            </c:forEach>

                        </select>

                    </td>

                </tr>

                <tr>

                    <td>Ãîä îáó÷åíèÿ:</td><td><input type="text" name="educationYear" value="${student.educationYear}"/></td>

                </tr>

            </table>

           

            <table>

                <tr>

                    <td><input type="submit" value="OK" name="OK"/></td>

                    <td><input type="submit" value="Cancel" name="Cancel"/></td>

                </tr>

            </table>

 

        </form>

       

    </body>

</html>

 

 

Òàêæå ÿ ïðèâîæó ôàéë web.xml.

 

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

   

    <servlet>

        <servlet-name>MainFrameServlet</servlet-name>

        <servlet-class>students.web.MainFrameServlet</servlet-class>

    </servlet>

    <servlet>

        <servlet-name>StudentFrameServlet</servlet-name>

        <servlet-class>students.web.StudentFrameServlet</servlet-class>

    </servlet>

   

    <servlet-mapping>

        <servlet-name>MainFrameServlet</servlet-name>

        <url-pattern>/main</url-pattern>

    </servlet-mapping>

    <servlet-mapping>

        <servlet-name>StudentFrameServlet</servlet-name>

        <url-pattern>/edit</url-pattern>

    </servlet-mapping>

   

    <welcome-file-list>

        <welcome-file>main</welcome-file>

    </welcome-file-list>

   

</web-app>

 

Îáðàòèòå âíèìàíèå íà òî, ÷òî â êà÷åñòâå welcome-file-list> ó íàñ îòìå÷åí íàø ñåðâëåò MainFrameServlet. Ò.å. êîãäà âû çàïóñòèòå ïðîåêò îí áóäåò îòîáðàæàòüñÿ ñðàçó æå. Ìåëî÷ü, à ïðèÿòíî.

 

×ÒÎ ÅÙÅ Î×ÅÍÜ ÂÀÆÍÎ !!!

Âàì íàäî ñêîïèðîâàòü ôàéëû èç äèðåêòîðèè tld (íàäåþñü âû íå çàáûëè – ýòî íàøè òýãè äëÿ óïðàâëåíèÿ êîíòåíòîì â JSP.

 

Âàø ïðîåêò íàõîäèòñÿ ãäå-òî ïî òàêîìó ïóòè

C:\Documents and Settings\<user>\My Documents\NetBeansProjects\StudentsApp\StudentsApp-war\web

 

Âîò çäåñü è íàäî êîïèðîâàòü íàø êàòàëîã tld – â WEB-INF. NetBeans «ïîäõâàòèò» äîáàâëåííûå ôàéëû.