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>\n");
          out.write("<html>\n");
          out.write("<head>\n");
          out.write("<meta charset=\"UTF-8\">\n");
          out.write("<title>inner</title>\n");
          out.write("</head>\n"); out.write("<body>\n"); out.write("\n"); out.write("\t"); for( int i = 0 ; i < 10 ; i++ ) { out.println( i ) ; // 这个 out 是 JSP 内置对象  } out.write("\n"); out.write("\n"); out.write("</body>\n"); 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

猜你喜欢

转载自www.cnblogs.com/AmyZheng/p/9164874.html