Advanced Kittenry - Tietokantasovellusohjeet

Sovelluksen rakenne ja servletit

Tiivistelmä:

  • Tee koodia varten oma pakettisi. Esim. Kissalista.
  • Sijoita kaikki mallit omaan pakettiinsa. Esim. Kissalista.Models.
  • Sijoita servlet-luokkasi omaan pakettiinsa. Esim. Kissalista.Servlets. Jatkossa samaan pakettiin tulevat kaikki muutkin servletit.

Lopullisen projektin pitäisi noudatella tämäntapaista kansiorakennetta

src/
  Paketti/
    Models/
      User.java
    Servlets/
      UserServlet.java
web/
  user.jsp

Tietokantasovellukset Javalla kannattaa jakaa arkkitehtuuriohjeen mukaisesti malleihin, kontrollereihin ja näkymiin. Keskitymme ensiksi malleihin ja kontrollereihin ja jatkamme sitten näkymiin seuraavalla sivulla.

Mallit

Sijoita projektin mallit omaan pakettiinsa samaan tapaan kuin servletit. Kolmannen viikon töihin tarvitset käytännössä vain yhden malliluokan, joka kuvaa käyttäjää. Jos teit toisella viikolla listauksesi käyttäjälistauksena, sinulla on jo sellainen valmiina.

Sijoita malliisi kentät tietokantataulun kenttiä varten ja luo kentille getterit ja setterit sekä halutessasi konstruktori, joka ottaa kenttien arvot vastaan.

Työn edetessä teemme luokkiin metodeja, jotka osaavat hakea olioihin sisältöä tietokannasta, sekä metodit, joilla tietoa päivitetään takaisin kantaan.

Servletit

Servletit ovat Java EE:ssä eli Javan nettipuolessa käytettäviä luokkia, jotka edustavat jonkin nettisivun tai toiminnon kontrollereita. Servletit ja kontrollerit ovat Javan näkökulmasta useimmiten käytännössä sama asia.

Jokainen Servlet-luokka on sidottu johonkin URL-osoitteeseen, johon ohjattu aineistopyyntö aktivoi sen. Sitomiset on käyttämässämme Java-ympäristön versiossa määritelty XML-pohjaisesti tiedostossa web/WEB-INF/web.xml.

NetBeans osaa muokata tämän tiedoston määrityksiä kätevällä käyttöliittymällä ja liittää esimerkiksi uusien Servlettien URL-osoitteet sinne samalla kun Servlettiä luodaan, jolloin käytännössä tiedostoon tarvitsee koskea käsin aika harvoin.

Jos tiedostoa kuitenkin haluaa muokata, on sen olennainen sisältö servlet- ja servlet-mapping-tägien kohdalla. Näistä ensimmäiset määrittävät yhteyksiä servlet-luokkien ja niistä käytettyjen nimien välillä. Nimet taas liitetään URL-osoitteisiin servlet-mapping-tägien avulla. Tällä tavalla yhden serveltin voi sijoittaa esimerkiksi useaan osoitteeseen.

<servlet>
    <servlet-name>Kissalista</servlet-name>
    <servlet-class>kissalista.servlet.Kissalista</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Kissalista</servlet-name>
    <url-pattern>/osoite</url-pattern>
</servlet-mapping>

Laittamalla url-pattern-tägin sisään pelkän kenoviivan /, saa servletin asetettua sovelluksen etusivuksi. Oletuksena Tomcat-sovellus käyttää etusivunaan index.jsp-tiedostoa.

Vinkki

Sekä servlet-, että malliluokat kannattaa sijoittaa omiin paketteihinsa. Näin sovelluksesi rakenteesta tulee huomattavasti selkeämpi.

Servletin toiminta

Servletin toiminnan ytimessä ovat doGet- ja doPost-metodit, jotka ottavat vastaan servletin osoitteeeseen GET- ja POST-metodeilla tehtyjä aineistopyyntöjä. NetBeansin vakiopohja Servlet-luokille luo nämä metodit automaattisesti ja laittaa ne molemmat kutsumaan samaa processRequest-metodia. Metodilla on parametreina HttpServletRequest-olio, joka sisältää pyynnön tiedot, ja HttpServletResponse-olio, johon voidaan lisätä vastaus.

Esimerkki Netbeansillä tuotetusta Servlet-luokasta. Älä käytä tätä koodia suoraan!

public class TestiServlet extends HttpServlet {

  /**
   * Processes requests for both HTTP
   * <code>GET</code> and <code>POST</code> methods.
   *
   * @param request servlet request
   * @param response servlet response
   * @throws ServletException if a servlet-specific error occurs
   * @throws IOException if an I/O error occurs
   */
  protected void processRequest(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter(); 
    try {
      /* TODO output your page here. You may use following sample code. */
      out.println("<html>"); 
      out.println("<head><title>Servlet TestiServlet</title></head>");
      out.println("<body>");
      out.println("<h1>Servlet TestiServlet at " + 
        request.getContextPath() + "</h1>");
      out.println("</body>");
      out.println("</html>");
    } finally {            
      out.close();
    }
  }
  
  /* NetBeansin piilottamat doGet- ja doPost-metodit, jotka kutsuvat processRequest-metodia. */

}

Valmiin pohjan sisältämä vastauksen tuottava koodi sisältää suoraan kontrolleriin upotettua HTML-koodia. Tälläistä koodia ei kannata käyttää, vaan kannattaa tuottaa HTML-sivut erillisillä näkymätiedostoilla.

Näistä kerrotaan enemmän seuraavalla sivuilla.

Seuraavaksi:

Seuraavaksi tutustumme tarkemmin näkymien toteuttamiseen.