JSP动作元素学习

     一JSP动作元素概述

       (1)JSP动作元素简介

       与JSP指令元素不同的是,JSP动作元素在请求处理阶段起作用。JSP动作元素是用XML语法写成的。利用JSP动作

可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码。

       JSP动作元素(action elements),动作元素为请求处理阶段提供信息。动作元素遵循XML元素的语法,有一个包

含元素名的开始标签,可以有属性、可选的内容、与开始标签匹配的结束标签。

       动作元素只有一种语法,它符合XML标准:

<jsp:action_name attribute="value" />

       动作元素基本上都是预定义的函数,JSP规范定义了一系列的标准动作,它用JSP作为前缀,可用的标准动作元素

如下:

       

       (2)JSP动作元素常见的属性

       所有的动作要素都有两个属性:id属性和scope属性。

       1)id属性

       id属性是动作元素的唯一标识,可以在JSP页面中引用。动作元素创建的id值可以通过PageContext对象来调

用。这些我们会在下面的实例中进行演示。

       2)scope属性

       scope属性用于识别动作元素的生命周期。 id属性和scope属性有直接关系,scope属性定义了相关联id对象的

寿命。 scope属性有四个可能的值:page、request、session和application,这是JSP的四个作用域。

      (3)JSP动作元素分类

      JSP动作元素包含五类:

      第一类是与JavaBean有关的,包括3个动作元素:

<jsp:useBean>  <jsp:getProperty>  <jsp:setProperty>

      第二类是JSP1.2就开始有的基本元素,包括6个动作元素:

<jsp:include>  <jsp:foward>  <jsp:param>  <jsp:plugin>  <jsp:params>  <jsp:fallback>

      第三类是JSP2.0新增加的元素,主要与JSP Document有关,包括6个动作元素:

<jsp:root>  <jsp:declaration>  <jsp:scriptlet>  <jsp:expression> <jsp:text>  <jsp:output>

      第四类是JSP2.0新增加的元素,主要是用来动态生成XML元素标签的值,包括3个动作元素:

<jsp:attribute>   <jsp:body>   <jsp:element>

      第五类是JSP2.0新增加的元素,主要使用在Tag Filter中,包括2个动作元素:

<jsp:invoke>  <jsp:dobody>

       二JavaBean

       (1)JavaBean简介

       JavaBean就是符合某种特定的规范的Java类。使用JavaBean的好处是解决代码重复编写,减少代码冗余,功能

区分明显,提高了代码的可维护性。

       (2)JavaBean设计原则

       先使用图示来说明JavaBean的四个设计原则:

       

       1)公有类

       JavaBean其实就是Java程序,只不过需要在JSP页面中应用,不定义成public类型的,当不是在同一个包下时(项

目里一般会把JavaBean放在单独的文件夹下,所有不可能在同一包下了)不可以访问。

        2)属性私有

        定义成私有变量实际上是出于安全性的考虑,把变量封装起来,所以需要public的getter和setter方法访问这些

私有属性。

        3)无参的公有构造方法

        一般不显式的写出构造方法,那么类都会默认的创建一个无参的公有构造方法,这是为了方便创建类的实例对

象。

        4)getter和setter方法

        对类的私有属性进行重构,得到这些私有属性的getter和setter方法,为的是获取属性值和设置属性值。

        实例:设计一个符合JavaBean设计原则的类

package com.entity;

/**
 * 用户实体类的访问属性是public
 * @author Administrator
 * @date 2016年7月11日
 */
public class Users {
//私有属性
private String username;
private String password;

//无参构造器
public Users(){

}

//通过重构得到setter和getter方法
public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

}

        三JSP页面中使用JavaBean

        (1)像使用普通Java类一样,创建JavaBean类实例

        实例:在JavaBean项目下的Java Resources目录下创建一个JavaBean类Users,在WebContent目录下创建

index.jsp页面。

        JavaBean类Users的代码为如上个例子中创建的Users类。

        index.jsp页面源代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 导入包 -->
<%@ page import="com.entity.Users" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JavaBean实例</title>
</head>
<body>
      <h1>使用普通方式创建JavaBean的实例</h1>
      <hr>
      <%
        Users user = new Users();  //创建JavaBean类的实例user
        user.setUsername("admin");  //设置用户名
        user.setPassword("123456");  //设置密码
      %>
      用户名:<%=user.getUsername() %><br>
      密码:<%=user.getPassword() %><br>
</body>
</html>

        运行结果:

        

        (2)在JSP页面中通常使用JSP动作元素使用JavaBean类

        1)<jsp:useBean>动作元素

        作用:在JSP页面中实例化或者在指定范围内使用JavaBean。<jsp:useBean>动作元素用来加载一个将在JSP页

面中使用的JavaBean。这个功能非常有用,因为它使得我们可以发挥JavaBean组件复用的优势。

        最简单的语法为:

<jsp:useBean id="标识符" class="Java类名" scope="作用范围" ></jsp:useBean>
         在JavaBean类载入后,我们既可以通过<jsp:setProperty>动作元素和<jsp:getProperty>动作元素来修改和检索Bean的属性。 以下是useBean动作元素相关的属性列表:

        

        在给出具体实例前,让我们先来看下<jsp:setProperty>动作元素和<jsp:getProperty>动作元素。

        2)<jsp:setProperty>动作元素

        <jsp:setProperty>动作元素用来设置已经实例化的Bean对象的属性,有两种用法。首先,你可以在<jsp:setProperty>动作元素的外面(后面)使用<jsp:setProperty>动作元素,如下所示:

<jsp:useBean id="myName" ... ></jsp:useBean>
...
<jsp:setProperty name="myName" property="someProperty" .../>

        此时,不管<jsp:setProperty>动作元素是找到了一个现有的Bean类,还是新创建了一个Bean类例,<jsp:setProperty>动作元素都会执行。第二种用法是把<jsp:setProperty>动作元素放入<jsp:useBean>动作元素的内部,如下所示:

<jsp:useBean id="myName" ... >
   ...
   <jsp:setProperty name="myName" property="someProperty" .../>
</jsp:useBean>

        此时,<jsp:setProperty>动作元素只有在新建Bean类实例时才会执行,如果是使用现有实例则不执行<jsp:setProperty>动作元素。

        <jsp:setProperty>动作元素有下面四个属性,如下表:

        

        3)<jsp:getProperty>动作元素

        <jsp:getProperty>动作元素提取指定Bean类属性的值,转换成字符串,然后输出。

        语法格式如下:

<jsp:useBean id="myName" ... /><jsp:useBean>
...
<jsp:getProperty name="myName" property="someProperty" .../>

        下表是与getProperty相关联的属性:

        

        实例

        依然使用上面例子中的JavaBean类Users类。

        新建的useBean.jsp页面源代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JavaBean实例</title>
</head>
<body>
      <h1>使用useBean方式创建JavaBean的实例</h1>
      <hr>
      <jsp:useBean id="myUsers" class="com.entity.Users" scope="page"></jsp:useBean>
      
      <!-- 使用setProperty方式来设置用户名和密码 -->
      <jsp:setProperty property="username" name="myUsers" value="admin"/><br>
      <jsp:setProperty property="password" name="myUsers" value="123456"/><br>
      
      <!-- 使用传统的表达式来获取用户名和密码 -->
      用户名:<%=myUsers.getUsername() %><br>
      密码:<%=myUsers.getPassword() %><br>
      
      <hr>
      <!-- 使用getProperty方式来获取用户名和密码 -->
      用户名:<jsp:getProperty property="username" name="myUsers"/><br>
      密码:<jsp:getProperty property="password" name="myUsers"/><br>
</body>
</html>

        运行结果:

        

        (3)对于<jsp:setProperty>动作元素的延伸

     <jsp:setProperty>动作元素作用:给已经实例化的JavaBean对象的属性赋值,一共有四种形式:

//跟表单关联 <jsp:setProperty name="JavaBean实例名" property="*" />  

// 跟表单关联 <jsp:setProperty name="JavaBean实例名" property="JavaBean属性名" /> 

//手工设置属性值 <jsp:setProperty name="JavaBean实例名" property="JavaBean属性名" value="BeanValue" />  

//跟request参数关联  <jsp:setProperty name="JavaBean实例名" property="propertyName" param="request对象中的参数名" />

              实例:

        照常使用JavaBean类Users类。

        login.jsp页面源代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录页面</title>
</head>
<body>
     <h1>登录表单</h1>
     <hr>
     <form name="loginForm" action="dologin.jsp" method="post">
         <table>
              <tr>
                  <td>用户名:</td>
                  <td><input type="text" name="username" value="" /></td>
              </tr>
              <tr>
                  <td>密码:</td>
                  <td><input type="password" name="password" value="" /></td>
              </tr>
              <tr>
                  <td colspan="2" align="center"><input type="submit" value="登录" /></td>
              </tr>
         </table>
     </form>
</body>
</html>

       dologin.jsp页面源代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录页面</title>
</head>
<body>
      <%
        //防止中文乱码
        request.setCharacterEncoding("utf-8"); 
       %>
      <h1>setProperty动作元素的使用</h1>
      <hr>
      <jsp:useBean id="myUsers" class="com.entity.Users" scope="page"></jsp:useBean>
      
      
      <!-- 通过request对象得到属性值 -->
      用户名:<%=request.getParameter("username") %><br>
      密码:<%=request.getParameter("password") %><br>
      
      <hr>
      <!-- 根据表单自动匹配所有属性 -->
      <jsp:setProperty property="*" name="myUsers"/>
      用户名:<%=myUsers.getUsername() %><br>
      密码:<%=myUsers.getPassword() %><br>
      
      <hr>
      <!-- 根据表单匹配部分的属性 -->
      <jsp:setProperty property="username" name="myUsers"/>
      <jsp:setProperty property="password" name="myUsers"/>
      用户名:<%=myUsers.getUsername() %><br>
      密码:<%=myUsers.getPassword() %><br>
      
      <hr>
      <!-- 跟表单无关,通过手动赋值给属性 -->
      <jsp:setProperty property="username" name="myUsers" value="Rose" />
      <jsp:setProperty property="password" name="myUsers" value="888888" />
      用户名:<%=myUsers.getUsername() %><br>
      密码:<%=myUsers.getPassword() %><br>
      
</body>
</html>

       运行结果:

       

       

       对于最后一种我们这样修改:

       在login.jsp中的表单中做出如下修改:

   

       在dologin.jsp页面全部注释掉上述代码,重新写入下述代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录页面</title>
</head>
<body>
      <%
            //防止中文乱码
            request.setCharacterEncoding("utf-8"); 
       %>
      <h1>setProperty动作元素的使用</h1>
      <hr>
      <jsp:useBean id="myUsers" class="com.entity.Users" scope="page"></jsp:useBean>
      
      <hr>
      <!-- 通过URL传参数给属性赋值 -->
      <jsp:setProperty property="username" name="myUsers" param="user" />
      <jsp:setProperty property="password" name="myUsers" param="pass" />
      用户名:<%=myUsers.getUsername() %><br>
      密码:<%=myUsers.getPassword() %><br>
      
</body>
</html>

       运行后我们输入用户名:李四,密码:123456,最后的结果是:

       


     <jsp:include>动作元素

        (1)<jsp:include>动作元素

        <jsp:include>动作元素用来包含静态和动态的文件。该动作把指定文件插入正在生成的页面。

        <jsp:include>动作元素语法格式如下:

<jsp:include page="相对URL地址" flush="true" />

     前面已经介绍过include指令,它是在JSP文件被转换成Servlet的时候引入文件,而这里的<jsp:include>动作元素不同,插入文件的时间是在页面被请求的时候。

       以下是include动作相关的属性列表:

       

       实例:以下我们定义了两个文件date.jsp和include.jsp

       date.jsp页面源代码:

<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>date页面</title>
</head>
<body>
      <%
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
            
            String string = sdf.format(date);
            out.println(string);
      %>
</body>
</html>

       include.jsp页面源代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>include指令</title>
</head>
<body>
      <h1>include指令</h1>
      <hr>
      <%@ include file="date.jsp"  %>
</body>
</html>

       运行结果:

       

       (2)include指令与include动作的区别

       JSP指令: 相当于是把被包含的文件的代码原封不动的放进了包含它的文件 ,编译的时候生成一个class文件。

       JSP动作:   被包含的文件和包含的文件在编译的时候生成的是两个class文件。

       <%@ include %>指令编译后文件包括其所包含jsp的源代码。

       <jsp:include>动作元素编译后文件不包括,只写明所包含文件的名字,其和所包含文件之间是相对独立的存

在。

       页面内容经常变化时更适合使用<jsp:include>动作元素。

       页面内容不经常变化时更适合使用include指令。

       <jsp:include>动作元素包含的是执行结果,而include指令包含的是文件内容。

       <jsp:include>动作元素在请求期间被执行,而include指令在编译期页面间被执行。

       include指令与include动作比较图表:

       

       include指令保存的文件:

       

       include动作保存的文件:

       

       <jsp:forward>动作元素

       <jsp:forward>动作元素把请求转到另外的页面。<jsp:forward>动作元素只有一个属性page。

       <jsp:forward>动作元素语法格式如下所示:

<jsp:forward page="相对 URL 地址" />

       以下是forward相关联的属性:

属性 描述
page page属性包含的是一个相对URL。page的值既可以直接给出,也可以在请求的时候动态计算,可以是一个JSP页面或者一个 Java Servlet.

       <jsp:forward>动作元素等同于服务器内部跳转或转发:

request.getRequestDispatcher("/url").forward(request,response);

       实例:我们使用了三个文件,分别是

       login.jsp页面源代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>登录界面</title>
</head>
<body>
     <h1>系统登录</h1>
     <hr>
     <form action="forward_action.jsp" name="loginForm" method="post">
          <table>
               <tr>
                   <td>用户名:</td>
                   <td><input type="text" name="username" /></td>
               </tr>
               <tr>
                   <td>密码:</td>
                   <td><input type="password" name="password" /></td>
               </tr>
                <tr>
                   <td colspan="2"><input type="submit" value="登录" /></td>
               </tr>
          </table>
      </form>
</body>
</html>

       users.jsp页面源代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户资料界面</title>
</head>
<body>
      <h1>用户资料</h1>
      <hr>
      <%
            request.setCharacterEncoding("UTF-8");
      
            String username = "";
            String password = "";
            if(request.getParameter("username") != null){
            	username = request.getParameter("username");
            }
            if(request.getParameter("password") != null){
            	password = request.getParameter("password");
            }
      %>
      用户名:<%=username %><br>
      密码:<%=password %><br>
</body>
</html>

       forward_action.jsp页面源代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>forward动作元素</title>
</head>
<body>
     <h1>forward动作元素</h1>
      <hr>
      <jsp:forward page="users.jsp"  />
      
      <!-- 上面的动作等同于下面的服务器内部转发 -->
      <%-- 
      <%
            request.getRequestDispatcher("users.jsp").forward(request, response);
      %>
      --%>
</body>
</html>

       运行结果:

       

       

       <jsp:param>动作元素

       常常与<jsp:forward >动作元素一起使用。

       <jsp:param>动作元素语法:

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

       实例:

       还是那个login.jsp页面,修改的地方为:

      

       增加一个dologin.jsp页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录界面</title>
</head>
<body>
    <jsp:forward page="users.jsp">
         <jsp:param value="[email protected]" name="email"/>
         <jsp:param value="888888" name="password"/>
    </jsp:forward>
</body>
</html>
       在users.jsp页面增加代码:

   
       运行结果:

       

       

       <jsp:plugin>动作元素

       <jsp:plugin>动作元素用来根据浏览器的类型,插入通过Java插件运行Java Applet所必需的OBJECT或EMBED元素。如果需要的插件不存在,它会下载插件,然后执行Java组件。 Java组件可以是一个applet或一个JavaBean。

plugin动作有多个对应HTML元素的属性用于格式化Java 组件。param元素可用于向Applet或Bean传递参数。

        以下是使用<jsp:plugin>动作元素的典型实例:

<jsp:plugin type="applet" codebase="dirname" code="MyApplet.class"
                           width="60" height="80">
   <jsp:param name="fontcolor" value="red" />
   <jsp:param name="background" value="black" />

<jsp:fallback>
Unable to initialize Java Plugin
</jsp:fallback>

</jsp:plugin>

        如果你有兴趣可以尝试使用applet来测试<jsp:plugin>动作元素,<jsp:fallback>动作元素是一个新元素,在组件出现故障的错误是发送给用户错误信息。

       <jsp:element> 、 <jsp:attribute>、 <jsp:body>动作元素

       <jsp:element> 、 <jsp:attribute>、 <jsp:body>动作元素动态定义XML元素。动态是非常重要的,这就意味着XML元素在编译时是动态生成的而非静态。

        以下实例动态定义了XML元素:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
   <jsp:element name="xmlElement">
       <jsp:attribute name="xmlElementAttr">
       属性值
       </jsp:attribute>
       <jsp:body>
       XML 元素的主体
       </jsp:body>
   </jsp:element>
</body>
</html>

        浏览器访问以下页面,输出结果如下所示:

        

       <jsp:text>动作元素

       <jsp:text>动作元素允许在JSP页面和文档中使用写入文本的模板,语法格式如下:

<jsp:text>模板数据</jsp:text>

       以上文本模板不能包含其他元素,只能只能包含文本和EL表达式。请注意,在XML文件中,不能使用表达式如 ${whatever > 0},因为>符号是非法的。 我们可以使用 ${whatever gt 0}表达式或者嵌入在一个CDATA部分的值。

<jsp:text><![CDATA[<br>]]></jsp:text>

       如果需要XHTML中声明DOCTYPE,必须使用到<jsp:text>动作元素,实例如下:

<jsp:text><![CDATA[<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">]]>
</jsp:text>
<head><title>jsp:text action</title></head>
<body>

<books><book><jsp:text>
Welcome to JSP Programming
</jsp:text></book></books>

</body>
</html>

        你可以对以上实例尝试使用<jsp:text>及不使用该动作元素执行结果的区别。


转载自:https://blog.csdn.net/qq_29028175/article/details/53729048

猜你喜欢

转载自blog.csdn.net/nfzhlk/article/details/84836710