这是使用JSP scriptlet的可接受的案例吗?

Bri*_*asa 3 java model-view-controller jsp servlets java-ee

我知道使用JSP scriptlet通常是不受欢迎的,这就是为什么我想知道是否有一种更优雅的方式来实现我想要做的事情.我正在创建一个视图,并且根据域模型中的某些情况,我正在呈现不同的HTML.

例如,考虑用户可能处于角色中的场景.这样的方法在User模型类中定义:

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

然后我们有一个JSP,如下所示:

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

// Some HTML here...

<% if (user.isInRole("admin") { %>
    // Generate some admin menu here
<% } %>
Run Code Online (Sandbox Code Playgroud)

据我所知,使用JSTL/EL无法做到这一点.在这里使用scriptlet听起来是个好主意吗?或者我应该采取另一种方法吗?

谢谢你的任何建议.

Bal*_*usC 8

我要么升级到Servlet 3.0/JSP 2.2,要么在EL中调用带参数的方法

<c:if test="${user.isInRole('admin')}">
Run Code Online (Sandbox Code Playgroud)

或创建自定义EL功能

<c:if test="${util:isUserInRole(user, 'admin')}">
Run Code Online (Sandbox Code Playgroud)

根据您的问题历史,您似乎已经在使用JEE6.所以第一种方法应该适合你(如果你web.xml的声明符合Servlet 3.0规范).


Mat*_*att 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>
Run Code Online (Sandbox Code Playgroud)

创建自定义标记类:tags/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;
  }
}
Run Code Online (Sandbox Code Playgroud)

创建你的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>
Run Code Online (Sandbox Code Playgroud)

采用这种方法可以使您的模型和标签保持松散耦合,并且最有可能在其他项目中重复使用.