PA165/Cvičení-podzim2008

Z FI WIKI
Přejít na: navigace, hledání


Cvičení 1

SVN

Cvičení 2

Java Persistence API Java Data Objects Zoznam JavaEE technológii

Cvičení 3

Vytvořte nový projekt typu "Java Application". Pravým tlačítkem klikněte na projekt a vyberte "New - Persistence Unit". Zvolte spojení na databázi. Vznikne soubor persistence.xml, který bude vypadat zhruba takto

 
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="JavaApplication3PU"" transaction-type="RESOURCE_LOCAL">
        <class>cz.muni.fi.pa165.Person</class>
        <properties>
            <property name="toplink.jdbc.url" value="jdbc:derby://localhost:1527/MOJEDB"/>
            <property name="toplink.jdbc.user" value="makub"/>
            <property name="toplink.jdbc.password" value="heslo"/>
            <property name="toplink.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
            <property name="toplink.logging.level" value="FINE"/>
         </properties>
    </persistence-unit>
</persistence>
 

Pozor, pokud vytvoříte projekt typu Enterprise, bude persistence.xml vypadat jinak a budete muset aplikaci nasadit do aplikačního serveru, aby fungovala.

Třídy podle DB tabulek vytvoříte pomocí "New - Entity classes from Database". Nebo naopak DB tabulky lze vytvořit podle tříd vygenerovaných pomocí "New - Entity class".

 
@Entity
public class Person implements Serializable {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String firstName;
    private String lastName;
    
    public void setId(Long id) { this.id = id; }
    public Long getId() { return 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 toString() { return "Person["+id+","+firstName+","+lastName+"]"; }
}

Aby aplikace fungovala, je třeba přidat knihovny "JavaDB" a "Toplink Essentials".

V aplikaci pak lze uložit třídu a opět ji najít podle ID pomocí následujícího kódu:

 
import javax.persistence.*;
 
public class Main {
    public static void main(String[] args) {
        Person p = new Person();
        p.setFirstName("Jan");
        p.setLastName("Novak");
        
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("JavaApplication3PU");
        EntityManager em = emf.createEntityManager();
 
        //vlozit novy
        em.getTransaction().begin();
        em.persist(p);
        em.getTransaction().commit();
        
        //najit podle ID 
        long id = p.getId();
        Person p2 = em.find(Person.class, id);
 
        //najit vsechny pomoci JPQL dotazu
        Query q = em.createQuery("select p from Person p");
        for(Person per:(List<Person>)q.getResultList()) {
            System.out.println("per = " +per);
        }
        //zmenit
        em.getTransaction().begin();
        p.setFirstName("Jiri");
        //zmena se automaticky ulozit pri ukonceni transakce
        em.getTransaction().commit();
  
    }
}

Vztahy mezi třídami

Mezi třídami Student a Note je vztah 1:N.

 
@Entity
public class Student implements Serializable {
    private Long id;
    private int age;
    private String fullName;
    private Date birthDay;
    private List<Note> notes;
 
 
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
 
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
    
    @Temporal(value=TemporalType.TIMESTAMP)
    public Date getBirthDay() { return birthDay; }
    public void setBirthDay(Date birthDay) { this.birthDay = birthDay; }
 
    public String getFullName() { return fullName; }
    public void setFullName(String fullName) { this.fullName = fullName; }
 
    @OneToMany(mappedBy="student")
    public List<Note> getNotes() { return notes; }
    public void setNotes(List<Note> notes) { this.notes = notes;  }
    
}
 
@Entity
public class Note implements Serializable {
 
    private Long id;
    Student student;
    String text;
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
 
    @ManyToOne
    public Student getStudent() { return student; }
 
    public void setStudent(Student student) { this.student = student; }
 
    public String getText() { return text; }
    public void setText(String text) {this.text = text; }
}

Cvičení 4

prostředí

module add netbeans-6.5

Pokud ho ještě nemáte, vytvořit nový applikační server (v netbeans Tools - Servers - Add Server - TomCat 6.0)

Servlet generující text

Vytvořte si novou webovou aplikaci jménem WebCviceni4, zvolte TomCat 6.0.16 a verzi Java EE 5.0, bez frameworků (Struts, JSF atd.).

Vytvořte package cz.muni.fi.pa165.cv4 (Projects - WebCviceni4 - Source Packages - New - Java Package) .

Vytvořte třídu typu Servlet cz.muni.fi.pa165.cv4.AhojServlet (pravým tlačítkem myši na package - New - Other - Categories:Web - File type:Servlet), mapování "URL Pattern(s)" nastavte na /ahoj/*.

Dopiště do třídy na kód aby vypadala takto:

 
package cz.muni.fi.pa165.cv4;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
public class AhojServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("Hello World !");
        out.println("</body></html>");
    }
}

Toto je minimalistický servlet obsluhující metodu GET, generující vždy stejnou HTML stránku.

Sestavte projekt (Build - Build Main Project) a spusťte ho (Run - Run Main Project).

Nyní můžete zavolat URL http://localhost:8093/WebCviceni4/ahoj/

Servlet generující obrázek a Filter

Vytvořte třídu typu Servlet cz.muni.fi.pa165.cv4.ObrazekServlet (pravým tlačítkem myši na package - New - Other - Categories:Web - File type:Servlet), mapování "URL Pattern(s)" nastavte na /obrazek/*.

Přetvořte třídu na kód:

 
package cz.muni.fi.pa165.cv4;
 
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.font.TextLayout;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
 
public class ObrazekServlet extends HttpServlet {
 
    {
        //pokus zabranit kontaktovani X-serveru
        System.setProperty("java.awt.headless", "true");
    }
 
@Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int velikostPisma = 200;
        String text = "Ahoj";
 
        String velpar = request.getParameter("velikost");
        if (velpar != null && velpar.length() > 0) {
            velikostPisma = Integer.parseInt(velpar);
        }
 
        String tpar = request.getParameter("text");
        if (tpar != null && tpar.length() > 0) text = tpar;
 
        Font font = new Font("SansSerif", Font.PLAIN, velikostPisma);
 
        response.setContentType("image/png");
        ImageIO.write(createTextImage(text, font), "png", response.getOutputStream());
    }
 
    private BufferedImage createTextImage(String text, Font font) {
        //predpocitat velikost napisu
        BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = image.createGraphics();
        g.setFont(font);
        Rectangle2D sb1 = g.getFontMetrics().getStringBounds(text,g);
        int sirka = (int) sb1.getWidth() + 20;
        int vyska = (int) sb1.getHeight() + 20;
 
        //vytvorit napis
        image = new BufferedImage(sirka, vyska, BufferedImage.TYPE_INT_RGB);
        g = image.createGraphics();
        g.setFont(font);
        //vymazat
        g.setColor(Color.decode("#200040"));
        g.fillRect(0, 0, sirka, vyska);
        //oramovani
        g.setColor(Color.YELLOW);
        g.drawRect(5, 5, sirka - 2 * 5, vyska - 2 * 5);
 
        TextLayout tl = new TextLayout(text, font, g.getFontRenderContext());
        Rectangle2D sb = tl.getBounds();
        int x = sirka/2 - (int)sb.getX() - (int) (sb.getWidth() / 2);
        int y = vyska/2 - (int)sb.getY() - (int)(sb.getHeight() / 2);
        tl.draw(g,x,y);
        return image;
    }
}

Vytvořte třídu typu Filter cz.muni.fi.pa165.cv4.KodovaniCestinyFilter (pravým tlačítkem myši na package, New - Other - Categories:Web - File type:Filter), mapování ponechte na /*. Upravte ji na kód:

 
package cz.muni.fi.pa165.cv4;
 
import javax.servlet.*;
import java.io.IOException;
 
public class KodovaniCestinyFilter implements Filter {
 
    public void init(FilterConfig filterConfig) throws ServletException {
    }
 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        if (request.getCharacterEncoding() == null) {
            request.setCharacterEncoding("utf-8");
        }
        chain.doFilter(request, response);
    }
 
    public void destroy() {
    }
}

Editujte soubor WEB-INF/web.xml v XML tvaru a upravte ho na tvar:

 
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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"
	 version="2.5">
    <filter>
        <filter-name>kodovani</filter-name>
        <filter-class>cz.muni.fi.pa165.cv4.KodovaniCestinyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>kodovani</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
 
    <servlet>
        <servlet-name>obrazek</servlet-name>
        <servlet-class>cz.muni.fi.pa165.cv4.ObrazekServlet</servlet-class>
    </servlet>
    <servlet-mapping>
      <servlet-name>obrazek</servlet-name>
      <url-pattern>/obrazek/*</url-pattern>
    </servlet-mapping>
</web-app>

Vytvořte JSP stránku obrazky.jsp (Projects - WebCviceni4 - Web Pages - New - JSP, pozor jméno zadejte bez přípony .jsp, NetBeans ji doplní samy) a upravte ji na tvar:

<%@ page contentType="text/html;charset=utf-8" %>
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

 <html>
   <body>   
 <c:set var="zacatek" scope="page" value="${! empty param.zacatek ? param.zacatek : 50}" />
 <c:set var="konec" scope="page" value="${! empty param.konec ? param.konec : 100}" />
 <c:set var="krok" scope="page" value="${! empty param.krok ? param.krok : 20}" />
 
 <c:forEach var="i"  begin="${zacatek}" end="${konec}" step="${krok}">
    <c:url var="u" value="/obrazek/img.png" >
        <c:param name="text" value="${param.text}" />
        <c:param name="velikost" value="${i}" />
    </c:url>
    ${i}: <br />
    <img src="${u}" alt="napis" > <hr />
 </c:forEach>
 </body>
 </html>
 

Do projektu musíte přidat knihovnu JSTL 1.1 (pravým tlačítkem na Libraries, Add Library - JSTL 1.1).

Sestavte projekt (Build - Build Main Project) a spusťte ho (Run - Run Main Project).

Nyní můžete zavolat URL http://localhost:8093/WebCviceni4/obrazky.jsp

JSTL, i18n

Vytvořte soubor cz/muni/fi/pa165/cv4/Texty_cs.properties (pravým tl. myši na package, New - File, Category:Other - File Types: Properties File, jméno souboru Texty, potvrdit, znovu pravým tl. myši, Add Locale, Language: cs, doubleklik na něj)

Pozor, pro identifikaci locale používejte jen jazyk, tj. cs a en, ne jazyk a zemi, tj. cs_CZ a en_US. Prohlížeče totiž specifikují pro češtinu jen zemi, a podle pravidel nalezení ResourceBundle se nepoužije specifičtější varianta, tj. pro jazyk cs se soubor s určením cs_CZ nenajde.

nadpis=Obr\u00e1zky
velikosti=Velikosti
od=Od
do=Do
krok=Krok
text=Text
odeslat=Odeslat
jazyky=Va\u0161e jazyky
tedje=Te\u010f je pr\u00e1v\u011b
velikost=Velikost
chyba.nenitext=Zadejte, pros\u00EDm, text pro obr\u00E1zky

Vytvořte soubor cz/muni/fi/pa165/cv4/Texty_en.properties (na Texty.properties dejte Add Locale, Language: en):

nadpis=Images
velikosti=Sizes
od=From
do=To
krok=Step
text=Text
odeslat=Send
jazyky=Your languages
tedje=The time is
velikost=Size
chyba.nenitext=Please enter the text for images

Všechny jazyky lze editovat po kliknutí pravým tl. na Texty.properties, zvolit Open.


Vytvořte JSP stránku index.jsp a vložte do ní:

 <%@ page pageEncoding="iso-8859-2" contentType="text/html;charset=utf-8" %>
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 <%@ taglib prefix="f" uri="http://java.sun.com/jsp/jstl/fmt" %>

 <html>
 <head>
    <style type="text/css">
        table.t1 { border-collapse: collapse; margin: 10px; }
        table.t1 th, table.t1 td { border: solid 1px black; padding: 4px; }
        .chyba { padding: 1em; font-weight: bold; color: red; background: yellow; border: solid 1px red; }
    </style>
 </head>
 <body>

 <f:setBundle basename="cz.muni.fi.pa165.cv4.Texty" />
 <h2><f:message key="nadpis" /> </h2>

 <f:message key="jazyky"/>:  <c:forEach var="loc" items="${pageContext.request.locales}" > ${loc} </c:forEach>
 <br/>
 <% request.setAttribute("ted",new java.util.Date()); %>
 <f:message key="tedje"/>: 
 <f:formatDate value="${ted}" dateStyle="full" timeStyle="full" type="both" />

 <c:if test="${! empty chyby}">
     <div class="chyba">
     <c:forEach var="ch" items="${chyby}"><f:message key="${ch}" /></c:forEach>
     </div>
 </c:if>
 <c:url var="u" value="/formular.kontrola"/>
 <form action="${u}" method="post">
    <table class="t1">
        <tr><td colspan="2"><f:message key="velikosti"/>:</td></tr>
        <tr><td><f:message key="od"/>:</td><td><input name="zacatek" value="20"/></td></tr>
        <tr><td><f:message key="do"/>: </td><td><input name="konec" value="150"/></td></tr>
        <tr><td><f:message key="krok"/>: </td><td><input name="krok" value="30"/></td></tr>
        <tr><td><f:message key="text"/>:</td><td><input type="text" name="text"></td></tr>
        <tr>
            <td colspan="2"><input type="submit" value="<f:message key="odeslat" />"/></td>
        </tr>
    </table>
 </form>

 </body>
 </html>
 

Vytvořte nový servlet cz.muni.fi.pa165.cv4.KontrolaServlet, tentokrát volbou New - Servlet, a na druhé stránce wizardu zadejte v položce URL Patterns: hodnotu *.kontrola. Ve web.xml si můžete zkontrolovat změnu, ale je nutné web.xml zavřít a znovu otevřít, aby byla vidět (chyba v NetBeans).

Upravte jeho metodu processRequest() na tvar:

 
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        ArrayList<String> chyby = new ArrayList<String>();
        String text = request.getParameter("text");
        if(text==null||text.length()==0) {
            chyby.add("chyba.nenitext");
        }
        if(chyby.size()>0) {
            request.setAttribute("chyby",chyby);
            request.getRequestDispatcher("/index.jsp").forward(request,response);
        } else {
            request.getRequestDispatcher("/obrazky.jsp").forward(request,response);
        }
    }

Znovu sestavte projekt (Build - Clean and Build Main Project) a spusťte ho (Run - Run Main Project).

Podívejte se na stránku index.jsp. V nastavení prohlížeče přesuňte do popředí jiný jazyk (pokud byla čeština, tak angličtinu, a naopak), dejte reload stránky. Odešlete formulář, zobrazí se chyba. Zadejte text a znovu odešlete formulář. Zobrazí se obrázky.

Samostatné cvičení: přidejte kontroly, že začátek a konec velikostí obrázků jsou nenulové, a konec není menší než začátek, s výpisy chybových hlášení.

Snoop

Vytvořte si a spusťte JSP stránku s následujícím obsahem:

 <%@ page session="true" contentType="text/html;charset=utf-8" %>
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 <%@ taglib prefix="f" uri="http://java.sun.com/jsp/jstl/fmt" %>
 <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
 <html>
 <head>
 <title> Snoop </title>
 </head>
 <body>
 <table border="1" bgcolor="#e0e0e0">
 <tr><th colspan="2" align="left">Headers:</th></tr>
 <c:forEach items="${header}" var="h" >
   <tr>
    <td>${h.key}</td>
    <td>${h.value}</td>
   </tr>
 </c:forEach>
 </table>
 <table border="1" bgcolor="#e0e0e0">
 <tr><th colspan="2" align="left">Request Params:</th></tr>
 <c:forEach items="${param}" var="p" >
   <tr>
    <td>${p.key}</td>
    <td>${p.value}</td>
   </tr>
 </c:forEach>
 </table>
 <hr width="90%">
 <table border="1" bgcolor="cyan">
 <tr><th colspan="2" align="left">page scope attributes:</th></tr>
 <c:forEach items="${pageScope}" var="a" >
   <tr>
    <td>${a.key}</td>
    <td>${a.value}</td>
   </tr>
 </c:forEach>
 <tr><th colspan="2" align="left">request scope attributes:</th></tr>
 <c:forEach items="${requestScope}" var="a" >
   <tr>
    <td>${a.key}</td>
    <td>${a.value}</td>
   </tr>
 </c:forEach>
 <tr><th colspan="2" align="left">session scope attributes:</th></tr>
 <c:forEach items="${sessionScope}" var="a" >
   <tr>
    <td>${a.key}</td>
    <td>${a.value}</td>
   </tr>
 </c:forEach>
  <tr><th colspan="2" align="left">application scope attributes:</th></tr>
  <c:forEach items="${applicationScope}" var="a" varStatus="s">
   <tr>
    <td>${s.count} ${a.key}</td>
    <td><c:catch var="ex">${a.value}</c:catch></td>
   </tr>
  </c:forEach>
  </table>
  <hr width="90%">
  <table border="1" bgcolor="yellow">
   <tr>
    <th colspan="2">pageContext.servletContext</th>
   </tr>
   <tr>
    <td> majorVersion.minorVersion</td>
    <td> ${pageContext.servletContext.majorVersion}.${pageContext.servletContext.minorVersion}</td>
   </tr>
   <tr>
    <td> serverInfo</td>
    <td> ${pageContext.servletContext.serverInfo} </td>
   </tr>
   <tr>
    <td> servletContextName</td>
    <td> ${pageContext.servletContext.servletContextName} </td>
   </tr>
   <tr><th colspan="2" align="left">initParam (servletContext/application)</th></tr>
  <c:forEach items="${initParam}" var="p" >
   <tr>
    <td>${p.key}</td>
    <td>${p.value}</td>
   </tr>
  </c:forEach>
  </table>
  <table border="1" bgcolor="orange">
   <tr>
    <th colspan="2">javax.servlet.http.HttpServletRequest</th>
   </tr>
   <tr>
    <td> pageContext.request.authType</td>
    <td> ${pageContext.request.authType} </td>
   </tr>
   <tr>
    <td> pageContext.request.contextPath</td>
    <td> ${pageContext.request.contextPath} </td>
   </tr>
   <tr>
    <td> pageContext.request.method</td>
    <td> ${pageContext.request.method} </td>
   </tr>
   <tr>
    <td> pageContext.request.pathInfo</td>
    <td> ${pageContext.request.pathInfo} </td>
   </tr>
   <tr>
    <td> pageContext.request.pathTranslated</td>
    <td> ${pageContext.request.pathTranslated} </td>
   </tr>
   <tr>
    <td> pageContext.request.queryString</td>
    <td> ${pageContext.request.queryString} </td>
   </tr>
   <tr>
    <td> pageContext.request.remoteUser</td>
    <td> ${pageContext.request.remoteUser} </td>
   </tr>
   <tr>
    <td> pageContext.request.requestedSessionId</td>
    <td> ${pageContext.request.requestedSessionId} </td>
   </tr>
   <tr>
    <td> pageContext.request.requestURI</td>
    <td> ${pageContext.request.requestURI} </td>
   </tr>
   <tr>
    <td> pageContext.request.requestURL</td>
    <td> ${pageContext.request.requestURL} </td>
   </tr>
   <tr>
    <td> pageContext.request.servletPath</td>
    <td> ${pageContext.request.servletPath} </td>
   </tr>
   <tr>
    <td> pageContext.request.userPrincipal</td>
    <td> ${pageContext.request.userPrincipal} </td>
   </tr>

   <tr>
    <th colspan="2">javax.servlet.ServletRequest</th>
   </tr>
   <tr>
    <td> pageContext.request.characterEncoding</td>
    <td> ${pageContext.request.characterEncoding} </td>
   </tr>
   <tr>
    <td> pageContext.request.contentLength</td>
    <td> ${pageContext.request.contentLength} </td>
   </tr>
   <tr>
    <td> pageContext.request.contentType</td>
    <td> ${pageContext.request.contentType} </td>
   </tr>
   <tr>
    <td> pageContext.request.localAddr</td>
    <td> ${pageContext.request.localAddr} </td>
   </tr>
   <tr>
    <td> pageContext.request.localName</td>
    <td> ${pageContext.request.localName} </td>
   </tr>
   <tr>
    <td> pageContext.request.localPort</td>
    <td> ${pageContext.request.localPort} </td>
   </tr>
   <tr>
    <td> pageContext.request.locale</td>
    <td> ${pageContext.request.locale} </td>
   </tr>
   <tr>
    <td> pageContext.request.protocol</td>
    <td> ${pageContext.request.protocol} </td>
   </tr>
   <tr>
    <td> pageContext.request.remoteAddr</td>
    <td> ${pageContext.request.remoteAddr} </td>
   </tr>
   <tr>
    <td> pageContext.request.remoteHost</td>
    <td> ${pageContext.request.remoteHost} </td>
   </tr>
   <tr>
    <td> pageContext.request.remotePort</td>
    <td> ${pageContext.request.remotePort} </td>
   </tr>
   <tr>
    <td> pageContext.request.scheme</td>
    <td> ${pageContext.request.scheme} </td>
   </tr>
   <tr>
    <td> pageContext.request.serverName</td>
    <td> ${pageContext.request.serverName} </td>
   </tr>
   <tr>
    <td> pageContext.request.serverPort</td>
    <td> ${pageContext.request.serverPort} </td>
   </tr>
   <tr>
    <td> pageContext.request.secure</td>
    <td> ${pageContext.request.secure} </td>
   </tr>
   <tr>
    <th colspan="2">javax.servlet.http.HttpSession</th>
   </tr>
   <tr>
    <td> pageContext.request.session.new</td>
    <td> ${pageContext.request.session.new} </td>
   </tr>
   <tr>
    <td> pageContext.request.session.id</td>
    <td> ${pageContext.request.session.id} </td>
   </tr>
   <tr>
    <td> pageContext.request.session.lastAccessedTime</td>
    <td> ${pageContext.request.session.lastAccessedTime} </td>
   </tr>
   <tr>
    <td> pageContext.request.session.maxInactiveInterval</td>
    <td> ${pageContext.request.session.maxInactiveInterval} </td>
   </tr>
   <tr>
    <th colspan="2">other</th>
   </tr>
   <tr>
    <td> pageContext.page.servletInfo</td>
    <td> ${pageContext.page.servletInfo} </td>
   </tr>
   <tr>
    <td> pageContext.servletConfig.servletName</td>
    <td> ${pageContext.servletConfig.servletName} </td>
   </tr>
   <tr>
    <td> javax.servlet.jsp.JspFactory</td>
    <td> <%=javax.servlet.jsp.JspFactory.getDefaultFactory().getEngineInfo().getSpecificationVersion()%></td>
   </tr>
 </table>
 </body>
 </html>
 

Cvičení 5

Postupujte podle pokynů v Cvičení Stripes

Cvičení 9

Postupujte podle pokynů v Cvičení AJAX

Projekty

Založení projektu

  1. poslat loginy členů teamu a acronym projektu na pavlovic@fi.muni.cz
  2. na adrese https://kore.fi.muni.cz:5443/repos/fi/pa165/2006/acronym je dostupna pro zápis SVN repozitory všem členům teamu
  3. na adrese http://kore.fi.muni.cz:5080/projects/pa165/2006/acronym je dostupný web vašeho projektu
  4. fyzicky se web projektu s právy pro zápis členům teamu nachází na stoji kore.fi.muni.cz, ssh běží na portu 5022, pokud jste mimo sít FI (platí i pro wifi přístup) ve složce /www/projects/pa165/2005/acronym

Databáze

Pokud budete k projektu potřebovat učet v DB, podívejte se na http://www.fi.muni.cz/tech/unix/databaze.xhtml. V případě, že byste potřebovali nestandardní služby od db je možné zřídit učet v db na stroji kore.fi.muni.cz viz pavlovic@fi.muni.cz .

K dispozici je i webové rozhraní pro manipulaci s DB.

Aplikační servery a Servlet kontejnery

Pro řešení projektů jsou následující servery:

Přístupové heslo na pavlovic@fi.muni.cz.

Cvičení 6

CREATE TABLE BEER (
    ID INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
    NAME VARCHAR(10),
    QUALITY INT
);
 
CREATE TABLE NOTE (
    ID INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
    BEER_ID INT REFERENCES BEER (ID),
    NOTE VARCHAR(100)
)

Cvičení 11

podle tutoriálu Getting Started with JAX-WS Web Services

Cvičení 12

Dle JSF a [2]