Jsp第八课 JavaBean与Jsp动作的学习

Posted 笔触狂放

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jsp第八课 JavaBean与Jsp动作的学习相关的知识,希望对你有一定的参考价值。

JavaBean的概念

JavaBean是可复用的、平台独立的软件组件

JavaBean既可以是简单的GUI要素,如按钮和滚动条,也可以是复杂的可视化软件组件,如数据库视图

有些JavaBean是没有GUI表现形式的,常用来封装事务逻辑、数据库操作等等

我们可以把遵循某种规范的Java类称为JavaBean:

  1. 这个类是可序列化的
  2. 这个类必须带有一个无参的构造方法
  3. 这个类的属性必须通过get 、set和其他标准命名规范来命名的方法进行操作
  4. 这个类包含事件处理方法

接下来我们通过一个小案例来引导出这一课程要学习的内容,创建一个jsp文件,并存储一个学生的六个数据信息至四大作用域的其中一个:

<%@page import="com.abc.Student"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		//存储一个学生的信息
		//学号:007
		//姓名:小明
		//性别:男
		//年龄:20
		//手机号:18188888888
		//家庭地址:江西省南昌市
		 session.setAttribute("id", "007");
		session.setAttribute("name", "小明");
		session.setAttribute("sex", "男");
		session.setAttribute("age", 20);
		session.setAttribute("phone", "18188888888");
		session.setAttribute("addr", "江西省南昌市"); 
		
		
	%>
		
			
</body>
</html>

 以上方式是初学者常用的存储数据的方式,那么我们再创建一个jsp文件来获得显示出这些数据:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>学生个人信息</h3>
 <p>学号:<% 
String id=(String)session.getAttribute("id");
out.write(id);
%></p>
<p>姓名:<% 
out.write((String)session.getAttribute("name"));
%></p>
<p>年龄:<%=session.getAttribute("age")%></p>
<p>性别:$sex</p>
<p>手机号:<%=session.getAttribute("phone")%></p>
<p>家庭地址:<%=session.getAttribute("addr")%></p> 



</body>
</html>

通过运行可以看到session中存储的数据是可以获得出来进行显示。那么如果需要存储更多的数据呢?比如60个数据,600个数据,再使用这种原始的方式,代码量就显的很累赘,冗余。那么我们使用另一种方式,创建JavaBean类来对数据进行封装,定义一个Student类,生成get,set方法,生成无参构造方法,带参数构造方法以及toString方法:

package com.abc;

import java.io.Serializable;
/**
 * java基础中类的封装
 * 服务端开发中称为javaBean
 * @author Administrator
 *
 */
public class Student implements Serializable
	private String id;//学号
	private String name;//姓名
	private int age;//年龄
	private String sex;//性别
	private String phone;//手机号
	private String addr;//家庭地址
	public String getId() 
		return id;
	
	public void setId(String id) 
		this.id = id;
	
	public String getName() 
		return name;
	
	public void setName(String name) 
		this.name = name;
	
	public int getAge() 
		return age;
	
	public void setAge(int age) 
		this.age = age;
	
	public String getSex() 
		return sex;
	
	public void setSex(String sex) 
		this.sex = sex;
	
	public String getPhone() 
		return phone;
	
	public void setPhone(String phone) 
		this.phone = phone;
	
	public String getAddr() 
		return addr;
	
	public void setAddr(String addr) 
		this.addr = addr;
	
	public Student() 
		super();
		// TODO Auto-generated constructor stub
	
	public Student(String id, String name, int age, String sex, String phone, String addr) 
		super();
		this.id = id;
		this.name = name;
		this.age = age;
		this.sex = sex;
		this.phone = phone;
		this.addr = addr;
	
	@Override
	public String toString() 
		return "Student [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + ", phone=" + phone + ", addr="
				+ addr + "]";
	
	

接下来在jsp中使用这个类来对存储的数据进行封装,

<%@page import="com.abc.Student"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		//存储一个学生的信息
		//学号:007
		//姓名:小明
		//性别:男
		//年龄:20
		//手机号:18188888888
		//家庭地址:江西省南昌市
		
		
		//当要存储的数据量比较大,不建议采用以上办法存储数据
		//使用类的封装
		Student student=
		new Student("007","小明",
				20,"男",
				"18188888888","江西省南昌市");
		session.setAttribute("student", student);
		
	%>
	
		
	
			
</body>
</html>

通过代码对比可以看出,明显比之前的写法简单了很多,再看看获取数据输出的结果:

<%@page import="com.abc.Student"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>学生个人信息</h3>


 <% Student student=(Student)session.getAttribute("student"); %>
<p>学号:<%=student.getId() %></p>
<p>姓名:<%=student.getName()%></p>
<p>年龄:<%=student.getAge()%></p>
<p>性别:<%=student.getSex() %></p>
<p>手机号:<%=student.getPhone()%></p>
<p>家庭地址:<%=student.getAddr()%></p> 


</body>
</html>

但是又存在新的问题,如果我们使用jsp开发大型项目,需要开发比较复杂的网站和网页,那么编写这种有html代码和java代码混杂在一起的文件,一旦出现错误,或者是后期的维护和修改,很不利,因此本课程引导出Jsp动作来进行替代Java代码在Jsp页面中的作用。

1.<jsp:useBean>动作

< jsp:useBean>的scope属性的取值

scope属性取值为page,JavaBean的缺省作用域,也叫页面级作用域

客户每次请求JSP页面时,都会创建一个JavaBean对象

JavaBean对象在以下两种情况下结束生命期

  •          客户请求访问的当前JSP网页通过<jsp:forward>标签将请求转发到另一个页面
  •         客户请求访问的当前JSP页面执行完毕并向客户端发回响应

scope属性取值为request时,客户每次请求访问JSP页面时,都会创建一个JavaBean对象

  •         JavaBean对象的有效范围为:
    •                 客户请求访问的当前JSP页面。
    •                 和当前JSP页在共享同一个客户请求的页面

scope属性取值为session,它存在于整个session的生存周期内,处于同一个session中的JSP页面共享这个JavaBean对象

scope属性值取为application,它存在于整个Web应用的生存周期内,Web应用中所有JSP页面都能共享同一个JavaBean对象

<%@page import="com.abc.Student"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<!-- 尽量在jsp页面不去使用java代码完成功能 -->
	<!-- Jsp动作 -->
	<!-- id:填对象名 
		class:类的完整包名
		scope:四大域的标识-->
	<!-- Student stu=new Student();
	session.setAttribute("stu", stu); -->
	<%-- <jsp:useBean id="stu" class="com.abc.Student" 
			scope="session"></jsp:useBean>
	<% stu.setId("007");
		stu.setName("小明");
		stu.setAge(20);
		stu.setSex("男");
		stu.setPhone("18188888888");
		stu.setAddr("江西省南昌市");%> --%>
		
		
			
</body>
</html>

再来看获取出来的数据的显示:

<%@page import="com.abc.Student"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>学生个人信息</h3>


<jsp:useBean id="stu" class="com.abc.Student" 
			scope="session"></jsp:useBean>
<p>学号:<%=stu.getId() %></p>
<p>姓名:<%=stu.getName()%></p>
<p>年龄:<%=stu.getAge()%></p>
<p>性别:<%=stu.getSex() %></p>
<p>手机号:<%=stu.getPhone()%></p>
<p>家庭地址:<%=stu.getAddr()%></p> 


</body>
</html>

2.<jsp:setProperty>动作

这时候可能很多初学者开始质疑博主,刚不是说Jsp动作用来替代Jsp页面中的java代码的作用,你现在反而把java代码越写越多,别急,接下来介绍第二个Jsp动作用来进行对象变量的赋值:

<%@page import="com.abc.Student"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
<jsp:useBean id="stu1" class="com.abc.Student" 
			scope="session"></jsp:useBean>
	<!-- name:填对象名
		property:填变量名
		value:填数据 -->		
<jsp:setProperty property="id" name="stu1" value="007"/>
<jsp:setProperty property="name" name="stu1" value="小明"/>
<jsp:setProperty property="age" name="stu1" value="20"/>
<jsp:setProperty property="sex" name="stu1" value="男"/>
<jsp:setProperty property="phone" name="stu1" value="18188888888"/>
<jsp:setProperty property="addr" name="stu1" value="江西省南昌市"/>		
			
</body>
</html>

3.<jsp:getProperty>动作

再来看获取数据的显示情况,使用第三个Jsp动作获取数据:

<%@page import="com.abc.Student"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>学生个人信息</h3>

<jsp:useBean id="stu1" class="com.abc.Student" 
			scope="session"></jsp:useBean>
<p>学号:<jsp:getProperty property="id" name="stu1"/></p>
<p>姓名:<jsp:getProperty property="name" name="stu1"/></p>
<p>年龄:<jsp:getProperty property="age" name="stu1"/></p>
<p>性别:<jsp:getProperty property="sex" name="stu1"/></p>
<p>手机号:<jsp:getProperty property="phone" name="stu1"/></p>
<p>家庭地址:<jsp:getProperty property="addr" name="stu1"/></p>
</body>
</html>

通过四种方式的运行,可以看出都能达到效果完成需求的功能,但是对于项目的可扩展性和维护性来说,Jsp动作确实是我们需要掌握的,在Jsp技术的学习中,是很有必要的。

以上三种Jsp动作还能结合映射关系完成表单提交的数据进行简化代码:

我们先创建一个表单页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>学生信息注册页面</title>
</head>
<body>
<div align="center">
	<form action="getStudentInfo.jsp" method="post">
	<!-- 每一个文本框定义的name属性的名称一定要
	和Student实体类的全局变量名称一致 -->
	<!-- 映射关系 -->
		学号:<input type="text" name="id"><br/>
		姓名:<input type="text" name="name"><br/>
		年龄:<input type="text" name="age"><br/>
		性别:<input type="text" name="sex"><br/>
		手机号:<input type="text" name="phone"><br/>
		家庭地址:<input type="text" name="addr"><br/>
		<input type="submit" value="注册">
	</form>
</div>
</body>
</html>

再创建获取表单信息的jsp页面:

<%@page import="com.abc.Student"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!-- 接收浏览器提交的学生的注册信息 -->
	<%
	//因为表单提交的时候是使用post的请求提交
	//post提交的数据是属于内部传输,不会显示在地址上
	//tomcat不会自动帮助我们转换编码格式
	//所以需要我们自己手动转码
	request.setCharacterEncoding("UTF-8");
	String id=request.getParameter("id");
	String name=request.getParameter("name");
	String age=request.getParameter("age");
	String sex=request.getParameter("sex");
	String phone=request.getParameter("phone");
	String addr=request.getParameter("addr");
	
	Student student=new Student(id,name,
			Integer.parseInt(age),sex,
			phone,addr);
	
	session.setAttribute("stu", student);
	%>
	
	<!-- 使用Jsp动作完成以上相同的功能作用 -->
	<jsp:useBean id="s" class="com.abc.Student" scope="session"></jsp:useBean>
	<!-- 使用表单和Student类的映射关系直接将表单的数据存储至Stuent对象 -->
	<jsp:setProperty property="*" name="s"/>
	
	<!-- 使用重定向跳转其他页面展示从表单上获得的学生信息 -->
	<% response.sendRedirect("showStudentInfo.jsp"); %>
	
</body>
</html>

 代码中使用了Java代码和Jsp动作两种方式完成了获取表单提交的数据,很明显Jsp动作是完胜!!!

再使用重定向的方式跳转到另一个jsp页面进行展示数据:

<%@page import="com.abc.Student"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<h3>使用Java代码方式展示学生的注册信息</h3>
	<% Student student=(Student)
				session.getAttribute("stu"); %>
	<p><%=student.getId() %></p>
	<p><%=student.getName() %></p>
	<p><%=student.getAge() %></p>
	<p><%=student.getSex() %></p>
	<p><%=student.getPhone() %></p>
	<p><%=student.getAddr() %></p>
	
	<br><br><br><br>
	<h3>使用Jsp动作方式展示学生的注册信息</h3>
	<jsp:useBean id="s" class="com.abc.Student" scope="session"></jsp:useBean>
	<p><jsp:getProperty property="id" name="s"/></p>
	<p><jsp:getProperty property="name" name="s"/></p>
	<p><jsp:getProperty property="age" name="s"/></p>
	<p><jsp:getProperty property="sex" name="s"/></p>
	<p><jsp:getProperty property="phone" name="s"/></p>
	<p><jsp:getProperty property="addr" name="s"/></p>
	
</body>
</html>

很明显都能进行显示,但通过代码量来说,Jsp动作是毋庸置疑的。 

除以上三种常用的Jsp动作以外,接下来再介绍几种常用的Jsp动作:

4.<jsp:forward>和<jsp:param>动作

<jsp:forward>标签用于将控制权从JSP页面传递给本地服务器的另一个位置,丢弃当前页面生成的任何内容,并在替换位置上重新处理请求

<jsp:forward>标签只有一个page属性。page属性包含的是一个相对URL,可以是html页面、JSP页面或者是Servlet的 url-pattern。 page的值既可以直接给出,也可以在请求的时候动态计算,通过表达式来实现

<jsp:forward>标签在传递页面的控制权到另外的页面的同时,使用<jsp:param>标签可以把相应的参数值传递到目的页面

该Jsp动作的跳转页面方式类似于request对象的请求转发的效果,也能达到跳转页面的同时可以携带数据跳转,但是在传递中文数据的时候,数据会经过tomcat服务器进行转码,因此我们在传递数据之前要进行提前转换编码格式的操作:

 <jsp:forward>标签用于把请求转发给另一个资源 <jsp:forward>标签只有一个page属性。

page属性包含的是一个相对URL,可以是html页面、JSP页面或者是Servlet的 url-pattern

语法:     <jsp:forward page="url" />

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- jsp:forward:用于跳转页面
该jsp动作是用于替代request的请求转发的java代码
跳转方式类似于请求转发
jsp:param:用于携带数据
jsp:param这个动作用于替代request.setAttribute()方法
 -->
 <%
	//UTF-8编码格式
	String info="小明";
	//解码成字节数组,因为字节数组是不带任何编码格式
	byte[] b=info.getBytes("UTF-8");
	//将字节数组重新编码
	String info1=new String(b,"ISO-8859-1");
%>
<jsp:forward page="seven.jsp">
<jsp:param value="<%=info1 %>" name="name"/>
</jsp:forward>
</body>
</html>

在传输到另一个jsp页面之后,要将编码格式转换回来:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
我是第七个页面<br>
<%
	//ISO-8859-1
	String info=request.getParameter("name");
	byte[] bs=info.getBytes("ISO-8859-1");
	String info1=new String(bs,"UTF-8");
%>
获得携带的数据为:<%=info1 %>

</body>
</html>

 5.<jsp:include>和<jsp:param>动作

用于把另一个资源的输出内容插入进当前jsp页面的输出内容之中,称之为动态引入。

<jsp:include> 标签的page属性包含的是一个相对URL,可以是html页面、JSP页面或者是Servlet的url-pattern

语法:     <jsp:include page="url" />

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- align="center":设置当前标签内部的所有内容居中对齐 -->
	<div  
	style="width: 900px;height: 800px;
	background-color: green;margin: auto;">
		<!-- 头部 -->
		<jsp:include page="head.jsp" flush="true">
			<jsp:param value="head" name="jsp"/>
		</jsp:include>
		<!-- 中部 -->
		<jsp:include page="center.jsp" flush="true">
			<jsp:param value="center" name="jsp"/>
		</jsp:include>
		<!-- 底部 -->
		<jsp:include page="foot.jsp" flush="true">
			<jsp:param value="foot" name="jsp"/>
		</jsp:include>
	</div>
</body>
</html>

head.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	String info=request.getParameter("jsp");
%>
<div style="width: 100%;height: 200px;
		background-color: red;"><%=info %></div>
</body>
</html>

center.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	String info=request.getParameter("jsp");
%>
<div style="width: 100%;height: 400px;
		background-color: pink;"><%=info %></div>
</body>
</html>

foot.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	String info=request.getParameter("jsp");
%>
<div style="width: 100%;height: 200px;
		background-color: blue;"><%=info %></div>
</body>
</html>

在引入子页面的同时还能动态的给子页面进行传入参数和数据,这种操作比我们之前所使用的静态包含的Jsp指令更灵活。

<%@ include %>指令和<jsp:include >区别

<jsp:include>标签是动态引入,涉及到的2个jsp页面会被翻译成2个servlet,这两个servlet的内容在执行时进行合并

而include指令是静态引入,涉及到的2个jsp页面会被翻译成一个servlet,其内容是在源文件级别进行合并

本次文章就介绍到这里!!!

以上是关于Jsp第八课 JavaBean与Jsp动作的学习的主要内容,如果未能解决你的问题,请参考以下文章

JSp动作指令

jsp都有哪些动作?作用分别是啥?

JSP学习日记

JAVA-JSP动作

在JSP中使用JavaBean

jsp有哪些动作作用分别是什么?