PA165/Cvičení-podzim2008: Porovnání verzí
(→Web Services) |
m |
||
(Není zobrazeno 196 mezilehlých verzí od 25 dalších uživatelů.) | |||
Řádka 1: | Řádka 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> | |
+ | <?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"/> | ||
− | |||
<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}"/> | ||
− | |||
<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> | ||
− | |||
<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í | + | |
=== Maven === | === Maven === | ||
=== Servlets === | === Servlets === | ||
+ | * http://www.onjava.com/topics/java/JSP_Servlets | ||
+ | * http://www.javaworld.com/channel_content/jw-servlets-index.shtml | ||
− | == Cvičení | + | == Cvičení 3 == |
=== JSP === | === JSP === | ||
+ | * http://www.onjava.com/topics/java/JSP_Servlets | ||
+ | * 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í | + | == 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í | + | == 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í | + | == 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 81: | Řádka 244: | ||
* http://dbunit.sourceforge.net/ DBUnit | * http://dbunit.sourceforge.net/ DBUnit | ||
− | == Cvičení | + | == Cvičení 7 == |
=== AJAX === | === AJAX === | ||
* http://interval.cz/clanek.asp?article=3921 | * http://interval.cz/clanek.asp?article=3921 | ||
Řádka 101: | Řádka 264: | ||
* http://java.sun.com/webservices/docs/1.6/tutorial/doc/index.html | * http://java.sun.com/webservices/docs/1.6/tutorial/doc/index.html | ||
* http://ws.apache.org/axis/ | * http://ws.apache.org/axis/ | ||
+ | * http://www.javaworld.com/channel_content/jw-webserv-index.shtml? | ||
+ | * http://www.onjava.com/topics/java/wsdl_uddi | ||
− | == Cvičení | + | == 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 109: | Řá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í | + | == 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 125: | Řádka 292: | ||
* http://www.onjava.com/pub/a/onjava/2005/11/09/jboss-pojo-cache.html clanek JBoss Cache as a POJO Cache | * http://www.onjava.com/pub/a/onjava/2005/11/09/jboss-pojo-cache.html clanek JBoss Cache as a POJO Cache | ||
* http://interval.cz/clanek.asp?article=3760 EJB 2.x - úvod do J2EE technológie | * http://interval.cz/clanek.asp?article=3760 EJB 2.x - úvod do J2EE technológie | ||
+ | * http://www.javaworld.com/channel_content/jw-ejbs-index.shtml? | ||
− | == Cvičení | + | == 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 133: | Řá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í | + | == Cvičení 11 == |
=== Testování === | === Testování === | ||
==== Nástroje pro testování ==== | ==== Nástroje pro testování ==== | ||
− | * JUnit http://www.junit.org/ | + | * 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 147: | Řá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 168: | Řádka 349: | ||
* XIQE http://www.xiqe.org/ | * XIQE http://www.xiqe.org/ | ||
− | == Cvičení | + | == Cvičení 12 == |
=== IDE === | === IDE === | ||
* NetBeans J2EE 5 | * NetBeans J2EE 5 | ||
Řádka 188: | Řá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: | + | # 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/ | + | # 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/ | + | # 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: | + | 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 208: | Řádka 962: | ||
Pro řešení projektů jsou následující servery: | Pro řešení projektů jsou následující servery: | ||
− | * Apache Tomcat | + | * 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 | + | * 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 216: | Řá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 | ||
− | |||
− | Přístupové heslo na [mailto: | + | 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, 17:16
Obsah
Cvičení 1
SVN
- https://kore.fi.muni.cz:5443/repos/test/
- netbeans + subversion (flash demo) [1]
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
- poslat loginy členů teamu a acronym projektu na pavlovic@fi.muni.cz
- 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/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
kore.fi.muni.cz
, ssh běží na portu5022
, 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.
- MySQL https://kore.fi.muni.cz:5443/phpMyAdmin/
- PostreSQL https://kore.fi.muni.cz:5443/phpPgAdmin/
- DBDesigner module add dbdesigner-4.0.5
- DBVisualizer module add dbvisualizer-4.2.2
Aplikační servery a Servlet kontejnery
Pro řešení projektů jsou následující servery:
- 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/
- 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/
- JOnAS 4.6.6 http://kore.fi.muni.cz:9000/
- Oracle Application Server 10g (10.1.3) Developer Preview 4 http://kore.fi.muni.cz:8888/
- Apache Geronimo 1.0 http://kore.fi.muni.cz:38080/console/
- 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
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