JSP/Servlet学习笔记(二)

时间:2022-01-12 17:16:06

1.JSP的三个编译指令

  • JSP的编译指令是通知JSP引擎的消息,它不直接生成输出。常见的编译指令有:

        page:用于针对当前页面的指令。

        include:用于指定包含另一个页面。

        taglib:用于定义和访问自定义标签。

  • 语法格式
<%@ 编译指令名 属性名="属性值"...%>

page指令

  • 语法格式
    <%@ page
    [ language="java" ]
    [ extends="package.class" ]
    [ import="{package.class | package.*}, ..." ]
    [ session="true | false" ]
    [ buffer="none | 8kb | sizekb" ]
    [ autoFlush="true | false" ]
    [ isThreadSafe="true | false" ]
    [ info="text" ]
    [ errorPage="relativeURL" ]
    [ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]
    [ isErrorPage="true | false" ]
    %>
  • page各属性的意义
     1. language:设置jsp中用到的语言,默认为java。
     2. extends:设置目前jsp要继承的父类,一般不需要设置,在默认情况下,jsp页面默认的父类是HttpJspBase。
     3. import :jsp页面所用到的类。
     4. errorPage: 设置该jsp页面出现异常时所要转到的页面,如果没设定,容器将使用当前的页面显示错误信息。
     5. isErrorPage: 设置该jsp页面是否作为错误显示页面,默认是false,如果设置为true,容器则会在当前页面生成一个exception对象。
     6. contentType :设置页面文件格式和编码方式。
     7. isThreadSafe :设置容器以多线程还是单线程运行该jsp页面,默认是true,是多线程。设置为false,则以单线程的方式运行该jsp页面。
     8. session: 设置该jsp页面是否可以用到session对象(jsp内置对象,为web容器创建),默认是true,能用到session.设置为false,则用不到。
    9. info:设置JSP页面的相关信息,如当前页面的作者、编写时间等。此值可设置为任意字符串,由Servlet.getServletInfo()方法来获取所设置的值。
     10. pageEncoding:设置JSP页面字符的编码。

include指令

  • 静态包含语句,它会把目标页面的其他编译指令也包含进来(如果此时两个页面的编译指令冲突,则会出错。)
  •  语法格式
<%@include file="relativeURLSpec"%>

2.JSP的7个动作指令 

        jsp:forward:执行页面转向,将请求的处理转发到下一个页面

        jsp:param:用于传递参数,必须与其他支持参数的标签一起使用

        jsp:include:动态引入一个JSP页面

        jsp:plugin:用于下载JavaBean或Applet到客户端执行,使用场景很少。

        jsp:useBean:创建一个JavaBean实例

        jsp:setProperty:设置JavaBean实例的属性值

        jsp:getProperty:输出JavaBean实例的属性值

forward指令

  • 用于将页面响应转发到另外的页面。
  • 语法格式
<jsp:forward page="{relativeURL|<%=expression%>}">
    {<jsp:param.../>}
</jsp:forward>
  • 示例
<!--jsp-forward1.jsp--!>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>forward转发前的页面</title>
</head>
<body>
<!-- 测试1 -->
<jsp:forward page="jsp-forward2.jsp">
    <jsp:param name="username" value="yz"/>
</jsp:forward>
<!-- <!-- 测试2 --> -->
<!-- <form id="login" method="post" action="jsp-forward2.jsp"> -->
<!-- <input type="text" name="username"> -->
<!-- <input type="submit" value="登录"> -->
</body>
</html>
<!--jsp-forward2.jsp--!>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>forward转发后页面</title>
</head>
<body>
<!-- 获取表单信息 -->
<%=request.getParameter("username") %>
</body>
</html>
        测试1截图:

JSP/Servlet学习笔记(二)

        测试2截图:

JSP/Servlet学习笔记(二)

  • 由1图可以看出,执行forward指令,用户请求的地址依然没有发生改变
  • 由2图可以看出,执行forward指令,请求依然是一次请求,客户端的请求参数不会丢失

include指令

  • 动态include指令,用于包含某个页面,但不会导入被导入页面的编译指令,仅仅将被导入页面的body内容插入本页面。
  • 语法格式
    <jsp:include page="{relativeURL|<%=expression%>}" flush="true">
        {<jsp:param name="..." value="..."/>}
    </jsp:include>
    flush用于指定输出缓存是否转移到被导入文件中,为true,则包含在被导入文件中;反之,则包含在源文件中。
  • jsp静态导入与动态导入的区别:原文地址
    静态导入
    <%@include file="head.jsp" %>
    
    动态导入
    动态导入只有在执行到它的时候才加载
    <jsp:include page="header.jsp">
        <jsp:param value="值" name="变量名"/>
    </jsp:include>
    
    两者的区别:
    
    静态导入时被导入页面的编译指令会起作用;而动态导入时被导入页面的编译指令则失去作用,只是插入被导入页面的body内容。
    静态导入是先包含,再编译,两个页面融合成一个整体Servlet,最终会生成一个.java文件和.class文件;静态包含时,包含页面上定义的java变量,在被包含页面上可以直接使用,反之也可以。
    动态导入是先编译,再包含,在Servlet中使用include方法来引入被导入页面的内容,最终会生成两个.java文件和.class文件;动态包含时,包含页面上定义的java变量,在被包含页面上是不能访问的,要传递参数,需要通过jsp:param来传递。反之则不行。
    生成的文件不同,静态的包含是将两个jsp文件二合一,生成一个以包含页面命名的servlet和class文件,动态包含的两个jsp文件各自生成自己的servlet和class文件。
    动态导入用的元素是page。静态导入用的是file。
    
    静态导入传递参数:
    传参方式一:在浏览器请求localhost:8080/a.jsp?name=jack&age=18时被包含的jsp页面是可以访问name和age该参数的。
    传参方式二: 包含的页面可以传递参数给被包含的页面。
    
    
    动态导入传递参数:
    <jsp:include page="header.jsp" >
        <jsp:param name="name" value="我是测试参数"/>
    </jsp:include>
    
    注:静态导入和动态导入传递参数有中文,一定要在include之前设置request的编码为UTF-8,否则到被包含页面取值会乱码。如果是动态导入在客户端访问包含页面时地址栏后面直接加上参数后传递,这种形式的传参是客户端送来的,但是这两个页面的request对象不是同一个,因为包含的页面可以向被包含的页面传递参数,所以被包含的request对象含的参数个数应该大于等于包含页面的参数个数的。

useBean、setProperty、getProperty指令

        useBean指令用于在JSP页面初始化一个Java实例。

        setProperty指令用于为JavaBean设置属性值。

        getProperty指令用于输出JavaBean实例的属性。

  • 如果多个JSP需要重复使用某段代码,则可以把这段代码定义成Java类的方法,然后让多个jsp页面调用该方法即可。
  • useBean的语法格式
    <jsp:useBean id="name" class="classname" scope="request" /> 
    其中id属性是JavaBean实例名,class是实现类,scope属性指定JavaBean的作用范围 ,该范围可以是:page,request,session,application
  • setProperty语法格式
    <jsp:setProperty name="..." property="..." value="..."/>
    其中,name属性确定需要设定JavaBean的实例名;
  • getProperty语法格式
    <jsp:setProperty name="..." property="..."/>
  • 示例
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    	<title> Java Bean测试 </title>
    	<meta name="website" content="http://www.crazyit.org" />
    </head>
    <body>
    <!-- 创建lee.Person的实例,该实例的实例名为p1 -->
    <jsp:useBean id="p1" class="lee.Person" scope="page"/>
    <!-- 设置p1的属性值 -->
    <jsp:setProperty name="p1" property="name" value="crazyit.org"/>
    
    <jsp:setProperty name="p1" property="age" value="23"/>
    
    <jsp:getProperty name="p1" property="name"/><br/>
    
    <jsp:getProperty name="p1" property="age"/>
    </body>
    </html>
    

param指令

  • 用于设置参数值,通常与以下三个指令结合使用:

        jsp:include
        jsp:forward
        jsp:plugin
  • 语法格式
    <jsp:param name="..." value="..."/>