`
zisefeiniao
  • 浏览: 168424 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

在MLDN培训中发现了自己的缺点和优点

阅读更多
今天学习了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">&nbsp;</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">&nbsp;</td>
    </tr>             
    <tr>
     <td colspan="2"  align="center">
      <input type="submit" value="Entry">
      &nbsp;
      <input type="reset" value="Reset">
      &nbsp;
      <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>&nbsp;&nbsp;
</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要使用图片显示。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics