PA165/Cvičení-podzim2008: Porovnání verzí

Z FI WIKI
Přejít na: navigace, hledání
(EJB)
m
 
(Není zobrazeno 192 mezilehlých verzí od 25 dalších uživatelů.)
Řádka 1: Řádka 1:
== Cvičení (1) ==
+
{{Deprecated}}
 +
 
 +
<!--== Jak přidat Glassfish do NetBeans ==
 +
Abz bylo možné pracovat s Java EE 5, je nutné do NetBeans přidat aplikační server Glassfish verze 9.0. Na fakultní síti to uděláte takto:
 +
# Spusťte NetBeans verze 5.5 (nejaktuálnější verze je 5.5rc1, tj. použijte příkaz <code>module add netbeans-5.5rc1</code>).
 +
-->
 +
 
 +
== Cvičení 1 ==
 
=== SVN ===
 
=== SVN ===
 
* https://kore.fi.muni.cz:5443/repos/test/
 
* https://kore.fi.muni.cz:5443/repos/test/
 +
* netbeans + subversion (flash demo) [http://www.netbeans.org/download/flash/subversion/subversion.html]
 +
 +
== 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 <code>persistence.xml</code>, který bude vypadat zhruba takto
 +
<xml>
 +
<?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>
 +
</xml>
 +
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".
 +
<java>
 +
@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+"]"; }
 +
}
 +
</java>
 +
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:
 +
<java>
 +
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();
 +
 
 +
    }
 +
}
 +
</java>
 +
==== Vztahy mezi třídami ====
 +
Mezi třídami Student a Note je vztah 1:N.
 +
<java>
 +
@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;  }
 +
   
 +
}
 +
</java>
 +
<java>
 +
@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; }
 +
}
 +
</java>
 +
<!--
 
=== ANT ===
 
=== ANT ===
 
==== Catalina ant example ====
 
==== Catalina ant example ====
  
 
* '''build.xml'''
 
* '''build.xml'''
<?xml version="1.0" encoding="utf-8"?>
+
<xml>
 +
<?xml version="1.0" encoding="utf-8"?>
 
  <project name="Uloha2" default="run" basedir=".">
 
  <project name="Uloha2" default="run" basedir=".">
 
  <description>
 
  <description>
 
  </description>
 
  </description>
 
  <property file="build.properties"/>
 
  <property file="build.properties"/>
<!-- Configure the custom Ant tasks for the Manager application -->
 
 
  <taskdef name="deploy"    classname="org.apache.catalina.ant.DeployTask" classpath="${catalina-ant.jar}" />
 
  <taskdef name="deploy"    classname="org.apache.catalina.ant.DeployTask" classpath="${catalina-ant.jar}" />
 
  <taskdef name="list"      classname="org.apache.catalina.ant.ListTask" classpath="${catalina-ant.jar}" />
 
  <taskdef name="list"      classname="org.apache.catalina.ant.ListTask" classpath="${catalina-ant.jar}" />
Řádka 20: Řádka 175:
 
  <taskdef name="stop"      classname="org.apache.catalina.ant.StopTask" classpath="${catalina-ant.jar}"/>
 
  <taskdef name="stop"      classname="org.apache.catalina.ant.StopTask" classpath="${catalina-ant.jar}"/>
 
  <taskdef name="undeploy"  classname="org.apache.catalina.ant.UndeployTask" classpath="${catalina-ant.jar}"/>
 
  <taskdef name="undeploy"  classname="org.apache.catalina.ant.UndeployTask" classpath="${catalina-ant.jar}"/>
<!-- Deploy application -->
 
 
  <target name="deploy" description="Deploy the web application">
 
  <target name="deploy" description="Deploy the web application">
 
   <deploy url="${manager.url}" username="${manager.username}" password="${manager.password}" path="/${app.path}"  
 
   <deploy url="${manager.url}" username="${manager.username}" password="${manager.password}" path="/${app.path}"  
 
           war="file:${dist.home}/${app.name}.war"/>
 
           war="file:${dist.home}/${app.name}.war"/>
 
  </target>
 
  </target>
<!-- Undeploy application -->
 
 
  <target name="undeploy" description="Undeploy web application">
 
  <target name="undeploy" description="Undeploy web application">
 
   <undeploy url="${manager.url}" username="${manager.username}" password="${manager.password}" path="/${app.path}"/>
 
   <undeploy url="${manager.url}" username="${manager.username}" password="${manager.password}" path="/${app.path}"/>
 
  </target>
 
  </target>
 
  </project>
 
  </project>
 +
</xml>
  
 
* '''build.properties'''
 
* '''build.properties'''
 
+
<xml>
 
  app.name=WebApplication2
 
  app.name=WebApplication2
 
  dist.home=${app.name}/dist
 
  dist.home=${app.name}/dist
Řádka 40: Řádka 194:
 
  manager.password=managerpass
 
  manager.password=managerpass
 
  catalina-ant.jar=/packages/share/tomcat-5.5.3/server/lib/catalina-ant.jar
 
  catalina-ant.jar=/packages/share/tomcat-5.5.3/server/lib/catalina-ant.jar
 +
</xml>
  
 
použití:
 
použití:
Řádka 51: Řádka 206:
 
  $ ant undeploy
 
  $ ant undeploy
  
 
+
== Cvičení 2 ==
== Cvičení (2) ==
+
 
=== Maven ===
 
=== Maven ===
 
=== Servlets ===
 
=== Servlets ===
Řádka 58: Řádka 212:
 
* http://www.javaworld.com/channel_content/jw-servlets-index.shtml
 
* http://www.javaworld.com/channel_content/jw-servlets-index.shtml
  
== Cvičení (3) ==
+
== Cvičení 3 ==
 
=== JSP ===
 
=== JSP ===
 
* http://www.onjava.com/topics/java/JSP_Servlets
 
* http://www.onjava.com/topics/java/JSP_Servlets
 
* http://www.javaworld.com/channel_content/jw-jsp-index.shtml?
 
* http://www.javaworld.com/channel_content/jw-jsp-index.shtml?
 +
* http://java.sun.com/developer/technicalArticles/J2EE/jsp_21/
 
==== JSTL ====
 
==== JSTL ====
 +
* http://java.sun.com/developer/technicalArticles/J2EE/jstl/
 
==== EL ====
 
==== EL ====
 +
* http://java.sun.com/products/jsp/reference/techart/unifiedEL.html?feed=JSC
  
 
=== Java Beans ===
 
=== Java Beans ===
 
*  http://java.sun.com/docs/books/tutorial/javabeans/index.html
 
*  http://java.sun.com/docs/books/tutorial/javabeans/index.html
  
== Cvičení (4) ==
+
== Cvičení 4 ==
 
=== JDBC ===
 
=== JDBC ===
* https://is.muni.cz/auth/el/1433/jaro2005/pv168/um/ jdbcExample
+
* [https://is.muni.cz/auth/el/1433/jaro2005/pv168/um/ jdbcExample]
* http://tomcat.apache.org/tomcat-5.5-doc/jndi-datasource-examples-howto.html tomcat JNDI example
+
* [http://www.onjava.com/pub/a/onjava/2006/04/19/database-connection-pooling-with-tomcat.html?CMP=OTC-FP2116136014&ATT=Database+Connection+Pooling+with+Tomcat Connection pooling]
 +
* [http://tomcat.apache.org/tomcat-5.5-doc/jndi-datasource-examples-howto.html tomcat JNDI example]
  
== Cvičení (5) ==
+
== Cvičení 5 ==
 
=== Hibernate ===
 
=== Hibernate ===
 
* http://www.hibernate.org/hib_docs/v3/reference/en/html/quickstart.html tomcat quickstart
 
* http://www.hibernate.org/hib_docs/v3/reference/en/html/quickstart.html tomcat quickstart
  
== Cvičení (6) ==
+
== Cvičení 6 ==
 
=== Nástroje pro vývoj webových aplikací ===
 
=== Nástroje pro vývoj webových aplikací ===
 
* http://pmd.sourceforge.net/ PMD
 
* http://pmd.sourceforge.net/ PMD
Řádka 86: Řádka 244:
 
* http://dbunit.sourceforge.net/ DBUnit
 
* http://dbunit.sourceforge.net/ DBUnit
  
== Cvičení (7) ==
+
== Cvičení 7 ==
 
=== AJAX ===
 
=== AJAX ===
 
* http://interval.cz/clanek.asp?article=3921
 
* http://interval.cz/clanek.asp?article=3921
Řádka 109: Řádka 267:
 
* http://www.onjava.com/topics/java/wsdl_uddi
 
* http://www.onjava.com/topics/java/wsdl_uddi
  
== Cvičení (8) ==
+
== Cvičení 8 ==
 
=== Struts ===
 
=== Struts ===
 
* http://struts.apache.org/struts-doc-1.2.7/index.html dokumentace Struts
 
* http://struts.apache.org/struts-doc-1.2.7/index.html dokumentace Struts
Řádka 116: Řádka 274:
 
* http://www.fi.muni.cz/~xpavlov/bc/nosek/abook bakalarska prace: Lubor Nosek, zdrojove kody
 
* http://www.fi.muni.cz/~xpavlov/bc/nosek/abook bakalarska prace: Lubor Nosek, zdrojove kody
 
* http://www.roseindia.net/struts/ tutorial
 
* http://www.roseindia.net/struts/ tutorial
 +
* http://www.theserverside.com/articles/article.tss?l=StrutsforJava5 Struts for Java 5
 
* http://www.fi.muni.cz/~xdrasil/vyuka/PA165/Cviceni%207/StrutsHibExample.zip example z cviceni Pavla Drasila
 
* http://www.fi.muni.cz/~xdrasil/vyuka/PA165/Cviceni%207/StrutsHibExample.zip example z cviceni Pavla Drasila
 +
* http://www.linuxsoft.cz/article.php?id_article=668 clanek na linuxsoft
  
== Cvičení (9) ==
+
== Cvičení 9 ==
 
=== EJB ===
 
=== EJB ===
 
* http://www.netbeans.org/kb/50/quickstart-j2ee.html NetBeans EJB Tutorial
 
* http://www.netbeans.org/kb/50/quickstart-j2ee.html NetBeans EJB Tutorial
Řádka 134: Řádka 294:
 
* http://www.javaworld.com/channel_content/jw-ejbs-index.shtml?
 
* http://www.javaworld.com/channel_content/jw-ejbs-index.shtml?
  
== Cvičení (10) ==
+
== Cvičení 10 ==
 
=== JMS ===
 
=== JMS ===
 
* http://java.sun.com/products/jms/tutorial/1_3_1-fcs/doc/jms_tutorialTOC.html Sun JMS Tutorial
 
* http://java.sun.com/products/jms/tutorial/1_3_1-fcs/doc/jms_tutorialTOC.html Sun JMS Tutorial
Řádka 141: Řádka 301:
 
* http://www.onjava.com/pub/a/onjava/2001/12/12/jms_not.html
 
* http://www.onjava.com/pub/a/onjava/2001/12/12/jms_not.html
 
* http://www.onjava.com/pub/a/onjava/2002/06/19/jms.html
 
* http://www.onjava.com/pub/a/onjava/2002/06/19/jms.html
 +
* http://www.javaworld.com/channel_content/jw-message-index.shtml?
  
 
literatura:
 
literatura:
 
* http://www.oreilly.com/catalog/javmesser/
 
* http://www.oreilly.com/catalog/javmesser/
  
== Cvičení (11) ==
+
== Cvičení 11 ==
 
=== Testování ===
 
=== Testování ===
  
 
==== Nástroje pro testování ====
 
==== Nástroje pro testování ====
* JUnit http://www.junit.org/index.htm
+
* JUnit http://www.junit.org/
 +
* TestNG http://testng.org/doc/
 
* Cactus http://jakarta.apache.org/cactus/
 
* Cactus http://jakarta.apache.org/cactus/
 
* JTRunner http://jtrunner.sourceforge.net/
 
* JTRunner http://jtrunner.sourceforge.net/
Řádka 155: Řádka 317:
 
* JUnitEE http://www.junitee.org/
 
* JUnitEE http://www.junitee.org/
 
* JMeter http://jakarta.apache.org/jmeter/
 
* JMeter http://jakarta.apache.org/jmeter/
 +
* Clif http://clif.objectweb.org/
 +
* MaxQ http://maxq.tigris.org/
 +
* Jameleon http://jameleon.sourceforge.net/
 +
* Testng http://testng.org/doc/
 +
* EasyMock http://easymock.org/
 +
* JMock http://jmock.org/
 +
* JWebUnit http://jwebunit.sourceforge.net/
 +
* Canoo WebTest http://webtest.canoo.com/webtest/manual/WebTestHome.html
 +
* JUnit vs. TestNG https://glassfish.dev.java.net/quality/testing-junit-testng.pdf
 +
* http://java-source.net/open-source/testing-tools
 +
* http://opensourcetesting.org/unit_java.php
  
 
==== Nástroje pro sledování kvality kódu ====
 
==== Nástroje pro sledování kvality kódu ====
Řádka 176: Řádka 349:
 
* XIQE http://www.xiqe.org/
 
* XIQE http://www.xiqe.org/
  
== Cvičení (12) ==
+
== Cvičení 12 ==
 
=== IDE ===
 
=== IDE ===
 
* NetBeans J2EE 5
 
* NetBeans J2EE 5
Řádka 196: Řádka 369:
 
* Eclipse 3.1
 
* Eclipse 3.1
 
  module add eclipse
 
  module add eclipse
 +
 +
-->
 +
 +
== 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:
 +
<java>
 +
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>");
 +
    }
 +
}
 +
</java>
 +
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:
 +
<java>
 +
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;
 +
    }
 +
}
 +
</java>
 +
 +
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:
 +
<java>
 +
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() {
 +
    }
 +
}
 +
</java>
 +
 +
Editujte soubor  '''WEB-INF/web.xml''' v XML tvaru a upravte ho na tvar:
 +
 +
<xml>
 +
<?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>
 +
</xml>
 +
 +
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:
 +
 +
<nowiki><%@ 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>
 +
</nowiki>
 +
 +
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í:
 +
 +
<nowiki>
 +
<%@ 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>
 +
</nowiki>
 +
 +
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:
 +
 +
<java>
 +
    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);
 +
        }
 +
    }
 +
</java>
 +
 +
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:
 +
<nowiki>
 +
<%@ 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>
 +
</nowiki>
 +
 +
== Cvičení 5 ==
 +
 +
Postupujte podle pokynů v [[Cvičení Stripes]]
 +
 +
== Cvičení 9 ==
 +
 +
Postupujte podle pokynů v [[Cvičení AJAX]]
  
 
== Projekty ==
 
== Projekty ==
 
=== Založení projektu ===
 
=== Založení projektu ===
# poslat loginy členů teamu a acronym projektu na [mailto:xpavlov@fi.muni.cz xpavlov@fi.muni.cz]
+
# poslat loginy členů teamu a acronym projektu na [mailto:pavlovic@fi.muni.cz pavlovic@fi.muni.cz]
# na adrese https://kore.fi.muni.cz:5443/repos/fi/pa165/2005/acronym je dostupna pro zápis SVN repozitory všem členům teamu
+
# 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
# na adrese http://kore.fi.muni.cz:5080/projects/pa165/2005/acronym je dostupný web vašeho projektu
+
# na adrese http://kore.fi.muni.cz:5080/projects/pa165/2006/acronym je dostupný web vašeho projektu
 
# fyzicky se web projektu s právy pro zápis členům teamu nachází na stoji <code>kore.fi.muni.cz</code>, ssh běží na portu <code>5022</code>, pokud jste mimo sít FI (platí i pro wifi přístup) ve složce <code>/www/projects/pa165/2005/acronym</code>
 
# fyzicky se web projektu s právy pro zápis členům teamu nachází na stoji <code>kore.fi.muni.cz</code>, ssh běží na portu <code>5022</code>, pokud jste mimo sít FI (platí i pro wifi přístup) ve složce <code>/www/projects/pa165/2005/acronym</code>
  
 
=== Databáze ===
 
=== 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 <code>kore.fi.muni.cz</code> viz [mailto:xpavlov@fi.muni.cz xpavlov@fi.muni.cz] .
+
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 <code>kore.fi.muni.cz</code> viz [mailto:pavlovic@fi.muni.cz pavlovic@fi.muni.cz] .
  
 
K dispozici je i webové rozhraní pro manipulaci s DB.
 
K dispozici je i webové rozhraní pro manipulaci s DB.
Řádka 216: Řádka 962:
 
Pro řešení projektů jsou následující servery:
 
Pro řešení projektů jsou následující servery:
  
* Apache Tomcat 5.5.15 http://kore.fi.muni.cz:8080/
+
* Apache Tomcat 6.0.10 http://kore.fi.muni.cz:8080/
 
* Sun Java System Application Server PE 8.2 http://kore.fi.muni.cz:4848/
 
* Sun Java System Application Server PE 8.2 http://kore.fi.muni.cz:4848/
* GlassFish 9.0 b32 (Sun Java System Application Server PE 9.0) http://kore.fi.muni.cz:5858/
+
* GlassFish 9.0 UR1 P01 B02 (Sun Java System Application Server PE 9.0) http://kore.fi.muni.cz:5858/
 +
* GlassFish 9.1 b36 (Sun Java System Application Server PE 9.1) http://kore.fi.muni.cz:6868/
 
* JBoss Application Server 4.0.3 SP1 http://kore.fi.muni.cz:48080/
 
* JBoss Application Server 4.0.3 SP1 http://kore.fi.muni.cz:48080/
 
* JOnAS 4.6.6 http://kore.fi.muni.cz:9000/
 
* JOnAS 4.6.6 http://kore.fi.muni.cz:9000/
Řádka 224: Řádka 971:
 
* Apache Geronimo 1.0 http://kore.fi.muni.cz:38080/console/
 
* Apache Geronimo 1.0 http://kore.fi.muni.cz:38080/console/
 
* OpenEJB 1.0 http://kore.fi.muni.cz:4203/
 
* OpenEJB 1.0 http://kore.fi.muni.cz:4203/
 +
* IBM WebSphere 6.1  https://kore.fi.muni.cz:9044/ibm/console/
 
* BEA WebLogic Server 9.1
 
* BEA WebLogic Server 9.1
* IBM WebSpheare 6.1
 
  
Přístupové heslo na [mailto:xpavlov@fi.muni.cz xpavlov@fi.muni.cz].
+
Přístupové heslo na [mailto:pavlovic@fi.muni.cz pavlovic@fi.muni.cz].
 +
 
 +
== Cvičení 6 ==
 +
<sql>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)
 +
)</sql>
 +
[[Kategorie:PA165]]
 +
 
 +
== Cvičení 11 ==
 +
podle tutoriálu [http://www.netbeans.org/kb/docs/websvc/jax-ws.html Getting Started with JAX-WS Web Services]
 +
 
 +
== Cvičení 12 ==
 +
Dle [[JSF]] a [http://is.muni.cz/de/72753/cviceni12.zip]

Aktuální verze z 10. 4. 2013, 16:16

Tato stránka obsahuje neaktuální informace a měla by být aktualizována. Berte ji proto prosím s rezervou!


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]