随笔 - 45, 文章 - 2, 评论 - 11, 引用 - 0
数据加载中……

2011年2月23日

JSTL的使用

1、在jsp文件的头部加入
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt"%>

2、<c:froEach/>的使用
 1<%
 2        OperationDAO opDao = new OperationDAOImpl();
 3        List<Operation> ops = opDao.getAll_();
 4        MenuDAO meDao = new MenuDAOImpl();
 5        List<Menu> mes = meDao.getAll_Lazy(1) ;
 6    %>
 7            <table id="demoTable" border="1">
 8            <thead>
 9                <th>id</th>
10                <th>显示名称</th>
11                <th>链接</th>
12                <th>所属菜单</th>
13                <th>是否可见</th>
14                <th>操作</th>
15            </thead>
16            <tbody>
17                <c:forEach var="op" items="<%=ops %>">
18                    <tr id="${op.op_Id}"
19                        class="{op_Id:${op.op_Id},op_displayName:'${op.op_displayName}',op_link:'${op.op_link }',me_name:'${op.menu.me_displayName}',viewMode:'${op.viewMode}'}">
20                        <td class="op_Id">${op.op_Id}</td>
21                        <td class="op_displayName">${op.op_displayName}</td>
22                        <td class="op_link">${op.op_link }</td>
23                        <td class="me_name">${op.menu.me_displayName}</td>
24                        <td class="viewMode">viewMode:${op.viewMode}</td>
25                        <td><class="editRecord" href="anotherPage.html">Edit</a> |
26                            <class="deleteRecord" href="anotherPage.html">Delete</a></td>
27                    </tr>
28                </c:forEach>
29            </tbody>
30        </table>



posted @ 2011-05-08 23:16 jack zhai 阅读(203) | 评论 (0)编辑 收藏

spring的一般配置

beans.xml

beans

 

 

jdbc.properties

properties

在web.xml里加入

web.xml


 

posted @ 2011-05-01 14:26 jack zhai 阅读(224) | 评论 (0)编辑 收藏

powerdesigner反向生成物理模型

需要先安装ODBC,才可以使用ODBC连接方式连接数据库

下载地址:mysql-connector-odbc-5.1.8-win32.msi

1

1

2

2

3

3

4

4

 

5

5

posted @ 2011-04-29 13:13 jack zhai 阅读(424) | 评论 (0)编辑 收藏

使用SchemaExport自动生成表结构

  new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);

posted @ 2011-04-29 08:09 jack zhai 阅读(326) | 评论 (0)编辑 收藏

hibernate配置模板

<?xml version='1.0' encoding='gb2312'?>  
<!DOCTYPE hibernate-configuration PUBLIC  
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
<hibernate-configuration>  
    <session-factory>  
        <!--显示执行的SQL语句-->  
        <property name="show_sql">true</property>  
        <!--连接字符串-->  
        <property name="connection.url">jdbc:mysql://localhost:3306/Test</property>  
        <!--连接数据库的用户名-->  
        <property name="connection.username">sa</property>  
        <!--数据库用户密码-->  
        <property name="connection.password">sa</property>  
        <!--数据库驱动-->  
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>  
        <!--JDBC连接池(使用内置的连接池)-->  
        <property name="connection.pool_size">1</property>  
        <!--设置Hibernate自动管理上下文的策略-->  
        <property name="current_session_context_class">thread</property>  
        <!--选择使用的方言-->  
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>  
        <!--在启动时删除并重新创建数据库-->  
        <property name="hbm2ddl.auto">create</property>  
        <mapping resource="events/User.hbm.xml"/>  
        <mapping resource="events/Student.hbm.xml"/>  
    </session-factory>  
</hibernate-configuration> 

 

posted @ 2011-04-28 18:25 jack zhai 阅读(289) | 评论 (0)编辑 收藏

链表-java实现

interface

implement

node

posted @ 2011-04-26 05:57 jack zhai 阅读(259) | 评论 (0)编辑 收藏

Velocity配置

一、web.xml中的配置

 1<web-app>
 2  <servlet>
 3    <servlet-name>velocity</servlet-name>
 4    <servlet-class>org.apache.velocity.tools.view.VelocityViewServlet</servlet-class>
 5  </servlet>
 6  <servlet-mapping>
 7    <servlet-name>velocity</servlet-name>
 8    <url-pattern>*.vm</url-pattern>
 9  </servlet-mapping>
10  <welcome-file-list>
11    <welcome-file>index.vm</welcome-file>
12  </welcome-file-list>
13</web-app>


二、可选配置tools.xml

<tools>
    
<data type="boolean" key="xhtml" value="true"/>
    
<data type="boolean" key="isSimple" value="true"/>
    
<data type="number" key="version" value="3.3.0"/>
    
<data key="foo">this is foo</data>
    
<data key="bar">this is bar.</data>
    
<toolbox scope="request">
        
<tool key="toytool" class="ToyTool" restrictTo="index*"/>
    
</toolbox>
    
<toolbox scope="session">
        
<tool key="map" class="java.util.HashMap"/>
    
</toolbox>
</tools>




 

posted @ 2011-04-14 08:45 jack zhai 阅读(2596) | 评论 (0)编辑 收藏

数据库设计学习笔记

一、设计过程包含五个主要步骤。

第 1 步:确定实体和关系

第 2 步:确定所需数据

第 3 步:规范化数据

第 4 步:解析关系

第 5 步:验证设计

二、阅读别人的概念模型图:
不管是从左到右读取还是从右到左读取,下面的规则都会使读取这些图示变得容易:读取 (1) 第一个实体的名称,(2) 第一个实体 旁边的角色,(3) 到第二个实体 的连接的基数,(4) 第二个实体的名称。

三、确定所需数据(实体属性的设计)需要注意的:

  • 确定支持数据时,一定要参考前面确定的活动以了解将如何访问这些数据。

    例如,在某些情况下可能需要按雇员的名字列出雇员,而在另一些情况下可能需要按姓氏列出。要满足这两种需要,应创建一个 First Name 属性和一个 Last Name 属性,而不应创建一个既包含名字又包含姓氏的属性。将姓氏和名字分开后,以后可以创建两个索引,分别适用于这两项任务。

  • 请选择一致的名称。使用一致的名称可以使数据库便于维护,并且便于阅读报告和输出窗口。

    例如,如果一个属性使用了缩略名称,如 Emp_status,则另一个属性不应使用完整名称,如 Employee_ID。应使名称保持一致,如 Emp_status 和 Emp_ID。

  • 在这个阶段,数据是否与正确的实体相关联并不十分重要。您可以根据自己的判断进行设计。在下一节中,将对设计进行测试,检查您的判断是否正确。


    四、规范化是指一系列测试,通过这些测试可以消除冗余的数据,并确保数据与正确的实体或关系相关联。共有五项测试。本节介绍其中前三项测试。这三项测试最重要,因此也最常使用。

    五、范式:

    数据规范化包括几项测试。数据在通过了第一项测试后,我们认为它满足第一范式;通过了第二项测试后,它满足第二范式;通过了第三项测试后,则满足第三范式。

    六、标识符是唯一地标识实体中各行的一组属性,至少由一个属性组成。

    七、解析关系:
    执行完规范化过程后,设计几乎就完成了。唯一还需要做的事情就是生成与概念数据模型相对应的物理数据模型。这个过程也称作解析关系,因为其中涉及的大量工作就是将概念模型中的关系转换为相应的表和外键关系。


    八、概念数据模型可以简化设计过程,因为它将大量细节隐藏起来。例如,多对多关系总会生成一个额外的表和两个外键引用。在概念数据模型中,通常可以用一个连接来标识这类结构。

    九、域(用户定义的数据类型)

    十、数据库对象的定义构成了数据库模式:您可以将模式看做一个空数据库。(是否可以理解成C#的命名空间或java里的包概念

     

  • 十一、

     

    posted @ 2011-04-11 08:44 jack zhai 阅读(236) | 评论 (0)编辑 收藏

    JQuery插件:TableEditor试用

    这个插件在JQuery1.5.1版下无法使用。

    项目地址:http://dev.iceburg.net/jquery/tableEditor/demo.php

    html文件:

    html


    js文件

    js

    posted @ 2011-04-09 06:27 jack zhai 阅读(2745) | 评论 (1)编辑 收藏

    用于Request的工具类 from DLOG4J

    从DLOG4J读到的Request的工具类:

     

    java

    posted @ 2011-03-31 08:33 jack zhai 阅读(431) | 评论 (0)编辑 收藏

    过滤敏感词汇类

    java

    这个类,是从DLOG4J上学到的。

    posted @ 2011-03-31 08:16 jack zhai 阅读(833) | 评论 (3)编辑 收藏

    权限管理系统 sql

    sql

    posted @ 2011-03-30 13:25 jack zhai 阅读(311) | 评论 (0)编辑 收藏

    sqlserver 基础

      1 --创建表
      2     if exists(select * from sysobjects where name='user' and type='U'drop table [user] ;
      3     create table [user](
      4     id int identity(1,1) , --自增字段
      5     name varchar(50) ,
      6     pwd varchar(50) ,
      7     constraint pk_user_id primary key(id) --主键
      8     --constraint pk_user_id primary key(id,[name])
      9     );
     10 
     11 -- 变量的声明,sql里面声明变量时必须在变量前加@符号
     12     DECLARE @I INT
     13 
     14 -- 变量的赋值,变量赋值时变量前必须加set
     15     SET @I = 30
     16 
     17 -- 声明多个变量
     18     DECLARE @s varchar(10),@a INT
     19 
     20 -- Sql 里if语句
     21     IF 条件 BEGIN
     22         执行语句
     23     END
     24     ELSE BEGIN
     25         执行语句
     26     END
     27             
     28     DECLARE @d INT
     29     set @d = 1
     30 
     31     IF @d = 1 BEGIN
     32 
     33     -- 打印
     34         PRINT '正确'
     35     END
     36     ELSE BEGIN
     37         PRINT '错误'
     38     END
     39 
     40 
     41 -- Sql 里的多条件选择语句.
     42     DECLARE @iRet INT@PKDisp VARCHAR(20)
     43     SET @iRet = 1
     44     Select @iRet =
     45     CASE
     46         WHEN @PKDisp = '' THEN 1
     47         WHEN @PKDisp = '' THEN 2
     48         WHEN @PKDisp = '' THEN 3
     49         WHEN @PKDisp = '' THEN 4
     50         WHEN @PKDisp = '' THEN 5
     51         ELSE 100
     52     END
     53 
     54 -- 循环语句
     55     WHILE 条件 BEGIN    
     56         执行语句
     57     END
     58 
     59     DECLARE @i INT
     60     SET @i = 1
     61     WHILE @i<1000000 BEGIN
     62         set @i=@i+1
     63     END
     64     -- 打印
     65     PRINT @i
     66 
     67 
     68 -- TRUNCATE 删除表中的所有行,而不记录单个行删除操作,不能带条件
     69 
     70     /*
     71     TRUNCATE TABLE 在功能上与不带 Where 子句的 Delete 语句相同:二者均删除表中的全部行
     72 
     73 。但 TRUNCATE TABLE 比 Delete 速度快,且使用的系统和事务日志资源少。
     74     Delete 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过
     75 
     76 释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
     77     TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用
     78 
     79 的计数值重置为该列的种子。如果想保留标识计数值,请改用 Delete。如果要删除表定义及其数据,请
     80 
     81 使用 Drop TABLE 语句。
     82     对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 Where 子句的
     83 
     84 Delete 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。
     85     TRUNCATE TABLE 不能用于参与了索引视图的表。
     86     示例
     87         下例删除 authors 表中的所有数据。*/
     88         
     89         TRUNCATE TABLE authors
     90                 
     91 
     92 -- Select INTO 从一个查询的计算结果中创建一个新表。 数据并不返回给客户端,这一点和普通的
     93 -- Select 不同。 新表的字段具有和 Select 的输出字段相关联(相同)的名字和数据类型。
     94         
     95         select * into NewTable
     96             from Uname
     97 
     98 
     99 -- Insert INTO Select
    100         -- 表ABC必须存在
    101         -- 把表Uname里面的字段Username复制到表ABC
    102         Insert INTO ABC Select Username FROM Uname
    103 
    104 -- 创建临时表
    105         Create TABLE #temp(
    106             UID int identity(11PRIMARY KEY,
    107             UserName varchar(16),
    108             Pwd varchar(50),
    109             Age smallint,
    110             Sex varchar(6)
    111         )
    112         -- 打开临时表
    113         Select * from #temp
    114 
    115 -- 存储过程
    116         -- 要创建存储过程的数据库
    117         Use Test
    118         -- 判断要创建的存储过程名是否存在
    119             if Exists(Select name From sysobjects Where name='csp_AddInfo' And
    120 
    121 type='P')
    122             -- 删除存储过程
    123             Drop Procedure dbo.csp_AddInfo
    124         Go
    125                 
    126                 
    127         -- 创建存储过程
    128         Create Proc dbo.csp_AddInfo
    129         -- 存储过程参数
    130         @UserName varchar(16),
    131         @Pwd varchar(50),
    132         @Age smallint,
    133         @Sex varchar(6)
    134         AS
    135         -- 存储过程语句体
    136         insert into Uname (UserName,Pwd,Age,Sex)
    137             values (@UserName,@Pwd,@Age,@Sex)
    138         RETURN
    139         -- 执行
    140         GO
    141                 
    142         -- 执行存储过程
    143         EXEC csp_AddInfo 'Junn.A','123456',20,'';
    144 修改自:http://blog.csdn.net/mx1029/archive/2007/07/06/1680910.aspx

    posted @ 2011-03-25 16:31 jack zhai 阅读(201) | 评论 (0)编辑 收藏

    commons-FileUpload上传过程

    1、

    ServletFileUpload.isMultipartContent(request)

    检测request中是否包含有multipart内容

    2、如果有,生成DiskFileItemFactory工厂将进行相关的设置

             DiskFileItemFactory factory = new DiskFileItemFactory();
            // maximum size that will be stored in memory
            factory.setSizeThreshold(maxMemSize);
            // Location to save data that is larger than maxMemSize.
            factory.setRepository(new File("d:/"));

    3、生成上传ServletFileUpload类,并将DiskFileFactory工厂传给它,并对ServletFileUpload进行配置

           // Create a new file upload handler
            ServletFileUpload upload = new ServletFileUpload(factory);
            // maximum file size to be uploaded.
            upload.setSizeMax(maxFileSize);

    4、从request得到上传的文件列表

                // Parse the request to get file items.
                List fileItems = upload.parseRequest(request);

                // Process the uploaded file items
                Iterator i = fileItems.iterator();

    5、处理文件:写入或者其他操作

    while (i.hasNext()) {
                    FileItem fi = (FileItem) i.next();
                    if (!fi.isFormField()) {
                        // Get the uploaded file parameters
                        String fieldName = fi.getFieldName();
                        String fileName = fi.getName();
                        String contentType = fi.getContentType();
                        boolean isInMemory = fi.isInMemory();
                        long sizeInBytes = fi.getSize();
                        // Write the file
                        if (fileName.lastIndexOf("\\") >= 0) {
                            file = new File(
                                    filePath
                                            + fileName.substring(fileName
                                                    .lastIndexOf("\\")));
                        } else {
                            file = new File(
                                    filePath
                                            + fileName.substring(fileName
                                                    .lastIndexOf("\\") + 1));
                        }
                        fi.write(file);
                        out.println("Uploaded Filename: " + fileName + "<br>");
                    }
                }

    }

     

    说明:

    FileItem接口是对用户上传文件的封装

    DiskFileItemFactory实现了FileItemFactory接口,主要方法有public FileItem createItem(String fieldName, String contentType, boolean isFormField, String fileName)

    ServletFileUpload从FileUpload继承,而FileUpload又从FileUploadBase继承,功能:分析传入的request对象、得到文件列表FileItemIterator……

    posted @ 2011-03-23 13:01 jack zhai 阅读(1546) | 评论 (0)编辑 收藏

    利用Servlet + commons-FileUpload 实现文件上传

    简明步骤

    1、下载所需包:commons-FileUpload  http://commons.apache.org/fileupload/ 依赖commons-IO包

                              commons-IO http://commons.apache.org/io/

    2、前端:

    3、书写Servlet

    4、web.xml中配置上传文件存放地址

    5、web.xml中配置Servlet

     

     

    一、前端

     
    <html>
    <head>
    <title>File Uploading Form</title>
    </head>
    <body>
    <h3>File Upload:</h3>
    Select a file to upload: <br />
    <form action="UploadServlet" method="post"
                            enctype="multipart/form-data">
    <input type="file" name="file" size="50" />
    <br />
    <input type="submit" value="Upload File" />
    </form>
    </body>
    </html>
    

     

    二、书写Servlet

    web.xml

    三、web.xml中配置上传文件存放地址

    web.xml

     

    四、web.xml中配置Servlet

    web.xml

    posted @ 2011-03-23 09:25 jack zhai 阅读(1138) | 评论 (0)编辑 收藏

    翻译:使用Servlet实现文件上传

    原文地址:http://www.tutorialspoint.com/servlets/servlets-file-uploading.htm

     

    一个Servlet可以通过HTML表单标签将文件上传到服务器。支待上传的有文本、图像及任何文件。

    创建文件上传表单:

             下面的html代码创建了一个上传表单。创建过程需要注意以下几点:

    form标签中的method属性必须设置为POST,即GET方法是不可以的。

    form标签中的enctype属性应该设置为multipart/form-data

    from标签中的action属性应该与服务器后台的servlet映射路径相同。接下来的实例,我们将使用UploadServlet实现文件上传。

    要上传一个文件,你应该使用一个<input type=”file”.../>标记。要多个文件上传,必须包含多个具有不同的名称属性值的<input type=”file”.../>标记。The browser associates a Browse button with each of them

    <html>

    <head>

    <title>File Uploading Form</title>

    </head>

    <body>

    <h3>File Upload:</h3>

    Select a file to upload: <br />

    <form action="UploadServlet" method="post"

                            enctype="multipart/form-data">

    <input type="file" name="file" size="50" />

    <br />

    <input type="submit" value="Upload File" />

    </form>

    </body>

    </html>

    以上代码将得到以下效果。你可以在本地PC上选择一个文件。当你点击“Upload File”,表单将会随着你选择的文件一起被提交。

    后台servlet

    以下UploadServlet servlet将接收上传的文件并将其保存入<Tomcat-installation-directory>/webapps/data文件夹。这个文件夹的名称可以通过外部配置文件web.xml中的context-param元素内容增加。代码如下:

    <web-app>
    ....
    <context-param> 
        <description>Location to store uploaded file</description> 
        <param-name>file-upload</param-name> 
        <param-value>
             c:"apache-tomcat-5.5.29"webapps"data"
         </param-value> 
    </context-param>
    ....
    </web-app>

             以下是实现了多文件同时上传功能的UploadServlet。在此之前您必须确定以下几点:

    以下实例依赖F ileUpload类,所以您须将最新版的commons-fileupload.x.x.jar放到您的classpath下。可以从这里下载:http://commons.apache.org/fileupload/

    FileUpload类依赖于Commons IO包,所以您须将最新版commons-fileupload.x.x.jar放到您的classpath下。可以从这里下载:http://commons.apache.org/io/

    在测试以下例子的时候,您应该上传小于maxFileSize的文件,否则无法上传。

    事先确定你已经建议好文件夹:c:"tempc:"apache-tomcat-5.5.29"webapps"data

    // Import required java libraries
    import java.io.*;
    import java.util.*;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.FileUploadException;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    import org.apache.commons.io.output.*;
     
    public class UploadServlet extends HttpServlet {
       
       private boolean isMultipart;
       private String filePath;
       private int maxFileSize = 50 * 1024;
       private int maxMemSize = 4 * 1024;
       private File file ;
     
       public void init( ){
          // Get the file location where it would be stored.
          filePath = 
                 getServletContext().getInitParameter("file-upload"); 
       }
       public void doPost(HttpServletRequest request, 
                   HttpServletResponse response)
                  throws ServletException, java.io.IOException {
          // Check that we have a file upload request
          isMultipart = ServletFileUpload.isMultipartContent(request);
          response.setContentType("text/html");
          java.io.PrintWriter out = response.getWriter( );
          if( !isMultipart ){
             out.println("<html>");
             out.println("<head>");
             out.println("<title>Servlet upload</title>"); 
             out.println("</head>");
             out.println("<body>");
             out.println("<p>No file uploaded</p>"); 
             out.println("</body>");
             out.println("</html>");
             return;
          }
          DiskFileItemFactory factory = new DiskFileItemFactory();
          // maximum size that will be stored in memory
          factory.setSizeThreshold(maxMemSize);
          // Location to save data that is larger than maxMemSize.
          factory.setRepository(new File("c:""temp"));
     
          // Create a new file upload handler
          ServletFileUpload upload = new ServletFileUpload(factory);
          // maximum file size to be uploaded.
          upload.setSizeMax( maxFileSize );
     
          try{ 
          // Parse the request to get file items.
          List fileItems = upload.parseRequest(request);
            
          // Process the uploaded file items
          Iterator i = fileItems.iterator();
     
          out.println("<html>");
          out.println("<head>");
          out.println("<title>Servlet upload</title>"); 
          out.println("</head>");
          out.println("<body>");
          while ( i.hasNext () ) 
          {
             FileItem fi = (FileItem)i.next();
             if ( !fi.isFormField () )      
             {
                // Get the uploaded file parameters
                String fieldName = fi.getFieldName();
                String fileName = fi.getName();
                String contentType = fi.getContentType();
                boolean isInMemory = fi.isInMemory();
                long sizeInBytes = fi.getSize();
                // Write the file
                if( fileName.lastIndexOf("""") >= 0 ){
                   file = new File( filePath + 
                   fileName.substring( fileName.lastIndexOf(""""))) ;
                }else{
                   file = new File( filePath + 
                   fileName.substring(fileName.lastIndexOf("""")+1)) ;
                }
                fi.write( file ) ;
                out.println("Uploaded Filename: " + fileName + "<br>");
             }
          }
          out.println("</body>");
          out.println("</html>");
       }catch(Exception ex) {
           System.out.println(ex);
       }
       }
       public void doGet(HttpServletRequest request, 
                           HttpServletResponse response)
            throws ServletException, java.io.IOException {
            
            throw new ServletException("GET method used with " +
                    getClass( ).getName( )+": POST method required.");
       } 
    }

           编译并运行Servlet

        编译以上UploadServlet并在web.xml中创建必须的实体,如下:

    <servlet>
       <servlet-name>UploadServlet</servlet-name>
       <servlet-class>UploadServlet</servlet-class>
    </servlet>
     
    <servlet-mapping>
       <servlet-name>UploadServlet</servlet-name>
       <url-pattern>/UploadServlet</url-pattern>
    </servlet-mapping>

             现在可以尝试使用你创建的HTML表单上传文件。当你访问http://localhost:8080/UploadFile.htm,浏览器里将会显示如下效果,您可以从本地上传你想要上传的任何文件。

             如果您的servlet脚本运行成功,您的文件上传在c:"apache-tomcat-5.5.29"webapps"data"directory文件夹。

    posted @ 2011-03-23 08:52 jack zhai 阅读(3798) | 评论 (0)编辑 收藏

    JavaMail发送邮件

    1、取得系统Properties,并配置

        Properties props = System.getProperties();
        props.setProperty("mail.transport.protocol", "smtp"); // smtp协议
        props.setProperty("mail.smtp.host", m_server); // 服务器地址
        props.setProperty("mail.smtp.port", "" + m_port); // 端口号

        props.setProperty("mail.smtp.auth", "true"); //// 认证信息

    2、将取得Session

    javax.mail.Session sess = javax.mail.Session.getDefaultInstance(props);

    3、实例MimeMessage类,然后设置收件人、主题、发件日期

    MimeMessage msg = new MimeMessage(sess);

    msg.setFrom(new InternetAddress(m_from));        // 发件人

    msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(m_to)); //收件人

    msg.setSubject(m_subject); //主题

    msg.setSentDate(new Date()); //发件日期

    4、向MimeMessage中添加文本内容及附件

    MimeMultipart content = new MimeMultipart();// 文本内容

    MimeBodyPart  part = new MimeBodyPart(); //part还需要加入头,类型之类的属性

    content.addBodyPart(part);   

    part = new MimeBodyPart();                 //这里是加入附件
    FileDataSource fds = new FileDataSource(filename);
    part.setDataHandler(new DataHandler(fds));
    part.setFileName(MimeUtility.encodeText(fds.getName()));

    content.addBodyPart(part);

    msg.setContent(content); //设置并保存
    msg.saveChanges();

    5、使用Session取得Transport

    Transport trans = sess.getTransport();

    6、使用Transport连接服务器

    trans.connect(m_server, m_user, m_pass);
            

    7、发送邮件并关闭

    trans.sendMessage(msg, InternetAddress.parse(m_to));
    trans.close();

    posted @ 2011-03-18 23:36 jack zhai 阅读(259) | 评论 (0)编辑 收藏

    java对象序列化知识

    1、java对象序列化不保存对象中的静态变量

    ser

    2、虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID 是否一致(就是 private static final long serialVersionUID = 1L)。

    3、父类的序列化与transient关键字

    只有子类和父类都实现了Serializable接口时,对子类反序列化时才会将父类也序列化。反序列化过程是先反序列过父类对象再反序列化子类。而如果不想序列化某一个变量,则可以在定义变量时使用transient关键字。

    Parent
    Son and main


    4、Java 序列化机制为了节省磁盘空间,具有特定的存储规则,当写入文件的为同一对象时,并不会再将对象的内容进行存储,而只是再次存储一份引用。

     

    从IBM DW 整理而来

    http://www.ibm.com/developerworks/cn/java/j-lo-serial/index.html#icomments


     

    posted @ 2011-03-15 13:24 jack zhai 阅读(173) | 评论 (0)编辑 收藏

    理解Class.forName()

    Class.froName(“cc.a.C”)

    返回:C这个类的class(其实是这个类的字节码)

    作用:告诉jvm使用相应的加载器,将C.class加载入jvm(至于加载到哪个位置,本人还不知道)

     

    而Class.forName(“cc.a.C”).newInstance()则是实例化一个对象;而new关键的作用也是实例化一个对象

    所以可以粗略的将这两种实例化对象的方法等同。

    当然它们有不同的地方。

    在网上看到别人是这样区别的:

    newInstance: 弱类型。低效率。只能调用无参构造。
    new: 强类型。相对高效。能调用任何public构造。

    posted @ 2011-03-14 18:57 jack zhai 阅读(163) | 评论 (0)编辑 收藏

    给eclipes安装myeclipes插件

    将myeclipes安装目录C:\Program Files\Genuitec\Common\plugins 所有的东西复制到eclipes安装目录的\plugins里,并覆盖。

    重新启动eclipes就可以了。

    posted @ 2011-03-14 11:07 jack zhai 阅读(439) | 评论 (0)编辑 收藏

    commons-lang源码学习之ArrayUtils

    1、比较两个对象是否类型相同

    array1.getClass().getName().equals(array2.getClass().getName()

    2、倒置(reverse)数组中的元素

             int i = 0;
            int j = array.length - 1;
            Object tmp;
            while (j > i) {
                tmp = array[j];
                array[j] = array[i];
                array[i] = tmp;
                j--;
                i++;
              }

    3、得到数组的容器类型

    array.getClass().getComponentType();

    4、lastIndex()这类方法的实现

    for (int i = startIndex; i >= 0; i--) {
                  if (objectToFind.equals(array[i])) {
                      return i;
                  }
    }

    5、isEmpty()这类方法的实现只要一句话,isNotEmpty方法依此推

    return array == null || array.length == 0;

    6、将两个数组合并addAll

           boolean[] joinedArray = new boolean[array1.length + array2.length];
           System.arraycopy(array1, 0, joinedArray, 0, array1.length);
           System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);

    7、将新元素加入到数组中

                int arrayLength = Array.getLength(array);
                Object newArray = Array.newInstance(array.getClass().getComponentType(), arrayLength + 1);
                System.arraycopy(array, 0, newArray, 0, arrayLength);
                return newArray;

    8、获得数组长度的方法

    int arrayLength = Array.getLength(array);

    9、以反射的方式获得数组对象

    Array.newInstance(array.getClass().getComponentType(), arrayLength + 1)

    10、将某一元素从数组中移除

    Object result = Array.newInstance(array.getClass().getComponentType(), getLength(array)- 1);
           System.arraycopy(array, 0, result, 0, index);
           if (index < length - 1) {
               System.arraycopy(array, index + 1, result, index, length - index - 1);
           }

    posted @ 2011-03-08 15:01 jack zhai 阅读(793) | 评论 (0)编辑 收藏

    泛型知识

    1、泛型是给java编译器使用的,在源文件经过编译后,编译器会将类型信息去掉,所以

    test

    2、可以绕过编译器的类型信息检查,而直接加入对象

    test

    3、泛型通配符

    test

    4、限定通配符上边界,限定通配符上边界

    test

    test

    5、自定义泛型方法

    test

    6、类级别泛型

    test

    7、通过反射获得泛型的实际类型参数

    test


     

    posted @ 2011-03-05 19:45 jack zhai 阅读(89) | 评论 (0)编辑 收藏

    对传入字符进行排列组合并进行md5编码,最后写入文件

    Combinations
    md5Util

    IO工具包

    md5Util


     

    posted @ 2011-03-03 13:17 jack zhai 阅读(301) | 评论 (0)编辑 收藏

    对象的创建过程《Think in java》读书笔记

    假设有一个Dog类

    1、当首次创建Dog的对象时(构造器可以看成静态方法),或者Dog类的静态方法/静态域首次被访问时,java解释器必须查找类路径,以定位Dog.class文件
    2、然后载入Dog.class,有关静态初始化的所有动作都会执行。因此,静态初始化的所有动作都会执行。因此,静态初始化只在Class对象首次加载的时候进行一次。
    3、当用new Dog()创建对象的时候,首先将在堆上为Dog类分配足够的存储空间。
    4、这块存储空间会被清零,这就看上去地将Dog对象中所有基本类型数据都设置成了默认值,而引用则被设置成了null。
    5、执行所有出现于字段定义处的初始化动作。
    6、执行构造器。

    posted @ 2011-02-23 16:17 jack zhai 阅读(121) | 评论 (0)编辑 收藏

    类的内部,变量的定义先后顺序决定变量初始化的顺序

    1、在类的内部,变量的定义先后顺序决定变量初始化的顺序,它们将会在任何方法(构造函数)被调用前被初始化

     1package cc.text;
     2
     3public class Dog {
     4    
     5    Cat c1 = new Cat(1) ; ;
     6    Cat c2 = new Cat(2) ;
     7    public Dog(){
     8        c1 = new Cat(1) ;
     9    }

    10    public void foo(){
    11        System.out.println("dog woo!");
    12    }

    13    Cat c3 = new Cat(3) ;
    14    
    15    public static void main(String[] args) {
    16        Dog d = new Dog() ;
    17        d.foo() ;
    18    }

    19}

    20class Cat{
    21    public Cat(int i){
    22        System.out.println("ini cat"+ i);
    23    }

    24}

    25


    posted @ 2011-02-23 16:07 jack zhai 阅读(201) | 评论 (0)编辑 收藏

    方法重载

    a、区分方法的重载有:

    1、参数顺序

    public void info(int i, String str);

    public void info(String str, int i);

    2、以返回值区分重载方法

    void f(){}

    int f(){return 1;}

    当int i = f();时就会调用int f(){return i;}方法

    b、基本类型的重载

    1、基本类型从一个“较小”的类型自动提提升成“较大”的类型

    2、如果找不到有char型的方法,就会把char型提升为int型

    posted @ 2011-02-23 13:41 jack zhai 阅读(125) | 评论 (0)编辑 收藏