2011-02-15 55 views
3

我知道使用JSP腳本通常是不被接受的,這就是爲什麼我想知道是否有一種更優雅的方式來實現我正在嘗試做的事情。我正在創建一個視圖,並且根據域模型中的某些情況,我呈現不同的HTML。這是使用JSP腳本的可接受情況嗎?

例如,考慮的方案,其中一個用戶可以在一個角色。而這樣的方法對用戶模型類中定義:

public boolean isInRole(String roleName) { 
    // Logic here to determine if the user is in a role 
} 

然後我們有一個JSP,如下圖所示:

<% 
    User user = (User)request.getAttribute("user"); 
%> 

// Some HTML here... 

<% if (user.isInRole("admin") { %> 
    // Generate some admin menu here 
<% } %> 

據我所知,這不能使用JSTL完成/ EL。這裏使用scriptlets聽起來像個好主意嗎?或者我應該採取另一種方法?

感謝您的任何建議。

回答

5

您也可以創建自定義標籤來完成此操作。這裏是一個裸露的骨頭例如:

創建一個新的TLD文件: WEB-INF/user.tld

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag 
Library 1.2//EN" 
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> 
<taglib> 
    <tlib-version>1.0</tlib-version> 
    <jsp-version>1.2</jsp-version> 
    <short-name></short-name> 
    <tag> 
     <name>user</name> 
     <tag-class>tags.UserRoleTag</tag-class> 
     <body-content>JSP</body-content> 
     <attribute> 
      <name>roles</name> 
      <required>true</required> 
      <rtexprvalue>true</rtexprvalue> 
     </attribute> 
    </tag> 
</taglib> 

創建自定義標籤種類: 標籤/ UserRoleTag.java

package tags; 

import javax.servlet.jsp.JspException; 
import javax.servlet.jsp.tagext.TagSupport; 

@SuppressWarnings("serial") 
public class UserRoleTag extends TagSupport { 
    private String roles; 

    public int doStartTag() throws JspException { 
    String userRole = (String)pageContext.getAttribute("currentUserRole"); 

    return roles.contains(userRole) ? EVAL_BODY_AGAIN : SKIP_BODY; 
    } 

    public String getRoles() { 
    return roles; 
    } 

    public void setRoles(String roles) { 
    this.roles = roles; 
    } 
} 

創建您的jsp:warfolder/home.jsp

<%@ taglib uri="/WEB-INF/user.tld" prefix="u" %> 

<% pageContext.setAttribute("currentUserRole", "admin"); // this value would come from the controller... %> 

<u:user roles="admin registered"> 
    welcome admin! 
</u:user> 

<u:user roles="guest"> 
    welcome guest! 
</u:user> 

羚牛g這種方法可以讓您的模型和標籤鬆散耦合,並且很可能可以在其他項目中重複使用。

8

我想無論是升級到Servlet的3.0/JSP 2.2哪裏調用帶有參數的方法是允許在EL

<c:if test="${user.isInRole('admin')}"> 

或者創建自定義EL函數

<c:if test="${util:isUserInRole(user, 'admin')}"> 

根據您的問題的歷史,你似乎已經在使用JEE6了。所以第一種方法應該適用於你(如果你的web.xml被聲明符合Servlet 3.0規範)。

2

經驗,我用的是小腳本(或JSP標籤或EL爲此事)只能使用已經成立了由控制器,而不是觸發與後端系統和交互行爲模型中的規則得到東西。

的差別往往是微妙的,但在我看來是相當顯著。在您的示例中,讓我們說確定用戶是否具有管理角色,需要您訪問某個數據庫或進行Web服務調用。然後,您將通過從視圖中觸發該操作來違反MVC。無論是從scriptlet還是JSP標記或EL調用操作都無關緊要。你已經完成了最好由控制器完成的任務。

那麼我將如何解決這個問題?我會把確定用戶是否在管理員角色中的邏輯放到控制器中。然後,我會在模型中提供此信息,以便視圖可以使用模型來確定用戶是否具有管理員角色。 一個簡單的$ {user.isAdmin}會從視圖中回答問題。該觀點不會被「指責」觸發任何行動。

所以,我是被作爲一個堅持己見的人對這種禁令的純粹?我發現,在許多情況下,如果需要優化應用程序,我可以更輕鬆地掃描控制器並優化他們正在做的事情。如果視圖也觸發後端工作,那麼進行這種優化將非常困難,因爲後端交互將分散在多個控制器和視圖中。

這也違反了單一職責原則。希望這回答你的問題。

順便說一句,很好的問題。我很高興你正在考慮這個細節。

相關問題