- 浏览: 168424 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
gwill_21:
dwr.xml找不到怎么办,难道要自己手写dwr.xml?痛苦 ...
DWR框架 —— 用户注册验证 -
recoba7:
MLDN魔乐科技 Oracle学习笔记 (5) -
lanni2460:
呵呵 尽管现在才看到这个 但是我真的觉得 李老师 讲的很好呢 ...
严重声明,那些恶意诋毁MLDN及李兴华老师的其他培训机构统统走开 -
chian_xxp:
只要把功能实现了,代码结构合理了,代码性能提高了,该注意的注意 ...
业务、业务、业务。。。 -
wzpbb:
密码多少啊??? 给一下啊
MLDN 魔乐科技 Oracle 学习笔记(2)
今天学习了DAO设计模式,还有上传组件,javaBean,感觉知识点都似乎很熟悉,在java基础中所讲解的很多知识都和今天的有关,基本的代码完成了,基本的操作就是慢慢熟悉了,感觉时间真的很紧张,每天除了要不断的练习代码,还要不断的复习之前的知识,我会努力下去的。
MLDN为了帮我们更好的面试,安排了专门的面试课程,感觉整体的面试都比较失败,李老师经常对我们说:“技术是一方面,要想真正弄好工作,还有很多方面的因素,包括演讲能力,表达能力,抓住问题中心的能力”,我感觉自己还算是一般,我们班的小胖子,就有些惨了,平常挺能说的,一到关键时刻就不能说了,能体会李老师的话了,但还需要一些时间,通过一些时间的锻炼,我觉得我可以,我也一定能行!
今天所讲的知识点
A SmartUpload类:完成文件上传
B DAO设计模式
C JavaBean
我对知识点的分析
A SmartUpload类
注意:
1、在使用SmartUpload类之前必须把支持jar包(smartupload.jar)拷贝到项目的WebRoot/WEB-INF/lib目录下。
2、文件上传表单必须使用post方式提交(因为get方式提交有大小限制,因为提交的参数会在地址栏显示),而且需要加入enctype进行多媒体封装
例如:
<form name="表单名称" action="表单提交页面" method="post" enctype="multipart/form-data" onSubmit="return checkInput(this)">
其中:checkInput()为JavaScript定义的函数,用来验证表单数据的输入
3、文件上传需要使用表单元素文件域:<input type="file" name="photo" id="photo">
4、表单的接受页面(即表单提交的处理页面)中使用SmartUpLoad类对象,对上传的文件进行接收、处理和保存
(1)接收上传文件(<%@ page import="org.lxh.smart.* " %>)
使用SmartUpLoad类对象
SmartUpload smart = new SmartUpload();
//用pageContext内置对象初始化SmartUpload对象
smart.initialize(pageContext);
//接收上传文件
smart.upload();
(2)接收表单中提交的其他信息
例如:
// 接收参数
String userid = smart.getRequest().getParameter("userid");
String real_name = smart.getRequest().getParameter("real_name");
String password = smart.getRequest().getParameter("password");
(3)对上传文件保存前,对其文件名需要特殊处理
a、如果用smart.save("/upload");语句执行保存操作时,则将所有表单中上传的文件全部保存到当前页面所在目录的upload文件夹中,而且不会改变其文件名。这样做不安全,因为如果多人进行上传,可能文件名存在相同,那么后传的会覆盖之前的,而且其文件名也不统一,不方便保存到数据库中
b、如果要修改文件名,需要单独对某一个文件进行保存操作
// 取得要保存的文件
File uploadFile = smart.getFiles().getFile(0);//表示取得所有上传文件中索引为0的文件,依次类推
// 对这个取得的文件进行单独保存
uploadFile.saveAs("/upload/test.jpg");
//指定其保存路径为当前页面所在目录的upload文件夹中,保存名称为test.jpg
c、其实一般呢,对上传文件的保存名称有一套常用的命名规则:
上传者的IP地址(12位,如果不足则补0) + 当前系统时间(格式为yyyyMMddHHmmssSSS,17位)+ 3位随机数 + “.” + 扩展名
这样来避免文件的重名问题。
首先,定义文件名处理的类:IPTimeStampRandom
package org.liky.util;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
public class IPTimeStampRandom {
private String ip;
public IPTimeStampRandom (String ip) {
this.ip = ip;
}
public String getIPTimeStampRandom () {
String output = "" ;
// 处理ip,依据.进行拆分
String[] allIP = ip.split("\\.");
for (int i = 0;i < allIP.length;i++) {
output += addZero(allIP[i],3);
}
// 处理当前系统时间
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
output += sf.format(new Date());
// 处理随机数
output += addZero(String.valueOf(new Random().nextInt(1000)),3);
return output ;
}
//对不足位的补零处理
public String addZero(String input,int count) {
if (input.length() >= count) {
return input.substring(0,count);
} else {
for (int i = input.length(); i < count;i++) {
input = "0" + input;
}
return input;
}
}
}
其次,在保存文件前处理文件名
String fileName = null;
//按照命名规则,创建文件名
fileName=new IPTimeStampRandom(request.getRemoteAddr()).getIPTimeStampRandom ();
// 加入扩展名,提取上传文件的扩展名作为保存的扩展名
fileName += "." + uploadFile.getFileExt();
// 对文件进行保存
uploadFile.saveAs("/upload/"+fileName);
(4)如果需要将上传文件保存到数据库中,一般在相应的表中只是保存该文件名称,而其实际文件保存在一个指定目录中,并非将该文件内容直接保存在数据库中(如果直接保存在数据库中,第一会增加数据库的容量,而且保存时需要进行处理,把文件内容转换为字节流等进行保存,非常麻烦)
在某个表中,加一个字符串类型的字段,用来保存上传文件的文件名
例如,prmt.setString(4,fileName);
(5)一般对上传的文件进行保存之前,会加入判断该文件的大小及类型
示例一:
// 创建文件名前,先判断上传文件中索引为0文件是否存在
if (smart.getFiles() != null && smart.getFiles().getFile(0).getSize() > 0)
示例二:
// 取得要保存的文件
File uploadFile = smart.getFiles().getFile(0);
// 判断类型,根据后缀判断,要求只能传jpg类型
if (uploadFile.getFileExt().equals("jpg"))
// 判断大小,要求最多100K
if (uploadFile.getSize() <= 102400)
B DAO设计模式
一、DAO的组成
DAO由多个Java的类与接口组成,主要有以下几部分:
1、vo类:ValueObject值对象,用来保存或传递数据,在接口定义的方法中的参数和返回值均以该对象为标准进行处理,其属性与表的字段对应,包含各字段的getter和setter方法
2、dbc类:用来创建数据库连接(类),包含取得和关闭数据库连接方法
3、dao接口:用来定义所有操作数据库的方法(增、删、改、各种查询)
4、daoimpl类 :(dao接口实现类)用来实现接口中的方法
5、proxy类:(daoimpl类对象的代理,同样实现dao接口)用来管理数据库连接或事务提交,或完成一些与真实操作无关的操作。例如数据库的连接和关闭,或者数据插入或者修改之前的检查操作
6、factory类:解耦合,用来创建各种dao接口对象,一般返回proxy类对象
二、开发顺序
开发的顺序为:
第一个vo dbc (一般只需编写一次) dao impl proxy factory
第二个vo dao impl proxy factory中加入方法
第三个vo …..
三、DAO部分的代码示例
参见示例DAODemo的src文件夹
四、页面代码
参见示例DAODemo的页面代码
C JavaBean
结合DAO设计模式使用,不是必须用,只是减少代码工作量
一、JavaBean的概念:
广义:所有在JSP页面上使用的Java类都可以被称为JavaBean
狭义:而一般在开发中JavaBean指的是vo对象
二、三个JavaBean操作标签
1、<jsp:useBean>标签
(1)创建对象
使用JavaBean可以在页面上不导包而直接创建对象。
<jsp:useBean id="user" class="org.liky.vo.User"></jsp:useBean>
在这里通过jsp:useBean创建一个名为user的对象,类型为org.liky.vo.User,使用该标签时,要求该类必须包含无参的构造方法。
(2)useBean的特殊作用
useBean的特殊作用,可以通过page属性将该bean设置到属性范围中,默认为page范围,当修改为session范围时,则该bean对象的属性会在整个session范围内起作用
<jsp:useBean id="user" class="org.liky.vo.User" scope="session"></jsp:useBean>
<jsp:setProperty name="user" property="*"/>
在其他页面取得该bean对象属性:
<jsp:useBean id="user" class="org.liky.vo.User" scope="session"></jsp:useBean>
<jsp:getProperty name="user" property="userid"/>
2、<jsp:setProperty>标签
<jsp:setProperty>来对对象进行自动赋值
可以根据提交参数的名称,将参数自动赋给vo中的属性,依据属性的setter,因此要使用setProperty,则属性必须包含setter方法,而且属性必须名称一致
注意:
当表单封装后,则无法使用该方法自动赋值
(1)自动匹配赋值(一次一批)
<jsp:setProperty name="user" property="*"/>
name:表示要赋值的bean的名称
property:表示要赋值的属性的名称,如果为 * 时表示自动赋值(依据参数名与属性名)
(2)手动匹配赋值(一次一个)
<jsp:setProperty name="user" property="photo" param="photos"/>
使用时包含三个参数:
name:表示要赋值的bean的名称
property:表示要赋值的属性的名称
param;表示将进行赋值的参数名
3、<jsp:getProperty>标签
<jsp:getProperty>:取得bean中的某个属性,显示到页面上
注意:需要该属性定义getter方法,否则无法使用
示例:userid:<jsp:getProperty name="user" property="userid"/>
其中name表示要显示的bean的名称,property表示属性的名称。
D
E
F
备注:
A
个人收获:
数据库表创建脚本:
//create table users(userid varchar(20) primary key,real_name varchar(20) not null,password varchar(10) not null,photo varchar(50)) not null;
//drop table users;
插入信息输入和文件上传页代码:
<%@ page language="java" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'insert.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<style>
<!--
#erro{
width:190px;
height:auto;
border:1px #7ECAFE solid;
background:#D2EDFF;
padding:10px;
font-size:14px;
color:#990000;
line-height:20px;
margin:auto;
z-index:102;
top:100px;
position:relative;
filter:alpha(opacity=100);
-moz-opacity:0.5;
opacity: 0.5;
}
.text_16c_black{
font-weight:bold;
font-size:16px;
color:#000000;
line-height:17px;
}
#div_content{
width:100%;
text-align:center;
position:absolute; left:0;
right:0; top:0; bottom:0;
height:100%;
}
-->
</style>
<script type="text/javascript" src="supporter.js"></script>
<script type="text/javascript">
function goback(){
history.back();
}
</script>
</head>
<body bgcolor="#A2B5F9" style="height:100%;background:repeat-x #80CCFF;">
<div id="div_content" style="display:none">
<div style="height:100%; width:100%;background:black;filter:alpha(opacity=50);">
<div id="erro">
<span class="text_16c_black">出错信息!!</span> <br/>
<span id="errorInfo" style="color:red;" ></span> <br/>
<input type="button" value="确定" onClick="closeDiv();">
</div>
</div>
</div>
<%
request.setCharacterEncoding("UTF-8");
%>
<center>
<form name="insertForm" action="insert_conf.jsp" method="post" enctype="multipart/form-data" onSubmit="return checkInput(this)">
<table border="0" width="26%">
<tr>
<td colspan="2" align="center">
<font color="#CC33CC" size="+2"><b>输入用户信息 </b></font>
</td>
</tr>
<tr>
<td colspan="2" align="center"> </td>
</tr>
<tr>
<td>userid:</td>
<td>
<input type="text" name="userid" id="userid" maxlength="20">
</td>
</tr>
<tr>
<td>real_name:</td>
<td>
<input type="text" name="real_name" id="real_name" maxlength="20">
</td>
</tr>
<tr>
<td>password:</td>
<td>
<input type="password" name="password" id="password" maxlength="10">
</td>
</tr>
<tr>
<td>confirm password:</td>
<td>
<input type="password" name="confirm_password" id="confirm_password" maxlength="10">
</td>
</tr>
<tr>
<td>upload:</td>
<td>
<input type="file" name="photo" id="photo">
</td>
</tr>
<tr>
<td colspan="2" align="center"> </td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="Entry">
<input type="reset" value="Reset">
<input type="button" value="back" onclick="goback();" />
</td>
</tr>
</table>
</form></center>
</body>
</html>
表单提交处理页面:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%@ page import="org.lxh.smart.*,org.liky.util.*" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'insert_conf.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<center>
<%
request.setCharacterEncoding("UTF-8");
%>
<%@ include file="mysql_conn.jsp" %>
<%
// 先把数据保存到数据库,当数据保存成功后,再保存图片文件
SmartUpload smart = new SmartUpload();
//用pageContext内置对象初始化SmartUpload对象
smart.initialize(pageContext);
//接收上传文件
smart.upload();
// 接收参数
String userid = smart.getRequest().getParameter("userid");
String real_name = smart.getRequest().getParameter("real_name");
String password = smart.getRequest().getParameter("password");
String photo = "";
// 创建文件名,先判断文件是否存在
if (smart.getFiles() != null && smart.getFiles().getFile(0).getSize() > 0){
photo = new IPTimeStampRandom(request.getRemoteAddr()).getIPTimeStampRandom ();
photo += "." + smart.getFiles().getFile(0).getFileExt();
//编写sql语句
String sql="INSERT INTO users(userid,real_name,password,photo) VALUES(?,?,?,?)";
prmt=conn.prepareStatement(sql);
conn.setAutoCommit(false);
//用接收的数据,设置sql语句中的占位符的真实值
prmt.setString(1,userid);
prmt.setString(2,real_name);
prmt.setString(3,password);
prmt.setString(4,photo);
if(prmt.executeUpdate()>0){
conn.commit();//提交
// 进行文件上传
smart.getFiles().getFile(0).saveAs("/upload/"+photo);
%>
用户成功注册!
<%
}else{
conn.rollback();//取消
%>
注册失败!!!
<%
}
prmt.close();
conn.close();
}else{
%>
文件上传失败!!!
<%
}
%>
<br /><br />
<a href="<%=path%>/insert.jsp">继续注册</a><br /><br />
<a href="<%=path%>/success.jsp">返回主菜单</a><br /><br />
<a href="<%=path%>/list.jsp">浏览用户信息</a><br /><br />
<a href="<%=path%>/quit.jsp" >退出系统</a>
</center>
</body>
</html>
列表页面:
<%@ page language="java" import="java.sql.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'list.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript">
function goback(){
history.back();
}
</script>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
%>
<table border="0" width="100%">
<tr>
<td align="right"><a href="<%=path%>/quit.jsp" style="">退出系统</a></td>
</tr>
</table>
<center>
<%@ include file="mysql_conn.jsp" %>
<%
String sql = "SELECT userid,real_name,password,photo FROM users" ;
prmt = conn.prepareStatement(sql);
ResultSet rs = prmt.executeQuery();
//从查询结果中取得列名称
ResultSetMetaData rsmd=rs.getMetaData();
%>
<table border="1" width="80%">
<tr>
<td><%=rsmd.getColumnName(1) %></td>
<td><%=rsmd.getColumnName(2) %></td>
<td><%=rsmd.getColumnName(3) %></td>
<td><%=rsmd.getColumnName(4) %></td>
</tr>
<%
while(rs.next()) {
%>
<tr>
<td><%=rs.getString(1) %></td>
<td><%=rs.getString(2) %></td>
<td><%=rs.getString(3) %></td>
<td><img src="<%=path%>/upload/<%=rs.getString(4) %>" width="40" height="30"></td>
</tr>
<%
}
rs.close();
prmt.close();
conn.close();
%>
</table><br />
<br /><br />
<a href="<%=path%>/success.jsp">返回主菜单</a>
</center>
</body>
</html>
数据库连接脚本mysql_conn.jsp
<%@ page language="java" import="java.sql.*" pageEncoding="UTF-8"%>
<%!
final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
final String DBURL = "jdbc:mysql://localhost:3306/info_users" ;
final String DBUSER = "root" ;
final String DBPASSWORD = "mysqladmin";
%>
<%
//加载数据库驱动
Class.forName(DBDRIVER);
//连接数据库
Connection conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
//生成数据库操作对象prmt
PreparedStatement prmt=null;
%>
案例名称:
建立数据库表,用户表:(userid,real_name,password,photo)
完成插入功能,插入时要上传一张图片,必须进行上传(判断是否为空且大小要大于0)
列表显示时显示出所有内容,photo要使用图片显示。
MLDN为了帮我们更好的面试,安排了专门的面试课程,感觉整体的面试都比较失败,李老师经常对我们说:“技术是一方面,要想真正弄好工作,还有很多方面的因素,包括演讲能力,表达能力,抓住问题中心的能力”,我感觉自己还算是一般,我们班的小胖子,就有些惨了,平常挺能说的,一到关键时刻就不能说了,能体会李老师的话了,但还需要一些时间,通过一些时间的锻炼,我觉得我可以,我也一定能行!
今天所讲的知识点
A SmartUpload类:完成文件上传
B DAO设计模式
C JavaBean
我对知识点的分析
A SmartUpload类
注意:
1、在使用SmartUpload类之前必须把支持jar包(smartupload.jar)拷贝到项目的WebRoot/WEB-INF/lib目录下。
2、文件上传表单必须使用post方式提交(因为get方式提交有大小限制,因为提交的参数会在地址栏显示),而且需要加入enctype进行多媒体封装
例如:
<form name="表单名称" action="表单提交页面" method="post" enctype="multipart/form-data" onSubmit="return checkInput(this)">
其中:checkInput()为JavaScript定义的函数,用来验证表单数据的输入
3、文件上传需要使用表单元素文件域:<input type="file" name="photo" id="photo">
4、表单的接受页面(即表单提交的处理页面)中使用SmartUpLoad类对象,对上传的文件进行接收、处理和保存
(1)接收上传文件(<%@ page import="org.lxh.smart.* " %>)
使用SmartUpLoad类对象
SmartUpload smart = new SmartUpload();
//用pageContext内置对象初始化SmartUpload对象
smart.initialize(pageContext);
//接收上传文件
smart.upload();
(2)接收表单中提交的其他信息
例如:
// 接收参数
String userid = smart.getRequest().getParameter("userid");
String real_name = smart.getRequest().getParameter("real_name");
String password = smart.getRequest().getParameter("password");
(3)对上传文件保存前,对其文件名需要特殊处理
a、如果用smart.save("/upload");语句执行保存操作时,则将所有表单中上传的文件全部保存到当前页面所在目录的upload文件夹中,而且不会改变其文件名。这样做不安全,因为如果多人进行上传,可能文件名存在相同,那么后传的会覆盖之前的,而且其文件名也不统一,不方便保存到数据库中
b、如果要修改文件名,需要单独对某一个文件进行保存操作
// 取得要保存的文件
File uploadFile = smart.getFiles().getFile(0);//表示取得所有上传文件中索引为0的文件,依次类推
// 对这个取得的文件进行单独保存
uploadFile.saveAs("/upload/test.jpg");
//指定其保存路径为当前页面所在目录的upload文件夹中,保存名称为test.jpg
c、其实一般呢,对上传文件的保存名称有一套常用的命名规则:
上传者的IP地址(12位,如果不足则补0) + 当前系统时间(格式为yyyyMMddHHmmssSSS,17位)+ 3位随机数 + “.” + 扩展名
这样来避免文件的重名问题。
首先,定义文件名处理的类:IPTimeStampRandom
package org.liky.util;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
public class IPTimeStampRandom {
private String ip;
public IPTimeStampRandom (String ip) {
this.ip = ip;
}
public String getIPTimeStampRandom () {
String output = "" ;
// 处理ip,依据.进行拆分
String[] allIP = ip.split("\\.");
for (int i = 0;i < allIP.length;i++) {
output += addZero(allIP[i],3);
}
// 处理当前系统时间
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
output += sf.format(new Date());
// 处理随机数
output += addZero(String.valueOf(new Random().nextInt(1000)),3);
return output ;
}
//对不足位的补零处理
public String addZero(String input,int count) {
if (input.length() >= count) {
return input.substring(0,count);
} else {
for (int i = input.length(); i < count;i++) {
input = "0" + input;
}
return input;
}
}
}
其次,在保存文件前处理文件名
String fileName = null;
//按照命名规则,创建文件名
fileName=new IPTimeStampRandom(request.getRemoteAddr()).getIPTimeStampRandom ();
// 加入扩展名,提取上传文件的扩展名作为保存的扩展名
fileName += "." + uploadFile.getFileExt();
// 对文件进行保存
uploadFile.saveAs("/upload/"+fileName);
(4)如果需要将上传文件保存到数据库中,一般在相应的表中只是保存该文件名称,而其实际文件保存在一个指定目录中,并非将该文件内容直接保存在数据库中(如果直接保存在数据库中,第一会增加数据库的容量,而且保存时需要进行处理,把文件内容转换为字节流等进行保存,非常麻烦)
在某个表中,加一个字符串类型的字段,用来保存上传文件的文件名
例如,prmt.setString(4,fileName);
(5)一般对上传的文件进行保存之前,会加入判断该文件的大小及类型
示例一:
// 创建文件名前,先判断上传文件中索引为0文件是否存在
if (smart.getFiles() != null && smart.getFiles().getFile(0).getSize() > 0)
示例二:
// 取得要保存的文件
File uploadFile = smart.getFiles().getFile(0);
// 判断类型,根据后缀判断,要求只能传jpg类型
if (uploadFile.getFileExt().equals("jpg"))
// 判断大小,要求最多100K
if (uploadFile.getSize() <= 102400)
B DAO设计模式
一、DAO的组成
DAO由多个Java的类与接口组成,主要有以下几部分:
1、vo类:ValueObject值对象,用来保存或传递数据,在接口定义的方法中的参数和返回值均以该对象为标准进行处理,其属性与表的字段对应,包含各字段的getter和setter方法
2、dbc类:用来创建数据库连接(类),包含取得和关闭数据库连接方法
3、dao接口:用来定义所有操作数据库的方法(增、删、改、各种查询)
4、daoimpl类 :(dao接口实现类)用来实现接口中的方法
5、proxy类:(daoimpl类对象的代理,同样实现dao接口)用来管理数据库连接或事务提交,或完成一些与真实操作无关的操作。例如数据库的连接和关闭,或者数据插入或者修改之前的检查操作
6、factory类:解耦合,用来创建各种dao接口对象,一般返回proxy类对象
二、开发顺序
开发的顺序为:
第一个vo dbc (一般只需编写一次) dao impl proxy factory
第二个vo dao impl proxy factory中加入方法
第三个vo …..
三、DAO部分的代码示例
参见示例DAODemo的src文件夹
四、页面代码
参见示例DAODemo的页面代码
C JavaBean
结合DAO设计模式使用,不是必须用,只是减少代码工作量
一、JavaBean的概念:
广义:所有在JSP页面上使用的Java类都可以被称为JavaBean
狭义:而一般在开发中JavaBean指的是vo对象
二、三个JavaBean操作标签
1、<jsp:useBean>标签
(1)创建对象
使用JavaBean可以在页面上不导包而直接创建对象。
<jsp:useBean id="user" class="org.liky.vo.User"></jsp:useBean>
在这里通过jsp:useBean创建一个名为user的对象,类型为org.liky.vo.User,使用该标签时,要求该类必须包含无参的构造方法。
(2)useBean的特殊作用
useBean的特殊作用,可以通过page属性将该bean设置到属性范围中,默认为page范围,当修改为session范围时,则该bean对象的属性会在整个session范围内起作用
<jsp:useBean id="user" class="org.liky.vo.User" scope="session"></jsp:useBean>
<jsp:setProperty name="user" property="*"/>
在其他页面取得该bean对象属性:
<jsp:useBean id="user" class="org.liky.vo.User" scope="session"></jsp:useBean>
<jsp:getProperty name="user" property="userid"/>
2、<jsp:setProperty>标签
<jsp:setProperty>来对对象进行自动赋值
可以根据提交参数的名称,将参数自动赋给vo中的属性,依据属性的setter,因此要使用setProperty,则属性必须包含setter方法,而且属性必须名称一致
注意:
当表单封装后,则无法使用该方法自动赋值
(1)自动匹配赋值(一次一批)
<jsp:setProperty name="user" property="*"/>
name:表示要赋值的bean的名称
property:表示要赋值的属性的名称,如果为 * 时表示自动赋值(依据参数名与属性名)
(2)手动匹配赋值(一次一个)
<jsp:setProperty name="user" property="photo" param="photos"/>
使用时包含三个参数:
name:表示要赋值的bean的名称
property:表示要赋值的属性的名称
param;表示将进行赋值的参数名
3、<jsp:getProperty>标签
<jsp:getProperty>:取得bean中的某个属性,显示到页面上
注意:需要该属性定义getter方法,否则无法使用
示例:userid:<jsp:getProperty name="user" property="userid"/>
其中name表示要显示的bean的名称,property表示属性的名称。
D
E
F
备注:
A
个人收获:
数据库表创建脚本:
//create table users(userid varchar(20) primary key,real_name varchar(20) not null,password varchar(10) not null,photo varchar(50)) not null;
//drop table users;
插入信息输入和文件上传页代码:
<%@ page language="java" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'insert.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<style>
<!--
#erro{
width:190px;
height:auto;
border:1px #7ECAFE solid;
background:#D2EDFF;
padding:10px;
font-size:14px;
color:#990000;
line-height:20px;
margin:auto;
z-index:102;
top:100px;
position:relative;
filter:alpha(opacity=100);
-moz-opacity:0.5;
opacity: 0.5;
}
.text_16c_black{
font-weight:bold;
font-size:16px;
color:#000000;
line-height:17px;
}
#div_content{
width:100%;
text-align:center;
position:absolute; left:0;
right:0; top:0; bottom:0;
height:100%;
}
-->
</style>
<script type="text/javascript" src="supporter.js"></script>
<script type="text/javascript">
function goback(){
history.back();
}
</script>
</head>
<body bgcolor="#A2B5F9" style="height:100%;background:repeat-x #80CCFF;">
<div id="div_content" style="display:none">
<div style="height:100%; width:100%;background:black;filter:alpha(opacity=50);">
<div id="erro">
<span class="text_16c_black">出错信息!!</span> <br/>
<span id="errorInfo" style="color:red;" ></span> <br/>
<input type="button" value="确定" onClick="closeDiv();">
</div>
</div>
</div>
<%
request.setCharacterEncoding("UTF-8");
%>
<center>
<form name="insertForm" action="insert_conf.jsp" method="post" enctype="multipart/form-data" onSubmit="return checkInput(this)">
<table border="0" width="26%">
<tr>
<td colspan="2" align="center">
<font color="#CC33CC" size="+2"><b>输入用户信息 </b></font>
</td>
</tr>
<tr>
<td colspan="2" align="center"> </td>
</tr>
<tr>
<td>userid:</td>
<td>
<input type="text" name="userid" id="userid" maxlength="20">
</td>
</tr>
<tr>
<td>real_name:</td>
<td>
<input type="text" name="real_name" id="real_name" maxlength="20">
</td>
</tr>
<tr>
<td>password:</td>
<td>
<input type="password" name="password" id="password" maxlength="10">
</td>
</tr>
<tr>
<td>confirm password:</td>
<td>
<input type="password" name="confirm_password" id="confirm_password" maxlength="10">
</td>
</tr>
<tr>
<td>upload:</td>
<td>
<input type="file" name="photo" id="photo">
</td>
</tr>
<tr>
<td colspan="2" align="center"> </td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="Entry">
<input type="reset" value="Reset">
<input type="button" value="back" onclick="goback();" />
</td>
</tr>
</table>
</form></center>
</body>
</html>
表单提交处理页面:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%@ page import="org.lxh.smart.*,org.liky.util.*" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'insert_conf.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<center>
<%
request.setCharacterEncoding("UTF-8");
%>
<%@ include file="mysql_conn.jsp" %>
<%
// 先把数据保存到数据库,当数据保存成功后,再保存图片文件
SmartUpload smart = new SmartUpload();
//用pageContext内置对象初始化SmartUpload对象
smart.initialize(pageContext);
//接收上传文件
smart.upload();
// 接收参数
String userid = smart.getRequest().getParameter("userid");
String real_name = smart.getRequest().getParameter("real_name");
String password = smart.getRequest().getParameter("password");
String photo = "";
// 创建文件名,先判断文件是否存在
if (smart.getFiles() != null && smart.getFiles().getFile(0).getSize() > 0){
photo = new IPTimeStampRandom(request.getRemoteAddr()).getIPTimeStampRandom ();
photo += "." + smart.getFiles().getFile(0).getFileExt();
//编写sql语句
String sql="INSERT INTO users(userid,real_name,password,photo) VALUES(?,?,?,?)";
prmt=conn.prepareStatement(sql);
conn.setAutoCommit(false);
//用接收的数据,设置sql语句中的占位符的真实值
prmt.setString(1,userid);
prmt.setString(2,real_name);
prmt.setString(3,password);
prmt.setString(4,photo);
if(prmt.executeUpdate()>0){
conn.commit();//提交
// 进行文件上传
smart.getFiles().getFile(0).saveAs("/upload/"+photo);
%>
用户成功注册!
<%
}else{
conn.rollback();//取消
%>
注册失败!!!
<%
}
prmt.close();
conn.close();
}else{
%>
文件上传失败!!!
<%
}
%>
<br /><br />
<a href="<%=path%>/insert.jsp">继续注册</a><br /><br />
<a href="<%=path%>/success.jsp">返回主菜单</a><br /><br />
<a href="<%=path%>/list.jsp">浏览用户信息</a><br /><br />
<a href="<%=path%>/quit.jsp" >退出系统</a>
</center>
</body>
</html>
列表页面:
<%@ page language="java" import="java.sql.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'list.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript">
function goback(){
history.back();
}
</script>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
%>
<table border="0" width="100%">
<tr>
<td align="right"><a href="<%=path%>/quit.jsp" style="">退出系统</a></td>
</tr>
</table>
<center>
<%@ include file="mysql_conn.jsp" %>
<%
String sql = "SELECT userid,real_name,password,photo FROM users" ;
prmt = conn.prepareStatement(sql);
ResultSet rs = prmt.executeQuery();
//从查询结果中取得列名称
ResultSetMetaData rsmd=rs.getMetaData();
%>
<table border="1" width="80%">
<tr>
<td><%=rsmd.getColumnName(1) %></td>
<td><%=rsmd.getColumnName(2) %></td>
<td><%=rsmd.getColumnName(3) %></td>
<td><%=rsmd.getColumnName(4) %></td>
</tr>
<%
while(rs.next()) {
%>
<tr>
<td><%=rs.getString(1) %></td>
<td><%=rs.getString(2) %></td>
<td><%=rs.getString(3) %></td>
<td><img src="<%=path%>/upload/<%=rs.getString(4) %>" width="40" height="30"></td>
</tr>
<%
}
rs.close();
prmt.close();
conn.close();
%>
</table><br />
<br /><br />
<a href="<%=path%>/success.jsp">返回主菜单</a>
</center>
</body>
</html>
数据库连接脚本mysql_conn.jsp
<%@ page language="java" import="java.sql.*" pageEncoding="UTF-8"%>
<%!
final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
final String DBURL = "jdbc:mysql://localhost:3306/info_users" ;
final String DBUSER = "root" ;
final String DBPASSWORD = "mysqladmin";
%>
<%
//加载数据库驱动
Class.forName(DBDRIVER);
//连接数据库
Connection conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
//生成数据库操作对象prmt
PreparedStatement prmt=null;
%>
案例名称:
建立数据库表,用户表:(userid,real_name,password,photo)
完成插入功能,插入时要上传一张图片,必须进行上传(判断是否为空且大小要大于0)
列表显示时显示出所有内容,photo要使用图片显示。
发表评论
-
本小姐回来啦 —— 超级感谢MLDN
2009-08-10 13:24 1578我又回来了!哈哈,报告一个好消息,我已经成功入职博彦科 ... -
现在开始积极的找工作
2009-07-05 19:13 1146学习差不多了,得赶在毕业前找到一个工作啊,本小姐这段时 ... -
素质教育 —— 模拟面试
2009-06-30 19:10 1018今天一天都安排了职业素质的培养,包括简历的指导、技术面 ... -
EJB实体Bean开发的复合主键映射
2009-06-29 21:36 1658复合主键的映射:在Hibernate中是通过一个主键类来完成复 ... -
EJB实体Bean开发
2009-06-29 21:33 966EJB实体Bean开发的数据库连接采用数据源连接池的方式,因此 ... -
EJB3.0
2009-06-28 14:14 1203EJB是SUN公司提出的开发 ... -
JBoss服务器配置
2009-06-25 21:21 2049哦,哦,哦,EJB的准备课程啊。 这里开发使用的是 JB ... -
Spring结合iBATIS进行开发
2009-06-25 21:19 938使用Spring管理iBATIS完全可以参照Spring+Hi ... -
ibatis开发框架
2009-06-25 21:17 1224iBATIS为一个ORMapping框架,可以帮助开发人员完成 ... -
WebService分布式开发
2009-06-24 22:23 1880WebService:用来跨语言传递数据。 数据交互是通过XM ... -
北京下雨了
2009-06-18 19:56 738上次在公交车上,听到电视里放《北京下雨了》,那么北京今天 ... -
JQuery
2009-06-10 21:03 12231、JQuery的基本语法 ... -
AJAX中使用JSON
2009-06-10 21:02 1279在Java开发中,如果要使用JSON进行开发,需要一些支持,这 ... -
AJAX框架 —— JSON基本知识
2009-06-10 21:01 910我真想知道这年头到底有多少种框架。 1、JSON ... -
还应该多帮助同学,才能让自己进步快
2009-06-08 21:57 959今天对于本小姐来讲还真是相对轻松的一天啊,上周完成了任 ... -
业务、业务、业务。。。
2009-06-03 18:41 1119项目就是业务,项目中都是业务,技术就这么点东西,只要把 ... -
IBM Project 继续中ing....
2009-06-02 19:08 843项目就是要坚持的做下去,而且要想到做到最好,虽然框架很好 ... -
实际开发了
2009-06-01 18:17 845今天开始新的项目了,项目老师帮我们搭建好了SVN服务器, ... -
web学习笔记 —— 数据源
2009-05-31 19:56 987使用数据源可以提升数据库的操作性能,当然,不管使用与否,对于程 ... -
SSH(Spring + Struts + Hibernate)
2009-05-31 19:47 2466Spring结合Hibernate ...
相关推荐
MLDN框架笔记大全 JSP+JDBC_假分页 02 JSP+JDBC_真分页(基于MySQL数据库分页) 03 JSP+DAO和MVC+DAO(基于MySQL数据库分页) 04 Struts入门 05 使用Struts + DAO完成用户登陆 06 Struts标签-...
可以直接运行 版权所有mldn java软件培训班
资源名称:MLDN李兴华JAVA WEB视频教程(30集)资源目录:【】MLDN软件实训练中心—JAVA.WEB教程.19_使用JSP.DAO完成用户登陆【】MLDN软件实训练中心—...资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
在MLDN的基础之上进行改进,修改很多BUG,完善了游戏功能
mldn的五子棋源代码和上课的笔记,其中有详细的介绍,是个不错的入门实例。
[MLDN魔乐科技][JAVA培训之Oracle课堂系列]下载地址
MLDN魔乐JAVA培训代码及笔记(pdf格式的)
本人上传资源一律无需资源分,本着分享的精神希望对您有所帮助!支持mldn!支持李老师!
2014_MLDN_Ajax视频教程链接
mldn的学习文档,javase 文档,java基础知识
李兴华 MLDN 整理笔记 JavaEye .doc
资源名称:MLDN魔乐科技_Oracle课堂教程内容:MLDN魔乐科技_Oracle课堂1MLDN魔乐科技_Oracle课堂10Oracle课堂11_子查询Oracle课堂12_数据库更新操作Oracle...资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
MLDN魔乐JAVAWEB课堂24_Servlet程序设计_2
李兴本oracle数据库视频笔记 www.mldn.cn
MLDN视频教程精选,著名讲师李兴华亲自授课。
MLDN李兴华视频教程代码.rar MLDN李兴华视频教程代码.rar
MLDN魔乐科技JAVA培训_Oracle课堂笔记
五子棋游戏程序java源码 看视频敲得 mldn兴趣教程
本人一律免资源分分享资源,享受分享的快乐! 支持mldn!支持李老师!
李兴华-MLDN魔乐JAVAWEB课堂