Java EE (Enterprise Edition) rozszerza Javę SE (Standard Edition) o dodatkowe klasy, dzięki czemu pozwala na tworzenie biznesowych aplikacji webowych, które potrafią być naprawdę rozbudowane.
Stworzenie nawet najprostszego projektu typu Hello World wydawać się może dość skomplikowane, zwłaszcza jeśli zaczniemy zagłębiać się nieco bardziej w to, jak dokładnie zbudowana jest i jak działa aplikacja napisana przy wykorzystaniu Javy EE.
Aplikacje w Javie EE działają przede wszystkim w oparciu o serwlety, które są klasami dziedziczącymi po klasie HttpServlet. Jednym z najważniejszych elementów każdej aplikacji jest tak zwany Deployment Descriptor pozwalający na wygenerowanie pliku web.xml, w którym to poszczególne serwlety „wiązane są” z adresami URL.
Tworzenie najprostszej aplikacji rozpoczniemy od utworzenia projektu Dynamic Web Project. Jeśli chodzi o jego strukturę, to w tym konkretnym przypadku interesować nas będą wyłącznie foldery Java Resources/src i WebContent oraz znajdujący się w tym ostatnim plik web.xml.
Klasa dziedzicząca po HttpServlet powinna nadpisywać przynajmniej jedną ze wspomnianych w dokumentacji metod wśród których znajdują się takie, które są swego rodzaju odpowiednikami metod HTTP takich jak GET, POST, PUT, DELETE. W tym przykładzie wykorzystamy metodę doGet.
Stwórzmy najpierw klasę HelloServlet (zawierającą wspomnianą wcześniej metodę) w folderze Java Resources/src, gdzie powinny znajdować się wszelkie klasy Javy. Ja umieszczę klasę w pakiecie pl.adriankurek.servlets.
package pl.adriankurek.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.append("<h1 style=\"color: #FF0000\">Hello World!</h1>");
}
}
- package pl.adriankurek.servlets;
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class HelloServlet extends HttpServlet {
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- PrintWriter out = response.getWriter();
- out.append("<h1 style=\"color: #FF0000\">Hello World!</h1>");
- }
- }
package pl.adriankurek.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.append("<h1 style=\"color: #FF0000\">Hello World!</h1>");
}
}
Musimy pamiętać też o „zmapowaniu” serwletu w pliku web.xml, by kojarzony był z odpowiednim adresem URL.
<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>HelloWorldApplication</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>pl.adriankurek.servlets.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
- <?xml version="1.0" encoding="UTF-8" ?>
- <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
- <display-name>HelloWorldApplication</display-name>
- <welcome-file-list>
- <welcome-file>index.html</welcome-file>
- <welcome-file>index.htm</welcome-file>
- <welcome-file>index.jsp</welcome-file>
- <welcome-file>default.html</welcome-file>
- <welcome-file>default.htm</welcome-file>
- <welcome-file>default.jsp</welcome-file>
- </welcome-file-list>
- <servlet>
- <servlet-name>Hello</servlet-name>
- <servlet-class>pl.adriankurek.servlets.HelloServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>Hello</servlet-name>
- <url-pattern>/hello</url-pattern>
- </servlet-mapping>
- </web-app>
<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>HelloWorldApplication</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>pl.adriankurek.servlets.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
Po uruchomieniu aplikacji na serwerze powinniśmy zobaczyć po wpisaniu adresu localhost:8080/HelloWorldApplication/hello (/hello, bo tak zmapowaliśmy adres) czerwony napis Hello World! w stylu nagłówka h1, który stworzony został w naszym serwlecie HelloServlet. Choć nie jest to jakoś bardzo wskazane, to w taki sposób wygenerować można przy użyciu znaczników HTML cały szablon strony.
Drugim sposobem na wskazanie, z jakim adresem URL powinien być kojarzony dany serwlet jest wykorzystanie adnotacji @WebServlet(„/jakis-adres”), która poprzedzać powinna klasę. Klasa naszego serwletu powinna w przypadku zastosowania adnotacji wyglądać następująco:
package pl.adriankurek.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.append("<h1 style=\"color: #FF0000\">Main Page!</h1>");
}
}
- package pl.adriankurek.servlets;
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.ServletException;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- @WebServlet("/hello")
- public class HelloServlet extends HttpServlet {
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- PrintWriter out = response.getWriter();
- out.append("<h1 style=\"color: #FF0000\">Main Page!</h1>");
- }
- }
package pl.adriankurek.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.append("<h1 style=\"color: #FF0000\">Main Page!</h1>");
}
}
Jeśli skorzystamy z adnotacji, dopisywanie jakichkolwiek dodatkowych informacji w pliku web.xml nie jest już konieczne.
Wspomniałem, że tworzenie zawartości plików strony za pośrednictwem serwletów nie jest wskazane, ponieważ lepiej jest wykorzystać do tego technologię JSP (JavaServer Pages), która pozwala na całkiem wygodne tworzenie dynamicznych stron przy użyciu języka Java.
Stwórzmy dla przykładu plik index.jsp w folderze WebContent.
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Index page</title>
</head>
<body>
<h1>Index page - simple form</h1>
<form action="./hello">
<label>Your name:</label><br>
<input type="text" name="name" placeholder="Name..."><br>
<label>Your age:</label><br>
<input type="number" name="age" placeholder="Age...">
<input type="submit" value="Process" />
</form>
</body>
</html>
- <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
- pageEncoding="ISO-8859-1"%>
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="ISO-8859-1">
- <title>Index page</title>
- </head>
-
- <body>
- <h1>Index page - simple form</h1>
- <form action="./hello">
- <label>Your name:</label><br>
- <input type="text" name="name" placeholder="Name..."><br>
- <label>Your age:</label><br>
- <input type="number" name="age" placeholder="Age...">
- <input type="submit" value="Process" />
- </form>
- </body>
- </html>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Index page</title>
</head>
<body>
<h1>Index page - simple form</h1>
<form action="./hello">
<label>Your name:</label><br>
<input type="text" name="name" placeholder="Name..."><br>
<label>Your age:</label><br>
<input type="number" name="age" placeholder="Age...">
<input type="submit" value="Process" />
</form>
</body>
</html>
Zmieńmy też nieco zawartość naszego serwletu HelloServlet.
package pl.adriankurek.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
String age = request.getParameter("age");
out.append(String.format("<h1 style=\"color: #FF0000\">Hello %s, you are %s! :)", name, age));
}
}
- package pl.adriankurek.servlets;
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.ServletException;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- @WebServlet("/hello")
- public class HelloServlet extends HttpServlet {
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- PrintWriter out = response.getWriter();
-
- String name = request.getParameter("name");
- String age = request.getParameter("age");
-
- out.append(String.format("<h1 style=\"color: #FF0000\">Hello %s, you are %s! :)", name, age));
- }
- }
package pl.adriankurek.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
String age = request.getParameter("age");
out.append(String.format("<h1 style=\"color: #FF0000\">Hello %s, you are %s! :)", name, age));
}
}
Teraz, po odwiedzeniu adresu localhost:8080/HelloWorldApplication, zobaczymy na ekranie napis Index page – simple, formularz i przycisk (od razu widzimy zawartość pliku index.jsp, ponieważ odpowiednia informacja na jego temat znajduje się w znaczniku <welcome-file-list> w pliku web.xml), który pozwoli przesłać dane. Dzięki formularzowi przekazujemy do serwletu informacje (w tym przypadku imię i wiek), które może on w zasadzie dowolnie przetworzyć i np. zapisać do bazy danych. W naszym przykładzie, po wypełnieniu formularza i naciśnięciu przycisku odwiedzimy stronę, za której wygenerowanie odpowiedzialny jest nasz serwlet skojarzony z adresem /hello. W serwlecie pobieramy parametry, które przekazane zostały za pośrednictwem adresu URL dzięki formularzom i metodzie GET i dzięki nim generujemy prosty komunikat powitalny.
Pominąłem sprawdzanie w serwlecie poprawności przekazanych parametrów.
W naszym przykładzie jednak nadal generujemy stronę witającą użytkownika w serwlecie HelloServlet. W kolejnym kroku stworzymy bardzo prostą klasę User.java spełniającą zasady JavaBean, a w serwlecie HelloServlet utworzymy obiekt tej klasy i przekażemy go dalej.
Moja klasa User umieszczona jest w pakiecie pl.adriankurek.app i wygląda następująco.
package pl.adriankurek.app;
public class User {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
- package pl.adriankurek.app;
- public class User {
- private String name;
- private int age;
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- public void setAge(int age) {
- this.age = age;
- }
-
- public int getAge() {
- return age;
- }
- }
package pl.adriankurek.app;
public class User {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
Zmodyfikujmy nieco serwlet HelloSerwlet.
package pl.adriankurek.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import pl.adriankurek.app.User;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
String age = request.getParameter("age");
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date();
String creationDate = dateFormat.format(date);
// Przekazujemy datę utworzenia użytkownika.
request.setAttribute("date", creationDate);
User user = new User();
user.setName(name);
user.setAge(Integer.parseInt(age));
// Przkazujemy obiekt klasy User.
request.setAttribute("user", user);
RequestDispatcher rd = request.getRequestDispatcher("/hello.jsp");
rd.forward(request, response);
}
}
- package pl.adriankurek.servlets;
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.util.Date;
- import java.text.DateFormat;
- import java.text.SimpleDateFormat;
- import javax.servlet.RequestDispatcher;
- import javax.servlet.ServletException;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import pl.adriankurek.app.User;
- @WebServlet("/hello")
- public class HelloServlet extends HttpServlet {
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- PrintWriter out = response.getWriter();
-
- String name = request.getParameter("name");
- String age = request.getParameter("age");
-
- DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
- Date date = new Date();
- String creationDate = dateFormat.format(date);
-
- // Przekazujemy datę utworzenia użytkownika.
- request.setAttribute("date", creationDate);
-
- User user = new User();
- user.setName(name);
- user.setAge(Integer.parseInt(age));
-
- // Przkazujemy obiekt klasy User.
- request.setAttribute("user", user);
-
- RequestDispatcher rd = request.getRequestDispatcher("/hello.jsp");
- rd.forward(request, response);
- }
- }
package pl.adriankurek.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import pl.adriankurek.app.User;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
String age = request.getParameter("age");
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date();
String creationDate = dateFormat.format(date);
// Przekazujemy datę utworzenia użytkownika.
request.setAttribute("date", creationDate);
User user = new User();
user.setName(name);
user.setAge(Integer.parseInt(age));
// Przkazujemy obiekt klasy User.
request.setAttribute("user", user);
RequestDispatcher rd = request.getRequestDispatcher("/hello.jsp");
rd.forward(request, response);
}
}
I utwórzmy w folderze WebContent plik hello.jsp, dzięki któremu przedstawimy w odpowiedni sposób przekazane przy pomocy serwletu informacje informacje.
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Hello page</title>
</head>
<body>
<h1>Hello page</h1>
<p>Welcome ${ user.name }! You are ${ user.age } years old! :)</p>
<p>User creation date: ${ requestScope.date }</p>
</body>
</html>
- <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
- pageEncoding="ISO-8859-1"%>
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="ISO-8859-1">
- <title>Hello page</title>
- </head>
-
- <body>
- <h1>Hello page</h1>
- <p>Welcome ${ user.name }! You are ${ user.age } years old! :)</p>
- <p>User creation date: ${ requestScope.date }</p>
- </body>
- </html>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Hello page</title>
</head>
<body>
<h1>Hello page</h1>
<p>Welcome ${ user.name }! You are ${ user.age } years old! :)</p>
<p>User creation date: ${ requestScope.date }</p>
</body>
</html>
Po przejściu z naszego początkowego formularza do serwletu następuje odczytanie parametrów z adresu URL i przekazanie ich za pośrednictwem klasy RequestDispatcher do pliku hello.jsp, gdzie dane za pośrednictwem JSP Expression Language są odczytywane.
Post Views:
982