Cześć! Tworzę aplikację bankową, której jedną z funkcjonalności jest wyświetlanie historii przelewów klienta.
Aplikację wykonuję przy pomocy Springa oraz Hibernate'a.
Historię chcę wyświetlić w postaci listy.
Poniżej przedstawiam kod, a w komentarzu dodam błąd(zbyt duża liczba znaków)
View:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<title>List Customers</title>
<link rel="stylesheet"
href="<c:url value="/resources/css/styles.css" />" >
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<meta http-equiv="refresh" content="<%=session.getMaxInactiveInterval()%>;url=showMyLoginPage"/>
</head>
<body>
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="#">
<span id="logo">CP</span>
</a>
</div>
<div class="title">
<h3>Client Panel</h3>
<form:form action="${pageContext.request.contextPath}/logout"
method="POST"
id="logout">
<div id="clockdiv"></div>
<input type="submit" value="Logout" class="btn btn-secondary btn-sm"/>
</form:form>
</div>
</div>
</nav>
<!-- new button: -->
<div class="col-xs-3 sidebar">
<div class="sidebar-container">
<input type="button" value="Make Transfer"
onclick="window.location.href='makeTransfer'; return false;"
class="btn btn-primary"
/>
</div>
</div>
<div class="col-xs-9 main">
<!-- add a search box -->
<div class="table-container">
<div class="panel panel-default">
<!-- Default panel contents -->
<div class="panel-heading">Panel heading</div>
<!-- Table -->
<table class="table">
<tr>
<th>Amount</th>
<th>Account Number Sender</th>
</tr>
<!-- loop over customers -->
<c:forEach var="tempOrderItems" items="${orderItems}">
<tr>
<td>${tempOrderItems.amount}</td>
<td>${tempOrderItems.accountNumberSender}</td>
</tr>
</c:forEach>
</table>
</div>
</div>
</div>
<script src="<c:url value="/resources/javaScript/logoutTimer.js" />"></script>
</body>
</html>
Controller:
package main.com.java.controller;
import java.util.ArrayList;
import java.util.List;
import main.com.java.service.business.objectUtils.OrderItemFilter;
import main.com.java.service.domain.interfaces.AccountService;
import main.com.java.service.domain.interfaces.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import main.com.java.entity.Account;
import main.com.java.entity.Customer;
import main.com.java.entity.OrderItem;
import main.com.java.service.domain.interfaces.OrderItemService;
@Controller
@RequestMapping("/user")
public class OrderItemController {
private OrderItemService orderItemService;
private UsersService usersService;
private AccountService accountService;
@Autowired
public OrderItemController(OrderItemService orderItemService, UsersService usersService, AccountService accountService) {
this.orderItemService = orderItemService;
this.usersService = usersService;
this.accountService = accountService;
}
@GetMapping("/makeTransfer")
public String makeTransfer(Model theModel) {
OrderItem theOrderItem = new OrderItem();
theModel.addAttribute("orderitem", theOrderItem);
return "transfer-form";
}
@PostMapping("/saveTransfer")
public String saveTransfer(@ModelAttribute("orderitem") OrderItem theOrderItem,
@ModelAttribute("account") Account account,
@RequestParam("accountNumberSender") String Send,
@RequestParam("accountNumberReceiver") String Rec,
@RequestParam("amount") long amount) {
orderItemService.saveTransfer(theOrderItem, account, Send, Rec, amount);
return "redirect:/user/panel";
}
@RequestMapping("/panel")
public String listCustomers(Model theModel) {
OrderItemFilter orderItemFilter = new OrderItemFilter(usersService, orderItemService, accountService);
List<OrderItem> theOrderItems = orderItemFilter.getSenderOrderItem();
theModel.addAttribute("orderItems", theOrderItems);
return "indexUser";
}
}
OrderItemFiler.getSenderOrderItem():
public List<OrderItem> getSenderOrderItem(){
try{
return orderItemService.getOrderItemListSender(getAccountNumber());
}catch (NullPointerException e){
e.printStackTrace();
List<OrderItem> emptyList = new ArrayList<>();
emptyList.add(new OrderItem(0L,"-","-"));
return orderItemService.getOrderItems();
}
}
getOrderItemListSender():
@Override
@Transactional
public List<OrderItem> getOrderItemListSender(String accountNumberSenderValue) {
String hql = "FROM OrderItem WHERE accountNumberSender=:accountNumberSenderParam";
Query theQuery = createCurrentSession(sessionFactory).createQuery(hql);
theQuery.setParameter("accountNumberSenderParam", accountNumberSenderValue);
System.out.println(theQuery.list());
return theQuery.list();
}
OrderItemDTO:
@Entity
@Table(name="orderitem")
public class OrderItem {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="orderItemID")
private long orderItemID;
@Column(name="amount")
private long amount;
@Column(name="accountNumberSender")
private String accountNumberSender;
@Column(name="accountNumberReceiver")
private String accountNumberReceiver;
@ManyToOne
@JoinColumn(name="accountNumberSender", insertable = false, updatable = false)
private Account senderAccount;
@ManyToOne
@JoinColumn(name="accountNumberReceiver", insertable = false, updatable = false)
private Account receiverAccount;
public OrderItem() {}
public OrderItem(long amount, String accountNumberSender, String accountNumberReceiver) {
this.amount = amount;
this.accountNumberSender = accountNumberSender;
this.accountNumberReceiver = accountNumberReceiver;
}
public Account getSenderAccount() {
return senderAccount;
}
public Account getReceiverAccount() {
return receiverAccount;
}
public void setSenderAccount(Account senderAccount) {
this.senderAccount = senderAccount;
}
public void setReceiverAccount(Account receiverAccount) {
this.receiverAccount = receiverAccount;
}
public long getOrderItemID() {
return orderItemID;
}
public void setOrderItemID(long orderItemID) {
this.orderItemID = orderItemID;
}
public long getAmount() {
return amount;
}
public void setAmount(long amount) {
this.amount = amount;
}
public String getAccountNumberSender() {
return accountNumberSender;
}
public void setAccountNumberSender(String accountNumberSender) {
this.accountNumberSender = accountNumberSender;
}
public String getAccountNumberReceiver() {
return accountNumberReceiver;
}
public void setAccountNumberReceiver(String accountNumberReceiver) {
this.accountNumberReceiver = accountNumberReceiver;
}
}
Tabela orderitem:
CREATE TABLE IF NOT EXISTS `bank_application`.`orderitem` (
`orderItemID` BIGINT(8) NOT NULL AUTO_INCREMENT,
`amount` BIGINT(7) NOT NULL,
`accountNumberSender` VARCHAR(26) CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NOT NULL,
`accountNumberReceiver` VARCHAR(26) CHARACTER SET 'utf8' COLLATE 'utf8_polish_ci' NOT NULL,
PRIMARY KEY (`orderItemID`),
INDEX `accountNumberSender` (`accountNumberSender` ASC),
INDEX `accountNumberReceiver` (`accountNumberReceiver` ASC),
CONSTRAINT `OrderItem_ibfk_1`
FOREIGN KEY (`accountNumberSender`)
REFERENCES `bank_application`.`account` (`accountNumber`)
ON UPDATE CASCADE,
CONSTRAINT `OrderItem_ibfk_2`
FOREIGN KEY (`accountNumberReceiver`)
REFERENCES `bank_application`.`account` (`accountNumber`)
ON UPDATE CASCADE)
ENGINE = InnoDB
AUTO_INCREMENT = 2
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_polish_ci;