Skip to content
Calvin edited this page Nov 13, 2013 · 10 revisions

#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.