老树新花 Servlet

模块化支持

在 Servlet 3.0 协议规范中给我们的页面管理注入了强大的能力,借助它提供的特性,可以发挥页面打包封装复用之作用。

首先有一独立的、公共的库项目,这个项目原来就是标准 Java 项目,那么现在只需要增加一个 META-INF/resources 目录,这里导出的 ${jar}/META-INF/resources/ 被视为 Web 虚拟目录的“/”根目录,里面可以放 HTML/JSP/CSS/JS 等的一切资源。假设 home.jsp 被放在 ${jar}/META-INF/resources/home.jsp ,当服务器运行时用户可以直接通过 “http://域名/home.jsp ” 访问。/META-INF/resources/ 为约定好的固定目录,不能修改。 如同我们的项目 head.jsp 就包含在其 META-INF/resources 特定目录中,如插图所示

因为采用了 Jar 打包 jsp 分发的缘故,故所以你不能在 IDEA/Eclipse 里面按 Ctrl 键打开 head.jsp,最好的方法是关闭 IDE 验证的错误提示。

EL 表达式

EL 表达式 ${param.xxx}
含义:获取请求参数,相当于request.getParameter("xxx")

EL 表达式 ${pageContext.request.contextPath}
含义:获取项目当前名称,相当于request.getContextPath()

EL 表达式 ${requestScope['javax.servlet.forward.request_uri']}
含义:获取原请求的uri,而非模版所在的uri

EL 表达式:${viewUtils.formatDateShorter(current.createDate)}
含义:调用Java方法并传参,例子viewUtils系传入到页面的对象,之前已经通过request.setAttribute()将其设置于页面的上下文中

EL 表达式: ${empty value ? Foo : bar}/${not empty value ? Bar : foo}
含义:三元二目式判断值是否为空

EL 表达式 ${'请求完成耗时:'.concat(requestTimeRecorder).concat('秒') }
含义:EL 不支持字符串 + 操作符,故使用 String 的 concat() 代替

EL 表达式可否获取或读取 Java 常量?答案是肯定的(EL v3.0新特性),首先在 JSP 中 import 具体的类,然后${XXX类名称.成员} 即可读取public final static的 Java 常量。 注意不能是接口而是普通类。接口也没关系,弄一个空的实现类即可。