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"><jsp:include></a>
<a href="${ pageContext.request.contextPath }/action/forward.jsp"><jsp:forward></a>
<a href="${ pageContext.request.contextPath }/action/param.jsp"><jsp:param></a>
<a href="${ pageContext.request.contextPath }/action/useBean.jsp"><jsp:useBean> 、<jsp:setProperty>、<jsp:getProperty></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>
转载请于明显处标明出处