JSP 隐藏技巧大公开

Posted sp42a

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSP 隐藏技巧大公开相关的知识,希望对你有一定的参考价值。

发觉时隔那么多年,我还是很喜欢 JSP,——初恋的感觉!今天就让我为大家介绍鲜为人知的 JSP 编码秘密!

web.xml

虽然 web.xml 在全面注解的时代已经过时,但是我们还是可以通过 web-fragment.xml 继续使用嘛。

在你的工程中安排 META-INF 目录如下,即可享用 Servlet 3.0 带来的 Web Fragment 技术,最终打包在一个 jar 包中。

定义 jsp 页面编码和去掉多余的空格

<!-- JSP 页面编码 -->
<jsp-config>
	<jsp-property-group>
		<url-pattern>*.jsp</url-pattern>
		<page-encoding>UTF-8</page-encoding>
		<trim-directive-whitespaces>true</trim-directive-whitespaces>
	</jsp-property-group>
</jsp-config>
<!-- // -->
<!-- 不安全的 TRACE、OPTIONS 等方法禁用 -->
<security-constraint>
	<web-resource-collection>
		<web-resource-name>restricted methods</web-resource-name>
		<url-pattern>/*</url-pattern>
		<http-method>HEAD</http-method>
		<http-method>OPTIONS</http-method>
		<http-method>TRACE</http-method>
	</web-resource-collection>
</security-constraint> 

隐藏 *.jsp 扩展名

JSP 默认扩展名 *.jsp,有时不想人家知道这是 jsp,可通过 servlet-mapping 隐藏扩展名。那样在浏览器上看上去会“专业”一点。,于是 web.xml 配置:

<servlet>
  <servlet-name>pub</servlet-name>
  <jsp-file>/publications.jsp</jsp-file>
</servlet>
<servlet-mapping>
  <servlet-name>pub</servlet-name>
  <url-pattern>/publications</url-pattern> <!-- Use this URL -->
</servlet-mapping>

实例化对象

有时候不能 <%……%> 里面写 Java 代码,可以用下面标签代替:

<jsp:useBean id="JspPageHelper" class="com.ajaxjs.util.JspPageHelper" />
<jsp:setProperty name="JspPageHelper" property="request" value="$pageContext.request" />
<jsp:setProperty name="JspPageHelper" property="pageResult" value="$PAGE_RESULT" />

EL 表达式篇

EL 很有用,可以代替我们不用写模板语言。常规的就不介绍了,下面说说比较少见但实用的:
EL 表达式 $param.xxx
含义:获取请求参数,相当于request.getParameter("xxx")

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

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

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

EL 如何拼接字符串?实话说比较麻烦的:

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

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

EL 表达式可否获取或读取 Java 常量?

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

为什么今天还推荐 JSP?

JSP 本身是门老技术,常被技术选型所诟病。我们选择的理由是,技术本身无非好坏,只有适合与否。在极力推崇前后端分离和不断弱化服务端表示层(Presentation)的今天,反正后端模板无足轻重,既然如此为什么不选择简单的呢?况且其缺点是能逐步克服的,只是存在着很大程度误解和“人云亦云”。

以上是关于JSP 隐藏技巧大公开的主要内容,如果未能解决你的问题,请参考以下文章

JSP 隐藏技巧大公开

JAVA面试潜规则大公开,能帮你多拿5k薪资

OKHttp实战篇(内部附赠真实案例+源码大公开)

虚拟数字人几近真人?“造假”过程大公开

虚拟数字人几近真人?“造假”过程大公开

错过了太后悔,九大绝招大公开,详解华为低时延技术