JavaBean基础

概述

JavaBean就是是符合一定规则的java类

  1. 有默认的无参构造函数
  2. 有一系列读写属性,即属性的setXX()和getXX()方法,对于boolean类型的属性允许拥有isXX()
  3. 需要被序列化并且实现了 Serializable 接口。

使用

在JSP的脚本标识中使用就和普通Java一样

<%
	Bean tmp = new Bean();
    //tmp.setXX("VALUE");
    //tmp.isXX();
    //tmp.getXX();
%>

与JSP的动作标识结合使用

  • <jsp:useBean id="" class="" scope="page|request|session|application"/>id为javabean实例名,class必须为类的完整包名, scope为作用域,默认为page,即当前页面。先在对应scope中寻找有没有重名的实例,如果有返回该实例的引用,否则初始化一个新的javabean

  • <jsp:setProperty property="" name="" value=""/>,为javabean实例的属性赋值,property为属性名,name为实例名,对应上面的id,value为所赋的值

  • <jsp:getProperty property="" name="">,获得实例对应属性值

使用setProperty时,value的值可以是①字符串②表达式。如value="<%=new Date()%>"为字符串时,该值会自动转化为JavaBean属性相应的类型,为表达式时,该表达式的计算结果必须与所要设置的JavaBean属性的类型一致。

如果使用<jsp:setproperty name="Test" property="*">,如


<jsp:useBean id="user" class="com.caut.bean.Bean"/>
<jsp:setProperty property="*" name="user"/>
<!-- 或 -->
<jsp:useBean id="user" class="com.lyq.bean.User">
	<jsp:setProperty property="*" name="user"/>
</jsp:useBean>

代表自动匹配客户端传来的所有参数,即request.getParameter可以获取到的值。

JavaBean中的静态成员变量

考虑下面的例子

package com.lyq.bean;
//计数器
public class Counter {
	private static int count = 0;//注意这里的static
	public int getCount(){//这里不能用static,否则JSP无法调用
		return ++count;
	}
}
<body>
	<jsp:useBean id="counter" class="com.lyq.bean.Counter"></jsp:useBean>
	<jsp:getProperty property="count" name="counter"/>
</body>

上述JavaBean的作用域为page,每次刷新页面的时候会初始化一个新的javabean,但是页面显示中可以看到counter一直在加一。这是因为JAVA静态变量只在加载类的时候初始化一次,所以虽然初始化新的实例,但是类没有重新加载(没有重启tomcat),counter的值就会保存下来

序列化

为什么要implements Serializable

Serializable是一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才是可序列化的。实际上,Serializable没有具体内容,是一个空接口,目的只是标识类的对象可以被序列化。

什么情况下需要序列化

  • 当你想把的内存中的对象写入到硬盘的时候。

  • 当你想用套接字在网络上传送对象的时候。

  • 当你想通过管道传输对象的时候。

运行机制

对象序列化把内存中的Java对象(User之类的JavaBean)转换成二进制流,可以很方便的存储或者在网络中传输

通过运行时判断类的序列化ID(serialVersionUID)来判定版本的一致性。在反序列化时,JVM会通过二进制流中的serialVersionUID与本地的对应的实体类进行比较,如果相同就认为是一致的,可以进行反序列化,正确获得信息,否则抛出序列化版本不一致的异常。

所以涉及到数据传输或者存储的类,严格意义上来说都要加上序列化ID,这也是一种良好的编程习惯。

实例

需要注意的几点:

  • Cookie记得设置编码
  • <jsp:setProperty property="*" name="user"/>实际要用到request获得参数,要在setProperty之前就设置好request的编码
    index.jsp
<body>
<!-- cookie实现记录上一次的登录用户 -->
<%@ page import="java.net.URLDecoder"%>
<%
    Cookie[] cookies = request.getCookies();
	if(cookies != null){
		String u_id="";
		String u_pass="";
		for(int i=0;i<cookies.length;++i){
			if(cookies[i].getName().equals("u_id")){
				u_id = URLDecoder.decode(cookies[i].getValue(),"UTF-8");
			}
			if(cookies[i].getName().equals("u_pass")){
				u_pass = URLDecoder.decode(cookies[i].getValue(),"UTF-8");
			}
		}
		
		if(!u_id.equals("")){
			out.print("welcome"+u_id);
			out.print("<br>");
			out.print(u_pass);
		}
		
	}
	
%>
<jsp:useBean id="bean" class="com.caut.bean.Bean"/>
<jsp:getProperty property="u_num" name="bean"/>
<form action="tmp.jsp" method="post">
  <input type="text" name="u_id"/>
  <input type="text" name="u_pass"/>
  <input type="submit"/>
</form>
</body>

tmp.jsp

<body>
<%@page import="java.net.URLEncoder"%>
<%
	request.setCharacterEncoding("utf8");
	response.setCharacterEncoding("utf8");
%>
<jsp:useBean id="user" class="com.caut.bean.Bean"/>
<jsp:setProperty property="*" name="user"/>
<%
	//保存cookie
	System.out.println(user.getU_pass());
	Cookie cookie1 = new Cookie("u_id",URLEncoder.encode(user.getU_id(),"UTF-8"));
	Cookie cookie2 = new Cookie("u_pass",URLEncoder.encode(user.getU_pass(),"UTF-8"));
	response.addCookie(cookie1);
	response.addCookie(cookie2);
%>
<jsp:include page="index.jsp"/>
<!-- 这里设置处理完之后跳转回index界面,此时就可以看到welcome等 -->
</body>

Bean.java

package com.caut.bean;
public class Bean implements Serializable {
	private static final long serialVersionUID = 1L;
	private String u_id;
	private String u_pass;
	private static int u_num = 0;
	public Bean() {
		System.out.println("创建javabean");
	}
	public String getU_id() {
		return u_id;
	}
	public void setU_id(String u_id) {
		this.u_id = u_id;
	}
	public String getU_pass() {
		return u_pass;
	}
	public void setU_pass(String u_pass) {
		this.u_pass = u_pass;
	}
	public int getU_num() {
		return ++u_num;
	}
	public void setU_num(int u_num) {
		Bean.u_num = u_num;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值