Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
J
javab_20230928
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Patryk Czarnik
javab_20230928
Commits
f2e7f26e
Commit
f2e7f26e
authored
Nov 10, 2023
by
Patryk Czarnik
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
moduł web
parent
b844947f
Hide whitespace changes
Inline
Side-by-side
Showing
26 changed files
with
1219 additions
and
0 deletions
+1219
-0
pom.xml
Wielomodulowy/pom.xml
+1
-0
pom.xml
Wielomodulowy/wielomodulowy-web/pom.xml
+58
-0
AddToBasket.java
...omodulowy-web/src/main/java/sklep/basket/AddToBasket.java
+39
-0
Basket.java
.../wielomodulowy-web/src/main/java/sklep/basket/Basket.java
+50
-0
BasketListener.java
...dulowy-web/src/main/java/sklep/basket/BasketListener.java
+34
-0
ProductInBasket.java
...ulowy-web/src/main/java/sklep/basket/ProductInBasket.java
+75
-0
RemoveFromBasket.java
...lowy-web/src/main/java/sklep/basket/RemoveFromBasket.java
+31
-0
EditProduct.java
...ielomodulowy-web/src/main/java/sklep/web/EditProduct.java
+80
-0
Photo.java
...lowy/wielomodulowy-web/src/main/java/sklep/web/Photo.java
+46
-0
PhotoUpload.java
...ielomodulowy-web/src/main/java/sklep/web/PhotoUpload.java
+40
-0
PhotoUtil.java
.../wielomodulowy-web/src/main/java/sklep/web/PhotoUtil.java
+55
-0
ProductBean.java
...ielomodulowy-web/src/main/java/sklep/web/ProductBean.java
+56
-0
Products0.java
.../wielomodulowy-web/src/main/java/sklep/web/Products0.java
+43
-0
Products1.java
.../wielomodulowy-web/src/main/java/sklep/web/Products1.java
+38
-0
Products2.java
.../wielomodulowy-web/src/main/java/sklep/web/Products2.java
+52
-0
index.html
Wielomodulowy/wielomodulowy-web/src/main/webapp/index.html
+39
-0
photo_upload.jsp
...dulowy/wielomodulowy-web/src/main/webapp/photo_upload.jsp
+34
-0
product_form.jsp
...dulowy/wielomodulowy-web/src/main/webapp/product_form.jsp
+48
-0
products3.jsp
...omodulowy/wielomodulowy-web/src/main/webapp/products3.jsp
+42
-0
products4.jsp
...omodulowy/wielomodulowy-web/src/main/webapp/products4.jsp
+39
-0
products5.jsp
...omodulowy/wielomodulowy-web/src/main/webapp/products5.jsp
+27
-0
products6.jsp
...omodulowy/wielomodulowy-web/src/main/webapp/products6.jsp
+41
-0
products7.jsp
...omodulowy/wielomodulowy-web/src/main/webapp/products7.jsp
+42
-0
products8.jsp
...omodulowy/wielomodulowy-web/src/main/webapp/products8.jsp
+55
-0
products9.jsp
...omodulowy/wielomodulowy-web/src/main/webapp/products9.jsp
+57
-0
styl.css
Wielomodulowy/wielomodulowy-web/src/main/webapp/styl.css
+97
-0
No files found.
Wielomodulowy/pom.xml
View file @
f2e7f26e
...
...
@@ -18,5 +18,6 @@
<module>
wielomodulowy-baza
</module>
<module>
wielomodulowy-rest
</module>
<module>
wielomodulowy-klient_rest
</module>
<module>
wielomodulowy-web
</module>
</modules>
</project>
Wielomodulowy/wielomodulowy-web/pom.xml
0 → 100644
View file @
f2e7f26e
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>
4.0.0
</modelVersion>
<parent>
<groupId>
pl.alx.kjava
</groupId>
<artifactId>
Wielomodulowy
</artifactId>
<version>
1.0
</version>
</parent>
<artifactId>
wielomodulowy-web
</artifactId>
<packaging>
war
</packaging>
<dependencies>
<dependency>
<groupId>
jakarta.platform
</groupId>
<artifactId>
jakarta.jakartaee-web-api
</artifactId>
<version>
10.0.0
</version>
<scope>
provided
</scope>
</dependency>
<dependency>
<groupId>
jakarta.servlet.jsp.jstl
</groupId>
<artifactId>
jakarta.servlet.jsp.jstl-api
</artifactId>
<version>
3.0.0
</version>
<scope>
provided
</scope>
</dependency>
<dependency>
<groupId>
org.glassfish.web
</groupId>
<artifactId>
jakarta.servlet.jsp.jstl
</artifactId>
<version>
3.0.1
</version>
<scope>
provided
</scope>
</dependency>
<dependency>
<groupId>
${project.groupId}
</groupId>
<artifactId>
wielomodulowy-model
</artifactId>
<version>
${project.version}
</version>
</dependency>
<dependency>
<groupId>
${project.groupId}
</groupId>
<artifactId>
wielomodulowy-baza
</artifactId>
<version>
${project.version}
</version>
</dependency>
</dependencies>
<build>
<finalName>
${project.artifactId}
</finalName>
<plugins>
<plugin>
<groupId>
org.apache.maven.plugins
</groupId>
<artifactId>
maven-war-plugin
</artifactId>
<version>
3.4.0
</version>
<configuration>
<failOnMissingWebXml>
false
</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
Wielomodulowy/wielomodulowy-web/src/main/java/sklep/basket/AddToBasket.java
0 → 100644
View file @
f2e7f26e
package
sklep
.
basket
;
import
java.io.IOException
;
import
jakarta.servlet.ServletException
;
import
jakarta.servlet.annotation.WebServlet
;
import
jakarta.servlet.http.HttpServlet
;
import
jakarta.servlet.http.HttpServletRequest
;
import
jakarta.servlet.http.HttpServletResponse
;
import
jakarta.servlet.http.HttpSession
;
import
sklep.db.DBConnection
;
import
sklep.db.ProductDAO
;
import
sklep.model.Product
;
@WebServlet
(
"/add_to_basket"
)
public
class
AddToBasket
extends
HttpServlet
{
private
static
final
long
serialVersionUID
=
1L
;
@Override
protected
void
doGet
(
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
ServletException
,
IOException
{
try
{
int
productId
=
Integer
.
parseInt
(
request
.
getParameter
(
"productId"
));
try
(
DBConnection
db
=
DBConnection
.
open
())
{
ProductDAO
productDAO
=
db
.
productDAO
();
Product
product
=
productDAO
.
findById
(
productId
);
HttpSession
sesja
=
request
.
getSession
();
Basket
basket
=
(
Basket
)
sesja
.
getAttribute
(
"basket"
);
// Zakładamy, że obiekt basket został dodany do sesji przez BasketListener
basket
.
addProduct
(
product
);
}
}
catch
(
Exception
e
)
{
// ignorujemy błędy
}
// Przekierowanie - każemy przeglądarce wejść pod ten adres.
response
.
sendRedirect
(
"products9.jsp"
);
}
}
Wielomodulowy/wielomodulowy-web/src/main/java/sklep/basket/Basket.java
0 → 100644
View file @
f2e7f26e
package
sklep
.
basket
;
import
java.math.BigDecimal
;
import
java.util.Collection
;
import
java.util.Collections
;
import
java.util.HashMap
;
import
java.util.Map
;
import
sklep.model.Product
;
public
class
Basket
{
private
final
Map
<
Integer
,
ProductInBasket
>
elementy
=
new
HashMap
<>();
public
synchronized
void
addProduct
(
Product
product
,
int
quantity
)
{
if
(
elementy
.
containsKey
(
product
.
getProductId
()))
{
// jeśli w słowniku jest już taki element, to tylko zwiększamy ilość
elementy
.
get
(
product
.
getProductId
()).
increaseQuantity
(
quantity
);
}
else
{
// jeśli jeszcze nie ma, to tworzymy
elementy
.
put
(
product
.
getProductId
(),
new
ProductInBasket
(
product
.
getProductId
(),
product
.
getProductName
(),
product
.
getPrice
(),
quantity
));
}
}
public
synchronized
void
addProduct
(
Product
product
)
{
// "domyślną ilością, o którą zwiększamy, jest 1"
addProduct
(
product
,
1
);
}
public
synchronized
void
removeProduct
(
int
productId
)
{
elementy
.
remove
(
productId
);
}
public
synchronized
Collection
<
ProductInBasket
>
getElements
()
{
return
Collections
.
unmodifiableCollection
(
elementy
.
values
());
}
public
synchronized
BigDecimal
getTotalValue
()
{
return
getElements
().
stream
()
.
map
(
ProductInBasket:
:
getValue
)
.
reduce
(
BigDecimal
.
ZERO
,
BigDecimal:
:
add
);
}
@Override
public
synchronized
String
toString
()
{
return
"Koszyk o rozmiarze "
+
getElements
().
size
()
+
" i wartości "
+
getTotalValue
();
}
}
Wielomodulowy/wielomodulowy-web/src/main/java/sklep/basket/BasketListener.java
0 → 100644
View file @
f2e7f26e
package
sklep
.
basket
;
import
jakarta.servlet.ServletContextEvent
;
import
jakarta.servlet.ServletContextListener
;
import
jakarta.servlet.annotation.WebListener
;
import
jakarta.servlet.http.HttpSession
;
import
jakarta.servlet.http.HttpSessionEvent
;
import
jakarta.servlet.http.HttpSessionListener
;
@WebListener
public
class
BasketListener
implements
HttpSessionListener
,
ServletContextListener
{
public
void
sessionCreated
(
HttpSessionEvent
se
)
{
HttpSession
sesja
=
se
.
getSession
();
sesja
.
setMaxInactiveInterval
(
30
);
// pół minuty i sesja wygasa
System
.
out
.
println
(
"sessionCreated "
+
sesja
.
getId
());
Basket
basket
=
new
Basket
();
sesja
.
setAttribute
(
"basket"
,
basket
);
}
public
void
sessionDestroyed
(
HttpSessionEvent
se
)
{
HttpSession
sesja
=
se
.
getSession
();
System
.
out
.
println
(
"sessionDestroyed "
+
sesja
.
getId
());
}
public
void
contextInitialized
(
ServletContextEvent
sce
)
{
System
.
out
.
println
(
"contextInitialized"
);
}
public
void
contextDestroyed
(
ServletContextEvent
sce
)
{
System
.
out
.
println
(
"contextDestroyed"
);
}
}
Wielomodulowy/wielomodulowy-web/src/main/java/sklep/basket/ProductInBasket.java
0 → 100644
View file @
f2e7f26e
package
sklep
.
basket
;
import
java.math.BigDecimal
;
import
java.util.Objects
;
public
class
ProductInBasket
{
private
int
productId
;
private
String
productName
;
private
BigDecimal
price
;
private
int
quantity
;
public
ProductInBasket
(
int
productId
,
String
productName
,
BigDecimal
price
,
int
quantity
)
{
this
.
productId
=
productId
;
this
.
productName
=
productName
;
this
.
price
=
price
;
this
.
quantity
=
quantity
;
}
public
BigDecimal
getPrice
()
{
return
price
;
}
public
void
setPrice
(
BigDecimal
price
)
{
this
.
price
=
price
;
}
public
int
getQuantity
()
{
return
quantity
;
}
public
void
setQuantity
(
int
quantity
)
{
this
.
quantity
=
quantity
;
}
public
int
getProductId
()
{
return
productId
;
}
public
String
getProductName
()
{
return
productName
;
}
@Override
public
String
toString
()
{
return
"ElementKoszyka [productId="
+
productId
+
", productName="
+
productName
+
", price="
+
price
+
", quantity="
+
quantity
+
"]"
;
}
@Override
public
int
hashCode
()
{
return
Objects
.
hash
(
price
,
productId
,
productName
,
quantity
);
}
@Override
public
boolean
equals
(
Object
obj
)
{
if
(
this
==
obj
)
return
true
;
if
(
obj
==
null
)
return
false
;
if
(
getClass
()
!=
obj
.
getClass
())
return
false
;
ProductInBasket
other
=
(
ProductInBasket
)
obj
;
return
Objects
.
equals
(
price
,
other
.
price
)
&&
productId
==
other
.
productId
&&
Objects
.
equals
(
productName
,
other
.
productName
)
&&
quantity
==
other
.
quantity
;
}
public
BigDecimal
getValue
()
{
return
price
.
multiply
(
BigDecimal
.
valueOf
(
quantity
));
}
public
void
increaseQuantity
(
int
change
)
{
quantity
+=
change
;
}
}
Wielomodulowy/wielomodulowy-web/src/main/java/sklep/basket/RemoveFromBasket.java
0 → 100644
View file @
f2e7f26e
package
sklep
.
basket
;
import
java.io.IOException
;
import
jakarta.servlet.ServletException
;
import
jakarta.servlet.annotation.WebServlet
;
import
jakarta.servlet.http.HttpServlet
;
import
jakarta.servlet.http.HttpServletRequest
;
import
jakarta.servlet.http.HttpServletResponse
;
import
jakarta.servlet.http.HttpSession
;
@WebServlet
(
"/remove_from_basket"
)
public
class
RemoveFromBasket
extends
HttpServlet
{
private
static
final
long
serialVersionUID
=
1L
;
@Override
protected
void
doGet
(
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
ServletException
,
IOException
{
try
{
int
productId
=
Integer
.
parseInt
(
request
.
getParameter
(
"productId"
));
HttpSession
sesja
=
request
.
getSession
();
Basket
basket
=
(
Basket
)
sesja
.
getAttribute
(
"basket"
);
basket
.
removeProduct
(
productId
);
}
catch
(
Exception
e
)
{
// ignorujemy błędy
}
// Przekierowanie - każemy przeglądarce wejść pod ten adres.
response
.
sendRedirect
(
"products9.jsp"
);
}
}
Wielomodulowy/wielomodulowy-web/src/main/java/sklep/web/EditProduct.java
0 → 100644
View file @
f2e7f26e
package
sklep
.
web
;
import
java.io.IOException
;
import
java.math.BigDecimal
;
import
jakarta.servlet.RequestDispatcher
;
import
jakarta.servlet.ServletException
;
import
jakarta.servlet.annotation.WebServlet
;
import
jakarta.servlet.http.HttpServlet
;
import
jakarta.servlet.http.HttpServletRequest
;
import
jakarta.servlet.http.HttpServletResponse
;
import
sklep.db.DBConnection
;
import
sklep.db.DBException
;
import
sklep.db.ProductDAO
;
import
sklep.db.RecordNotFound
;
import
sklep.model.Product
;
@WebServlet
(
"/edit"
)
public
class
EditProduct
extends
HttpServlet
{
@Override
protected
void
doGet
(
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
ServletException
,
IOException
{
String
parametrId
=
request
.
getParameter
(
"productId"
);
if
(
parametrId
!=
null
)
{
int
productId
=
Integer
.
parseInt
(
parametrId
);
try
(
DBConnection
db
=
DBConnection
.
open
())
{
ProductDAO
productDAO
=
db
.
productDAO
();
Product
product
=
productDAO
.
findById
(
productId
);
// Gdy do obiektu request dodamy atrybut, to stanie się on dostępny dla kolejnych komponentów
// naszej aplikacji, które będą obsługiwać to zapytanie.
// W tym przypadku skrypt JSP może odwoływać się do obiektu product.
// Obiekt request jest też nośnikiem danych, podobnie jak sesja i servletContext.
// To działa jak Model w Spring MVC.
// Tylko jeśli znajdę produkt, tylko wtedy dodaję go do requestu i JSP wyświetli jego dane.
// Jeśli parametru productId nie było lub produktu nie znaleziono, to wyświetli się pusty formularz.
request
.
setAttribute
(
"product"
,
product
);
}
catch
(
DBException
|
RecordNotFound
e
)
{
e
.
printStackTrace
();
}
}
// Forward to "wewnętrzne przekierowanie" obsługi zapytania do innego komponentu aplikacji.
// Tutaj "wyświetlamy" formularz edycji produktu.
RequestDispatcher
dispatcher
=
request
.
getRequestDispatcher
(
"product_form.jsp"
);
if
(
dispatcher
!=
null
)
dispatcher
.
forward
(
request
,
response
);
}
@Override
protected
void
doPost
(
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
ServletException
,
IOException
{
// W tej wersji nie obsługujemy błędów - w razie błędu wyświetli się strona z wyjątkiem
// W przypadku braku ID zostanie utworzony nowy produkt, a w przypadku podania ID (gdy to była edycja istniejącego) - zostanie zastąpiony.
request
.
setCharacterEncoding
(
"UTF-8"
);
String
parametrId
=
request
.
getParameter
(
"productId"
);
Integer
productId
=
(
parametrId
==
null
||
parametrId
.
isEmpty
())
?
null
:
Integer
.
valueOf
(
parametrId
);
String
parametrPrice
=
request
.
getParameter
(
"price"
);
BigDecimal
price
=
new
BigDecimal
(
parametrPrice
);
String
parametrVat
=
request
.
getParameter
(
"vat"
);
BigDecimal
vat
=
(
parametrVat
==
null
||
parametrVat
.
isEmpty
())
?
null
:
new
BigDecimal
(
parametrVat
);
String
name
=
request
.
getParameter
(
"productName"
);
String
description
=
request
.
getParameter
(
"description"
);
Product
product
=
new
Product
(
productId
,
name
,
price
,
vat
,
description
);
try
(
DBConnection
db
=
DBConnection
.
open
())
{
ProductDAO
productDAO
=
db
.
productDAO
();
productDAO
.
save
(
product
);
db
.
commit
();
// Gdy udało się zapisać, to przejdziemy z powrotem do listy.
// To jest przekierowanie przeglądarki do inny adres.
response
.
sendRedirect
(
"products9.jsp"
);
}
catch
(
DBException
e
)
{
e
.
printStackTrace
();
}
}
}
Wielomodulowy/wielomodulowy-web/src/main/java/sklep/web/Photo.java
0 → 100644
View file @
f2e7f26e
package
sklep
.
web
;
import
java.io.IOException
;
import
jakarta.servlet.ServletException
;
import
jakarta.servlet.ServletOutputStream
;
import
jakarta.servlet.annotation.WebServlet
;
import
jakarta.servlet.http.HttpServlet
;
import
jakarta.servlet.http.HttpServletRequest
;
import
jakarta.servlet.http.HttpServletResponse
;
import
sklep.db.RecordNotFound
;
@WebServlet
(
"/photo"
)
public
class
Photo
extends
HttpServlet
{
private
static
final
long
serialVersionUID
=
1L
;
/* Ten serwlet wczytuje z dysku plik ze zdjęciem o podanym numerze (z parametru productId).
* Aby odesłać odpowiedź "binarną" (a nie tekstową) używamy getOutputStream() zamiast getWriter().
* Aby przeglądarka wiedziała, że otrzymuje grafikę, ustawiamy content-type image/jpeg.
*/
protected
void
doGet
(
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
ServletException
,
IOException
{
String
parametrId
=
request
.
getParameter
(
"productId"
);
if
(
parametrId
==
null
)
{
return
;
}
try
{
int
id
=
Integer
.
parseInt
(
parametrId
);
byte
[]
bytes
=
PhotoUtil
.
readBytes
(
id
);
response
.
setContentType
(
"image/jpeg"
);
ServletOutputStream
output
=
response
.
getOutputStream
();
output
.
write
(
bytes
);
output
.
close
();
}
catch
(
RecordNotFound
e
)
{
response
.
setStatus
(
404
);
response
.
setContentType
(
"text/plain"
);
response
.
setCharacterEncoding
(
"utf-8"
);
response
.
getWriter
().
println
(
"Nie ma zdjęcia dla produktu o nr "
+
parametrId
);
}
catch
(
Exception
e
)
{
response
.
setStatus
(
500
);
e
.
printStackTrace
();
}
}
}
Wielomodulowy/wielomodulowy-web/src/main/java/sklep/web/PhotoUpload.java
0 → 100644
View file @
f2e7f26e
package
sklep
.
web
;
import
java.io.IOException
;
import
jakarta.servlet.ServletException
;
import
jakarta.servlet.annotation.MultipartConfig
;
import
jakarta.servlet.annotation.WebServlet
;
import
jakarta.servlet.http.HttpServlet
;
import
jakarta.servlet.http.HttpServletRequest
;
import
jakarta.servlet.http.HttpServletResponse
;
import
jakarta.servlet.http.Part
;
// Włączona obsługa zapytań multipart ("z załącznikami"). Maks rozmiar zapytania/pliku: 16M
@WebServlet
(
"/photo_upload"
)
@MultipartConfig
(
maxRequestSize
=
16
*
1024
*
1024
)
public
class
PhotoUpload
extends
HttpServlet
{
private
static
final
long
serialVersionUID
=
1L
;
protected
void
doPost
(
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
ServletException
,
IOException
{
try
{
String
paramId
=
request
.
getParameter
(
"productId"
);
if
(
paramId
!=
null
)
{
int
productId
=
Integer
.
parseInt
(
paramId
);
Part
part
=
request
.
getPart
(
"plik"
);
if
(
part
!=
null
)
{
// przysłano plik
// Tutaj nazwa pliku jest dla nas bez znaczenia, ale gdybyśmy potrzebowali, to w ten sposób:
// String nazwaPliku = part.getSubmittedFileName();
// Przypisujemy bajty ze strumienia do pliku w katalogu ze zdjęciami:
PhotoUtil
.
writeStream
(
productId
,
part
.
getInputStream
());
}
}
}
catch
(
Exception
e
)
{
// wypisujemy błąd, ale metoda kończy się normalnie
e
.
printStackTrace
();
}
response
.
sendRedirect
(
"products9.jsp"
);
}
}
Wielomodulowy/wielomodulowy-web/src/main/java/sklep/web/PhotoUtil.java
0 → 100644
View file @
f2e7f26e
package
sklep
.
web
;
import
java.io.File
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.nio.file.Files
;
import
java.nio.file.Path
;
import
java.nio.file.Paths
;
import
java.nio.file.StandardCopyOption
;
import
sklep.db.DBException
;
import
sklep.db.DBSettings
;
import
sklep.db.RecordNotFound
;
public
class
PhotoUtil
{
private
static
final
String
EXT
=
".jpg"
;
public
static
File
getFile
(
int
productId
)
throws
DBException
,
RecordNotFound
{
Path
path
=
getPath
(
productId
);
File
file
=
path
.
toFile
();
if
(
file
.
exists
())
{
return
file
;
}
else
{
throw
new
RecordNotFound
(
"Cannot read photo for product id = "
+
productId
);
}
}
public
static
byte
[]
readBytes
(
int
productId
)
throws
DBException
,
RecordNotFound
{
Path
path
=
getPath
(
productId
);
try
{
return
Files
.
readAllBytes
(
path
);
}
catch
(
IOException
e
)
{
// System.err.println(e);
throw
new
RecordNotFound
(
"Cannot read photo for product id = "
+
productId
);
}
}
public
static
void
writeStream
(
int
productId
,
InputStream
inputStream
)
{
try
{
Path
path
=
getPath
(
productId
);
Files
.
copy
(
inputStream
,
path
,
StandardCopyOption
.
REPLACE_EXISTING
);
}
catch
(
Exception
e
)
{
// wypisujemy błąd, ale metoda kończy się normalnie
e
.
printStackTrace
();
}
}
private
static
Path
getPath
(
int
productId
)
throws
DBException
{
String
dir
=
DBSettings
.
load
().
getProperty
(
"photo_dir"
);
String
fileName
=
productId
+
EXT
;
return
Paths
.
get
(
dir
,
fileName
);
}
}
Wielomodulowy/wielomodulowy-web/src/main/java/sklep/web/ProductBean.java
0 → 100644
View file @
f2e7f26e
package
sklep
.
web
;
import
java.math.BigDecimal
;
import
java.util.List
;
import
sklep.db.DBConnection
;
import
sklep.db.DBException
;
import
sklep.db.ProductDAO
;
import
sklep.model.Product
;
/* Ta klasa jest po to, aby w skrypcie JSP w wygodny sposób odczytać sobie listę produktów z bazy danych. */
public
class
ProductBean
{
private
BigDecimal
minPrice
,
maxPrice
;
// Chociaż wewnętrznie zmienna jest typu BigDecimal, to gettery i settery napiszemy tak, jakby to były Stringi.
// Robimy to po to, aby w JSP zadziałało setProperty.
public
String
getMinPrice
()
{
return
minPrice
==
null
?
null
:
minPrice
.
toString
();
}
public
void
setMinPrice
(
String
minPrice
)
{
if
(
minPrice
==
null
||
minPrice
.
isEmpty
())
{
this
.
minPrice
=
null
;
}
else
{
this
.
minPrice
=
new
BigDecimal
(
minPrice
);
}
}
public
String
getMaxPrice
()
{
return
maxPrice
==
null
?
null
:
maxPrice
.
toString
();
}
public
void
setMaxPrice
(
String
maxPrice
)
{
if
(
maxPrice
==
null
||
maxPrice
.
isEmpty
())
{
this
.
maxPrice
=
null
;
}
else
{
this
.
maxPrice
=
new
BigDecimal
(
maxPrice
);
}
}
// Metoda wygląda jak getter, ale wewnętrznie czyta dane z bazy, a nie z własnej zmiennej.
public
List
<
Product
>
getAllProducts
()
throws
DBException
{
try
(
DBConnection
db
=
DBConnection
.
open
())
{
ProductDAO
productDAO
=
db
.
productDAO
();
return
productDAO
.
readAll
();
}
}
// Metoda odczytuje produkty zgodnie z ustawionymi wcześniej kryteriami (w tym przykładzie są to ceny, ale może być więcej filtrów).
public
List
<
Product
>
getFilteredProducts
()
throws
DBException
{
try
(
DBConnection
db
=
DBConnection
.
open
())
{
return
db
.
productDAO
().
findByPrice
(
minPrice
,
maxPrice
);
}
}
}
Wielomodulowy/wielomodulowy-web/src/main/java/sklep/web/Products0.java
0 → 100644
View file @
f2e7f26e
package
sklep
.
web
;
import
java.io.IOException
;
import
java.io.PrintWriter
;
import
java.sql.Connection
;
import
java.sql.DriverManager
;
import
java.sql.ResultSet
;
import
java.sql.SQLException
;
import
java.sql.Statement
;
import
jakarta.servlet.ServletException
;
import
jakarta.servlet.annotation.WebServlet
;
import
jakarta.servlet.http.HttpServlet
;
import
jakarta.servlet.http.HttpServletRequest
;
import
jakarta.servlet.http.HttpServletResponse
;
@WebServlet
(
"/products0"
)
public
class
Products0
extends
HttpServlet
{
@Override
protected
void
doGet
(
HttpServletRequest
requets
,
HttpServletResponse
response
)
throws
ServletException
,
IOException
{
response
.
setContentType
(
"text/plain"
);
response
.
setCharacterEncoding
(
"UTF-8"
);
PrintWriter
out
=
response
.
getWriter
();
out
.
println
(
"Zaraz odczytam produkty z bazy..."
);
final
String
url
=
"jdbc:postgresql://localhost/sklep"
;
final
String
sql
=
"SELECT * FROM products"
;
try
(
Connection
c
=
DriverManager
.
getConnection
(
url
,
"kurs"
,
"abc123"
);
Statement
stmt
=
c
.
createStatement
();
ResultSet
rs
=
stmt
.
executeQuery
(
sql
))
{
while
(
rs
.
next
())
{
out
.
printf
(
"Produkt nr %s to jest %s za cenę %s\n"
,
rs
.
getInt
(
"product_id"
),
rs
.
getString
(
"product_name"
),
rs
.
getBigDecimal
(
"price"
));
}
}
catch
(
SQLException
e
)
{
out
.
println
(
"Wielka bieda!"
);
e
.
printStackTrace
(
out
);
}
}
}
Wielomodulowy/wielomodulowy-web/src/main/java/sklep/web/Products1.java
0 → 100644
View file @
f2e7f26e
package
sklep
.
web
;
import
java.io.IOException
;
import
java.io.PrintWriter
;
import
java.util.List
;
import
jakarta.servlet.ServletException
;
import
jakarta.servlet.annotation.WebServlet
;
import
jakarta.servlet.http.HttpServlet
;
import
jakarta.servlet.http.HttpServletRequest
;
import
jakarta.servlet.http.HttpServletResponse
;
import
sklep.db.DBConnection
;
import
sklep.db.DBException
;
import
sklep.db.ProductDAO
;
import
sklep.model.Product
;
@WebServlet
(
"/products1"
)
public
class
Products1
extends
HttpServlet
{
@Override
protected
void
doGet
(
HttpServletRequest
requets
,
HttpServletResponse
response
)
throws
ServletException
,
IOException
{
response
.
setContentType
(
"text/plain"
);
response
.
setCharacterEncoding
(
"UTF-8"
);
PrintWriter
out
=
response
.
getWriter
();
out
.
println
(
"Zaraz odczytam produkty z bazy..."
);
try
(
DBConnection
db
=
DBConnection
.
open
())
{
ProductDAO
productDAO
=
db
.
productDAO
();
List
<
Product
>
products
=
productDAO
.
readAll
();
for
(
Product
product
:
products
)
{
out
.
println
(
product
);
}
}
catch
(
DBException
e
)
{
out
.
println
(
"Wielka bieda!"
);
e
.
printStackTrace
(
out
);
}
}
}
Wielomodulowy/wielomodulowy-web/src/main/java/sklep/web/Products2.java
0 → 100644
View file @
f2e7f26e
package
sklep
.
web
;
import
java.io.IOException
;
import
java.io.PrintWriter
;
import
java.util.List
;
import
jakarta.servlet.ServletException
;
import
jakarta.servlet.annotation.WebServlet
;
import
jakarta.servlet.http.HttpServlet
;
import
jakarta.servlet.http.HttpServletRequest
;
import
jakarta.servlet.http.HttpServletResponse
;
import
sklep.db.DBConnection
;
import
sklep.db.DBException
;
import
sklep.db.ProductDAO
;
import
sklep.model.Product
;
@WebServlet
(
"/products2"
)
public
class
Products2
extends
HttpServlet
{
@Override
protected
void
doGet
(
HttpServletRequest
requets
,
HttpServletResponse
response
)
throws
ServletException
,
IOException
{
response
.
setContentType
(
"text/html"
);
response
.
setCharacterEncoding
(
"UTF-8"
);
PrintWriter
out
=
response
.
getWriter
();
out
.
println
(
"""
<!DOCTYPE html>
<html>
<head>
<title>Lista produktów</title>
<link rel='stylesheet' type='text/css' href='styl.css'>
</head>
<body>
<h1>Produkty</h1>
"""
);
try
(
DBConnection
db
=
DBConnection
.
open
())
{
ProductDAO
productDAO
=
db
.
productDAO
();
List
<
Product
>
products
=
productDAO
.
readAll
();
for
(
Product
product
:
products
)
{
out
.
println
(
product
.
toHtml
());
}
}
catch
(
DBException
e
)
{
out
.
println
(
"Wielka bieda!"
);
out
.
print
(
"<pre>"
);
e
.
printStackTrace
(
out
);
out
.
print
(
"</pre>"
);
}
out
.
println
(
"</body></html>"
);
}
}
Wielomodulowy/wielomodulowy-web/src/main/webapp/index.html
0 → 100644
View file @
f2e7f26e
<!DOCTYPE html>
<html>
<head>
<meta
charset=
"UTF-8"
>
<title>
Sklep - spis treści
</title>
<link
rel=
"stylesheet"
type=
"text/css"
href=
"styl.css"
>
</head>
<body>
<h1>
Sklep Web
</h1>
<h2>
Lista produktów w różnych wersjach
</h2>
<h3>
Wersje niedoskonałe, nie do naśladowania.
</h3>
<ul>
<li><a
href=
"products0"
>
wersja 0
</a>
- samodzielny prosty serwlet
</li>
<li><a
href=
"products1"
>
wersja 1
</a>
- serwlet oparty o klasy DAO
</li>
<li><a
href=
"products2"
>
wersja 2
</a>
- serwlet oparty o klasy DAO z HTMLem
</li>
<li><a
href=
"products3.jsp"
>
wersja 3
</a>
- JSP ze skryptletami
</li>
<li><a
href=
"products4.jsp"
>
wersja 4
</a>
- JSP z tagami SQL
</li>
</ul>
<h3>
Wersje przyzwoite ;-)
</h3>
<ul>
<li><a
href=
"products5.jsp"
>
wersja 5
</a>
- JSP oparty o klasę bean
</li>
<li><a
href=
"products6.jsp"
>
wersja 6
</a>
- wyszukiwanie wg ceny - bean
</li>
<li><a
href=
"products7.jsp"
>
wersja 7
</a>
- fotki
</li>
<li><a
href=
"products8.jsp"
>
wersja 8
</a>
- koszyk
</li>
<li><a
href=
"products9.jsp"
>
wersja 9
</a>
- edycja produktów
</li>
</ul>
<h3>
Dodatkowe strony
</h3>
<ul>
<li><a
href=
"photo?productId=2"
>
Foto
</a>
- przykładowe zdjęcie
</li>
<li><a
href=
"photo_upload.jsp?productId=2"
>
Zmień zdjęcie
</a>
nr 2
</li>
<li><a
href=
"edit_product?productId=1"
>
Edytuj produkt nr 1
</a></li>
<li><a
href=
"edit_product"
>
Dodaj nowy produkt
</a></li>
</ul>
</body>
</html>
Wielomodulowy/wielomodulowy-web/src/main/webapp/photo_upload.jsp
0 → 100644
View file @
f2e7f26e
<
%@
page
language=
"java"
contentType=
"text/html; charset=UTF-8"
pageEncoding=
"UTF-8"
%
>
<
%@
taglib
prefix=
"c"
uri=
"jakarta.tags.core"
%
>
<!DOCTYPE html>
<html>
<head>
<meta
charset=
"UTF-8"
>
<title>
Edycja zdjęcia
</title>
<link
rel=
"stylesheet"
type=
"text/css"
href=
"styl.css"
>
</head>
<body>
<h1>
Wgraj zdjęcie produktu
</h1>
<div>
Produkt nr
<strong>
${param.productId}
</strong></div>
<div>
Aktualne zdjęcie:
<br/>
<img
class=
"photo"
src=
"photo?productId=${param.productId}"
alt=
"Brak zdjęcia"
>
</div>
<
%
--
action
powoduje
,
ż
e
zapytanie
z
formularza
jest
wysy
ł
ane
pod
podany
adres
,
a
nie
bie
żą
cy
.
Aby
wys
ł
a
ć
zawarto
ść
pliku
(
a
nie
tylko
jego
nazw
ę),
nale
ż
y
ustawi
ć
enctype
jak
poni
ż
ej
.
Sam
plik
to
pole
formularza
typu
file
;
opr
ó
cz
niego
mog
ą
by
ć
inne
„
zwyk
ł
e
”
pola
.
Odpowiednio
trzeba
to
te
ż
obs
ł
u
ż
y
ć
w
serwlecie
-
patrz
klasa
DoUploadPhoto
.
--
%
>
<form
id=
"photo-form"
method=
"post"
action=
"photo_upload"
enctype=
"multipart/form-data"
>
<input
type=
"hidden"
name=
"productId"
value=
"${param.productId}"
>
<label
for=
"plik"
>
Wybierz plik ze zdjęciem
</label>
<input
id=
"plik"
type=
"file"
name=
"plik"
accept=
"image/jpeg"
>
<br>
<button>
Wyślij
</button>
</form>
<p>
[
<a
href=
"products9.jsp"
>
powrót do listy produktów
</a>
]
</p>
<p>
[
<a
href=
"index.html"
>
powrót do spisu treści
</a>
]
</p>
</body>
</html>
Wielomodulowy/wielomodulowy-web/src/main/webapp/product_form.jsp
0 → 100644
View file @
f2e7f26e
<
%@
page
language=
"java"
contentType=
"text/html; charset=UTF-8"
pageEncoding=
"UTF-8"
%
>
<
%@
taglib
prefix=
"c"
uri=
"jakarta.tags.core"
%
>
<!DOCTYPE html>
<html>
<head>
<meta
charset=
"UTF-8"
>
<title>
Edycja danych produktu
</title>
<link
rel=
"stylesheet"
type=
"text/css"
href=
"styl.css"
>
</head>
<body>
<h1>
Edycja produktu
</h1>
<form
id=
"product-form"
method=
"post"
>
<table
class=
"form"
>
<tr>
<td><label
for=
"productId"
>
Numer:
</label></td>
<td><input
name=
"productId"
placeholder=
"brak"
type=
"number"
readonly=
"readonly"
value=
"${product.productId}"
/></td>
</tr>
<tr>
<td><label
for=
"productName"
>
Nazwa towaru:
</label></td>
<td><input
name=
"productName"
placeholder=
"nazwa..."
type=
"text"
value=
"${product.productName}"
/>
</td>
</tr>
<tr>
<td><label
for=
"price"
>
Cena:
</label></td>
<td><input
name=
"price"
placeholder=
"12.90"
title=
"tu wpisz cenę"
type=
"number"
step=
"0.01"
value=
"${product.price}"
/>
</td>
</tr>
<tr>
<td><label
for=
"vat"
>
Stawka VAT:
</label></td>
<td><input
name=
"vat"
placeholder=
"0.23"
title=
"tu wpisz vat"
type=
"number"
step=
"0.01"
value=
"${product.vat}"
/>
</td>
</tr>
<tr>
<td><label
for=
"description"
>
Opis:
</label></td>
<td><textarea
name=
"description"
rows=
"10"
cols=
"120"
>
${product.description}
</textarea></td>
</tr>
<tr>
<td><button>
Zapisz
</button></td>
</tr>
</table>
</form>
<div
class=
"action"
><a
href=
"products9.jsp"
>
powrót do listy produktów
</a></div>
<div
class=
"action"
><a
href=
"index.html"
>
powrót do spisu treści
</a></div>
</body>
</html>
Wielomodulowy/wielomodulowy-web/src/main/webapp/products3.jsp
0 → 100644
View file @
f2e7f26e
<
%@
page
import=
"sklep.model.Product"
%
>
<
%@
page
import=
"java.util.List"
%
>
<
%@
page
import=
"sklep.db.ProductDAO"
%
>
<
%@
page
import=
"sklep.db.DBConnection"
%
>
<
%@
page
language=
"java"
contentType=
"text/html; charset=UTF-8"
pageEncoding=
"UTF-8"
%
>
<!DOCTYPE html>
<html>
<head>
<meta
charset=
"UTF-8"
>
<title>
Lista produktów 3
</title>
</head>
<body>
<h1>
Lista produktów - wersja 3 JSP
</h1>
<p>
W tej wersji wewnątrz skryptu JSP umieścimy fragmenty Javy, tzw. scriptlets.
To jest pierwsza techniczna możliwość, którą oferował standard JSP.
</p>
<p>
Uwaga - ta wersja nadal jest nieporządna i
<strong>
nie jest
</strong>
wzorem do naśladowania.
Mieszanie kodu HTML z Javą w taki sposób, szczególnie jak zrobiliśmy z pętlą pod koniec, jest w bardzo złym stylu.
</p>
<p>
[
<a
href=
"index.html"
>
powrót do spisu treści
</a>
]
</p>
<
%
--
Poni
ż
ej
skryptlet
,
kt
ó
ry
otwiera
po
łą
czenie
z
baz
ą
danych:
--
%
>
<
%
DBConnection
db =
DBConnection.open();
ProductDAO
dao =
db.productDAO();
%
>
<p>
Pobieranie danych...
</p>
<
%
List
<
Product
>
products = dao.readAll();
%>
<p>
Pobrano
<
%=
products
.
size
()
%
>
produktów.
</p>
<h3>
Wszystkie produkty
</h3>
<ul>
<
%
for
(
Product
product
:
products
)
{
%
>
<li><
%=
product
.
getProductName
()
%
>
za
<
%=
product
.
getPrice
()
%
></li>
<
%
}
%
>
</ul>
<
%
db
.
close
();
%
>
<p>
[
<a
href=
"index.html"
>
powrót do spisu treści
</a>
]
</p>
</body>
</html>
Wielomodulowy/wielomodulowy-web/src/main/webapp/products4.jsp
0 → 100644
View file @
f2e7f26e
<
%@
page
language=
"java"
contentType=
"text/html; charset=UTF-8"
pageEncoding=
"UTF-8"
%
>
<
%@
taglib
prefix=
"c"
uri=
"jakarta.tags.core"
%
>
<
%@
taglib
prefix=
"sql"
uri=
"jakarta.tags.sql"
%
>
<!DOCTYPE html>
<html>
<head>
<meta
charset=
"UTF-8"
>
<title>
Lista produktów 4
</title>
<link
rel=
"stylesheet"
type=
"text/css"
href=
"styl.css"
>
</head>
<body>
<h1>
Lista produktów - wersja 4 JSP
</h1>
<p>
W tej wersji korzystamy ze standardowej biblioteki tagów (JSTL), a dokładnie z jej fragmentu obsługującego SQL.
</p>
<p>
Bezpośrednio w JSP wykonamy zapytanie w bazie danych - to też jeszcze nie będzie najładniejszy styl...
</p>
<
%
--
W
tej
wersji
za
pomoc
ą
dedykowanych
tag
ó
w
JSP
zadamy
zapytanie
SQL
.
Ta
wersja
W
OG
Ó
LE
nie
u
ż
ywa
klas
stworzonych
przez
nas
w
projekcie
;
jest
samowystarczalna
.
--
%
>
<
%
--
"
taglibs
"
-
biblioteki
tag
ó
w
,
zaimplementowane
w
Javie
,
a
w
JSP
u
ż
ywa
si
ę
ich
za
pomoc
ą
sk
ł
adni
"
tagowej
"
(
dok
ł
adnie
sk
ł
adni
XML
)
--
%
>
<sql:setDataSource
var=
"baza"
driver=
"org.postgresql.Driver"
url=
"jdbc:postgresql://localhost/sklep"
user=
"kurs"
password=
"abc123"
/>
<sql:query
dataSource=
"${baza}"
scope=
"page"
var=
"result"
>
SELECT * FROM products ORDER BY product_id
</sql:query>
<
%
--
.
product_name
.
price
itp
-
to
s
ą
nazwy
kolumn
w
tabeli
SQL
--
%
>
<c:forEach
var=
"row"
items=
"${result.rows}"
>
<div
class=
"product"
>
<h3>
${row.product_name}
</h3>
<div
class=
"price"
>
${row.price}
</div>
<p>
${row.description}
</p>
</div>
</c:forEach>
</body>
</html>
Wielomodulowy/wielomodulowy-web/src/main/webapp/products5.jsp
0 → 100644
View file @
f2e7f26e
<
%@
page
language=
"java"
contentType=
"text/html; charset=UTF-8"
pageEncoding=
"UTF-8"
%
>
<
%@
taglib
prefix=
"c"
uri=
"jakarta.tags.core"
%
>
<!DOCTYPE html>
<html>
<head>
<meta
charset=
"UTF-8"
>
<title>
Lista produktów 5
</title>
<link
rel=
"stylesheet"
type=
"text/css"
href=
"styl.css"
>
</head>
<body>
<h1>
Lista produktów - wersja 5
</h1>
<jsp:useBean
id=
"productBean"
class=
"sklep.web.ProductBean"
/>
<c:forEach
var=
"product"
items=
"${productBean.allProducts}"
>
<div
class=
"product"
>
<h3>
${product.productName}
</h3>
<div
class=
"price"
>
Cena: ${product.price}
</div>
<div
class=
"price"
>
VAT ${product.vat * 100}%
</div>
<c:if
test=
"${not empty(product.description)}"
>
<p
class=
"description"
>
${product.description}
</p>
</c:if>
</div>
</c:forEach>
</body>
</html>
Wielomodulowy/wielomodulowy-web/src/main/webapp/products6.jsp
0 → 100644
View file @
f2e7f26e
<
%@
page
language=
"java"
contentType=
"text/html; charset=UTF-8"
pageEncoding=
"UTF-8"
%
>
<
%@
taglib
prefix=
"c"
uri=
"jakarta.tags.core"
%
>
<!DOCTYPE html>
<html>
<head>
<meta
charset=
"UTF-8"
>
<title>
Lista produktów 6
</title>
<link
rel=
"stylesheet"
type=
"text/css"
href=
"styl.css"
>
</head>
<body>
<h1>
Lista produktów - wersja 6
</h1>
<form
id=
"wyszukiwarka"
method=
"get"
>
<h2>
Filtr cen
</h2>
<table
class=
"formularz"
>
<tr><td><label
for=
"min_price"
>
Cena minimalna:
</label></td>
<td><input
id=
"min_price"
name=
"min_price"
type=
"number"
value=
"${param.min_price}"
></td></tr>
<tr><td><label
for=
"max_price"
>
Cena maksymalna:
</label></td>
<td><input
id=
"max_price"
name=
"max_price"
type=
"number"
value=
"${param.max_price}"
></td></tr>
<tr><td><button>
Filtruj
</button></td></tr>
</table>
</form>
<jsp:useBean
id=
"productBean"
class=
"sklep.web.ProductBean"
/>
<jsp:setProperty
name=
"productBean"
property=
"minPrice"
param=
"min_price"
/>
<jsp:setProperty
name=
"productBean"
property=
"maxPrice"
param=
"max_price"
/>
<c:forEach
var=
"product"
items=
"${productBean.filteredProducts}"
>
<div
class=
"product"
>
<h3>
${product.productName}
</h3>
<div
class=
"price"
>
Cena: ${product.price}
</div>
<div
class=
"price"
>
VAT ${product.vat * 100}%
</div>
<c:if
test=
"${not empty(product.description)}"
>
<p
class=
"description"
>
${product.description}
</p>
</c:if>
</div>
</c:forEach>
</body>
</html>
Wielomodulowy/wielomodulowy-web/src/main/webapp/products7.jsp
0 → 100644
View file @
f2e7f26e
<
%@
page
language=
"java"
contentType=
"text/html; charset=UTF-8"
pageEncoding=
"UTF-8"
%
>
<
%@
taglib
prefix=
"c"
uri=
"jakarta.tags.core"
%
>
<!DOCTYPE html>
<html>
<head>
<meta
charset=
"UTF-8"
>
<title>
Lista produktów 7
</title>
<link
rel=
"stylesheet"
type=
"text/css"
href=
"styl.css"
>
</head>
<body>
<h1>
Lista produktów - wersja 7
</h1>
<form
id=
"wyszukiwarka"
method=
"get"
>
<h2>
Filtr cen
</h2>
<table
class=
"formularz"
>
<tr><td><label
for=
"min_price"
>
Cena minimalna:
</label></td>
<td><input
id=
"min_price"
name=
"min_price"
type=
"number"
value=
"${param.min_price}"
></td></tr>
<tr><td><label
for=
"max_price"
>
Cena maksymalna:
</label></td>
<td><input
id=
"max_price"
name=
"max_price"
type=
"number"
value=
"${param.max_price}"
></td></tr>
<tr><td><button>
Filtruj
</button></td></tr>
</table>
</form>
<jsp:useBean
id=
"productBean"
class=
"sklep.web.ProductBean"
/>
<jsp:setProperty
name=
"productBean"
property=
"minPrice"
param=
"min_price"
/>
<jsp:setProperty
name=
"productBean"
property=
"maxPrice"
param=
"max_price"
/>
<c:forEach
var=
"product"
items=
"${productBean.filteredProducts}"
>
<div
class=
"product"
>
<img
class=
"photo"
src=
"photo?productId=${product.productId}"
alt=
""
/>
<h3>
${product.productName}
</h3>
<div
class=
"price"
>
Cena: ${product.price}
</div>
<div
class=
"price"
>
VAT ${product.vat * 100}%
</div>
<c:if
test=
"${not empty(product.description)}"
>
<p
class=
"description"
>
${product.description}
</p>
</c:if>
</div>
</c:forEach>
</body>
</html>
Wielomodulowy/wielomodulowy-web/src/main/webapp/products8.jsp
0 → 100644
View file @
f2e7f26e
<
%@
page
language=
"java"
contentType=
"text/html; charset=UTF-8"
pageEncoding=
"UTF-8"
%
>
<
%@
taglib
prefix=
"c"
uri=
"jakarta.tags.core"
%
>
<!DOCTYPE html>
<html>
<head>
<meta
charset=
"UTF-8"
>
<title>
Lista produktów 8
</title>
<link
rel=
"stylesheet"
type=
"text/css"
href=
"styl.css"
>
</head>
<body>
<h1>
Lista produktów - wersja 8
</h1>
<div
class=
"koszyk"
>
<h4>
Koszyk
</h4>
<ul>
<
%
--
Zauwa
ż
my
,
ż
e
dla
obiektu
koszyk
nie
wykonujemy
ju
ż
useBean
.
Po
prostu
zak
ł
adamy
,
ż
e
jest
obecny
(
w
sesji
).
Gdyby
go
nie
by
ł
o
,
to
p
ę
tla
si
ę
nie
wykona
.
--
%
>
<c:forEach
var=
"elm"
items=
"${basket.elements}"
>
<li>
${elm.productName} (${elm.quantity}) za
<b>
${elm.value}
</b></li>
</c:forEach>
</ul>
<p
class=
"total"
>
Do zapłaty: ${basket.totalValue}
</p>
</div>
<form
id=
"wyszukiwarka"
method=
"get"
>
<h2>
Filtr cen
</h2>
<table
class=
"formularz"
>
<tr><td><label
for=
"min_price"
>
Cena minimalna:
</label></td>
<td><input
id=
"min_price"
name=
"min_price"
type=
"number"
value=
"${param.min_price}"
></td></tr>
<tr><td><label
for=
"max_price"
>
Cena maksymalna:
</label></td>
<td><input
id=
"max_price"
name=
"max_price"
type=
"number"
value=
"${param.max_price}"
></td></tr>
<tr><td><button>
Filtruj
</button></td></tr>
</table>
</form>
<jsp:useBean
id=
"productBean"
class=
"sklep.web.ProductBean"
/>
<jsp:setProperty
name=
"productBean"
property=
"minPrice"
param=
"min_price"
/>
<jsp:setProperty
name=
"productBean"
property=
"maxPrice"
param=
"max_price"
/>
<c:forEach
var=
"product"
items=
"${productBean.filteredProducts}"
>
<div
class=
"product"
>
<img
class=
"photo"
src=
"photo?productId=${product.productId}"
alt=
""
/>
<h3>
${product.productName}
</h3>
<div
class=
"price"
>
Cena: ${product.price}
</div>
<div
class=
"price"
>
VAT ${product.vat * 100}%
</div>
<c:if
test=
"${not empty(product.description)}"
>
<p
class=
"description"
>
${product.description}
</p>
</c:if>
<div
class=
"action"
><a
href=
"add_to_basket?productId=${product.productId}"
>
dodaj do koszyka
</a></div>
</div>
</c:forEach>
</body>
</html>
Wielomodulowy/wielomodulowy-web/src/main/webapp/products9.jsp
0 → 100644
View file @
f2e7f26e
<
%@
page
language=
"java"
contentType=
"text/html; charset=UTF-8"
pageEncoding=
"UTF-8"
%
>
<
%@
taglib
prefix=
"c"
uri=
"jakarta.tags.core"
%
>
<!DOCTYPE html>
<html>
<head>
<meta
charset=
"UTF-8"
>
<title>
Lista produktów 9
</title>
<link
rel=
"stylesheet"
type=
"text/css"
href=
"styl.css"
>
</head>
<body>
<h1>
Lista produktów - wersja 9
</h1>
<div
class=
"koszyk"
>
<h4>
Koszyk
</h4>
<ul>
<
%
--
Zauwa
ż
my
,
ż
e
dla
obiektu
koszyk
nie
wykonujemy
ju
ż
useBean
.
Po
prostu
zak
ł
adamy
,
ż
e
jest
obecny
(
w
sesji
).
Gdyby
go
nie
by
ł
o
,
to
p
ę
tla
si
ę
nie
wykona
.
--
%
>
<c:forEach
var=
"elm"
items=
"${basket.elements}"
>
<li>
${elm.productName} (${elm.quantity}) za
<b>
${elm.value}
</b>
<a
href=
"remove_from_basket?productId=${elm.productId}"
>
(–)
</a></li>
</c:forEach>
</ul>
<p
class=
"total"
>
Do zapłaty: ${basket.totalValue}
</p>
</div>
<form
id=
"wyszukiwarka"
method=
"get"
>
<h2>
Filtr cen
</h2>
<table
class=
"formularz"
>
<tr><td><label
for=
"min_price"
>
Cena minimalna:
</label></td>
<td><input
id=
"min_price"
name=
"min_price"
type=
"number"
value=
"${param.min_price}"
></td></tr>
<tr><td><label
for=
"max_price"
>
Cena maksymalna:
</label></td>
<td><input
id=
"max_price"
name=
"max_price"
type=
"number"
value=
"${param.max_price}"
></td></tr>
<tr><td><button>
Filtruj
</button></td></tr>
</table>
</form>
<jsp:useBean
id=
"productBean"
class=
"sklep.web.ProductBean"
/>
<jsp:setProperty
name=
"productBean"
property=
"minPrice"
param=
"min_price"
/>
<jsp:setProperty
name=
"productBean"
property=
"maxPrice"
param=
"max_price"
/>
<c:forEach
var=
"product"
items=
"${productBean.filteredProducts}"
>
<div
class=
"product"
>
<img
class=
"photo"
src=
"photo?productId=${product.productId}"
alt=
""
/>
<h3>
${product.productName}
</h3>
<div
class=
"price"
>
Cena: ${product.price}
</div>
<div
class=
"price"
>
VAT ${product.vat * 100}%
</div>
<c:if
test=
"${not empty(product.description)}"
>
<p
class=
"description"
>
${product.description}
</p>
</c:if>
<div
class=
"action"
><a
href=
"add_to_basket?productId=${product.productId}"
>
dodaj do koszyka
</a></div>
<div
class=
"action"
><a
href=
"edit?productId=${product.productId}"
>
edytuj
</a></div>
<div
class=
"action"
><a
href=
"photo_upload.jsp?productId=${product.productId}"
>
zmień zdjęcie
</a></div>
</div>
</c:forEach>
<div
class=
"action"
><a
href=
"edit"
>
Dodaj nowy produkt
</a></div>
</body>
</html>
Wielomodulowy/wielomodulowy-web/src/main/webapp/styl.css
0 → 100644
View file @
f2e7f26e
body
{
background-color
:
#FFFFDD
;
font-family
:
'Arial'
,
sans-serif
;
}
/* komentarz w CSS */
h4
{
text-align
:
center
;
}
h2
,
h3
,
h4
{
margin-top
:
0
;
}
.product
{
border
:
solid
2px
blue
;
margin
:
1em
auto
1em
50px
;
padding
:
1em
;
background-color
:
white
;
width
:
800px
;
min-height
:
230px
;
clear
:
right
;
}
.koszyk
{
position
:
fixed
;
right
:
0
;
top
:
0
;
width
:
300px
;
height
:
400px
;
background-color
:
white
;
border
:
outset
3px
green
;
}
#wyszukiwarka
{
background-color
:
#AAEEFF
;
width
:
800px
;
border
:
2px
black
solid
;
margin
:
1em
400px
1em
50px
;
padding
:
1em
;
}
.error
{
background-color
:
#FFFFFF
;
border
:
6px
double
red
;
margin
:
20px
;
padding
:
10px
;
color
:
red
;
}
.photo
{
display
:
block
;
float
:
right
;
max-width
:
300px
;
max-height
:
200px
;
margin
:
5px
;
}
.description
{
font-size
:
smaller
;
font-style
:
italic
;
}
div
.action
{
font-size
:
smaller
;
font-family
:
'Arial'
,
sans-serif
;
font-weight
:
bold
;
background-color
:
#DDDDDD
;
border
:
2px
#444466
outset
;
padding
:
6px
;
margin
:
4px
auto
4px
4px
;
max-width
:
200px
;
}
.action
:hover
{
background-color
:
#EEEEEE
;
border
:
2px
#4455CC
outset
;
}
.action
:active
{
background-color
:
#EEEEEE
;
border
:
2px
#CC4455
inset
;
}
.action
a
{
display
:
inline-block
;
color
:
inherit
;
text-decoration
:
none
;
width
:
100%
;
}
.action
a
:hover
{
color
:
#0000CC
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment