首页 > 代码库 > JSP简明教程(五):高级特性

JSP简明教程(五):高级特性

JSP过滤器

过滤器的作用是给web请求增加额外的逻辑,每个页面可以被多个过滤器进行处理。过滤器需要在web.xml文件中进行定义,语法如下。过滤器的执行顺序与filter-mapping的定义顺序相同。
<filter>
  <filter-name>FilterName</filter-name>
  <filter-class>TestFilter</filter-name>
  <init-param>
    <param-name>test-param</param-name>
    <param-value>test-value</param-name>
  </init-param>
</filter>

<filter-mapping>
  <filter-name>TestFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

文件上传

浏览器上传文件的时候,HTTP请求中的MIME类型必须为multipart/form-data。

文件上传的处理需要使用commons-fileupload库和commons-io库。

在服务端,为了获取文件列表,你需要一个ServletFileUpload对象,这样就可以调用它的parseRequest(request)方法来获得文件列表。为了创建ServletFileUpload,你需要一个DiskFileItemFactory,这个类的作用就是将文件保存到内存中,如果保存不下,就保存到磁盘中。因此需要设置内存的使用量和临时文件的存放路径,分别可以通过setSizeThreshold和setRepository方法。下面是完整的例子。

DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置内存中存储文件的最大值
factory.setSizeThreshold(maxMemSize);
// 本地存储的数据大于 maxMemSize.
factory.setRepository(new File("c:\\temp"));

// 创建一个新的文件上传处理程序
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置最大上传的文件大小
upload.setSizeMax( maxFileSize );
// 解析上传的文件
List fileItems = upload.parseRequest(request);

JSTL

在使用JSTL之前首先要下载jakarta-taglibs-standard-x.x.x.zip,并将压缩包中的standard.jar和jstl.jar加入到WEB-INF/lib下。

JSTL的所有标签见下图:


变量要用$符号括起来,$是EL表达式的写法,通过EL表达式转换成对应的字符串。下面这个例子展示了变量的用法。

<fmt:formatNumber value=http://www.mamicode.com/"${balance}" type="currency"/>

JSTL函数的用法。下面这个例子中,将函数与if标签结合使用。

<c:if test="${fn:contains(theString, 'test')}">
   <p>Found test string<p>
</c:if>

数据库操作

下面的代码实现了JSP中数据库的连接,并且创建了一个名为snapshot的数据源。

<sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/test" user="root" password="123456"/>

下面的代码实现了数据库的请求。
<sql:query dataSource="${snapshot}" var="result">
  SELECT * FROM users;
</sql:query>

下面的代码展示了参数替换的用法。
<sql:query dataSource="${snapshot}" var="result">
  SELECT * FROM users WHERE id = ?;
  <sql:param value=http://www.mamicode.com/"${userId}"/>>

自定义标签

自定义标签需要完成两件事,一件是定义标签的规则,有哪些属性,哪些属性是必填的,格式是怎样的,可以包含哪些子标签。另外一件事就是实现标签的功能。

定义标签规则。新建一个tld文件,对于这个例子,文件的内容可以这样写:
<taglib>
  <tlib-version>1.0</tlib-version>
  <jsp-version>2.0</jsp-version>
  <short-name>Test TLD</short-name>
  <tag>
    <name>hello</name>
    <tag-class>com.pc.HelloTag</tag-class>
    <body-content>empty</body-content>
  </tag>
</taglib>

实现标签的功能。这个例子里面就是简单地将标签替换成Hello World字符串。代码可以写成这样:
public class HelloTag extends SimpleTagSupport {
    public void doTag() {
        JspWriter out = getJspContext().getOut();
        out.println("Hello world!");
    }
}

获取标签里面的内容。首先要修改TLD,使其允许在标签里面存放文本。其次是通过invoke函数获取标签里面的内容。
<body-content>scriptless</body-content>

StringWriter writer = new StringWriter();
getJspBody().invoke(writer);

获取标签上的属性。首先要修改TLD,允许标签设置哪些属性。其次,JSP引擎会调用setXXX函数传递属性值。

<tag>
  <attribute>
    <name>message</name>
  </attribute>
</tag>

// 由系统自动调用。
public void setMessage(String message) {
    this.message = message;
}