文章目录
<jsp:include>
前面介绍了一种指令元素
include
,那是一种静态包含JSP
文件,这个标签是动态包含一个JSP
页面,也就是被包含的JSP
页面和原JSP将合并在一起,转译为一个Servlet
类。这是有一定的局限性的,如变量的定义不能重复。 动态的包含JSP文件即是被包含的JSP和原JSP分别转译为一个Servlet类,这就保证了其中的变量可以重复定义了,因为并不是在一个类中了<jsp:include page="相对的文件路径"></jsp:include>
这种标签转译为Servlet和指令元素include
是一样的
<%--动态导入在编译的时候是两个jsp文件各自编译成一个Servlet文件,因此其中的变量是不可以共享的,在当前页面中还是可以定义导入页面定义的变量 --%>
<jsp:include page="form.jsp">
//定义的param可以在form.jsp中使用request.getParameter(String name)取得其中的值
<jsp:param value="陈加兵" name="username"/>
<jsp:param value="123456" name="password"/>
</jsp:include>
<jsp:forward>
这是将请求转发给另外一个JSP或者Servlet文件处理,这个和
RequestDispatcher
是一样的原理,就是Servlet中转发 //绑定属性,在login.jsp中可以获取 request.setAttribute("username","陈加兵"); //当前页面的请求将会交给login.jsp文件处理 <jsp:forward page='login.jsp'></jsp:forward>
<jsp:useBean>
这个动作元素是用来搭配
JavaBean
组件的标准标签。JavaBean
必须满足下面的条件:
Java.io.Serializable
接口public
)类变量setter
)与取值方法(getter
)
下面就是一个JavaBean
组件
package com;
import java.io.Serializable;
public class Person implements Serializable {
//这里的变量的值一定要和表单的中的name属性的值一样,否则不能获取
private String username;
private String password;
private int age;
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;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Boolean Checkout(){
return "陈加兵".equals(username)&&"123456".equals(password);
}
}
使用
JavaBean
的目的是减少Scriptlet
的使用。其中搭配<jsp:useBean>
来使用这个JavaBean
,并且使用<jsp:setProperty>
与<jsp:getProperty>
对javaBean
进行设值与取值 注意javaBean
一定要搭配表单使用,因为设值的值其实是隐式的调用request.getParameter(String name)
来获取表单的值 下面是一个登录的表单(注意这里的input
中的name
属性的值一定要和JavaBean
组件类的成员变量的名字一样)
<%@ 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>Insert title here</title>
</head>
<body>
<!--提交给Demo1.jsp处理,下面就实现Demo1.jsp-->
<form action="Demo1.jsp">
<label>姓名:</label>
<input type="text" name="username">
<label>密码:</label>
<input type="password" name="password">
<input type="submit" value="提交">
</form>
</body>
</html>
下面我们写一个
JSP
文件设置JavaBean
<%@ 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>Insert title here</title>
</head>
<body>
<%--使用JavaBean person是Person创建的对象,相当于 Person person=new Person()
其中class是JavaBean的类所在的路径(在com包下的Person文件中)
id就是相当于创建的对象
--%>
<jsp:useBean id="person" class="com.Person"></jsp:useBean>
<%--为username和password设置值,相当于下面的语句
person.setUsername(request.getParameter("username"));
person.setPassword(request.getParameter("password"));
JavaBean中的变量一定要和表单中的值一样,否则就不能对应,出现错误
其中name就是指定上面的id,即是使用的对象,property就是指定变量
--%>
<jsp:setProperty property="uesrname" name="person"/>
<jsp:setProperty property="password" name="person"/>
<%--age是另外的变量,并没有对应着表单的name属性,因此我们可以单独的为其设置值,使用value实行即可设置,这里不必考虑类型,因为在内部会自动转换成JavaBean中的类型 --%>
<jsp:setProperty property="age" name="person" value="20"/>
<%--获取设置的值,相当于下面的语句:
person.getUsername();
person.getPassword();
person.getAge();
--%>
<h1><jsp:getProperty property="username" name="person" /></h1>
<h1><jsp:getProperty property="password" name="person" /></h1>
<h1><jsp:getProperty property="age" name="person" /></h1>
</body>
</html>
其实我们还可以不但可以将表单中的值赋值给变量,还可以使用
value
和param
自己设置
<%-- 将请求的url中的password的值赋值给username,注意这里的使用的get的请求的话,提交的时候url会有请求值的
http://localhost:8080/web2/JSP/Demo1.jsp?username=%E9%99%88%E5%8A%A0%E5%85%B5&password=123456
--%>
<jsp:setProperty property="username" name="person" param="password"/>
<%--age是另外的变量,并没有对应着表单的name属性,因此我们可以单独的为其设置值,使用value实行即可设置,这里不必考虑类型,因为在内部会自动转换成JavaBean中的类型 --%>
<jsp:setProperty property="age" name="person" value="20"/>
Scope
属性决定了javabean对象的存在的范围。可选值有:
page
(默认值)request
session
application
<jsp:useBean id="person" class="com.anllin.bean.Person" scope="page"></jsp:useBean>
客户每次请求访问
jsp
页面时,都会创建一个javabean
对象。JavaBean对象的有效范围就是当前的jsp
文件中,如果不在当前Jsp中,那么就不可以使用该JavaBean
对象中设置的值 比如使用forward
转发给另外一个JSP文件,那么此时就会再创建一个JavaBean
对象,原来页面的JavaBean对象并没有传过来,也就不能使用其中的值,这个和变量的共享是一个道理的,这个JavaBean对象只能在当前的Jsp文件中调用,不能实现共享
客户每次请求访问jsp页面时,都会创建新的javabean对象。有效范围为:
<%@include %>
指令以及<forward>
标记包含的其他jsp文件,也就是转发和包含的Jsp文件也是可以共享这个JavaBean
对象的,这个和Servlet中的request
是一样的,一旦转发了,就可以通过setAttribute()
设置属性,那么在转发的页面中就可以访问这个属性
javabean
对象作为属性保存在httpServletRequest
对象中,属性名javabean的id
,属性值为javabean
对象,因此可以通过HttpRequest.getAttribute()
方法取得javabean
对象
//Demo1.jsp文件 表单请求提交的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>Insert title here</title>
</head>
<body>
<%--设置scope属性为request,这个是必须的,这里的JavaBean对象为person--%>
<jsp:useBean id="person" class="com.Person" scope="request"></jsp:useBean>
<jsp:setProperty property="uesrname" name="person"/>
<jsp:setProperty property="password" name="person"/>
<jsp:setProperty property="age" name="person" value="20"/>
>
e
<%--转发请求到Demo2.jsp文件中,那么就可以在Demo.jsp中共享person对象了--%>
<jsp:forward page="Demo2.jsp"></jsp:forward>
</body>
</html>
//Demo2.jsp
<%@page import="com.Person"%>
<%@ 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>Insert title here</title>
</head>
<body>
<%-- 使用JavaBean,这里的scope是必须的,一定要和Demo1.jsp一样,id也要一样 --%>
<jsp:useBean id="person" class="com.Person" scope="request"></jsp:useBean>
<%--获取username的值 --%>
<jsp:getProperty property="username" name="person"/>
<%
//使用HttpServletRequest获取对象person
Person p=(Person)request.getAttribute("person");
out.println(p.getUsername()); //获取username的值
%>
</body>
</html>
HttpSession
是可以在会话期间实现数据共享的,只要是同一个项目中的Jsp
文件都是可以共享这个JavaBean对象,但是并不是永久的,因为会话也是有时间限制的,
javabean
对象作为属性保存在HttpSession对象中,属性名为javabean的id,属性值为javabean对象。除了可以通过javabean的id直接引用javabean对象外,也可以通过HttpSession.getAttribute()
方法取得javabean
对象
<jsp:useBean>
中都要写上scope="session"
ServletContext
存在于整个web应用的生命周期,这个不像session
,一旦设置的会话时间结束,那么就不存在了,这个是永远存在的,只要web程序在继续
javabean
对象作为属性保存在application
对象中,属性名为javabean
的id,属性值为javabean对象,除了可以通过javabean的id
直接引用对象外,也可以通过javabean的application.getAttribute()
方法取得javabean对象
其实不仅仅可以对于表单中请求可以转换为对象的值,上面我们说过了存活范围,其实只要在这个请求范围内,并且将对象绑定到响应的属性上面,那么就可以在jsp文件中使用改标签接收其值。 其实一般在表单提交之后,我们会使用Sevlet文件验证是否密码和用户名正确,那么就不是直接提交给jsp文件,此时就像上面说过的,不影响标签的使用,只要将JavaBean对象绑定到响应范围的属性上,便是可以实现对象的共享,代码如下: ServletDemo文件
package com;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//创建对象,并且设置值
Person person=new Person();
person.setUsername("陈加兵");
person.setPassword("123456");
//将JavaBean对象绑定到request上,相当于存活范围为request
//注意这里的键值一定要是和对象的名称一样,否则不行
request.setAttribute("person", person);
//转发请求到jsp文件,下面我们就将在jsp文件中使用JavaBean标签接收
RequestDispatcher dispatcher=request.getRequestDispatcher("JSP/demo1.jsp");
dispatcher.forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
demo1.jsp:上面文件转发过来的,接收JavaBean对象
<%@ 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>Insert title here</title>
</head>
<body>
<%-- 使用标签接收转发过来的JavaBean对象,scope一定要设置为request,id就是传过来的对象,一定要和前面的名称一样,下面的语句相当于:
Person person=(Person)request.getAttribute("person");
--%>
<jsp:useBean id="person" class="com.Person" scope="request"></jsp:useBean>
<h1><jsp:getProperty property="username" name="person"/></h1>
</body>
</html>
http://www.cnblogs.com/zfc2201/archive/2011/08/17/2143615.html