7.1 JavaBean 简介
7.1.1 使用Bean的原因
7.1.2 Bean是什么
7.1.3 javaBean在jsp中的应用
JavaBean就是一个Java类,也就意味着,JAVA的一切特性,此处都可以使用
她只是完成基本业务的逻辑封装
JavaBean可以使用JAVA的封装、继承、多态
用它来封装许多可重复调用的代码,通过使用JavaBean可以达到显示与业务的分离
显示:JSP
业务:JavaBean
将JavaBean编译好的.class文件拷贝到WEB-INF下的classes文件夹下
lib文件夹用来存放.jar文件
编写JavaBean必须满足以下几点:
放在一个包中
必须申明成public class类型 文件名称与类名一致
所有的属性必须封装
设置和取得属性可以通过 setter、getter方法
使用JSP标签去调用JavaBean时必须有一个无参构造方法v
// 所有的JavaBean必须放在一个包中 package org.sky.darkness ; public class SimpleBean { private String name ; private String password ; // 如果没有指定构造方法,则会自动生成一无参的什么都不做的构造方法 public SimpleBean() { System.out.println("** public SimpleBean() .") ; System.out.println("-------------------------------------------") ; } public void setName(String name) { this.name = name ; } public void setPassword(String password) { this.password = password ; } public String getName() { return this.name ; } public String getPassword() { return this.password ; } };
JAVA命名规范:
1、 包命名:全部字母小写:org.sky.darkness
2、 类命名:单词的首字母大写:SimpleBean
3、 属性名称:第一个单词的首字母小写,之后的每一个单词的首字母大写
4、 方法命名:与属性命名相同:public void sayHellow();
5、 常量命名:全部单词大写:final String DBDRIVER=”darkness”
对Java程序进行打包编译:javac –d . *.java
JavaBean开发完成之后,在JSP中的调用过程:
1.使用<%@ page import =””%>导入
实际上WEB-INF/classes是一个classpath路径,所有的class文件只要放在此目录都可以被访问到,与其他类的调用方式一样
<%@page contentType="text/html;charset=gb2312"%> <%@page import=" org.sky.darkness.*"%> <% // 实例化对象 SimpleBean sb = new SimpleBean() ; sb.setName("darkness") ; sb.setPassword("wind") ; %> <h1>姓名:<%=sb.getName()%></h1> <h1>密码:<%=sb.getPassword()%></h1>
2.使用JSP的标签指令调用
<jsp:useBean id=”对象名” scope=”属性范围” class=”包的路径”/>
如果使用此标签,则JAVABEAN中必须要有一个无参构造方法
<%@page contentType="text/html;charset=gb2312"%> <jsp:useBean id="sb" scope="page" class="org.sky.darkness.SimpleBean"/> <% sb.setName("darkness") ; sb.setPassword("wind") ; %> <h1>姓名:<%=sb.getName()%></h1> <h1>密码:<%=sb.getPassword()%></h1> <form action="JBDemo03.jsp" method="post"> 用户名:<input type="text" name="name"><br> 密 码:<input type="text" name="password"><br> <input type="submit" value="提交"> <input type="reset" value="重置"> </form>
Tomcat 服务器,在默认的情况下是不能读取修改后的JAVABEAN,如要读取有以下两中方法:
1. 重新启动服务器
2. 配置参数: reloadable=”true”
Server.xml中<Context path=”/test” docBase=”f:\testWeb” reloadable=”true”/>
什么时候使用这个reloadable属性?
*如果使用这个参数,则表示服务器使用要监视着是否有改动,影响服务器的性能
*在运行时,此参数必须去掉
*在开发是,为了开发方便,则加入此参数
使用JAVABEAN, v表示要设置的属性,如果为“*”,则表示自动匹配
<%@page contentType="text/html;charset=gb2312"%> <jsp:useBean id="sb" scope="page" class="org.sky.darkness.SimpleBean"/> <jsp:setProperty name="sb" property="*"/> <%-- // 如果有20个数据需要设置,则使用JavaBean的设置属性方式,可以自动完成 // 代替以下代码 sb.setName(request.getParameter("name")) ; sb.setPassword(request.getParameter("password")) ; --%> <h1>姓名:<%=sb.getName()%></h1> <h1>密码:<%=sb.getPassword()%></h1>
为什么能够通过property=”*”的方式,将内容设置到BEAN中,其根本原因是使用了JAVA本身的反射机制,传递参数的名称找到相应的方法,比如:参数名称为name,则自动找到setName()方法
// 所有的JavaBean必须放在一个包中 package org.sky.darkness ; public class SimpleBean { private String name ; private String password ; private int age ; // 如果没有指定构造方法,则会自动生成一无参的什么都不做的构造方法 public SimpleBean() { System.out.println("** public SimpleBean() .") ; System.out.println("-------------------------------------------") ; } public void setAge(int age) { this.age = age ; } public int getAge() { return this.age ; } public void setName(String name) { System.out.println("** 设置name属性.") ; this.name = name ; } public void setPassword(String password) { System.out.println("** 设置password属性.") ; this.password = password ; } public String getName() { System.out.println("** 取得password属性.") ; return this.name ; } public String getPassword() { System.out.println("** 取得password属性.") ; return this.password ; } };
原则:使用JAVABEAN的自动设置内容时,一定要让参数名称与BEAN中的属性名称一致,这样通过JAVA的命名规范,可以达到统一。
当需要指定设置具体某个参数时,可以在property中指定参数
*<jsp:setProperty name=”ds” property=”*”/>:自动匹配
*<jsp:setProperty name=”ds” property=”name”/>:可以根据自己的需要设置需要的属性值
*<jsp:setProperty name=”ds” property=”name” param=”password”/>
<jsp:setProperty name=”ds” property=”password” param=”name”/>//密码与用户名调换
*<jsp:setProperty name=”ds” property=”name” value=”<%=%>”/>根据用户的需要自己设置属性的值,当为变量时要使用表达式输出
取得属性用:<jsp:getProperty name=”ds” property=”name”/>
<%@page contentType="text/html;charset=gb2312"%> <jsp:useBean id="sb" scope="page" class="org.sky.darkness.SimpleBean"/> <jsp:setProperty name="sb" property="*"/> <h1>姓名:<jsp:getProperty name="sb" property="name"/></h1> <h1>密码:<jsp:getProperty name="sb" property="password"/></h1> 使用javaBean的setProperty方法,可以自动将传递过来的只有数字的字符串转换为整型 <form action="JBDemo05.jsp" method="post"> 用户名:<input type="text" name="name"><br> 密 码:<input type="text" name="password"><br> 年 龄:<input type="text" name="age"><br> <input type="submit" value="提交"> <input type="reset" value="重置"> </form> <%@page contentType="text/html;charset=gb2312"%> <jsp:useBean id="sb" scope="page" class="org.sky.darkness.SimpleBean"/> <jsp:setProperty name="sb" property="*"/> <h1>姓名:<jsp:getProperty name="sb" property="name"/></h1> <h1>密码:<jsp:getProperty name="sb" property="password"/></h1> <h1>年龄:<jsp:getProperty name="sb" property="age"/></h1>
Page范围:属性只在当前页有效,如果跳转到其他页面则重新实例化
适用于:JSP页面操作资源时使用
Request范围:属性只保存在一次服务器端跳转
前提:使用<jsp:forward>跳转才行
Session范围:属性保存在一次会话中
适用于 :使用JSP直接开发购物车
Application范围:整个服务器中只实例化一次
package org.sky.darkness ; public class CountBean { private int coun = 0 ; public CountBean() { System.out.println("** CountBean() ...") ; System.out.println("¤ --------------------------------- ¤") ; } public void setCoun(int coun) { this.coun = coun ; } public int getCoun() { return ++this.coun ; } };
<%@page contentType="text/html;charset=gb2312"%> <jsp:useBean id="cb" scope="page" class="org.sky.darkness.CountBean"/> 访问第 <font color="red" size="15"> <jsp:getProperty name="cb" property="coun"/> </font> 次!! <jsp:forward page="pageJBDemo02.jsp"/> <%@page contentType="text/html;charset=gb2312"%> <jsp:useBean id="cb" scope="page" class="org.sky.darkness.CountBean"/> 访问第 <font color="red" size="15"> <jsp:getProperty name="cb" property="coun"/> </font> 次!!
<%@page contentType="text/html;charset=gb2312"%> <jsp:useBean id="cb" scope="request" class=" org.sky.darkness.CountBean"/> 访问第 <font color="red" size="15"> <jsp:getProperty name="cb" property="coun"/> </font> 次!! <jsp:forward page="requestJBDemo02.jsp"/>
<%@page contentType="text/html;charset=gb2312"%> <jsp:useBean id="cb" scope="request" class=" org.sky.darkness.CountBean"/> 访问第 <font color="red" size="15"> <jsp:getProperty name="cb" property="coun"/> </font> 次!!
<%@page contentType="text/html;charset=gb2312"%> <jsp:useBean id="cb" scope="session" class=" org.sky.darkness.CountBean"/> 访问第 <font color="red" size="15"> <jsp:getProperty name="cb" property="coun"/> </font> 次!! <a href="sessionJBDemo02.jsp">sessionJBDemo02.jsp</a>
<%@page contentType="text/html;charset=gb2312"%> <jsp:useBean id="cb" scope="session" class=" org.sky.darkness.CountBean"/> 访问第 <font color="red" size="15"> <jsp:getProperty name="cb" property="coun"/> </font> 次!!
<%@page contentType="text/html;charset=gb2312"%> <jsp:useBean id="cb" scope="application" class=" org.sky.darkness.CountBean"/> 访问第 <font color="red" size="15"> <jsp:getProperty name="cb" property="coun"/> </font> 次!!
7.2 JSP 标准动作简介
7.3 forward 动作
<jsp:forward page=”uri”/>跳转语句,属于无条件跳转语句,使用此语句页面内容已经跳转了,但地址栏没有改变,意味着:用户的请求没有改变,此跳转属于服务器端跳转
<jsp:forward page=”uri”> <jsp:param name=”” value=”<%=%>”> </jsp:forward> <% String name = "darkness" ; %> <jsp:forward page="forwardDemo02.jsp"> <jsp:param name="ref1" value="sky"/> <jsp:param name="ref2" value="<%=name%>"/> </jsp:forward>
两种跳转语句的区别:
1.<jsp:forward page=””/>
* 地址栏不改变跳转——服务器跳转
* 执行到跳转语句后无条件立刻跳转——之后的代码不再被执
* 注意:如果使用 forward跳转,则一定要在跳转之前释放到所有资源
* 使用forward时,request设置的属性依然能保存在下一个页面(setAttribute)
* 通过<jsp:param name=”” value=””/>传递参数
2.response.sendRedirect(URL)
* 地址栏改变——客户端跳转
* 所有代码执行完后再跳转
* 不能保存 request属性——地址改变了,客户端跳转
* 通过URL地址重写传递参数
7.4 include 动作
JSP中两中包含语句:
<%@ include file = “”%>
---------静态包含页面:只是将叶面的内容包含进来,如果被包含的页面含有JSP代码,则执行此代码,不管被包含的页面的后缀如何
-------执行时,将页面包含进来一起处理
<jsp:include page=”uri” flues=”true”>标签指令形式的代码,必须完结
<jsp:param name=”” value=””>//将参数传给页面处理后将执行的结果包含进来
</jsp:include>
<jsp:include page=”uri” />
--------动态包含页面:能自动区分所包含的页面是静态页面还是动态页面
--------执行是:如果为静态页面,处理方式与<%@ include file = “”%>相同
如果为动态页面,则先各自处理,然后将处理后的内容包含进来
<%-- 使用此语句处理显示中的乱码 --%> <%@page contentType="text/html;charset=gb2312"%> <html> <head> <title>include demo</title> </head> <body> <jsp:include page="incl.jsp"> <jsp:param name="ref1" value="wind"/> <jsp:param name="ref2" value="cloud"/> </jsp:include> <jsp:include page="incl.txt"> <jsp:param name="ref1" value="wind"/> <jsp:param name="ref2" value="cloud"/> </jsp:include> <jsp:include page="incl.sky"/> </body> </html> <h1>PARAM1:<%=request.getParameter("ref1")%></h1> <h1>PARAM2:<%=request.getParameter("ref2")%></h1>
<%-- 使用此语句处理显示中的乱码 --%> <%@page contentType="text/html;charset=gb2312"%> <html> <head> <title>include demo</title> </head> <body> <% int i = 100 ; %> <h1>includeDemo04.jsp:<%=i%></h1> <jsp:include page="include.jsp"/> <%@include file="incl.jsp"%> <%@include file="incl.txt"%> </body> </html> <% int i = 10 ; %> <h1>include.jsp:<%=i%></h1>
7.5 JavaBean和Jsp标准动作应用案例
7.6 本章小结