JSP 标签还是很方便的,比如 Struts、Spring 等提供给我们的 JSP 标签,可以用它们来获取变量或进行一些计算。比如 struts2 的 <s:url value="/admin/unmi.action"/> 会为我们自动在前面附加上应用上下文,如实际会生成 /testsite/admin/unmi.action。还有更多更方便的标签使用,比如用标签获取到 session 或请求中的数据作为 js 的变量等。

引申此话题的,其实不光是在 JS 中使用 JSP 标签,可用 JSP 标签的地方当然可以直接写 Java 代码,即 ScriptLet 代码。

如果是在 JSP 中内嵌的 JS 代码,那当然好办,JSP 文件中能用什么标签,js 代码中也能随便用,因为 JSP  标签会先在服务端解释生成相应的 JS 代码,丢给客户端执行。

那如果是在单独的 JS 文件中想要使用 JSP 标签,该如何办呢?还直接像 JSP 那样使用标签的话,对不起 JS 文件中给你原样显示出来,因为 JS 文件不被服务器端解释。其实到现在问题也基本有了答案,要解决的问题就是要让服务端去解释你的标签,有两种方案。

    一.  js 文件命名为 JSP 文件,写 js 内容,其中用标签,然后用 <script src="/scripts/tags.js.jsp"></script> 把该  JSP  文件当作 JS 文件那样引入。

因为 JSP 文件会被服务端解释,所以把该 JSP 文件当作 JS 文件来写,JS 文件里应该是什么,你的 JSP 文件也应该输出什么,只是里面可以放标签,要知道它将会输出什么。用 <script> 来引入的话,页面顺理的把它认为是一段外部 JS 代码。

例如文件 /scripts/tags.js.jsp 中的内容是:

  1. <%@ taglib  prefix="s" uri="/struts-tags" %>
  2. var currentUser = '<s:property value="#session.userName" />';
  3. alert("currentUser: " + currentUser);

那么在某个网页中用 <script src="/scripts/tags.js.jsp"></script> 引入该文件时,上面的 JS 代码将会弹出当前 session 中的用户名来。

上面代码执行都没问题的,但是你直接浏览 http://unmi/testsite/scripts/tags.js.jsp  你看到的是挤在一团的代码,不像查看普通 JS 文件那样有清晰的换行和退格,原因是浏览器默认只认扩展名,它的 mime 类型,也就是 Content-Typetext/html。要让它更像是个 JS 文件那得给它加上响应类型的设置,在 tags.js.jsp 文件第一行加上:

    <%response.setContentType("text/javascript;charset=utf-8");%>

这时候对于浏览器来说,无论从哪个方向来看它都是个切切实实的 JS 文件,只扩展名不同罢了。

    上面的方法实际表现是没什么问题的,不过还有两点不那么完美,第一,文件名看起来像 JSP 文件,有些令人误解;第二,在 IDE 中打开该 JSP 文件,没法应用 JS 的语法加亮,给编辑带来不少麻烦。下面的方法充分解决前面两个问题。

     二. 直接在 JS 文件中使用 JSP 标签

     讲下原理,不是说应用服务器端默认不解释 JS 中的标签吗,那我们可以让个别的 JS 文件同样受到服务器端的关注,不是把 js 原文直接抛给客户端,而是先解释其中的标签,或是其中的 java 代码。

     Tomcat 这种应用服务器我们通常也会称它为 Servlet 容器,因为它执行的是 Servlet,JSP 自然也是 Servlet。在 %TOMCAT_HOME%/conf/web.xml 中我们可以看到实际处理 JSP 文件的 Servlet 是:

  1. <servlet>
  2. <servlet-name>jsp</servlet-name>
  3. <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
  4. <init-param>
  5. <param-name>fork</param-name>
  6. <param-value>false</param-value>
  7. </init-param>
  8. <init-param>
  9. <param-name>xpoweredBy</param-name>
  10. <param-value>false</param-value>
  11. </init-param>
  12. <load-on-startup>3</load-on-startup>
  13. </servlet>
  14. <servlet-mapping>
  15. <servlet-name>jsp</servlet-name>
  16. <url-pattern>*.jsp</url-pattern>
  17. </servlet-mapping>
  18. <servlet-mapping>
  19. <servlet-name>jsp</servlet-name>
  20. <url-pattern>*.jspx</url-pattern>
  21. </servlet-mapping>

org.apache.jasper.servlet.JspServlet,所以我们可以在自己应用的 web.xml 文件中配置某些特别的文件同样由 JspServlet 来处理。比如要特别处理 /scripts/tags.js 文件,在应用的 web.xml 中只要加上:

  1. <servlet-mapping>
  2. <servlet-name>jsp</servlet-name>
  3. <url-pattern>/scripts/tags.js</url-pattern>
  4. </servlet-mapping>

我们配置 /scripts/tags.js 要由 JspServlet 来处理,不会影响到现有的其他任何 JS 文件。

那现在的 /scripts/tags.js 可不是普通的 js 文件了,它可是具有放置 JSP 标签和写 Java 代码的超能力了,因为其中的 JSP 标签和 Java 代码首先会经由服务端来解释。它集 JS 和 JSP 于一身,另外也别忘了给该 JS 文件前面加上代码:

<%response.setContentType("text/javascript;charset=utf-8");%>

不然单独浏览它也就只是不那么好看。

无疑,这是目前我能想的最完美的一种方式了,且兼容于其他的 Servlet 容器,也不用改动公共部分的东西。/scripts/tags.js 在 JS IDE 中打开也漂亮多了,因为它就是个 JS 文件,只是被赋予了 JSP 的功能。

如何在 js 代码中使用 jsp 标签或 Java 代码的更多相关文章

  1. 如何在Mirth Connect中创建和调用自定义Java代码

    0-前言 本文章将向您展示如何创建自定义Java类,将其编译/打包到JAR中,将其包含在Mirth Connect在,并在JavaScript中调用它,您可以从任何JavaScript上下文调用自定义 ...

  2. 11 jsp脚本调用java代码

    大多数情况下, jsp 文档的大部分由静态文本(html)构成, 为处理该页面而创建的 servlet 只是将它们原封不动的传递给客户端, 原封不动的传送给客户端有两个小例外: 1. 如果想传送 &l ...

  3. js 和 css 中 不能使用 jsp 页面中一些 标签 和 java 代码等,应注意

    js  和 css 中 不能使用 jsp  页面中一些 标签 和 java 代码等,应注意 如 ${ }  <%%>  等

  4. Java中替换HTML标签的方法代码

    这篇文章主要介绍了Java中替换HTML标签的方法代码,需要的朋友可以参考下 replaceAll("\\&[a-zA-Z]{0,9};", "").r ...

  5. 如何在js文件中实现获取request.getCotextPath();

    我们在jsp中可以方便的使用“request.getCotext()”来获取工程的根目录. 但是如果我们的js代码存在一个单独的js文件中,这时候再想获取根目录,我们就要自己截取了.可以采用下面的方式 ...

  6. JSP标签使用的代码记录——《%= %》(神奇的CSDN为啥标题不让打英文的尖括号)

    关于JSP的一些标签,在用到的时候有些生疏,就去找了找资源重新温习了一下. 附上两个JSP<%= %>标签的博客,同时也记录当前项目里用到的方法. jsp页面中<%@ %>.& ...

  7. Android在代码中获取meta标签内容

    最近写SDK需要获取<meta>标签的值,网上资料很多~分享是件好事~我很快就找到了相关资料. 下面贴上代码: ApplicationInfo appInfo = null; String ...

  8. kafka中常用API的简单JAVA代码

    通过之前<kafka分布式消息队列介绍以及集群安装>的介绍,对kafka有了初步的了解.本文主要讲述java代码中常用的操作. 准备:增加kafka依赖 <dependency> ...

  9. java代码之美(11)---java代码的优化

    java代码的优化 随着自己做开发时间的增长,越来越理解雷布斯说的: 敲代码要像写诗一样美.也能理解有一次面试官问我你对代码有洁癖吗? 一段好的代码会让人看就像诗一样,也像一个干净房间会让人看去很舒服 ...

随机推荐

  1. 20145302张薇《Java程序设计》第七周学习总结

    20145302 <Java程序设计>第七周学习总结 教材学习内容总结 第十三章 时间的度量 Greenwich Mean Time,格林威治时间,简称GMT时间,由观察太阳而得来: Un ...

  2. P(Y|X) 和 P(X,Y)

    P ( x | y ):在Y发生的条件下,X发生的概率.P ( x , y )P(x,y)说明该事件与两个因素有关,比如设是因素A,B.P(x,y)=P{因素A处于x状态,因素B处于y状态}确切地说P ...

  3. Leetcode(93): Restore IP Addresses

    Given a string containing only digits, restore it by returning all possible valid IP address combina ...

  4. yield生成器函数

    生成器有主要有四种方法: next() 执行函数,直到遇到下一个yield为止,并返回值 send(value) 为生成器发送一个数值,next()方法就相当于send(None) close() 终 ...

  5. 定制Writable类

    以IntWritable为例介绍,定制writable的步骤 //继承 WritableComparable接口(继承了writable接口和comparable接口) public class In ...

  6. Java ArrayList在foreach中remove的问题分析

    目录 iterator itr.hasNext 和 itr.next 实现 倒数第二个元素的特殊 如何避坑 都说ArrayList在用foreach循环的时候,不能add元素,也不能remove元素, ...

  7. Spring的配置相关知识(学习spring boot的预备知识)

    我们经常说的控制反转(Inversion of Control-IOC)和依赖注入(dependency injection-DI)在Spring环境下是等同的概念,控制反转是通过依赖注入实现的.所谓 ...

  8. python 编程测试练习答案

    -- coding: UTF-8 -- file('B.txt','wb').write(file('A.txt','rb').read()) 作业内容 这次作业较为简单,从一个a.txt的多行文本文 ...

  9. scp 上传 下载 文件

    linux 中的ssh命令: scp 可以用来上传本地文件到远程服务器 或下载远程服务器中的文件到本地 1. 上传本地文件到远程服务器 scp readme.md user@www.*****.com ...

  10. 【Python】@staticmethod和@classmethod的作用与区别

    前言 Python其实有3个方法,即静态方法(staticmethod),类方法(classmethod)和实例方法,一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法.而使用@static ...