`

JSP(JSTL)中使用常量防止硬编码

 
阅读更多
this.state="01";通常的做法是写一个类(接口)来存放常量
public interface MyConstant
{
public static final String STATE_01= "01";
}

然后在程序中这样写就可以了
this.state=MyConstant.STATE_01;


在Java程序中这样就可以避免硬编码了。可是JSP中呢?当然,如果JSP中允许使用Scriplet的话当然也可以直接使用常量了,不过现在JSP中一般不允许出现<%%>这样的代码,比如在JSTL中怎么办呢?

<c:if test=${state=='01'}>

</c:if>

这样又出现了'01'这样的硬编码了,该如何使用常量类中的变量呢?

下面介绍用JspTag的方式来处理:

首先在/WEB-INF/tags/下建立my-tag.tld描述文件:

<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="
http://java.sun.com/xml/ns/j2ee "
xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance "
xsi:schemaLocation="
http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd "
version="2.0">
    <description>my tag</description>
    <display-name>my tag</display-name>
    <tlib-version>1.0</tlib-version>
    <short-name>my-tag</short-name>
    <uri>/my-tag</uri>

    <tag>
    <!--
        在JSP中初始化MyConstant常量,以便JSTL中引用。
        jsp中使用范例:<my-tag:MyConstant var="常量名称"/>
        必填参数var:指定初始化MyConstant中某个变量,如果为空,则报异常
        可选参数scope:变量作用范围,默认为page
   -->
        <description>MyConstant常量</description>
        <name>MyConstant</name>
        <tag-class>com.test.util.tag.MyConstantTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
            <description>必填参数var:指定初始化MyConstant中某个变量,为空则报异常</description>
            <name>var</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
         </attribute>
        <attribute>
            <description>变量作用范围(默认为page)</description>
            <name>scope</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
         </attribute>

    </tag>

</taglib>

还要在web.xml中配置<jsp-config/>:

<jsp-config>

    <taglib>
        <taglib-uri>/my-tag</taglib-uri>
        <taglib-location>/WEB-INF/tags/my-tag.tld
        </taglib-location>
    </taglib>

</jsp-config>

JSP中:

头部引入:<my-tag:MyConstant var="STATE_01"/>

用${STATE_01}便可使用常量

之前的情况就可以像如下方式一样使用java的常量:

<c:if test=${state==STATE_01}>

</c:if>

当然最重要的还是com.test.util.tag.MyConstantTag,它继承了TagSupport并重写doStartTag()方法,才使得JSP中可以直接使用java中的常量:

关于这个类,还是大家自己体会吧,用的时候复制就可以了。

public class MyConstantTag extends TagSupport {
    private static final long serialVersionUID = 3258417209566116146L;
    private final Log log = LogFactory.getLog(MyConstantTag.class);
    public String clazz = MyConstant.class.getName();
    protected String scope = null;
    protected String var = null;

    public int doStartTag() throws JspException {
        Class c = null;
        int toScope = PageContext.PAGE_SCOPE;
        if (scope != null) {
            toScope = getScope(scope);
        }
        try {
            c = Class.forName(clazz);
        } catch (ClassNotFoundException cnf) {
           log.error("ClassNotFound - maybe a typo?");
            throw new JspException(cnf.getMessage());
        }

       try {
            if (var == null || var.length() == 0) {
                throw new JspException("常量参数var必须填写!");
            } else {
                try {
                    Object value = c.getField(var).get(this);
                    pageContext.setAttribute(c.getField(var).getName(), value, toScope);
                } catch (NoSuchFieldException nsf) {
                    log.error(nsf.getMessage());
                    throw new JspException(nsf);
                }
            }
         } catch (IllegalAccessException iae) {
            log.error("Illegal Access Exception - maybe a classloader issue?");
            throw new JspException(iae);
        }
     return (SKIP_BODY);
}
/**
* @jsp.attribute
*/
    public void setScope(String scope) {
        this.scope = scope;
    }

    public String getScope() {
        return (this.scope);
    }

/**
* @jsp.attribute
*/
    public void setVar(String var) {
        this.var = var;
     }

    public String getVar() {
        return (this.var);
    }

/**
* Release all allocated resources.
*/
    public void release() {
        super.release();
        clazz = null;
        scope = MyConstant.class.getName();
    }

    private static final Map scopes = new HashMap();
        static {
            scopes.put("page", new Integer(PageContext.PAGE_SCOPE));
            scopes.put("request", new Integer(PageContext.REQUEST_SCOPE));
            scopes.put("session", new Integer(PageContext.SESSION_SCOPE));
            scopes.put("application", new Integer(PageContext.APPLICATION_SCOPE));
        }
        public int getScope(String scopeName) throws JspException {
            Integer scope = (Integer) scopes.get(scopeName.toLowerCase());

        if (scope == null) {
            throw new JspException("Scope '" + scopeName + "' not a valid option");
        }

        return scope.intValue();
     }
}

分享到:
评论

相关推荐

    jsp中使用jstl标签的驱动

    在Java Web开发中,JSP(JavaServer Pages)是一种用于创建动态网页的技术,而JSTL(JavaServer Pages Standard ...在实际开发中,应当尽可能地避免在JSP页面中直接写Java脚本,转而使用JSTL等标签库来实现业务逻辑。

    jakarta.servlet.jsp.jstl-api-2.0.0.jar

    JSTL的主要目标是减少在JSP页面中使用脚本元素,从而提高代码的可读性和可维护性。 JSTL分为两个主要部分:API和实现。"jakarta.servlet.jsp.jstl-api-2.0.0.jar"包含的是API部分,定义了各种标签接口和类,而...

    最新开发的一套jsp jstl

    10. **最佳实践**:在实际开发中,应尽量避免在JSP页面中使用过多的Java脚本,转而使用JSTL标签来提高代码的可读性和可维护性。 **文件名称列表分析** "newjstl"可能是这个项目的主目录或者压缩包的名称,里面可能...

    在jsp页面中引入jstl

    根据题目中的描述,要在JSP项目中使用JSTL,首先需要将`jstl.jar`和`standard.jar`这两个必要的JAR包导入到项目的`WEB-INF/lib`目录下。这是因为在Web应用程序中,JSP页面通常位于`WEB-INF`目录之外,而类路径...

    jsp中使用JSTL的jar包

    **JSP中使用JSTL的Jar包** JavaServer Pages(JSP)是Java平台上的一个标准技术,用于创建动态web内容。为了增强JSP页面的功能性和可维护性,开发人员常常会使用JSP Standard Tag Library(JSTL)。JSTL提供了一...

    jsp中jstl的jar包

    在JSP中使用JSTL,首先需要引入对应的jar包。在给定的文件中,有两个关键的jar包: 1. **jstl-1.2.jar**: 这是JSTL的核心库,包含了所有JSTL的标签实现。引入这个jar包后,可以在JSP页面中使用JSTL提供的各种标签。...

    jsp中标签JSTL中英文对照的中文帮助文档(chm格式)

    **JSP中的JSTL(JavaServer Pages Standard Tag Library)** JSTL是JavaServer Pages标准标签库,它提供了一套用于处理常见任务的标签,如迭代、条件语句、XML处理、国际化和数据库操作等。JSTL的出现是为了减少在...

    javax.servlet.jsp.jstl-1.2.zip

    在Maven项目中,如果要使用JSTL,可以在POM.xml文件中添加相应的依赖项,如下所示: ```xml &lt;groupId&gt;javax.servlet.jsp.jstl &lt;artifactId&gt;jstl &lt;version&gt;1.2 ``` 这样,Maven会自动下载并管理JSTL的相关依赖,...

    jsp中的jstl

    jsp中简单的jstl应用,让你理解什么是jstl以及如何运用好jstl

    Java web常用包javax.servlet.jsp.jstl-1.2.1.zip

    6. **JSTL与EL表达式(Expression Language)**:JSTL通常与JavaServer Pages Expression Language (EL) 结合使用,EL用于在JSP页面中访问和操作Java对象。EL表达式可以在JSTL标签中直接使用,简化了数据绑定。 7. ...

    jsp导入jstl需要的jar包

    导入 JSTL 至 JSP 页面需要特定的 jar 包,以便在页面中使用这些标签。 首先,我们来详细了解一下 JSTL 的核心组件: 1. **core**:这是最基础的模块,提供了基本的控制结构,如迭代、条件判断等。 2. **fmt**:这...

    JSTL标签库-tomcat10-简化JSP中java代码

    然后,就可以在JSP页面中直接使用JSTL标签了。 使用JSTL带来的好处包括: - **提高代码可读性**:将Java代码逻辑移出JSP页面,使得页面更专注于展现逻辑,而不是业务逻辑。 - **增强维护性**:JSTL标签具有统一的...

    网上书店 jsp+jstl1.1+el+sql2000+javabean

    网上书店 jsp jstl1.1+el+sql2000+javabean 网上书店 jsp jstl1.1+el+sql2000+javabean 网上书店 jsp+jstl1.1+el+sql2000+javabean 网上书店 jsp+jstl1.1+el+sql2000+javabean 网上书店 jsp+jstl1.1+el+sql2000+...

    JSP JSTL EL表达式中FN函数使用帮助

    在JavaServer Pages (JSP) 开发中,JSTL(JavaServer Pages Standard Tag Library)是一种标准标签库,用于简化页面编码,提高可维护性。其中,EL(Expression Language)表达式是JSP 2.0引入的一种轻量级脚本语言,...

    用JSTL实现JSP分页显示数据代码(MySQL数据库)

    1. JSTL 的使用:该代码使用 JSTL 实现了 JSP 分页显示数据的功能,详细地演示了 JSTL 的使用方法。 2. MySQL 数据库的使用:该代码使用 MySQL 作为数据库,详细地演示了如何使用 MySQL 数据库。 3. JSP 分页的实现...

    JSP+Servlet+jstl教程PPT版

    JSTL还支持EL(Expression Language),使得在JSP中访问JavaBean属性变得更加方便。 **自定义标签** 是JSP的一个强大特性,允许开发者创建自己的标签库,以满足特定需求。自定义标签可以封装复杂的逻辑,提供简洁的...

    jsp页面用jstl取值

    1. 引入JSTL库:在JSP页面中使用JSTL之前,需要确保项目已经引入了JSTL的jar文件。通常,这会包括`jstl.jar`和`standard.jar`。在`WEB-INF/lib`目录下添加这两个库后,还需要在JSP头部声明JSTL的命名空间: ```jsp ...

    JSTL中文帮助文档

    - EL 可以直接在 JSTL 标签中使用,例如 `${}` 语法。 7. **优点** - 提高代码可读性:JSTL 标签比 JSP 脚本更直观,便于理解。 - 分离关注点:JSTL 有助于实现 MVC 设计模式,将业务逻辑从视图层分离。 - 更少...

    jsp+jstl实现分页

    jsp+jstl实现分页,简单的分页

    javax/servlet/jsp/jstl/core/ConditionalTagSupport

    在Java Web开发中,`javax.servlet.jsp.jspl.core.ConditionalTagSupport`是JSTL(JavaServer Pages Standard Tag Library)库中的一个核心类,用于支持条件标签的实现。当你遇到`java.lang.NoClassDefFoundError: ...

Global site tag (gtag.js) - Google Analytics