从小白到到精通,一文带你搞懂JSP文件标识

本文详细介绍了JSP中的动作标识,包括jsp:include、jsp:useBean、jsp:setProperty、jsp:getProperty、jsp:forward等,以及它们在处理动态和静态文件时的区别。还展示了如何通过jsp:forward进行请求转发,并提供了实际的留言板应用示例,演示了如何使用JavaBean操作和传递参数。
摘要由CSDN通过智能技术生成

动作标识应该在哪里使用?

在JSP的请求处理阶段按在页面出现的顺序来执行动作标识的时候。

JSP动作元素是用XML语法写成的,所以必须符合XML标准。它的作用是可以动态地插入文件、重用JavaBean组件、将用户重定向到另外的页面、为Java插件生成相应的HTML代码等。也用于一些特殊用处,譬如,操作JavaBean、包含其他文件或执行请求转发等。开发中比较常用的动作标识来介绍:

#怎么用呢?

使用格式:

<jsp:action_name attribute="value" />

如下的标准动作标识,这些基本上就是预定义的函数,只是前面多了JSP作为前缀;

语法描述
jsp:include在页面被请求的时候引入一个文件。
jsp:useBean寻找或者实例化一个JavaBean。
jsp:setProperty设置JavaBean的属性。
jsp:getProperty输出某个JavaBean的属性。
jsp:forward把请求转到一个新的页面。
jsp:plugin根据浏览器类型为Java插件生成OBJECT或EMBED标记。
jsp:element定义动态XML元素
jsp:attribute设置动态定义的XML元素属性。
jsp:body设置动态定义的XML元素内容。
jsp:text在JSP页面和文档中使用写入文本的模板

jsp:include

作用是用来包含其它JSP页面的。你可能会说include指令,它们是否相同呢?了下节会解释它们两者有什么区别,并且它所包含的文件可以是动态文件,也可以是静态的文件

include指令是在编译级别完成的包含,把当前JSP和被包含的JSP合并成一个JSP,然后再编译成一个Servlet。

该标签是在运行时完成的包含,即当前JSP和被包含的JSP都会各自生成Servlet,然后在执行当前JSP的Servlet时完成包含另一个JSP的Servlet。它与RequestDispatcher的include()方法是相同的!

参数说明:


用法如下:

<jsp:include page=”url” flush=”flase|true” />
\\ 或者
<jsp:include page="url" flush="false|true" >
    子动作标识<jsp:param>
</jsp:include>

参数说明:

  • page:用于指定被包含文件的相对路径。如:指定属性值为top.jsp,则表示包含的是与当前JSP文件相同文件夹中的 top.jsp文件 包含在当前JSP页面中。

  • flush:可选属性,用于设置是否刷新缓冲区。默认值是false,如果设置为true,在当前页面输出使用了缓冲区的情况时,则先刷新缓冲区,然后再执行包含工作。

  • < jsp:param >子动作标识:
    用于向被包含的动态页面中传递参数
    那我们:
    2

    下面程序所示:

    date.jsp文件:
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <p>
       今天的日期是: <%= (new java.util.Date()).toLocaleString()%>
    </p>
    main.jsp文件:
    <%@ page language="java" contentType="text/html; charset=UTF-8"
      pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>码工是小希(https://github.com/Datalong)</title>
    </head>
    

include 动作实例

``` 现将上面两个文件放在服务器的**根目录**,访问main.jsp文件。显示为:
>include 动作实例
今天的日期是: 2021-5-13 13:08:17

小结:

jsp:include动作标识是对包含的动态文件和静态文件的处理方式是有所不同的。

如果被包含的是静态文件,则页面执行后,在使用该标识的位置会输出这个文件的内容。如果包含的是一个动态文件,那么JSP编译器将编译并执行这个文件。jsp:include动作标识会识别出文件类型,而并不是通过文件的名称来判断改文件是静态的还是动态的:

include指令

文件包含指令是JSP的另外一种指令标识,写的目的就是和include动作标识做一下区分。通过该指令可以在一个JSP页面中去包含另一个JSP页面。不过该指令是静态包含,也就是说被包含文件里的所有内容被原样包含到该JSP页面中,即使被包含页面中有JSP代码,在包含时也是不会被编译执行的,使用include这个指令,最终会生成一个文件,所以在被包含和包含的文件中,都不能有相同名称的变量,所以去包含另外一个页面只能静态包含

在JSP页面中包含文件的方法有两种:

include指令:<%@ include file=""%>
include动作:<jsp:include page="" />

区分:

<%@ include file=""%>又叫静态包含,使用时要注意以下几点:

1、被包含文件里不能再使用这种标签,否则会与包含页面中的标签重复

2、被包含文件的路径不能写成动态的,譬如:<%@ include file="<%=xxx%>"%>;

3、被包含文件的路径中不能携带参数,如:<%@ include file="navi.jsp?flag=1"%>。

处理方式不同:
  • include指令在编译时候,就把jsp的代码原封不动就拼到这个页面来了。运行时把jsp的代码,当作本页代码来运行。
  • <jsp:include page="" />又叫动态包含运行访问这个页面,把jsp页面的结果拿出来。也就是说,直接新写一个完整的jsp或html即可,就像html以前已经过时的框架那种写法;

请求转发标识jsp:forward

通过它可以将请求转发到其他的Web资源,例如,另一个JSP页面,HTML页面,Servlet等。执行请求转发后,当前页面就不再被执行,而是去执行该标识指定的目标页面
**

  • 用法:
    <jsp:forward page=”url” />
    参数:
    page:用于指定请求转发的目标页面。该属性值可以是一个指定文件路径的字符串,也可以是表示文件路径的JSP表达式。但是请求被转向的目标文件必须是内部的资源。

传递参数标识jsp:param

JSP的动作标识jsp:param可以作为其他标识的子标识,用于为其他标识传递参数: 用法:

<jsp:param name=”参数名” value=”7” />
参数

name:用于指定参数名称 value:用于设置对应的参数值

<jsp:forward >

请求转发标识,通过jsp:forward动作标识可以将请求转发到其他的Web资源,例如,另一个JSP页面,HTML页面,Servlet等。执行请求转发后,当前页面将不再被执行,而是去执行该标识指定的目标页面。

基本语法:<jsp:forward page="url"/>

参数说明:

page:用于指定请求转发的目标页面。该属性值可以是一个指定文件路径的字符串,也可以是表示文件路径的JSP表达式。但是请求被转向的目标文件必须是内部的资源。

< jsp:param> 设置参数的子动作标识,子动作标识是指作为其他标识的子标识。用来向动态的目标文件中传递参数。等价于文件名后面加“?参数名=参数值”。

基本语法:

  < jsp:param name="参数名” value="参数值"/>
参数说明:

name:用于指定参数名称 value:用于设置对应的参数值

操作JavaBean的动作标识

1、创建JavaBean实例的动作表识 < jsp:useBean >

不存在Body的语法格式:

<jsp:useBean id="实例名" scope="范围" class="完整的类名" beanName="完整类名"  type="数据类型"/>
<jsp:setProperty name="JavaBean实例名" property="属性名" param="请求参数"/>

 ···多个子动作标识····

存在Body的语法格式:

<jsp:useBean id=”实例名“ scope="范围"  class="完整类名" beanName="完整类名" type="数据类型" >
<jsp:setProperty name="JavaBean实例名" property="属性名" param="请求参数"/>
···多个子动作标识····

</jsp:useBean>
语法区别:

在页面用< jsp:useBean >标识创建个JavaBean实例时,如果该JavaBean是第一次被实例化,那么对于第二种语法格式,被指的内容会被执行;若已经存在指定的JavaBean实例时,则标识体内的内容就不再被执行。而对于第一种语法格式,无论在指定的范围内是否已经存在一个指定的JavaBean实例,其中< jsp:useBean >标识后面的< jsp:setProperty >子标识都会被执行!

2、读取JavaBean属性值的动作标识<jsp:getProperty >
<jsp: name="实例名" property="属性名">
3、设置JavaBean属性的动作标识 < jsp:setProperty >
<jsp:setProperty name="" property="" vaule=""/param="">
class = beanName +type

//value 与 param 不可同时使用;

实战练习

实现留言板

<%@ page contentType="text/html;charset=gb2312" %>
<HTML><body bgcolor=cyan>
 <form action="example3_18_pane.jsp" method="post" name="form">
   输入名字:<input  type="text" name="peopleName">
   <br>留言标题:<input  type="text"  name="title">
   <br>留言:<br> <textArea name="messages" rows="10" cols=36 
                   wrap="physical"></textArea>
   <br><input type="submit" value="提交" name="submit">
 </form>
 <a href="example3_18_show.jsp">查看留言板</a>
</body></HTML>

<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.*" %>
<HTML><body>
     <%! Vector v=new Vector();
         int i=0; 
         ServletContext  application;
         synchronized void leaveWord(String s) { //留言方法
            application=getServletContext();;
            i++;
            v.add("No."+i+","+s);
            application.setAttribute("Mess",v); 
         }
     %> 
     <% String name=request.getParameter("peopleName");
        String title=request.getParameter("title");
        String messages=request.getParameter("messages");
           if(name==null)
              name="guest"+(int)(Math.random()*10000);
           if(title==null)
              title="无标题";
           if(messages==null)
              messages="无信息";
           String s=name+"#"+title+"#"+messages; 
           leaveWord(s);
           out.print("您的信息已经提交!");
     %>
  <a href="example3_18_input.jsp" >返回留言页面 
</body></HTML>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.*" %>
<%! public String handleStr(String s) {
       try {  byte [] bb= s.getBytes("iso-8859-1");
              s = new String(bb);
       }
       catch(Exception exp){}
       return s;
    }
%>
<HTML><body>
  <% Vector v=(Vector)application.getAttribute("Mess");
     for(int i=0;i<v.size();i++) {
        String message=(String)v.elementAt(i);
        String []a =message.split("#");
        out.print("留言人:"+handleStr(a[0])+","+"<br>");
        out.print("标题:"+handleStr(a[1])+"<br>");
        out.print("留言内容:<br>"+handleStr(a[2]));
        out.print("<br>--------------<br>");
     } 
  %>
</body></HTML> 

运行结果:

留言板1 浏览吧2

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙哥手记

非常感谢你的赞赏,一起加油整起

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值