`
qieyi28
  • 浏览: 157516 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JSP 中使用常量防止硬编码

 
阅读更多

   jsp页面硬编码是个很头疼的问题,工作这么多年,看到好多项目都有这种问题,这里介绍下如何防止页面硬编码吧

     Java程序中可以通过静态常量的方法来避免硬编码。如果JSP中允许使用Scriplet的话当然也可以直接使用常量了,不过现在JSP中一般不允许出现<%%>这样的代码,比如在JSTL中怎么办呢?我们不希望看到如下代码:

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

 

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

 

第一步、/WEB-INF/tld/下建立my-tag.tld描述文件:

注意:根据JSP2.1规范,tld文件不能存放在/WEB-INF/classes或者/WEB-INF/lib目录中,特别不能放在/WEB-INF/tags目录或子目录中,否则会出现错误:
 exception:org.apache.jasper.JasperException: PWC6180: Unable to initializeTldLocationsCache
 root cause:org.apache.jasper.JasperException: PWC6336: Illegal TLD path/WEB-INF/tags/fn.tld, must not start with “/WEB-INF/tags”
 在
TomcatWeblogic中不会出现该问题,GlassFish则严格遵照规范,可将tld文件放置在/WEB-INF/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>

 

 

第二步、创建JAVA处理代码 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();
     }
}

 

     创建常量类MyConstant:

package cn.hshb.common;

public final class MyConstant {

	public static String STATE_01 = "1";
	
	
}

 

 

 

第三步、web.xml中配置<jsp-config/>

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

 

 

第四部、JSP头部引入

<%@ taglib prefix="my-tag" uri="/my-tag" %>
<my-tag:MyConstant var="STATE_01"/>

 

现在用${STATE_01}便可使用常量。

再来看下与最初硬编码的区别

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

</c:if>

 

 

 

 

 

分享到:
评论

相关推荐

    JAVA编码规范

    - 避免硬编码,使用常量代替。 #### 常量 - 定义全局不变量,提升代码可维护性。 #### main方法 - 主方法签名应为`public static void main(String[] args)`。 #### 构造方法 - 与类同名,用于对象初始化。 ### ...

    struts框架软件国际化

    2. 使用常量定义资源文件键,避免硬编码,提高代码可读性和维护性。 3. 在开发阶段,定期检查不同语言环境下的显示效果,确保文本正确无误。 4. 考虑到日期、时间、货币等的格式化问题,使用`java.text....

    ejb编码规范实例

    避免硬编码依赖关系,使组件更易于重用和配置。 9. **性能优化**:考虑缓存策略、批处理操作、懒加载等技术,以提高EJB的性能。同时,避免在方法内创建过多的临时对象,减少内存消耗。 10. **测试**:编写单元测试...

    ENOVIA-Development Best Practices.pptx

    Headings 是指在 Java/JPO 程序中使用的标题。Headings 需要遵守以下规则: * Java/JPO 程序 headings 应该遵守以下格式:&lt;类名&gt;_&lt;方法名&gt; * JSP headings 应该遵守以下格式:&lt;页面名&gt;_&lt;方法名&gt; ENOVIA ...

    Struts教程.rar

    在实际开发中,为避免硬编码和增强代码可读性,应遵循一些最佳实践。例如,使用Struts的常量类定义所有常量,而不是在代码中直接写死;利用Tiles进行页面布局,提高UI设计的灵活性;使用ActionSupport和Validation...

    项目命名规范

    鼓励使用常量代替硬编码数值,提高代码的可读性和可维护性。 ### 5. 方法的命名规范(MethodsNames) - **规则-1**:方法名采用驼峰命名法,首字母小写,后续每个单词首字母大写。 - **规则-2**:避免在方法名中...

    软件开发规范

    此外,还需遵循一些其他的编码规范,如适当的空格和缩进,适当的异常处理,避免硬编码,使用注解来提供额外的信息等。每个团队或公司可能有自己的定制化规范,但基础的软件开发规范是所有开发者都应该遵循的。通过...

    Struts2文件上传.docx

    值得注意的是,文件名不应硬编码在配置文件中,而应根据实际文件路径动态获取。 在进行文件上传和下载时,还需要考虑安全性问题,比如防止文件覆盖、非法文件上传以及内存溢出等。此外,为了提高用户体验,你还可以...

    Struts 标签文档

    - 避免了在JSP页面中使用Java脚本,使页面更加清晰,易于维护。 - 提供了与Struts框架的紧密集成,简化了业务逻辑和视图的交互。 - 通过使用标准标签,提高了代码的可读性和可重用性。 6. **Struts标签文档的...

    init-parameter和context-parameter区别

    例如,一个处理用户登录的Servlet可能需要一个`init-parameter`来指定数据库连接字符串,这样可以确保安全性并避免硬编码敏感信息。 - **使用`context-parameter`**:对于那些需要在多个组件间共享的数据,如应用的...

    The Java Language Specification, Java SE 6 Edition.rar

    枚举提供了更安全的常量表示,避免了硬编码和类型转换错误。 7. 异常处理:Java使用异常处理机制来捕获和处理运行时错误。try-catch-finally结构用于包围可能抛出异常的代码,catch块处理特定类型的异常,finally块...

    struts1&struts2

    5. **JSP视图**: 用于展示数据,通常使用Struts标签库来减少硬编码和提高可维护性。 **Struts2框架** Struts2是Struts1的后续版本,它吸取了其他框架如Spring、WebWork的优点,提供了更强大和灵活的特性。Struts2...

    jdk-1_5_0_10-windows-i586-p.rar_jdk_jdk-1_5_0_10_jdk1.5.0_10_jdk

    3. **枚举类型**:为Java引入了枚举,使得定义常量集合更加规范和安全,避免了硬编码值可能导致的错误。 4. **变量赋值的增强for循环**:也称为foreach循环,使得遍历数组或集合变得更加简洁。 5. **可变参数**:...

    java开发经理面试

    2. **编码规范**:遵循良好的编码规范,如使用有意义的变量名、注释清晰、避免硬编码等,可以提高代码的可读性和维护性。 #### 七、并发编程 1. **线程同步**:Java提供多种机制来保证多线程环境下的数据一致性,...

    Web项目最基本的架构

    4. **com.web.constant**:这个包存储应用中的常量和静态变量,用于全局配置和避免硬编码。 5. **com.web.exception**:自定义异常包,简化异常处理,为其他包提供自定义异常服务。 6. **com.web.util**:工具包,...

    Eclipse最全快捷键 分享便捷与快乐(1)

    25. **Ctrl+Shift+L**:抽取本地变量,将常量或硬编码值转化为局部变量。 26. **Ctrl+Shift+F**:格式化代码,统一代码风格。 27. **Ctrl+Shift+P**:定位匹配的括号,检查括号匹配是否正确。 28. **Ctrl+Shift+X...

Global site tag (gtag.js) - Google Analytics