2008-10-31 15 views
6

Trong JSP Tôi có thể tham khảo tài sản của đậu bằng cách sử dụng thẻ $ {} object.propertyJSP tag đậu cho tài sản đó có thể không tồn tại

Có một số cách để đối phó với những đặc tính mà có thể không tồn tại? Tôi có một trang JSP cần phải xử lý các loại khác nhau. Ví dụ:

public class Person { 
    public String getName() 
} 
public class Employee extends Person { 
    public float getSalary() 
} 

Trong JSP Tôi muốn hiển thị bảng người có cột tên và tiền lương. Nếu người đó không phải là nhân viên thì tiền lương sẽ được để trống. HTML hàng có thể trông giống như:

<tr> 
    <td><c:out value="${person.name}"></td> 
    <td><c:out value="${person.salary}"></td> 
</tr> 

Thật không may nếu người đó không phải là nhân viên thì không thể tìm thấy mức lương và lỗi xảy ra. Làm thế nào tôi sẽ giải quyết điều này trong JSP?

Chỉnh sửa: Có một số instanceof kiểm tra bằng ngôn ngữ thẻ JSP không?

Trả lời

7

Chỉ cần sử dụng toán tử rỗng EL NẾU nó là một thuộc tính có phạm vi, không may bạn sẽ phải đi với xung quanh biểu hiện của bạn sử dụng employee.salary với < c: catch >:

<c:catch var="err"> 
    <c:out value="${employee.salary}"/> 
</c:catch> 

Nếu bạn thực sự cần instanceof, bạn có thể lừa sider một thẻ tùy chỉnh.

+0

Tôi _knew_ có cách dễ dàng hơn ... DOH! –

+0

Sử dụng Tomcat 5.5 điều này sẽ ném một ngoại lệ nếu thuộc tính không thực sự tồn tại trên đối tượng như trong trường hợp ví dụ được hiển thị ở trên. – laz

+0

Xác nhận, điều này không có tác dụng nếu người đó không có tài sản tiền lương. –

0

Bạn luôn có thể có trường loại.

public class Person { 
    public String getType() { return "Person"; } 
    public String getName() 
} 
public class Employee extends Person { 
    public String getType() { return "Employee"; } 
    public float getSalary() 
} 

JSP của bạn sẽ trông giống như

<tr> 
    <td><c:out value="${person.name}"></td> 
    <td><c:if test="'Employee' eq person.type"><c:out value="${person.salary}"></c:if></td> 
</tr> 

Tất nhiên lớp Class đã có này ...

<tr> 
    <td><c:out value="${person.name}"></td> 
    <td><c:if test="'Employee' eq person.class.simpleName"><c:out value="${person.salary}"></c:if></td> 
</tr> 

Bạn cũng có thể có 'phương pháp' isEmployee().

1

Một phương pháp là tạo thư viện thẻ tùy chỉnh và sử dụng đa hình trong đó để xử lý trường hợp trong đó Personlà mộtEmployee.

Tôi đã không làm điều này trong một thời gian cho JSP, nhưng thường sử dụng một kỹ thuật tương tự trong GSP (Groovy/Grails Server Pages).

Nếu không, bạn có thể đặt một số logic trong JSP (không lý tưởng) để kiểm tra Employee -ness:

<% 
    String salary 
    if (person instanceof Employee) { 
     salary = person.salary 
    } else { 
     salary = "" // or '&nbsp;' 
    } 
%> 
<td><c:out value="${salary}"></td> 
4

Nếu bạn muốn lớp học, chỉ cần sử dụng ${person.class}. Bạn cũng có thể sử dụng ${person.class.name eq 'my.package.PersonClass'}

Bạn cũng có thể sử dụng "mặc định" trên c: out.

<c:out value='${person.salary}' default="Null Value" /> 
+0

Đây chính xác là những gì tôi đang tìm kiếm! Tôi sử dụng một thẻ và thuộc tính simpleName của lớp và tôi có thể hiển thị từng trường duy nhất của lớp con của tôi.

3

Ngắn gọn nhưng không được chọn.

<tr> 
    <td>${person.name}</td>  
    <td>${person.class.simpleName == 'Employee' ? person.salary : ''}</td> 
</tr> 

Có thể kiểm tra ngôn ngữ thẻ JSP không?

Không phải tại thời điểm viết bài này. Tôi đọc ở đâu đó mà họ đã đặt trước, thể hiện của từ khóa, trong EL, có thể là tương lai. Hơn nữa, có một thư viện có sẵn mà có thẻ cụ thể này. Hãy xem xét điều đó trước khi quyết định tạo một số thẻ tùy chỉnh cho chính bạn. Đây là liên kết, Unstandard Tag Library.