JSP第三篇【JavaBean的介紹、JSP的行為--JavaBean】

Java3y發表於2018-02-05

什麼是javaBean

  • JavaBean就是一個普通的java類,也稱之為簡單java物件--POJO(Plain Ordinary Java Object),是Java程式設計中一種設計模式,是一種基於 Java 平臺的軟體元件思想

  • JavaBean遵循著特定的寫法,通常有以下的規則:

    • 有無參的建構函式
    • 成員屬性私有化
    • 封裝的屬性如果需要被外所操作,必須編寫public型別的setter、getter方法
  • 上面的文字看起來好像很高大上,javaBean其實非常簡單,下面的程式碼就是按照特定寫法、規則編寫的一個JavaBean物件



	public class Person {
	    private String username ;
	    private int age;
	
	    public Person() {
	
	    }
	
	
	    public String getUsername() {
	        return username;
	    }
	
	    public void setUsername(String username) {
	        this.username = username;
	    }
	
	    public int getAge() {
	        return age;
	    }
	
	    public void setAge(int age) {
	        this.age = age;
	    }
	}


複製程式碼

為什麼需要使用Javabean

  • 使用javaBean的好處就是:封裝,重用,可讀
  • 下面引用知乎一段回答:

JaveBean你可以理解為一輛貨車,在你的java端和web頁面進行資料傳遞的載體,你當然可以每個變數單獨傳遞,或者使用集合傳遞,但是javabean可以使你的資料更有可讀性,方便開發時明確變數的意義,也使其他閱讀你程式碼的人能直接你的意圖

如果把bean類與資料庫聯合使用,一張表使用bean類,可以使你的程式碼更加簡潔高效,易於理解,現在大多數框架都會使用這種機制。


JSP行為--JavaBean

  • JSP技術提供了三個關於JavaBean元件的動作元素,即JSP行為(標籤),它們分別為:

##jsp:useBean ##

  • <jsp:useBean>標籤用於在指定的域範圍內查詢指定名稱的JavaBean物件

    • 存在則直接返回該JavaBean物件的引用
    • 不存在則例項化一個新的JavaBean物件並將它以指定的名稱儲存到指定的域範圍中
  • 語法:


	<jsp:useBean id="例項化物件的名稱" class="類的全名" scope="儲存範圍"/>


複製程式碼
  • 如果JSP不支援<jsp:useBean>這個行為,我們要使用Person類是這樣使用的

	<%--這裡需要匯入Person類--%>
	<%@ page import="domain.Person" %>

	<%@ page contentType="text/html;charset=UTF-8" language="java" %>
	<html>
	<head>
	    <title></title>
	</head>
	<body>
	
	
	<%
		//new出物件
		Person person = new Person();

	    person.setName("zhongfucheng");
	    System.out.println(person.getName());
	%>
	
	</body>
	</html>


複製程式碼
  • 效果如下

JSP第三篇【JavaBean的介紹、JSP的行為--JavaBean】

  • 我們使用<jsp:useBean>就顯得非常簡潔,不用導包,不用new出物件

	<%@ page contentType="text/html;charset=UTF-8" language="java" %>
	<html>
	<head>
	    <title></title>
	</head>
	<body>
	
	<jsp:useBean id="person" class="domain.Person" scope="page"/>
	<%
	    person.setName("zhongfucheng");
	    System.out.println(person.getName());
	%>
	</body>
	</html>


複製程式碼
  • 也可以實現同樣的效果:

JSP第三篇【JavaBean的介紹、JSP的行為--JavaBean】

  • 有人可能會想,憑什麼寫一個<jsp:useBean>這樣的程式碼就可以建立出一個物件出來
  • 現在我把JavaBean中無參的建構函式改成有參的,我們看看會出現什麼情況,出現異常了!

	 public Person(int age) {
	        this.age = age;
	    }

複製程式碼

JSP第三篇【JavaBean的介紹、JSP的行為--JavaBean】

  • <jsp:useBean id="person" class="domain.Person" scope="page"/>內部原理是這樣子的:

JSP第三篇【JavaBean的介紹、JSP的行為--JavaBean】

  • 通過上面的程式碼我們也知道了為什麼要有一個無參的建構函式內部在new 物件的時候是沒有傳遞引數進去的!

jsp:setProperty

  • 語法:

	<jsp:setProerty name="物件名稱" property="屬性名" param="引數名" value="值">

複製程式碼
  • 在語法上可分為4種模式

    • <jsp:setProperty name="物件名稱" property="*"/>自動匹配
    • <jsp:setProperty name="物件名稱" property="屬性名稱"/>指定屬性
    • <jsp:setProperty name="物件名稱" property="屬性名稱" param="引數名稱"/>指定引數【很少用】
    • <jsp:setProperty name="物件名稱" property="屬性名稱" value="內容"/>指定內容【很少用】
  • 我們沒有學習到<jsp:setProperty>,我們獲取表單的資訊,然後匯入到javaBean物件中是這樣的一種情況

  • 這是表單的頁面程式碼


	<form action="/zhongfucheng/1.jsp" method="post">
	    使用者名稱:<input type="text" name="username">
	    年齡:<input type="text " name="age">
	    <input type="submit" value="提交">
	</form>


複製程式碼
  • 這是處理表單提交過來資料的jsp的程式碼


	<jsp:useBean id="person" class="domain.Person" scope="page"/>
	<%
	    int age = Integer.parseInt(request.getParameter("age"));
	    
	    person.setAge(age);
	
	    System.out.println(person.getAge());
	    
	%>


複製程式碼
  • 這是可以完成的,但是相對來說,比較麻煩!

JSP第三篇【JavaBean的介紹、JSP的行為--JavaBean】


	<jsp:useBean id="person" class="domain.Person" scope="page"/>

	<%--指定屬性名稱為age--%>
	<jsp:setProperty name="person" property="age"/>
	<%
	    System.out.println(person.getAge());
	%>

複製程式碼
  • 也可以完成,並且程式碼更少,功能更強大

JSP第三篇【JavaBean的介紹、JSP的行為--JavaBean】

  • 程式碼更少可以直觀看出來,為什麼我說它功能更加強大呢?表單提交過來的資料都是字串,在我們沒有用jsp:setProperty前,我們儲存設定int型別或其他非字串型別的資料是需要強轉的!但是jsp:setProperty不需要我們強轉,它內部自動幫我們轉換了
  • 我們再來使用一下自動匹配來感受它的強大之處吧

	<jsp:useBean id="person" class="domain.Person" scope="page"/>

	<%--property的值設定為*就代表自動匹配--%>
	<jsp:setProperty name="person" property="*"/>
	<%
	    System.out.println(person.getAge());
	    System.out.println(person.getName());
	%>

複製程式碼
  • 我們再來看一下效果:

JSP第三篇【JavaBean的介紹、JSP的行為--JavaBean】

  • 看到這裡,有人可能會覺得好神奇:只要設定property的值就可以將表單傳遞過來的資料封裝到JavaBean物件中了!這究竟是這樣做到的???
  • 細心的朋友會發現,JavaBean的屬性名稱和表單的name屬性設定的名稱是一模一樣的

	    private String username ;
	    private int age;

	    使用者名稱:<input type="text" name="username">
	    年齡:<input type="text " name="age">

複製程式碼
  • 如果我設定不一樣還能不能用?我們試試:表單name屬性的username改成是user

 	使用者名稱:<input type="text" name="user">

複製程式碼
  • 我們再來看看還能不能把表單的資料完整地封裝JavaBean物件中

JSP第三篇【JavaBean的介紹、JSP的行為--JavaBean】

  • 我們可以發現:要想能夠把表單帶過來的資料成功封裝到JavaBean物件上,名字要一致!也就是說:JavaBean屬性名要和表單的name的名稱一致
  • 至於原理,它是通過反射來做的,呼叫了內省的方法!,我們看編譯後的JSP就明白了。

JSP第三篇【JavaBean的介紹、JSP的行為--JavaBean】


jsp:getProperty

  • 語法:

    • <jsp:getProperty name="物件名" property="屬性名"/>
  • 該jsp行為十分簡單,我們來使用一下就知道了。


	<%--使用<jsp:getProperty>輸出--%>
	<jsp:getProperty name="person" property="username"/>
	<jsp:getProperty name="person" property="age"/>

複製程式碼
  • 效果:

JSP第三篇【JavaBean的介紹、JSP的行為--JavaBean】

  • 原理如下

JSP第三篇【JavaBean的介紹、JSP的行為--JavaBean】


如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章的同學,可以關注微信公眾號:Java3y

相關文章