Thức ăn cho vật nuôi
I.
Bài toán
Một
cửa hàng bày bán các loại thức ăn cho vật nuôi như
sau:
Loại
(grade)
|
Giá
(cents/lb.)
|
A
|
30
|
B
|
20
|
C
|
10
|
Hãy
phát triển một web application để xác định giá của một
loại thức ăn cho trước. Dưới đây là một UI mẫu.
II.
Giải pháp
Project:
PetFoodJSF
1.
Thiết kế UI screen
Để
trình bày tất cả các loại thức ăn cho user lựa chọn,
ta dùng <select> tag
(drop-down list), trong đó mỗi loại thức ăn được đặt
vào một <option>
tag.
2.1.
Thiết kế managed bean
Quan
sát UI screen, ta thấy có một input component là loại thức
ăn mà user chọn (selectedGrade), một output component là
giá tương ứng với loại thức ăn đã chọn (price),
và hai hành vi: xác định giá (showPrice) và xóa data (clear).
Ngoài ra, để tăng tính động cho application, ta sẽ chuyển tất cả các loại thức ăn định nghĩa bên trong UI screen về managed bean, và đặt chúng vào một array.
Thêm
vào đó, data cung cấp cho grades
array sẽ lấy từ một kiểu liệt kê (enum) gọi là Grade.
Từ nay về sau, khi muốn thêm hay bớt số loại thức ăn,
ta chỉ cần thao tác trên enum này.
2.2. Tạo fields và methods cho managed bean
Grade.java
package data;
public enum Grade {
A, B, C
}
Index.java
package controller;
import data.Grade;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
@Named(value = "index")
@RequestScoped
public class Index {
private Grade selectedGrade;
private Integer price;
public Index() {
}
public void showPrice() {
// TODO
}
public void clear() {
selectedGrade = null;
price = null;
}
public Grade getSelectedGrade() { return selectedGrade; }
public void setSelectedGrade(Grade selectedGrade) {
this.selectedGrade = selectedGrade;
}
public Integer getPrice() { return price; }
public Grade[] getGrades() { return Grade.values(); }
}
Lưu
ý là trong code trên, ta không khai báo grades[] field
như đã được chỉ định trong thiết kế, mà ta có thể
cung cấp trực tiếp thông qua getGrades()
getter.
2.3.
Ràng buộc UI screen với managed bean
Đối
với loại thức ăn, ta thay <select>
tag của HTML bằng <h:seclectOneMenu>
của JSF.
Để
UI screen có thể tiếp nhận tất cả các loại thức ăn
từ managed bean, ta lồng <f:selectItems>
tag vào trong <h:selectOneMenu>.
Khi
user chọn một loại thức ăn, ta cần ràng buộc giá trị
chọn lựa này với selectedGrade
bên trong managed bean, thông qua attributevalue của <h:selectOneMenu>.
Đối
với các component khác, ngoài Clear button, ta làm theo chỉ dẫn của những
bài trước.
2.4.
Xóa form ở phía browser
Khác
với những bài trước, ngoài ô nhập, UI screen của bài
này còn có một drop-down list, thể hiện thông quả
<select>
tag. Như vậy, JavaScript code cần bổ sung khả năng xóa
drop-down list này, tức chuyển nó về option đầu tiên. Ta
đặt đoạn JavaScript code sau vào clearForm.js
file và khai báo file này trong index.xhtml.
clearForm.js
function clearForm(form) {
clearInputTexts(form.getElementsByTagName('input'));
clearSelects(form.getElementsByTagName('select'));
}
function clearInputTexts(inputs) {
for (i = 0; i < inputs.length; i++)
if (inputs[i].type == 'text')
inputs[i].value = '';
}
function clearSelects(selects) {
for (i = 0; i < selects.length; i++)
selects[i].selectedIndex = 0;
}
Hình
10
3.
Phát triển model
3.1.
Design
3.2.
Test class
package model;
import data.Grade;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class PetFoodTest {
@Test
public void getPrice() {
assertEquals(30, new PetFood(Grade.A).getPrice());
assertEquals(20, new PetFood(Grade.B).getPrice());
assertEquals(10, new PetFood(Grade.C).getPrice());
}
}
3.3.
Main class
package model;
import data.Grade;
import java.util.NoSuchElementException;
public class PetFood {
private Grade grade;
public PetFood(Grade grade) {
this.grade = grade;
}
public int getPrice() {
if (this.grade == Grade.A)
return 30;
else if (this.grade == Grade.B)
return 20;
else if (this.grade == Grade.C)
return 10;
else
throw new NoSuchElementException("Unknown price for grade " + grade);
}
}
4.
Kết nối managed bean với model
III.
Tổng kết
Bài
viết đã trình bày việc vận dụng <h:selectOneMenu>
tag của JSF để phát triển UI cho bài toán xác định giá
cả của một loại thức ăn cho vật nuôi. Ngoài
ra, bài còn bổ sung JavaScript code để tái khởi động một
drop-down list trong form.
IV.
Tài liệu tham khảo
- Gaddis T. (2010) Starting Out with Java: From Control Structures Through Objects, 4th edition, Pearson Education, Boston. Chương 3.
- Clear a form with JavaScript. http://www.electrictoolbox.com/javascript-clear-form/
bai viet rat hay. thanks
Trả lờiXóa