java jsp标签_JavaWeb---总结(十)JSP标签

一、JSP标签介绍

JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。

二、JSP常用标签

jsp的常用标签有以下三个

标签

标签

2.1、标签

标签用于把另外一个资源的输出内容插入进当前JSP页面的输出内容之中,这种在JSP页面执行时的引入方式称之为动态引入。

语法:

page属性用于指定被引入资源的相对路径,它也可以通过执行一个表达式来获得。

flush属性指定在插入其他资源的输出内容时,是否先将当前JSP页面的已输出的内容刷新到客户端。

范例:使用jsp:include标签引入资源

1

2

3

4

5

jsp的jsp:include标签测试

6

7

8

9

10

11

网页主体内容

12

13

14

运行结果:

java jsp标签_JavaWeb---总结(十)JSP标签_第1张图片

2.2、标签与include指令的区别

标签是动态引入, 标签涉及到的2个JSP页面会被翻译成2个servlet,这2个servlet的内容在执行时进行合并。

而include指令是静态引入,涉及到的2个JSP页面会被翻译成一个servlet,其内容是在源文件级别进行合并。

通过下面的例子来说明标签与include指令的区别

demo.jsp:

1

2

3 int i=1000;

4 %>

5

demo.jsp中i的值为:

分别使用include指令和标签两种包含语句,包含以上的demo.jsp

范例:使用@include包含内容

1

2

3 int i=10;

4 %>

5

JspIncludeTagDemo01.jsp中i的值为:

6

此时在编译jsp时就已经提示出错了,如下所示:

java jsp标签_JavaWeb---总结(十)JSP标签_第2张图片

这个错误说的是变量i已经重复定义了

运行JspIncludeTagDemo01.jsp,结果如下:

java jsp标签_JavaWeb---总结(十)JSP标签_第3张图片

运行后发现出现了重复定义变量i的错误提示信息,因为静态包含是将全部内容包含进来之后,再进行处理,属于先包含后处理。由于被包含进来的页面demo.jsp中定义了一个变量i,而包含页面JspIncludeTagDemo01.jsp本身又定义了一个变量i,所以服务器在处理JspIncludeTagDemo01.jsp这个页面时就会发现里面有两个重复定义的变量i,因此就会报错。

而如果现在使用的是动态包含的话,观察以下程序:

范例:使用动态包含

25c308da85ed528ac8a7c43831f40f66.png

1

2

JspIncludeTagDemo02.jsp

3

5 %>

6

7

JspIncludeTagDemo02.jsp中i的值为:

8

运行结果:

java jsp标签_JavaWeb---总结(十)JSP标签_第4张图片

发现结果已经可以正确地显示,而且不会互相影响,这是因为使用jsp:include属于动态包含,动态包含就是指先将各个页面分别处理,处理完之后再将处理后的结果包含进来。

不管是标签,还是include指令,它们都会把两个JSP页面内容合并输出,所以这两个页面不要出现重复的HTML全局架构标签,否则输出给客户端的内容将会是一个格式混乱的HTML文档。

2.3、*.jspf扩展名文件在jsp:include、@include和c:import中的区别

JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。今天无意中发现,把一个JSP文件命名为jspf扩展名,然后include到另一个jsp文件中的,发现只有用"@include"指令的时候,jspf文件的内容才会被解析并执行其中的jsp指令和tag,而使用"jsp:include"和JSTL的"c:import"都没有用,jspf文件被当作纯文本文件处理了。

比如现在有一个head.jspf页面和foot.jspf页面

head.jspf

1

2

网页头部

foot.jspf

1

2

网页尾部

首先使用"@include"指令将"head.jspf和foot.jspf"include到IncludeTagTest.jsp页面,如下所示:

25c308da85ed528ac8a7c43831f40f66.png

1

2

3

4

5

jsp的Include指令测试

6

7

8

9  

10

11

网页主体内容

12

13

14

运行IncludeTagTest.jsp页面,运行结果如下:

java jsp标签_JavaWeb---总结(十)JSP标签_第5张图片

jspf文件的内容会被解析并执行其中的jsp指令和tag,查看浏览器解析JspIncludeTagTest.jsp页面生成的源代码,如下所示:

java jsp标签_JavaWeb---总结(十)JSP标签_第6张图片

然后再使用"标签将"head.jspf和foot.jspf"include到JspIncludeTagTest.jsp页面中,如下所示:

1

2

3

4

5

jsp的jsp:include标签测试

6

7

8

9

10

11

网页主体内容

12

13

14

运行JspIncludeTagTest.jsp页面,运行结果如下:

java jsp标签_JavaWeb---总结(十)JSP标签_第7张图片

查看浏览器解析JspIncludeTagTest.jsp页面生成的源代码,如下所示:

java jsp标签_JavaWeb---总结(十)JSP标签_第8张图片

可以看到,head.jspf和foot.jspf中的没有解析执行,而是原封不动地作为文本内容输出到页面上了,在IE下看不到的输出,在google和火狐浏览器下运行可以看到页面上输出,如下所示:

java jsp标签_JavaWeb---总结(十)JSP标签_第9张图片

这说明jspf文件Tomcat服务器被当作纯文本文件处理了,没有当作jsp页面来解析执行,那么该如何解决这个问题呢?如何让tomcat服务器能够解析执行*.jspf文件中的java代码和标签呢,有如下的几种解决办法:

解决办法一:修改web.xml文件,添加对扩展名为*.jspf文件的映射

如下所示:

25c308da85ed528ac8a7c43831f40f66.png

1 2

3 jsp

4 *.jspf

5

6 7

8 jsp

9 *.jsp

10

25c308da85ed528ac8a7c43831f40f66.png

上面的配置方式也可以简写成这样:

1

2 jsp

3 *.jsp

4

5 *.jspf

6

两种写法的效果都是一样的。

添加这样的配置信息后,此时tomcat服务器就可以正常解析执行*.jspf文件了,如下所示:

java jsp标签_JavaWeb---总结(十)JSP标签_第10张图片

解决办法二:修改Tomcat服务器的web.xml文件,添加对扩展名为*.jspf文件的映射

找到tomcat服务器的web.xml文件,如下所示:

java jsp标签_JavaWeb---总结(十)JSP标签_第11张图片

找到名字为jsp的那个Servlet,如下所示:

25c308da85ed528ac8a7c43831f40f66.png

1

2 jsp

3 org.apache.jasper.servlet.JspServlet

4

5 fork

6 false

7

8

9 xpoweredBy

10 false

11

12 3

13

然后根据Servlet名找到对应的servlet-mapping配置,如下所示:

1

2

3 jsp

4 *.jsp

5 *.jspx

6

在这里可以看到,名字为jsp的那个Servlet只支持*.jsp和*.jspx两种扩展名,因此可以在这个地方添加多一个*.jspf,如下所示:

1 2

3 jsp

4 *.jsp

5 *.jspx

6 *.jspf

7

经过这样的配置之后,Tomcat服务器就可以正常解析和执行*.jspf文件了。

2.3、标签

标签用于把请求转发给另外一个资源。

语法:

page属性用于指定请求转发到的资源的相对路径,它也可以通过执行一个表达式来获得。

范例:使用标签跳转页面

forwarddemo01.jsp

1

2 标签跳转到forwarddemo02.jsp--%>

3

forwarddemo02.jsp

1 2

跳转之后的页面!!

运行结果如下:

java jsp标签_JavaWeb---总结(十)JSP标签_第12张图片

从页面的显示效果来看,页面已经完成了跳转,但地址栏没有变化,地址栏中显示的地址还是forwarddemo01.jsp,但页面显示的内容却是forwardemo02.jsp中的内容。因为此跳转属于服务器端跳转。只要是服务器端跳转,则地址栏永远没有变化。

2.4、

当使用和标签引入或将请求转发给其它资源时,可以使用

语法1:

语法2:

范例:使用

JspIncludeTagDemo03.jsp

25c308da85ed528ac8a7c43831f40f66.png

1

2

JspIncludeTagDemo03.jsp

3


4

5

6 7

25c308da85ed528ac8a7c43831f40f66.png

Inc.jsp

1

2

接收从JspIncludeTagDemo03.jsp页面中传递过来的参数:

3

4

在JspIncludeTagDemo03.jsp页面中使用标签将Inc.jsp页面包含进来,使用标签向Inc.jsp页面传递了两个参数parm1和parm2

JspIncludeTagDemo03.jsp页面运行结果如下:

java jsp标签_JavaWeb---总结(十)JSP标签_第13张图片

范例:使用

forwarddemo03.jsp

25c308da85ed528ac8a7c43831f40f66.png

1 2 标签跳转到forwarddemo04.jsp--%>3 标签向forwarddemo04.jsp传递参数--%>4 5 6 7

25c308da85ed528ac8a7c43831f40f66.png

forwarddemo04.jsp

1 2

跳转之后的页面!!

3

接收从forwarddemo03.jsp传递过来的参数:

4

ref1:

5

ref2:

运行结果如下:

java jsp标签_JavaWeb---总结(十)JSP标签_第14张图片

你可能感兴趣的:(java,jsp标签)