JSTL

Föreläsning 7
JSTL EJB 3.0

• •

Erbjuder ett sätt att ytterligare separera presentation från logik genom att minimera användningen av scriptlets. Består av fyra delbibliotek – Core Tag Library (core) • Stöd för villkor, slingor, uttrycksevaluering, inmatning och utmatning. – Formatting/Internationalization Tag Library (fmt) • För att hantera datumformat, konverteringar etc. – Database Tag Library (sql) • Taggar för att accessa databaser, bör dock ej användas i en driftsatt lösning, dataaccessen bör istället ske i JavaBeans eller i EJB:er – XML Tag Library (xml) • XML stöd I JSP 2.0 finns även stöd för EL (Expression Language) så att man kan skriva <p> Your total, including shipping is ${total+shipping} </p> I JSTL (kan adderas till JSP 1.2) måste man istället skriva: <p> Your total, including shipping is <c:out var="${total+shipping"/></p>

Scriptlet
<html> <head> <title>Count to 10 in JSP scriptlet</title> </head> <body> <% for(int i=1;i<=10;i++) {%> <%=i%><br/> <% } %> </body> </html>

JSTL
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %> <html> <head> <title>Count to 10 Example (using JSTL)</title> </head> <body> <c:forEach var="i" begin="1" end="10" step="1"> <c:out value="${i}" /> <br /> </c:forEach> </body> </html>

Exempel
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %> <html><head><title>If with Body</title></head><body> <c:if test="${pageContext.request.method=='POST'}"> <c:if test="${param.guess=='Java'}">You guessed it! <br /> <br /> <br /> </c:if> <c:if test="${param.guess!='Java'}">You are wrong <br /> <br /> <br /> </c:if> </c:if> <form method="post">Guess what computer language I am thinking of? <input type="text" name="guess" /> <input type="submit" value="Try!" /> <br/> </form> </body> </html> • • • •

Problem med EJB 2.1
The current EJB model requires you to create several component interfaces and implement several unnecessary callback methods. The component interfaces require implementation of EJBObject or EJBLocalObject and handling of many unnecessary exceptions. The EJB deployment descriptor is complex and error prone. The container-managed persistence, being based on the EJB model, is overly complex to develop and manage. Several basic features are missing--such as a standard way to define a primary key using a database sequence. The EJBQL syntax is very limited. EJB components are not truly object-oriented, as they have restrictions for using inheritance and polymorphism. Developers cannot test EJB modules outside an EJB container and debugging an EJB inside the container is a nightmare. Looking up and invoking an EJB is a complex task. Detailed knowledge of JNDI is required for even the most basic use of an EJB in your application.

• • •

1

Lösningar i EJB 3.0
• Removing need for unnecessary interfaces and implementation of callback methods • Using metadata annotations instead of deployment descriptors • Using regular Java classes as EJBs and regular business interfaces for EJBs

EJB 3.0
• Har inget HomeInterface och kräver inte RemoteInterface • Ingen deployment descriptor • ”Annotations”
– Erbjuder en möjlighet att definiera egenskaper för klasser och metoder, börjar med ”@”. Är en del av J2SE5.0. Redan över 50 st definierade...

EJB 3.0
• EJB import javax.ejb.Stateless;
@Stateless

Exempel
public class HelloWorldBean implements HelloWorld { public void sayHello(String name){ System.out.println("Hello "+name +" from your first EJB 3.0 component ..."); } } Interface import javax.ejb.Remote; @Remote public interface HelloWorld { public void sayHello(String name); } Klient @EJB HelloWorld bean;

Klassnivå
– @Stateless, Stateful, MessageDriven, Entity – @Remote
• Alla EJB:er är lokala per default.

– @Resource(name="jdbc/db", resourceType="javax.sql.DataSource")

Fältnivå
– @Id
• För att markera primärnyckel

– @Transient
• Endast för entitetsbönor, fält markerade ska inte vara persistenta.

Metodnivå
– @BusinessMethod
• Om RemoteInteface saknas skapas ett sådant med samtliga publika metoder från EJBklassen. Om man använder denna ”annotation” skapas ett remoteinterface med endast markerade metoder i RemoteInterfacet

– @Remove
• EJB:n ska raderas efter metoden har anropats (Cart checkout).

Exempel
@Entity @Table(name=”spelare") @NamedQuery(name="findAll",queryString="SELECT OBJECT(p) FROM spelare p"); public class Player implements java.io.Serializable { int id; @Id @Column(name = "ID", primaryKey = true, nullable = false) public String getId() { return id; } }

2

Sign up to vote on this title
UsefulNot useful