10
JSP
Calvin edited this page 2013-11-14 01:37:15 +08:00
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#JSP/JSTL/Servlet

##1. JSP/JSTL/Servlet Tips 现在的project一般选Servlet2.5, JSP 2.1 和 JSTL1.2.

1.1 尽量使用JSP2.0的EL而不是JSTL,使页面看起来更像普通html页面。 比如:

<input type="text" id="loginName" name="loginName" size="25" value="${user.loginName}"/>
vs
<s:input path="loginName" id="loginName" size="25"/>

只有像 checkboxes, radiobuttons这些贪图它自动列出所有checkbox,而且将以选值打勾,这种taglib超方便的的地方才会使用。

1.2 web.xml里的头换成如下,就不会在Eclipse里一更改web.xml就被卡死一阵了。

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	version="2.5">

1.3 tld文件 http://java.sun.com/jsp/jstl/core 找不到的讨厌错误。
首先,注意是否需要jstl-1.2.jar,如果web容器里没有自带,则需要打包,否则最好把它设为provided级别,避免撞车。

然后,主要就是Jetty自己的特殊规则了,见Jetty章节.

**1.4 JSP2.1新版的TagLib好像容易写了很多.**

只要写一些JSP片段之类的东西,不像以前写Java版的一个Taglib要学一天还不一定学会某些高深的用法。

在quickstart中,封装了分页和排序两个tag。

首先在WEB-INF/tags目录下放一个hello.tag文件,内容如下,先声明了编码,和传入的变量,剩下就是普通的JSP内容了:

<%@tag pageEncoding="UTF-8"%>
<%@ attribute name="user" type="java.lang.String" required="true"%>
Hello, <%==user%>

然后在jsp中指向之前的目录,以tag文件名作为tag名称进行调用:

<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
<tags:hello user="foo"/>

##2.SpringSide Core的Servlets SpringSide Core的Servlets工具类,封装了Http与Servlet中的很多常用函数。

2.1 设置缓存的函数 高性能的Web编程中,设置内容在客户端浏览器的缓存是无比重要的一环。

Servlets封装了setExpiresHeader(),setNoCacheHeader(),setLastModifiedHeader(),setEtag(),checkIfModifiedSince(),checkIfNoneMatchEtag()等函数。

简单的说,Expires/Cache Control是服务端告诉客户端浏览器如何控制本内容的缓存的,在缓存过期前,不要再发送请求。 Expires 是 Http 1.0的header,只能设置某个固定时间。Cache Control是Http1.1的header,可以设置从现在开始多少时间,并有对代理服务器缓存的控制。

LastModified和Etag是服务端告诉客户端浏览器的本内容的修改标识。 当本地内容过期时,客户端会拿着这个标识发一个checkIfModifiedSince的询问给服务端,是否有新的内容。服务端如果认为其实内容依然没有过期,会只返回一个304的状态码而不是把内容重新发送。LastModified和Etag的区别是,LastModified只能是时间,而Etag可以是任何服务端能识别的字符串。

2.2 setFileDownloadHeader 设置弹出下载文件对话框,并设定下载后的文件名的实用函数。

2.3 getParametersStartingWith
从Spring copy来的函数,比如有两个Request参数,search_name和search_loginName, 会返回一个key为name和loginName为的Map.

2.4 encodeHttpBasic 将明文的用户名密码编码为Http Basic的Header。

##SpringSide Showcase的Servlets使用演示

在Web演示页面,演示了:

  1. 显示静态内容Servlet, 演示高效读取静态内容, 控制客户端缓存, 压缩传输, 弹出下载对话框,见StaticContentServlet

  2. CacheControlHeaderFilter为静态内容添加缓存控制 Header.