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="${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="${userId}"/> </sql:query>
自定义标签
自定义标签需要完成两件事,一件是定义标签的规则,有哪些属性,哪些属性是必填的,格式是怎样的,可以包含哪些子标签。另外一件事就是实现标签的功能。定义标签规则。新建一个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; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。