JSP总结二(动作元素)
- 2019 年 12 月 31 日
- 筆記
文章目录
JSP总结二(动作元素)
<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"/>
JavaBean的存活范围
Scope
属性决定了javabean对象的存在的范围。可选值有:
page
(默认值)request
session
application
<jsp:useBean id="person" class="com.anllin.bean.Person" scope="page"></jsp:useBean>
在page范围
客户每次请求访问
jsp
页面时,都会创建一个javabean
对象。JavaBean对象的有效范围就是当前的jsp
文件中,如果不在当前Jsp中,那么就不可以使用该JavaBean
对象中设置的值 比如使用forward
转发给另外一个JSP文件,那么此时就会再创建一个JavaBean
对象,原来页面的JavaBean对象并没有传过来,也就不能使用其中的值,这个和变量的共享是一个道理的,这个JavaBean对象只能在当前的Jsp文件中调用,不能实现共享
在request范围
客户每次请求访问jsp页面时,都会创建新的javabean对象。有效范围为:
- 客户请求访问的当前jsp网页。
- 和当前网页共享一个客户请求的网页,即当前jsp网页中
<%@include %>
指令以及<forward>
标记包含的其他jsp文件,也就是转发和包含的Jsp文件也是可以共享这个JavaBean
对象的,这个和Servlet中的request
是一样的,一旦转发了,就可以通过setAttribute()
设置属性,那么在转发的页面中就可以访问这个属性 - 当所有共享同一个客户请求的jsp页面执行完毕并向客户端发加响应时,javabean对象结束生命周期。
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>
在session范围内
- 我们知道
HttpSession
是可以在会话期间实现数据共享的,只要是同一个项目中的Jsp
文件都是可以共享这个JavaBean对象,但是并不是永久的,因为会话也是有时间限制的, javabean
对象作为属性保存在HttpSession对象中,属性名为javabean的id,属性值为javabean对象。除了可以通过javabean的id直接引用javabean对象外,也可以通过HttpSession.getAttribute()
方法取得javabean
对象- 一定要注意在每一个
<jsp:useBean>
中都要写上scope="session"
在application范围内
- 我们知道
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