zoukankan      html  css  js  c++  java
  • Jsp学习(四)

    JSP Action

    1、定义

    • Action 是一个JSP 元素,可以操作内置对象、其他服务器对象,或者定义一个新的脚本变量,或者完成转发、包含等行为
    • Action 可以分成标准动作和自定义动作

    标准动作

    1、定义

    • 标准动作必须使用jsp: 做前缀
    • 标准动作通用语法
    <jsp:actionName attribute="attrValue" > body </jsp:actionName>

    2、常见的标准动作

    • <jsp:include>在JSP页面动态包含一个外在文件
    • <jsp:param>:用于传递参数值
    • <jsp:forward>:把到达的请求转发另一个页面进行处理

    • <jsp:useBean>:定义jsp页面使用一个JavaBean实例

    • <jsp:setProperty>:设置一个JavaBean中的属性值

    • <jsp:getProperty>:从JavaBean中获取一个属性值

    <jsp:include>

    1、include动作和include的指令的区别

    • include指令在被导入页面时,编译jsp会起作用,而include动作在编译到页面会失去作用,只是在原有的jsp代码中的<boby>标签生成页面的内容,故可以使用param动作来为被导入的页面传递参数;
    • 从jsp位置来看,include指令是通过file属性来指定被包含的文件,是放在jsp代码顶部,include动作放在<boby>标签来指定被包含的文件,可以通过page属性,所以支持jsp表达式,而file不支持任何表达式
    • include指令在被导入页面时,会与原有的jsp代码完全融合,共同生成同一个Servlet;而include动作则会在原有的jsp代码使用include方法而被导入页面,所以includ指令在执行时不需要编译,执行速度快,而includ动作在执行时需要编译,执行速度慢;

      include动作的包含

            org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "/action/inner.jsp", out, false);

      include指令的包含

            out.write("<!DOCTYPE html>
      ");
            out.write("<html>
      ");
            out.write("<head>
      ");
            out.write("<meta charset="UTF-8">
      ");
            out.write("<title>inner</title>
      ");
            out.write("</head>
      ");
            out.write("<body>
      ");
            out.write("
      ");
            out.write("	");
      
              for( int i = 0 ; i < 10 ; i++ )  {
                  out.println( i ) ; // 这个 out 是 JSP 内置对象
              }
          
            out.write("
      ");
            out.write("
      ");
            out.write("</body>
      ");
            out.write("</html>");

    2、属性

    • page 用于指定所要包含的资源相对URL
    • 被包含的资源可以是jsp 也可以是servlet 或者html 等
    • 可以使用相对路径,也可以使用"绝对路径"(这个路径是相对于当前web应用的根目录的,本质上还是相对路径)

        例如:绝对路径/action/inner.jsp,相对路径 inner.jsp(被包含的资源与当前页面在同一层次)

    • flush 用于设置当缓冲区用尽时,是否清空

    3、测试案例

    include.jsp

    <%@ page language = "java" pageEncoding = "UTF-8" %>
    <%@ page contentType = "text/html; charset= UTF-8"%>

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>标准动作 : include</title> <style type="text/css"> div { border: 1px solid blue ; margin: 10px 10px ; padding: 10px 10px ; } </style> </head> <body> <div> <jsp:include page="/action/inner.jsp"></jsp:include> </div> <div> <jsp:include page="/action/inner.html"></jsp:include> </div> <div> <jsp:include page="/action/inner.txt"></jsp:include> </div> <div> <jsp:include page="/inner.do"></jsp:include> </div> </body> </html>

    inner.jsp

    <%@ page language = "java" pageEncoding = "UTF-8" %>
    <%@ page contentType = "text/html; charset= UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>inner</title> </head> <body>    <% for( int i = 0 ; i < 10 ; i++ ) { out.println( i ) ; // 这个 out 是 JSP 内置对象 } %> </body> </html>

    inner.html

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <h1>我是内部的HTML页面</h1>
    </body>
    </html>

    inner.txt

    你好,我是文本文件

    InnerServlet.java

    package ecut.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.malajava.util.StringHelper;
    
    @WebServlet( "/inner.do" )
    public class InnerServlet extends HttpServlet {
    
        private static final long serialVersionUID = 8241829948239427285L;
    
        @Override
        protected void service( HttpServletRequest request , HttpServletResponse response ) 
                throws ServletException, IOException {
            PrintWriter w = response.getWriter();
            w.println( "我是内部的Servlet" );
            String username = request.getParameter( "username" );
            if( StringHelper.notEmpty( username ) ) {
                w.println( "<p>" + username +"</p>" ) ;
            }
        }
        
        
    
    }

    <jsp:param>

     1、作用

    • 提供key/value 形式的信息,主要用途是用来传递参数
    • 使用在jsp:include 、jsp:forward 、jsp:params 等元素中

    2、测试案例

    <%@ page language = "java" pageEncoding = "UTF-8" %>
    <%@ page contentType = "text/html; charset= UTF-8"%>
    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>标准动作 : include & param </title> <style type="text/css"> div { border: 1px solid blue ; margin: 10px 10px ; padding: 10px 10px ; } </style> </head> <body> <div> <jsp:include page="inner.jsp"> <jsp:param name="username" value="张三丰"/> </jsp:include> </div> <div> <jsp:include page="inner.html"></jsp:include> </div> <div> <jsp:include page="inner.txt"></jsp:include> </div> <div> <jsp:include page="../inner.do"> <jsp:param name="username" value="张三丰"/> </jsp:include> </div> </body> </html>

    inner.jsp

    <%@ page language = "java" pageEncoding = "UTF-8" %>
    <%@ page contentType = "text/html; charset= UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>inner</title> </head> <body>    <% for( int i = 0 ; i < 10 ; i++ ) { out.println( i ) ; // 这个 out 是 JSP 内置对象 } %>

      <div>${ param.username }</div>
    </body> </html>

     <jsp:forward>

     1、属性

    • page 指定将要转发到的目标URL,使用相对路径

    2、元素

    • <jsp:attribute> : 设置参数,比如设置page,相当于在page 属性中设置url
    • <jsp:param> : 为目标URL 传递参数,name : 指定所传递的参数的名称,value : 指定所传递的参数的参数值

    3、测试案例

    <%@ page language = "java" pageEncoding = "UTF-8" %>
    <%@ page contentType = "text/html; charset= UTF-8"%>
    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>标准动作 : forward </title> </head> <body> <jsp:forward page="/WEB-INF/main.jsp" > <jsp:param name="username" value="Amy" /> </jsp:forward> </body> </html>

    main.jsp

    <%@ page language = "java" pageEncoding = "UTF-8" %>
    <%@ page contentType = "text/html; charset= UTF-8"%>
    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>VIP</title> </head> <body> <h1>这是付费才能看的片片哦</h1> <h3>${ param.username }</h3> </body> </html>

     <jsp:useBean>

    1、定义

    Java Beans是一种软件组件

    JavaBeans 是一种规范

    JavaBeans是一个Java的类

    有时称JavaBeans的实例为JavaBeans

    2、Java Beans 编写要求

    • Bean 类必须拥有一个无参构造方法(就是默认的那个),显式地定义这样一个构造,或者省略所有的构造
    • JSP元素创建Bean时,会调用默认的构造函数,实际应用中,常用Servlet 创建Bean ,此时,不必一定有无参构造
    • Bean 类不应该有公开的实例变量(或叫字段、属性),所有的属性被私有化(封装起来)
    • 持续性的值应该通过getXxx 和setXxx 方法来访问,对于私有的属性需要提供对外访问的方法: get 和set

    3、语法

    <jsp:useBean id="id" scope="page|request|session|application" typeSpec/>
    • 其中typeSpec 可以写成如下形式之一:

        class = "className"
        class = "className" type = "typeName"
        beanName = "beanName" type = "typeName"
        type = "typeName"

    4、属性

    • id="name"

        用以指定Java 对象的实例名或引用对象的脚本变量的名称
        通过id指定的名称来分辨不同的Bean
        该名称严格区分大小写(相当于Java中的变量的名称)

    • scope="page | request | session | application "

        该属性用以确定Bean 存在的范围以及id 变量名的有效范围,默认page

    • class="className"

        使用new 关键字和构造器构造一个实例
        这个类必须是非抽象的,必须有公共的、无参构造
        类名必须是包名+ 类名,严格区分大小写

    • beanName="beanName" type="typeName"

        使用instantiate 方法从一个class 中实例化一个Bean
        instantiate方法在java.beans.Beans 中
        beanName可以是package 或class ,也可以是表达式
        package和class都是大小写敏感的
        同时还可以指定Bean 的类型

    • type="typeName"

        type可以指定一个类,也可以是一个父类,或者是一个接口
        如果没有使用class或beanName指定type,Bean将不会被实例化

    5、测试案例

    Student.java

    package ecut.entity;
    
    import java.io.Serializable;
    import java.util.Date;
    
    public class Student implements Serializable {
    
        private static final long serialVersionUID = 3097161330831346815L;
    
        private Integer id;
        private String studentName;
        private char gender;
        private Date birthdate;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return studentName;
        }
    
        public void setName(String name) {
            this.studentName = name;
        }
    
        public char getGender() {
            return gender;
        }
    
        public void setGender(char gender) {
            this.gender = gender;
        }
    
        public Date getBirthdate() {
            return birthdate;
        }
    
        public void setBirthdate(Date birthdate) {
            this.birthdate = birthdate;
        }
    
    }

    userbean.jsp

    <%@ page language = "java" pageEncoding = "UTF-8" %>
    <%@ page contentType = "text/html; charset= UTF-8"%> <%@ page import= "java.util.*" %>
    <%@ page import= "org.malajava.util.*" %>
    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>标准动作: useBean</title> </head> <body> <%-- Student student = null ; --%> <%--student = (Student )pageContext.getAttribute("student");--%> <%-- if ( student == null ) {   student =new Student();
            pageContext.setAttribute("student" ,student);
           } else {
              //如果指定的scope中已有某个类型的对象就不再创建
           
    }
      
    --%>
    <jsp:useBean id="student" class="ecut.entity.Student" scope="page" /> <%-- student 。setId( 1001 );//studet.id =1001--%> <jsp:setProperty name="student" property="id" value="10001" /> <jsp:setProperty name="student" property="name" value="张三丰" /> <jsp:setProperty name="student" property="gender" value="男" /> <%Date birthdate = DateHelper.getDate( 1995 , 10 , 10 ) ; %> <jsp:setProperty name="student" property="birthdate" value="<%= birthdate %>"/> <p> JSP表达式:<%= student %> </p> <p> EL表达式:${ student } </p> <hr> <div> id : ${ student.id } </div> <div> name : ${ student.name } </div> <div> gender : ${ student.gender } </div> <div> birthdate : ${ student.birthdate } </div> <hr> <div> id : <jsp:getProperty name="student" property="id" /> </div> <div> name : <jsp:getProperty name="student" property="name" /> </div> </body> </html>

     <jsp:getProperty>

    1、作用

    • 获取Bean的值,并将其转化为一个字符串插入到输出页面中

    2、属性

    • name="name" : 必选属性,相应的Bean的名字
    • property="propertyName" : 必选属性,其值为相应的Bean内的属性名

     <jsp:setProperty>

    1、作用

    • 用以设置Bean 中属性的值

    2、语法

    <jsp:setProperty name=”objName” property-expression />
    • property-expression 可以写成:

        property="*"
        property="propertyName"
        property="propertyName" param="parameterName"
        property="propertyName" value="propertyValue"

    3、测试案例

    • value只能赋静态值,param可以动态赋值;
    • value和param不能同时使用
    • 当property属性值为“*”时,request请求中所有参数的值将被分别赋给Bean中与参数具有相同名字的属性。
    • Bean中属性与参名字不相同用param

    index.jsp

    <%@ page language = "java" pageEncoding = "UTF-8" %>
    <%@ page contentType = "text/html; charset= UTF-8"%>
    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Standard Actions</title> <style type="text/css"> a { display: block ; margin: 20px 0px ; padding : 5px 5px ; border: 1px solid blue ; border-radius : 3px ; width: 60% ; text-decoration: none ; } </style> </head> <body> <h2>Standard Actions</h2> <a href="${ pageContext.request.contextPath }/action/include.jsp">&lt;jsp:include&gt;</a> <a href="${ pageContext.request.contextPath }/action/forward.jsp">&lt;jsp:forward&gt;</a> <a href="${ pageContext.request.contextPath }/action/param.jsp">&lt;jsp:param&gt;</a> <a href="${ pageContext.request.contextPath }/action/useBean.jsp">&lt;jsp:useBean&gt;&lt;jsp:setProperty&gt;&lt;jsp:getProperty&gt;</a> <hr> <form action="${ pageContext.request.contextPath }/action/setProperty1.jsp" method="post"> <input type="text" name="id" placeholder="编号" > <input type="text" name="name" placeholder="姓名" > 性别: <input type="radio" name="gender" value="女" ><input type="radio" name="gender" value="男" ><input type="submit" value="提交" > </form> <hr> <form action="${ pageContext.request.contextPath }/action/setProperty2.jsp" method="post"> <input type="text" name="sid" placeholder="编号" > <input type="text" name="sname" placeholder="姓名" > 性别: <input type="radio" name="sgender" value="女" ><input type="radio" name="sgender" value="男" ><input type="submit" value="提交" > </form> </body> </html>

    setProperty1.jsp

    <%@ page language = "java" pageEncoding = "UTF-8" %>
    <%@ page contentType = "text/html; charset= UTF-8"%>
    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>标准动作 : setProperty</title> </head> <body> <jsp:useBean id="student" class="ecut.entity.Student" scope="page" /> <jsp:setProperty name="student" property="*" /> <div> <div> id : ${ student.id } </div> <div> name : ${ student.name } </div> <div> gender : ${ student.gender } </div> </div> </body> </html>

     setProperty2.jsp

    <%@ page language = "java" pageEncoding = "UTF-8" %>
    <%@ page contentType = "text/html; charset= UTF-8"%>
    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>标准动作 : setProperty</title> </head> <body> <jsp:useBean id="student" class="ecut.entity.Student" scope="page" /> <jsp:setProperty name="student" property="id" param="sid"/> <jsp:setProperty name="student" property="name" param="sname"/> <jsp:setProperty name="student" property="gender" param="sgender"/> <div> <div> id : ${ student.id } </div> <div> name : ${ student.name } </div> <div> gender : ${ student.gender } </div> </div> </body> </html>

    转载请于明显处标明出处

    https://www.cnblogs.com/AmyZheng/p/9164874.html

  • 相关阅读:
    从B树、B+树、B*树谈到R 树
    The Log-Structured Merge-Tree(译)
    Leveldb源码分析--2
    Leveldb源码分析--1
    little-endian And big-endian
    Fixed数据类型
    Varint数值压缩存储方法
    JavaEE开发之SpringBoot工程的创建、运行与配置
    Javaee基本框架(Struts2,Spring,MyBatista)之间的关系
    XLM解析技术概述
  • 原文地址:https://www.cnblogs.com/AmyZheng/p/9164874.html
Copyright © 2011-2022 走看看