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”
在Tomcat和Weblogic中不会出现该问题,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>
相关推荐
- 避免硬编码,使用常量代替。 #### 常量 - 定义全局不变量,提升代码可维护性。 #### main方法 - 主方法签名应为`public static void main(String[] args)`。 #### 构造方法 - 与类同名,用于对象初始化。 ### ...
2. 使用常量定义资源文件键,避免硬编码,提高代码可读性和维护性。 3. 在开发阶段,定期检查不同语言环境下的显示效果,确保文本正确无误。 4. 考虑到日期、时间、货币等的格式化问题,使用`java.text....
避免硬编码依赖关系,使组件更易于重用和配置。 9. **性能优化**:考虑缓存策略、批处理操作、懒加载等技术,以提高EJB的性能。同时,避免在方法内创建过多的临时对象,减少内存消耗。 10. **测试**:编写单元测试...
Headings 是指在 Java/JPO 程序中使用的标题。Headings 需要遵守以下规则: * Java/JPO 程序 headings 应该遵守以下格式:<类名>_<方法名> * JSP headings 应该遵守以下格式:<页面名>_<方法名> ENOVIA ...
在实际开发中,为避免硬编码和增强代码可读性,应遵循一些最佳实践。例如,使用Struts的常量类定义所有常量,而不是在代码中直接写死;利用Tiles进行页面布局,提高UI设计的灵活性;使用ActionSupport和Validation...
鼓励使用常量代替硬编码数值,提高代码的可读性和可维护性。 ### 5. 方法的命名规范(MethodsNames) - **规则-1**:方法名采用驼峰命名法,首字母小写,后续每个单词首字母大写。 - **规则-2**:避免在方法名中...
此外,还需遵循一些其他的编码规范,如适当的空格和缩进,适当的异常处理,避免硬编码,使用注解来提供额外的信息等。每个团队或公司可能有自己的定制化规范,但基础的软件开发规范是所有开发者都应该遵循的。通过...
值得注意的是,文件名不应硬编码在配置文件中,而应根据实际文件路径动态获取。 在进行文件上传和下载时,还需要考虑安全性问题,比如防止文件覆盖、非法文件上传以及内存溢出等。此外,为了提高用户体验,你还可以...
- 避免了在JSP页面中使用Java脚本,使页面更加清晰,易于维护。 - 提供了与Struts框架的紧密集成,简化了业务逻辑和视图的交互。 - 通过使用标准标签,提高了代码的可读性和可重用性。 6. **Struts标签文档的...
例如,一个处理用户登录的Servlet可能需要一个`init-parameter`来指定数据库连接字符串,这样可以确保安全性并避免硬编码敏感信息。 - **使用`context-parameter`**:对于那些需要在多个组件间共享的数据,如应用的...
枚举提供了更安全的常量表示,避免了硬编码和类型转换错误。 7. 异常处理:Java使用异常处理机制来捕获和处理运行时错误。try-catch-finally结构用于包围可能抛出异常的代码,catch块处理特定类型的异常,finally块...
5. **JSP视图**: 用于展示数据,通常使用Struts标签库来减少硬编码和提高可维护性。 **Struts2框架** Struts2是Struts1的后续版本,它吸取了其他框架如Spring、WebWork的优点,提供了更强大和灵活的特性。Struts2...
3. **枚举类型**:为Java引入了枚举,使得定义常量集合更加规范和安全,避免了硬编码值可能导致的错误。 4. **变量赋值的增强for循环**:也称为foreach循环,使得遍历数组或集合变得更加简洁。 5. **可变参数**:...
2. **编码规范**:遵循良好的编码规范,如使用有意义的变量名、注释清晰、避免硬编码等,可以提高代码的可读性和维护性。 #### 七、并发编程 1. **线程同步**:Java提供多种机制来保证多线程环境下的数据一致性,...
4. **com.web.constant**:这个包存储应用中的常量和静态变量,用于全局配置和避免硬编码。 5. **com.web.exception**:自定义异常包,简化异常处理,为其他包提供自定义异常服务。 6. **com.web.util**:工具包,...
25. **Ctrl+Shift+L**:抽取本地变量,将常量或硬编码值转化为局部变量。 26. **Ctrl+Shift+F**:格式化代码,统一代码风格。 27. **Ctrl+Shift+P**:定位匹配的括号,检查括号匹配是否正确。 28. **Ctrl+Shift+X...