Skip to content
springside edited this page Apr 10, 2012 · 10 revisions

#JSP/JSTL/Servlet

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

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"/>

只有像 form, checkbox, radiobox这些不得不用的地方才会使用。

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">

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

然后,在Eclipse里通过自己写的Start.java运行Jetty时,需要

webContext.setClassLoader(Thread.currentThread().getContextClassLoader());

这样,就会用Eclipse那个带着项目classpath的Laucher$ClassLoader代替jetty的WebAppClassLoader运行应用,否则jetty会自己创一个WebAppClassLoader,然后把Eclipse的Loader设为parent。这时候悲剧来了,jetty用的那个Jasper,只会扫描当前classloader里的jar,不会扫描parent的classloader里的,除非你像[Jetty文档](http://wiki.eclipse.org/Jetty/Howto/Configure_JSP)教的那样设置org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern去扫描某些jar。感觉还是直接设classloader简单点。

在Maven运行的Test里,则需要如下设置,原因懒得深究了。

<useSystemClassLoader>false</useSystemClassLoader>,

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

只要写一些JSP片段之类的东西,然后放到特定目录下就可以了。不像以前写一个Taglib要学一天还不一定学会某些高深的用法。

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

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.setFileDownloadHeader ** 设置弹出下载文件对话框,并设定下载后的文件名的实用函数。

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

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

##SpringSide Showcase的Servlets使用演示

在Web演示页面,演示了:

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

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

返回参考手册

Clone this wiki locally