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>
  ......
一个项目中会在多个JSP界面中使用下拉框,日期控件,分页控件。若能将此类控件抽象出来,做成一个JspTag的话,那使用起来就方便多了。同时便于JSP的阅读,更主要的是方便了项目的管理与维护。
下面以行业下拉框控件为例介绍自定义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>
<!--
  ......
配置程序的运行目录与JDBC数据源:
<Context path="/test" docBase="F:\JSPLesson\test" reloadable="true">
<Resource name="jdbc/bookstore" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="root" password="123456"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/bookstore?autoReconnect=true"/>
</Context>
JSP中通过如下方式得到数据库连接:
<%
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/bookstore");
Connection conn = ds.getConnection();
%> ......
JSTL的目标是为了简化JSP页面而设计。对于页面设计人员来说,使用脚本语言(JSP默认是Java)操作动态数据是比较困难的,而采用标签和表达式语言则相对容易些,JSTL的使用为页面设计人员和程序开发人员的分工协作提供了便利。
JSTL虽然叫做标准标签库,但实际上是由5个不同功能的标签库组成。这里只介绍常用的Core标签库
Core标签库主要包括了一般用途的标签、条件标签、迭代标签和URL相关的标签。在JSP页面中使用Core标签库,要使用taglib指令,指定引用的标签库,如下:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<s:set>
设置范围变量的值
<s:set var="user" value="zhangsan" scope="session"/>
或
<s:set var="user" scope="session">zhangsan</s:set>
设置对象的属性值
<s:set target="${user}" value="18" property="age"/>
或
<s:set target="${preferences}" property="color">${param.color}</c:set>
条件标签:
例
<c:choose>
<c:when test="${param.name='zhangsan'}">
${param.name} is ma ......
<jsp:useBean>动作用于实例化JavaBean,或者定位一个已经存在的JavaBean实例,并把实例的引用赋给一个变量。
语法如下:
<jsp:useBean id="cart" scope="session" class="org.sunxin.lesson.jsp.bookstore.CartBean">
<jsp:setProperty>动作和<jsp:useBean>一起使用,用来设置JavaBean的简单属性和索引属性。
语法如下:
<jsp:setProperty name="cart" property="goodsname" value="name"/>
<jsp:getProperty>动作用来访问一个Bean属性,并把属性的值转化成一个String,然后发送到输出流中。如果属性是一个对象,将调用属性的toString()方法。
语法如下:
<jsp:getProperty name="cart" property="propertyName"/> ......
JSP的运行机制:
JSP容器管理JSP页面生命周期的两个阶段:转换阶段和执行阶段。当有一个对JSP页面的客户请求到来时,JSP容器检验JSP页面的语法是否正确,将JSP页面转换为Servlet源文件,然后调用javac工具类编译Servlet源文件生成字节码文件,这一阶段是转换阶段。接下来,Servlet容器加载转换后的Servlet类,实例化一个对象处理客户端的请求,在请求处理完成后,相应对象被JSP容器接收,容器将HTML格式的响应信息发送到客户端,这一阶段是执行阶段。
一个JSP页面由元素和模板数据组成。元素是必须由JSP容器处理的部分,而模板是JSP容器不处理的部分,例如,JSP页面中的HTML内容会直接发送到客户端。在JSP2.0规范中,元素有三种类型:指令元素,脚本元素,动作元素。
1 JSP的指令元素:
指令元素主要用于为转换阶段提供整个JSP页面的相关信息,指令不会产生任何的输出到当前的输出流中。
1.1 page指令:<%@ page attr1="value1" attr2="value2">
page指令有13个属性.
language="java" 指定在脚本元素中使用的脚本语言,默认是Java
extends="className" 指定JSP页面转换后的Servlet类从哪个类继承,属性值是完整的限定类名。通常不需要使用这个属性,JSP ......