jsp+javaBean
1,什么是可重用组件:是指能够完成某种特定的功能,并提供了一个或多个访问接口的聚合模块程序,可重复使用是它最大的特点。
在java企业级开发中,最重要的两类组件是javabean和EJB。
javabean本质就是一个java类,但是这个java类的组成必须符合一定的规则,这个规则也就是javabean规范,其中包括缺省的构造方法,setXXX和getXXXde风格来构造属性等。他可以很容易的被组合到程序中去,一般包括业务逻辑代码和数据访问代码等。jsp在使用他的时候可以用普通的java脚本实例化这个类,像其他java对象一样使用,也可以使用jsp提供的动态标签来访问。
EJB 相对于javabean来说是一个大得多的组件,他必须生存在符合javaee规范的应用服务器中,它的定义和调用都要复杂的多,在实际的java开发中很小使用EJB组件。
2,javabean规范:
(1),它是一个公开类(public class);
(2),他有一个公开的无参数 的构造方法。
(3),提供了公开的setXXX和getXXX方法来决定javabean的属性,
3,用jsp完成一种特定的功能时,有三种实现方式:
(1),在html代码中间夹杂java语言写成的jsp脚本,功能逻辑就在java语言中完成。缺点是:代码可读性差,很难维护。
(2),把功能逻辑包装在一个javabean内,然后在jsp脚本中,用new关键字实例化这个javabean,在调用set和get方法来完成特定的功能,这种方式虽然维护比第一种好一些,但是可读性仍然不好。
(3),同样先把功能逻辑包装在一个javabean钟,再利用jsp提供的动作标签来访问javabean的属性,这种方式比第二种耦合度进一步降低了,是一种值得推荐的方式。
4,jsp使用javabean的标签详解:
(1),定义javabean的动作标签<jsp:useBean>
<jsp:useBean>标签用于在特定的范围内实例化或查找一个javabean,基本语法如下:
<jsp:useBean id="唯一标示名字"
scope="page|request|session|application";
type="父类型"
class="实现类">
id:表示在特定范围内的唯一标示的名字;
scope:指定bean的存活范围,有4种:page:默认是page,标示jsp的页面范围,如果是同一个请求的另外一个jsp也页面就不见了。request:当前这一次的请求范围,包含多个jsp页面;session:标示会话范围;application:标示整个web应用,与servlet上下文同义。
class:javabean的实例类名,必须是完整类名。
type:javabean的父类或者一实现接口。
<jsp:useBean>动作标签的基本工作机制如下:
(1),在指定范围内寻找是否已有名字为id属性指定的对象。
(2),如果存在,且指定了type属性,则用该type做一次强制类型转换后再返回该对象的引用,如果没用指定 ,则直接返回该对象的引用。
(3),如果不存在,则用class属性指定的类实例化一个新的对象并返回,并将该对象保存到scope内。
(2),设置javabean属性动作标签<jsp:setProperty>
<jsp:setProperty>:是为javabean的可写属性赋值,它既可以放在<jsp:useBean>中间,也可以单独使用,基本语法如下:
<jsp:setProperty
id="与javabean的属性同名"
property="可写属性名"
value="字面值"
params="请求参数的名字"/>
name:bean的id
property:可写属性名,如setAge(),属性名为age,如果是*,则表示将所有的属性一一与请求参数按名匹配赋值。
value:为属性复字面值,
params:http请求的参数名。
3,获取javabean属性动作标签<jsp:getProperty>
<jsp:getProperty>是获取javabean的可读属性,它既可以放在<jsp:useBean>中间,也可以单独使用,基本语法如下: <jsp:getProperty
name="与javabean的id属性值相同"
property="可读属性名">
4,javaBean封装数据库操作的代码如下:
private static final String url="jdbc:mysql://localhost:3306/test";
private static final String username="root";
private static final String password="123";
private String table;
private Object[] params;
public Connection getCon(){
Connection conn=null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection(url, username, password);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
public void close(Connection conn,Statement st,ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(st!=null){
try {
st.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public String getTable() {
return table;
}
public void setTable(String table) {
this.table = table;
}
public Object[] getParams() {
return params;
}
public void setParams(Object[] params) {
this.params = params;
}
5,javaBean封装添加数据操作:
public boolean getInsertData(){
//Æ´½ÓsqlÓï¾ä
String sql="insert into "+table+" values(";
for (int i = 0; i <params.length; i++) {
sql+="?";
if(i!=params.length-1){
sql+=",";
}
}
sql+=")";
boolean rst=false;//¶¨Òå²Ù×÷½á¹û
Connection conn=null;//¶¨ÒåÁ¬½Ó¶ÔÏó
PreparedStatement pst=null;//¶¨Òå»á»°¶ÔÏó
try {
conn=this.getCon();//»ñÈ¡Êý¾Ý¿âÁ¬½Ó
conn.setAutoCommit(false);//¹Ø±Õ×Ô¶¯Ìá½»
pst=conn.prepareStatement(sql);//´´½¨»á»°
//Ñ»·ÉèÖòÎÊý
for (int i = 0; i < params.length; i++) {
pst.setObject(i+1,params[i]);
}
int num=pst.executeUpdate();//Ö´ÐÐsqlÓï¾ä
conn.commit();//Ìá½»ÊÂÎñ
//Èç¹ûÖ´Ðнá¹û´óÓÚ0 £¬´ú±íÖ´Ðгɹ¦
if(num>0){
rst=true;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
if(conn!=null){
try {
conn.rollback();//»Ø¹öÊÂÎñ
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
e.printStackTrace();
}finally{
close(conn,pst,null);//¹Ø±ÕÁ¬½Ó
}
return rst;
}
6,javabean封装删除数据操作:
public boolean getDeleteData(){
String sql="delete from "+table+" where "+params[0]+" =?";
boolean rst=false;
Connection conn=null;
PreparedStatement ps=null;
try {
conn=this.getCon();
conn.setAutoCommit(false);
ps=conn.prepareStatement(sql);
ps.setObject(1,params[1]);
int num=ps.executeUpdate();
conn.commit();
if(num>0){
rst=true;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
close(conn,ps,null);
}
return true;
}
7,javabean封装修改数据操作:
public boolean getModifyData(){
String sql="update "+table+" set "+params[0]+" =? where "+params[2]+"=?";
boolean rst=false;
Connection conn=null;
PreparedStatement ps=null;
try {
conn=this.getCon();
conn.setAutoCommit(false);
ps=conn.prepareStatement(sql);
ps.setObject(1,params[1]);
ps.setObject(2,params[3]);
int num=ps.executeUpdate();
conn.commit();
if(num>0){
rst=true;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
close(conn,ps,null);
}
return rst;
}
8,javabean封装查询数据操作:
private Connection conn=null;
private PreparedStatement ps=null;
private ResultSet rs=null;
public void setQuery(String sql){
try {
conn=this.getCon();
ps=conn.prepareStatement(sql);
rs=ps.executeQuery();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public List getList(){
List list=new ArrayList();
try {
while(rs.next()){
String str="";
for (int i = 0; i <params.length; i++) {
str +=rs.getObject(params[i].toString());
if(i!=params.length){
str +=",";
}
list.add(str);
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
this.close(conn,ps, rs);
}
return list;
}
9,分页技术:逻辑分页和物理分页
逻辑分页:查询sql语句不变,只不过通过java代码从逻辑上控制结果集光标的位置,从而实现分页;
物理分页:改变sql语句,在数据库查询的时候只需取出需要的结果集,但是各个数据库控制结果集的sql语句不一样,;mysql:limit,orcale:rownum
两种分页技术各有优缺点:逻辑分页效果低,但是程序容易控制,但不能跨数据库。
10,逻辑分页:逻辑分页的关键点在于根据当前的节点去定位结果集的下标位置,把下标定位好以后,就知道它是否有下一页和上一页信息等。
实现逻辑分页的步骤:(1),确定每页的最大记录数。(2),查询总共记录数。(3),根据总记录数和每页最大记录数确定最大页码。(4)查询结果集。(5),根据每页最大记录数和当前页码对结果集的下表进行定位。(6),不超过最大记录数的循环打印结果集。
11,物理分页的实现思想还是需要确定每页的最大记录数、当前页码、最大页码、总记录数的信息,但是它把结果集下标定位交个数据库来完成了,开发者需要做的就是把sql写好。
对于mysql数据库,需要开发者熟悉他的limit语句,limit语句需要追加到查询语句的后面,告诉sql只返回规定行数的记录,基本语法如下:
limit n #返回前 n行数据
limit n,m #返回从n+1行开始,最多m行的数据。