powerwind 发表于 2006-8-13 12:56

暑期JAVA学习笔记

一,JAR基本用法示例
在 C:新建文件夹叫 Test ,然后新建 HelloWorld.java 文件,内容如下:

package powerwind;
import javax.swing.*;
public class HelloWorld
{
        public static void main(String[]args)throws Exception
        {
                JOptionPane.showMessageDialog(null,"HelloWorld");
        }
}
接着打开命令提示符窗口,输入 cd c:\Test,此时切换到 c:\test目录下。用javac HelloWorld.java -d .开始编译JAVA源文件。

编译成功后,c:\test目录下有个 powerwind 文件夹,该文件夹下有 HelloWorld.class 文件。
此时在 c:\test 目录下新建文件helloworld.txt ,在此文件输入 Main-Class: powerwind.HelloWorld注意:在最后一定要有个回车,Main-Class:后面要有空格。
输入jar -cvfm HelloWorld.jar helloworld.txt powerwind/ 命令完成后,生成 HelloWorld.jar 文件,直接双击此文件就可以运行程序了。如果 .jar 文件已经被 WinRAR关联了,可以再新建一个批处理文件 run.batstart javaw -jar HelloWorld.jar 这样,双击 run.bat 也可以运行程序。

[ 本帖最后由 powerwind 于 2006-9-13 16:11 编辑 ]

MJOfPowerwind 发表于 2006-8-13 15:35

ant基本用法示例

二,ant基本用法示例

程序如一楼的,在c:\test目录下新建 src文件夹,在此文件夹下新建 powerwind 文件夹并把 HelloWorld.java 这个文件放在里面。helloworld.txt 文件放在src文件夹下。最后在c:\test文件夹下新建 build.xml 文件:

<?xml version="1.0"?>
<project name="A simple test" default="compile" basedir=".">
<property environment="env"/>
<property name="src.dir" value="${basedir}/src"/>
<property name="classes.dir" value="${basedir}/classes"/>
<path id="classpath">
        <pathelement location="${classes.dir}"/>
        <pathelement location="${basedir}"/>
        <pathelement location="${env.CLASSPATH}"/>
</path>
<target name="init" >
        <delete dir="${classes.dir}"/>
    <mkdir dir="${classes.dir}"/>
</target>
<target name="compile" depends="init">
    <javac srcdir="${src.dir}" destdir="${classes.dir}" includes="**/*.java">
          <classpath refid="classpath"/>
    </javac>
</target>
<target name="jar" depends="compile">
    <jar jarfile="${classes.dir}/HelloWorld.jar" manifest="${src.dir}/helloworld.txt">
                <fileset dir="${classes.dir}" includes="**/*.class" />
    </jar>
</target>
<target name="run">
    <java classname="powerwind.HelloWorld" fork="yes" dir=".">
      <classpath refid="classpath"/>
    </java>
</target>
</project>

此时,输入命令 ant 或 ant compile执行编译,完成后输入 ant run ,用 ant jar 还可以打包文件。

有时候要设置很多属性,就可能把属性放在一个单独的文件里.
删除<property name="src.dir" value="${basedir}/src"/> <property name="classes.dir" value="${basedir}/classes"/> ,添加 <property file="build.properties"/>.
同时新建一个文件:
build.properties
src.dir=${basedir}/src
classes.dir=${basedir}/classes

PS:前提条件是下载了 ant 这个小工具。

[ 本帖最后由 powerwind 于 2006-9-10 17:01 编辑 ]

powerwind 发表于 2006-8-13 19:10

三,由 Hibernate 配置文件生成JAVA代码

三,由 Hibernate 配置文件生成JAVA代码

文件结构图如下:

其中 build.xml 在 Test 目录下,codegen.cfg.xml 文件在 Test/src 目录下,Student.hbm.xml 文件在 Test/src/powerwind 目录下。

Student.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>

<class name="powerwind.Student" table="STUDENTS" >
    <meta attribute="class-scope">public</meta>
   
    <id name="id" type="long" column="ID" >
      <meta attribute="scope-set">protected</meta>
      <generator class="native"/>
    </id>

    <property name="name" type="string" >
      <meta attribute="use-in-tostring">true</meta>
      <meta attribute="finder-method">findByName</meta>
      <column name="NAME" length="15" not-null="true" unique="true" />
    </property>
      
    <property name="age" type="int">
      <meta attribute="field-description">How old is the student</meta>
      <meta attribute="use-in-tostring">true</meta>
      <column name="AGE" check="AGE>18" not-null="true"/>
    </property>
   
    <property name="***" type="char" column="***"/>
   
    <property name="info" type="string">
       <meta attribute="use-in-tostring">true</meta>
       <column name="INFO" sql-type="text"/>
    </property>
       
</class>

</hibernate-mapping>

codegen.cfg.xml

<codegen>
    <generate renderer="net.sf.hibernate.tool.hbm2java.BasicRenderer"/>
    <generate renderer="net.sf.hibernate.tool.hbm2java.FinderRenderer" suffix="Finder"package="powerwind"/>
</codegen>

build.xml

<?xml version="1.0"?>
<project name="hbm2java" default="hbm2java" basedir=".">

<property name="source.root" value="${basedir}/src"/>
<property name="lib.dir" value="E:/java/Hibernate/lib"/>

<path id="class.path">
      <fileset dir="${lib.dir}" includes="*.jar"/>
</path>

<target name="hbm2java">
    <taskdef name="hbm2java"
         classname="net.sf.hibernate.tool.hbm2java.Hbm2JavaTask"
         classpathref="class.path"/>
    <hbm2java output="${source.root}" config="${source.root}/codegen.cfg.xml">
      <fileset dir="${source.root}">
      <include name="**/*.hbm.xml"/>
      </fileset>
    </hbm2java>
</target>

</project>


<property name="lib.dir" value="E:/java/Hibernate/lib"/> 这个要根据 Hibernate 所在目录而设置。

输入 ant 或ant hbm2java,就可能生成JAVA源文件了。

hjack 发表于 2006-8-13 19:51

ant 确实是一个很好的工具...

powerwind 发表于 2006-8-14 00:17

三(2),由 Hibernate 配置文件生成DDL

在前面的基础上,加上这个文件.
hibernate.properties
hibernate.dialect=net.sf.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://localhost:3306/course
hibernate.connection.username=root
hibernate.connection.password=123456
hibernate.show_sql=true

在 build.xml 里添加两个 target 元素.
<target name="compile">
        <javac srcdir="${source.root}"
                           destdir="${source.root}"
                           debug="on">
                  <classpath refid="class.path"/>
        </javac>
</target>

<target name="schema">
        <taskdef name="schemaexport"
                classname="net.sf.hibernate.tool.hbm2ddl.SchemaExportTask"
                classpathref="class.path" />
                <schemaexport properties="${source.root}/hibernate.properties"
                                          quiet="no" text="no" drop="no" output="${basedir}/student.sql" delimiter=";">
                <fileset dir="${source.root}" includes="**/*.hbm.xml"/>
                </schemaexport>
</target>
同时还要在原来的path 元素加上 <pathelement location="${source.root}" />
这样,执行 ant compile后再执行 ant schema 就可能生成DDL文件了:

student.sqldrop table if exists STUDENTS;
create table STUDENTS (
   ID bigint not null auto_increment,
   NAME varchar(15) not null unique,
   AGE integer not null check(AGE>18),
   *** char(1),
   INFO text,
   primary key (ID)
);

有一点很奇怪,没有启动 mysql 数据厍时不能生成DDL。

MJOfPowerwind 发表于 2006-8-14 18:08

四,有Spring和没有Spring的 IoC

四,有Spring和没有Spring的 IoC

1、使用 Spring的简单例子:

IHelloWorldService.java
package powerwind;
public interface IHelloWorldService
{
        public String getHello();
        public void setHello(String hello);
}

HelloWorldService.java
package powerwind;
public class HelloWorldService implements IHelloWorldService
{
        private String hello;
        public String getHello()
        {
                return hello;
        }
        public void setHello(String hello)
        {
                this.hello=hello;
        }
}
HelloWorld.java
package powerwind;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.*;
public class HelloWorld
{
        private IHelloWorldService iHelloWorld;
        public HelloWorld()
        {
                setService();
        }
        public void setService()
        {
                Resource resource=new ClassPathResource("appcontext.xml");
                BeanFactory factory=new XmlBeanFactory(resource);
                iHelloWorld=(IHelloWorldService)factory.getBean("HelloWorld");
        }
        public IHelloWorldService getService()
        {
                return iHelloWorld;
        }
        public static void main(String[]args)
        {
                HelloWorld helloworld=new HelloWorld();
                System.out.println(helloworld.getService().getHello());
        }
}
配置文件 appcontext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
        <bean id="HelloWorld" class="powerwind.HelloWorldService">
                <property name="hello">
                        <value>Hello,World!This is from spring!</value>
                </property>
        </bean>
</beans>

二,没有Spring的实现

修改 HelloWorld.java 文件
package powerwind;

import java.util.Properties;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.io.InputStream;

public class HelloWorld
{
        private IHelloWorldService iHelloWorld;
        public HelloWorld()
        {
                setService();
        }
        public void setService()
        {
                try
                {
                        Properties p=new Properties();
                        InputStream is=getClass().getClassLoader()
                                .getResourceAsStream("appcontext.properties");
                        p.load(is);
                        is.close();
                        String cls=p.getProperty("HelloWorld");
                        iHelloWorld=(IHelloWorldService)Class.forName(cls).newInstance();
                        iHelloWorld.setHello(p.getProperty("hello"));
                }catch(Exception e)
                {
                        System.out.println(e);
                }
        }
        public IHelloWorldService getService()
        {
                return iHelloWorld;
        }
        public static void main(String[]args)
        {
                HelloWorld helloworld=new HelloWorld();
                System.out.println(helloworld.getService().getHello());
        }
       
}
同时配置文件用 appcontext.properties
HelloWorld=powerwind.HelloWorldService
hello=Hello,World!This is not from spring!

这样实现了同样效果,可是Spring的实现不会是这么简单的。

[ 本帖最后由 powerwind 于 2006-8-14 20:30 编辑 ]

powerwind 发表于 2006-8-14 23:00

四,有Spring和没有Spring的 IoC

四,有Spring和没有Spring的 AOP

一、使用Spring:AOP的 before advice 简单例子.

IHelloWorldService.javapackage powerwind;public interface IHelloWorldService{public String getHello();public void setHello(String hello);}
HelloWorldService.java
package powerwind;
public class HelloWorldService implements IHelloWorldService
{
        private String hello;
        public String getHello()
        {
                return hello;
        }
        public void setHello(String hello)
        {
                this.hello=hello;
        }
}
HelloWorld.java
package powerwind;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.*;

public class HelloWorld
{
        private IHelloWorldService iHelloWorld;
        public HelloWorld()
        {
                setService();
        }
        public void setService()
        {
                Resource resource=new ClassPathResource("appcontext.xml");
                BeanFactory factory=new XmlBeanFactory(resource);
                iHelloWorld=(IHelloWorldService)factory.getBean("IHelloWorld");
        }
        public IHelloWorldService getService()
        {
                return iHelloWorld;
        }
        public static void main(String[]args)
        {
                HelloWorld helloworld=new HelloWorld();
                System.out.println(helloworld.getService().getHello());
        }
}
BeforeAdvice.java
package powerwind;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;

public class BeforeAdvice implements MethodBeforeAdvice
{
        public void before(Method arg0,Object[]arg1,Object arg2)throws Throwable
        {
                System.out.println("invoke before method ["+arg0+"]");
        }
}
appcontext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>

        <bean id="HelloWorld" class="powerwind.HelloWorldService">
                <property name="hello">
                        <value>Hello,World!This is from spring!</value>
                </property>
        </bean>

        <bean id="advice" class="powerwind.BeforeAdvice" />

        <bean id="IHelloWorld" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="proxyInterfaces">
                <value>powerwind.IHelloWorldService</value>
        </property>
        <property name="target">
                <ref local="HelloWorld" />
        </property>
        <property name="interceptorNames">
                <list>
                        <value>advice</value>
                </list>
        </property>
        </bean>

</beans>

二、没有Spring的时候
HelloWorldService.java 文件内容同上,而 IHelloWorldService.java 初始化变量 private String hello=“HelloWorld,this is not from spring!”,删除BeforeAdvice.java文件,新建叫 HelloWorldFactory.java 的文件
package powerwind;
import java.lang.reflect.*;
import java.util.*;
import java.io.*;

public class HelloWorldFactory implements InvocationHandler
{
        private Object proxyObj;

        public Object getBean(String beanName)throws Exception
        {
                Properties p=new Properties();
                InputStream is=getClass().getClassLoader()
                                .getResourceAsStream("appcontext.properties");
                p.load(is);
                is.close();
                proxyObj=Class.forName(p.getProperty(beanName)).newInstance();

                Class cls=proxyObj.getClass();
                return Proxy.newProxyInstance(cls.getClassLoader(),
                        cls.getInterfaces(),this);
        }

        public Object invoke(Object obj,Method method,Object[]args)throws Throwable
        {
                System.out.println("invoke before method ["+method+"]");
                if(args!=null)
                {
                        for(int i=0;i<args.length;i++)
                        {
                                System.out.println(args+"");
                        }
                }
                return method.invoke(proxyObj,args);
        }
}
HelloWorld.java

package powerwind;
public class HelloWorld
{
        private IHelloWorldService iHelloWorld;
        public HelloWorld()
        {
                setService();
        }
        public void setService()
        {
                try
                {
                        iHelloWorld=(IHelloWorldService)new HelloWorldFactory()
                                .getBean("IHelloWorld");
                }catch(Exception e)
                {
                        System.out.println(e);
                }
               
        }
        public IHelloWorldService getService()
        {
                return iHelloWorld;
        }
        public static void main(String[]args)
        {
                HelloWorld helloworld=new HelloWorld();
                System.out.println(helloworld.getService().getHello());
        }
}
配置文件 appcontext.properties

IHelloWorld=powerwind.HelloWorldService

[ 本帖最后由 powerwind 于 2006-8-14 23:14 编辑 ]

powerwind 发表于 2006-8-16 13:02

五、Eclipse 常用快捷键整理

五、Eclipse 常用快捷键整理

Ctrl + Shift + L 查看所有快捷键

Ctr l+ M ——> 窗口最大化 / 还原

Ctrl + Shift + M ——> 自动导入类包

Ctrl + / ——> 注释 / 取消注释

Ctrl + Shift + / ——> /**/块注释

Ctrl + Shift + \ ——> /**/取消块注释

Ctrl + Shift + F ——> 格式化代码

F3 ——> 打开定义

Alt + / ——> 自动补全


[ 本帖最后由 powerwind 于 2006-8-16 13:25 编辑 ]

iptton 发表于 2006-8-16 13:12

昨晚用JBuilder2006 对一本 JBuilder2005的书学习……

可能是版本问题:JOptionPane.showMessageDialog(this,"hello!");
找不到JOptionPane

JAVABean   (问题该怎么描述就不清楚了……016,我只是照书中说的实例做,没看原理……)
找不了 com.borland.dx.dataset.DataSet 类

powerwind 发表于 2006-8-16 13:17

JOptionPane 全名是:javax.swing.JOptionPane
com.borland.dx.dataset.DataSet 是JB 自带的东西,看看包的导入是否正确

powerwind 发表于 2006-8-22 16:55

六、JSP2.0里的一些好东西

六、JSP2.0里的一些好东西

我想,如果JSP够令人满意的话,像struts,JSF之类的东西就不会出现了。JSP的好坏不去说它,现在先把它的一些好东西记录下来。

1、在 web.xml 中配置

<jsp-property-group>
   <url-pattern>/pages/*</url-pattern>
   <el-ignore>false</el-ignore>
    <page-encoding>GB2312</page-encoding>
    <include-prelude>/include/header.jspf</include-prelude>
    <include-coda>/include/copyright.jspf</include-coda>
</jsp-property-group>

在 <jsp-config> 插入上面的代码,可以省去在每页写上 <%@page contentType="html/text;charset=GB2312" %>,而且<include-prelude>/include/header.jspf</include-prelude> 和 <include-coda>/include/copyright.jspf</include-coda>分别设置了页面的页眉和页脚,似乎比 include 包含文件要好。


<filter>
        <filter-name>setCharacterEncoding</filter-name>
        <filter-class>powerwind.filter.SetCharacterEncodingFilter</filter-class>
        <init-param>
                <param-name>encoding</param-name>
                <param-value>GB2312</param-value>
        </init-param>
</filter>

<filter-mapping>
        <filter-name>setCharacterEncoding</filter-name>
        <url-pattern>/pages/*</url-pattern>
</filter-mapping>

JSP的中文一向令初学者心烦,在Tomcat的例子里就有一个 filter,把它拿来用,在 web.xml 的 <web-app> 加入上面的设置,对于中文的表单处理就不用加上<% request.setCharacterEncoding("GB2312");%> 了。

2、使用JSTL
个人比较喜欢JSTL的I18N标签厍。
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<fmt:setBundle basename="BookStore"/>
<fmt:message key="login.title" />
只要这样使用,所谓的国际化也不过如此。

[ 本帖最后由 powerwind 于 2006-8-23 16:26 编辑 ]

powerwind 发表于 2006-8-26 22:31

七、在editplus中使用正则表达式

七、在editplus中使用正则表达式

纯粹写代码的时候还是喜欢用editplus,因为它够小巧,功能强大,应用广泛(呵呵~)。
有时候看电子书,要运行一下书里的例子,又懒得从键盘一字一字地敲入,就想直接Copy书中的例子代码。有些电子书的代码编排得很美观,还加入了行号。比如:

1. public class Test
2.{
3.   private String str=null;
4.   public getStr()
5.    {
6.      return str;
7.   }
8.}

这样的代码可不能直接用啊,难道一行行地删除那些数字吗?其实不用,用editplus的替换功能,只要替换为空字符就等于删除了。替换所有数字,就要用到正则表达式。在替换先项里勾选 正则表达式,输入 (+)[\.] ,按全部替换就可以替换掉所有的行号和那个点了。
其实 editplus 在正则表达式方面应该还有很多功能的,正在摸索中。

powerwind 发表于 2006-9-6 13:27

Hibernate之一对一

暑假过了,笔记还是应该继续。打算为了练习hibernate而做一个简单的BBS。初步设计开始:
用户信息User完全可能放入全部的信息,但我为了练习hibernate,把它分割了。
mysql 的DDL为:

/***用户信息表**/
create table users( id bigint not null auto_increment,name varchar(20) not null unique,password varchar(35) not null default '123456',regTime timestamp not null,role integer default 1, /*对应的角色,暂时没用到*/ primary key(id) );
/*honor:头衔,icon_url:头像,personality:个性签名*/
create table Info( id bigint not null,honor varchar(20),icon_url varchar(50),personality varchar(255),primary key(id) );
alter table Info add constraint user_fk foreign key(id) references users(id);

这样,一个用户就要和它唯一的信息关联了。这里就使用Hibernate的 one-to-one
两个持久化类都只是一些getter和setter,主要是配置文件。
Info.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
        <class name="powerwind.bean.Info" table="info" catalog="sampledb">
                <id name="id" type="java.lang.Long">
                        <generator class="foreign">
                        <param name="property">user</param>
                        </generator>
                </id>
                <property name="honor" type="java.lang.String">
                        <column name="honor" length="20" />
                </property>
                <property name="iconUrl" type="java.lang.String">
                        <column name="icon_url" length="50" />
                </property>
                <property name="personality" type="java.lang.String">
                        <column name="personality" />
                </property>
                <one-to-one name="user" class="powerwind.bean.User"
                        constrained="true"/>
        </class>
</hibernate-mapping>

User.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="powerwind.bean.User" table="users" catalog="sampledb">
      <id name="id" type="java.lang.Long">
            <column name="id" />
            <generator class="native"></generator>
      </id>
      <property name="name" type="java.lang.String">
            <column name="name" length="20" not-null="true" unique="true" />
      </property>
      <property name="password" type="java.lang.String">
            <column name="password" length="35" not-null="true" />
      </property>
      <property name="regTime" type="java.util.Date">
            <column name="regTime" length="19" />
      </property>
      <property name="role" type="java.lang.Integer">
            <column name="role" />
      </property>
            <one-to-one name="info" class="powerwind.bean.Info" cascade="all"/>
    </class>
</hibernate-mapping>

现在两个类是双向关联,但实际上好像单向就够用了。

powerwind 发表于 2006-9-6 15:52

一个用户属于某个用户组,一个用户组包括很多用户。这样看来,应该是一个多对一的关系。
用户还是原先的 User,现在再定义一个用户组(在此,我把它叫作角色(Role))
DDL为:

/****角色表***/
create table roles(id integer not null auto_increment,name varchar(50) not null,
popedom integer default 1, /*权限大小*/ primary key(id) );
alter table users add constraint user_fk2 foreign key(role) references roles(id);


Role类是个很纯粹的 Bean,因为不需要从 Role 到 User关联。只修改User类的一点,Integer role 改为 Role role ,相应getter和setter也更改,然后在配置文件中再修改一点。原来 <property name="role" type="java.lang.Integer"><column name="role" /></property>

<many-to-one name="role" class="powerwind.bean.Role">
            <column name="role" />
      </many-to-one>

原来它和 Info 的关联一点也不影响。
现在突然想起,要为用户加上发帖数量这个字段,就在 Info 中加上去,也没影响到其它的。

[ 本帖最后由 powerwind 于 2006-9-6 15:56 编辑 ]

powerwind 发表于 2006-9-6 19:29

发帖的文章之间应该是怎样的关系呢?我这样想:如果一篇文章是主题帖,它还会有回帖,这些帖子的关系就是一对多双向自关联。一个帖是主题就没有父帖,反之则有父帖,每个父帖有若干子帖。而文章和作者的关系也是一对多关系,如果我们不需要从作者去了解文章的信息,而只需要从文章中知道作者,就只要在 Article 类的配置文件中设置 many-to-one,而作者中不作任何设置。
mysql的DDL为:
create table articles(
id bigint not null auto_increment,title varchar(255) not null,content text,
pubTime timestamp not null,article_id bigint,author_id bigint not null,
borad_id bigint not null, /*该文章所在的版块,暂时没用到*/
primary key(id)
);
alter table articles add constraint article_fk foreign key(author_id) references users(id);
alter table articles add constraint article_fk2 foreign key(article_id) references articles(id);
Article.java

package powerwind.bean;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

public class Article implements java.io.Serializable {

        private Long id;

        private User user;

        private Article parent_article;

        private String title;

        private String content;

        private Date pubTime;

        private Long boradId;

        private Set<Article> child_articles = new HashSet<Article>(0);

        /** default constructor */
        public Article() {
        }

        /** minimal constructor */
        public Article(User user, String title, Long boradId) {
                this.user = user;
                this.title = title;
                this.boradId = boradId;
        }

        public Long getId() {
                return this.id;
        }

        private void setId(Long id) {
                this.id = id;
        }

        public User getUser() {
                return this.user;
        }

        public void setUser(User user) {
                this.user = user;
        }

        public String getTitle() {
                return this.title;
        }

        public void setTitle(String title) {
                this.title = title;
        }

        public String getContent() {
                return this.content;
        }

        public void setContent(String content) {
                this.content = content;
        }

        public Date getPubTime() {
                return this.pubTime;
        }

        public void setPubTime(Date pubTime) {
                this.pubTime = pubTime;
        }

        public Long getBoradId() {
                return this.boradId;
        }

        public void setBoradId(Long boradId) {
                this.boradId = boradId;
        }

        public Article getParent_article() {
                return parent_article;
        }

        public void setParent_article(Article parent_article) {
                if (this.parent_article != null)
                        parent_article.child_articles.remove(parent_article);
                this.parent_article = parent_article;
        }

        public Set<Article> getChild_articles() {
                return child_articles;
        }

        public void setChild_articles(Set<Article> child_articles) {
                // if(child_articles==null)throw new NullPointerException();
                this.child_articles = child_articles;
        }

//增加这个方法,方便添加子文章
        public void addChildArticle(Article a) {
                // if(this.parent_article!=null)throw Exception;
                if (a.getParent_article() != null)
                        a.getParent_article().getChild_articles().remove(a);
                this.child_articles.add(a);
                a.setParent_article(this);
        }
}


Article.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
        <class name="powerwind.bean.Article" table="articles"
                catalog="sampledb">
                <id name="id" type="java.lang.Long">
                        <column name="id" />
                        <generator class="native"></generator>
                </id>
                <many-to-one name="user" class="powerwind.bean.User"
                        cascade="save-update" fetch="select">
                        <column name="author_id" not-null="true" />
                </many-to-one>
                <many-to-one name="parent_article"
                        class="powerwind.bean.Article" fetch="select">
                        <column name="article_id" />
                </many-to-one>
                <property name="title" type="java.lang.String">
                        <column name="title" not-null="true" />
                </property>
                <property name="content" type="java.lang.String">
                        <column name="content" length="65535" />
                </property>
                <property name="pubTime" type="java.util.Date">
                        <column name="pubTime" length="19" />
                </property>
                <property name="boradId" type="java.lang.Long">
                        <column name="borad_id" not-null="true" />
                </property>

                <set name="child_articles" inverse="true">
                        <key>
                                <column name="article_id" />
                        </key>
                        <one-to-many class="powerwind.bean.Article" />
                </set>

        </class>
</hibernate-mapping>

powerwind 发表于 2006-9-6 22:45

最后添加版面类,为了简单,假设版面没有嵌套关系,只有外键对应用户(为该版主)。这样,一个最简易的BBS的数据设计完成了。我用几个关联的类去相互导航,发现是可行的。
暂时只做得如此简。

powerwind 发表于 2006-9-9 18:21

Hibernate 的持久化类和 DAO类都基本完成,才发觉自己对Struts框架的扩展不太了解.
现在只得重新学习一下Struts了.

powerwind 发表于 2006-9-23 23:31

JSP应用中配置Log4J

第一次真正使用Log4j.
首先是配置文件:
log4j.properties

log4j.rootLogger = DEBUG,INFO, A1, A2,A3
log4j.appender.A1 = org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout = org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern = %4p [%t] (%F:%L) - %m%n

log4j.appender.A2 = org.apache.log4j.RollingFileAppender
log4j.appender.A2.File =D:/Program Files/Tomcat 5.5/webapps/Course/log/course.log
log4j.appender.A2.MaxFileSize = 1KB
log4j.appender.A2.MaxBackupIndex = 3
log4j.appender.A2.layout = org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern = %d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n

log4j.appender.A3=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.A3.URL= jdbc:mysql://localhost:3306/log4jTest
log4j.appender.A3.driver= com.mysql.jdbc.Driver
log4j.appender.A3.user= root
log4j.appender.A3.password= 123456
log4j.appender.A3.layout = org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern = INSERT INTO log4j (createDate, thread, level, class, message) values(\'%d\', \'%t\', \'%-5p\', \'%c\', \'%m\')

然后是用个Servlet加配置.
Log4jInit.java

package powerwind.servlet;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

import javax.servlet.*;
import javax.servlet.http.*;

public class Log4jInit extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
        super.init(config);
        String prefix = getServletContext().getRealPath("/");
        String file = getInitParameter("log4j");
        System.out.println("init log4j...");
        if (file != null){
          PropertyConfigurator.configure(prefix+file);
        }else
        {
               PropertyConfigurator.configure(prefix+"log4j.properties");
        }
}
}

在Web.xml中设置

<servlet>
                <servlet-name>log4jInit</servlet-name>
                <servlet-class>powerwind.servlet.Log4jInit</servlet-class>
                <init-param>
                <param-name>log4j</param-name>
                <param-value>WEB-INF/classes/log4j.properties</param-value>
                </init-param>
                <load-on-startup>1</load-on-startup>
</servlet>

这样,在Servlet程序中只要像下面那样使用就可以了.

import org.apache.log4j.Logger;
......
static Logger logger = Logger.getLogger(LoginAction.class);
.....
logger.warn("Please input your password and name!");
.....


如果在JSP页面中,则应该使用 log 标签,下载 Log4j 的时候并没有一起打包的,所以要重新去下载回来.
<log:info>someone trying to login!</info:debug>

注:参加了一本书和Wool王以前的一个帖!

[ 本帖最后由 powerwind 于 2006-9-26 01:30 编辑 ]

powerwind 发表于 2006-9-24 19:24

使用欧莱礼的文件上传工具 cos-05Nov2002.zip,按照示例代码改写,两种方法都成功上传了文件.

使用: MultipartRequest multi =new MultipartRequest(request, dirName, 10*1024*1024,"GBK", new DefaultFileRenamePolicy()); 有自动更改文件名的功能.

如果使用: MultipartParser mp = new MultipartParser(request, 10*1024*1024); 遇到已有同名文件时就会覆盖它。

本来应该用第一种方法的,可我偏偏选了第二种方法。因为已经写了一大半,不想改,就自己实现自动更名的功能了。

除了这点,还有一个问题不可以不注意。因为用来上传文件的表单是这样的:
<form action="articleAction?action=add" enctype="multipart/form-data" method="post">
而我要做的并不是单单传文件,而是文章加附件的形式,所以要传文件和一般的文本字符。因为enctype="multipart/form-data" 使我不能用一平常的 getParameter()来取得参数。还好,这个上传组件有它自己的方法来取得参数。

        private void addActicle(HttpServletRequest request,
                        HttpServletResponse response) throws ServletException, IOException {
                HashMap<String, String> hm = new HashMap<String, String>(15);
                try {
                        MultipartParser mp = new MultipartParser(request, 2 * 1024 * 1024,
                                        true, true, "GBK"); // 2MB
                        Part part;
                        int i = 0;
                        while ((part = mp.readNextPart()) != null) {
                                String name = part.getName();
                                if (part.isParam()) {
                                        ParamPart paramPart = (ParamPart) part;
                                        String value = paramPart.getStringValue();
                                        if(value==null||value.length()<1)
                                        {
                                                logger.debug("parameter is not right");
                                                redirect(request, response, toPage, "请填写标题和内容");
                                                return;
                                        }
                                        hm.put(name, value);
                                } else if (part.isFile()) {
                                        FilePart filePart = (FilePart) part;
                                        String fileName = filePart.getFileName();
                                        if (fileName != null) {
                                                if (i>=2)break;
                                                hm.put(name, autoRenameFile(new File(dir, fileName)));
                                                long size = filePart
                                                                .writeTo(new File(dir, hm.get(name)));
                                        }
                                }
                        }
                } catch (IOException lEx) {
                        logger.error("error reading or saving file");
                }

                String title = hm.get("title");
。。。。。。



        private String autoRenameFile(final File file) {
                File f = file;
                String d = file.getAbsolutePath();
                int i = d.lastIndexOf(f.separator);
                int j = d.lastIndexOf(".");
                while (f.exists()) {
                        f = new File(d.substring(0, i) + d.substring(i, j)
                                        + new Random().nextInt() + d.substring(j, d.length()));
                }
                String str = f.getAbsolutePath();
                return str.substring(str.lastIndexOf(f.separator) + 1, str.length());
        }

[ 本帖最后由 powerwind 于 2006-9-25 00:16 编辑 ]

powerwind 发表于 2006-10-3 19:40

使用JMock对Servlet进行简单的测试

JMock在官方网址是:http://www.jmock.org

一个极简单的用于登录的Servlet

package powerwind;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class LoginServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
                checkUser(request);
    }

        public boolean checkUser(HttpServletRequest request)
        {
                String name = request.getParameter("name");
      String password = request.getParameter("password");
                if (name != null && password != null &&name.equals("powerwind")&&password.equals("123456"))
                {
                        System.out.println("成功登录");
                        return true;
                }
                else
                {
                        System.out.println("登录失败");
                        return false;
                }
        }
}

测试类

package powerwind;

import org.jmock.Mock;
import org.jmock.MockObjectTestCase;
import javax.servlet.http.*;

public class LoginServletMockTest extends MockObjectTestCase {

    public void testMockRequest1() {
      //构造Mock对象,参数必须是接口
      Mock mock = new Mock(HttpServletRequest.class);
      mock.expects(atLeastOnce())                       
                        .method("getParameter")       
                        .with(eq("name"))                       
                        .will(returnValue("powerwind"));
      mock.expects(atLeastOnce())
                        .method("getParameter")
                        .with(eq("password"))
                        .will(returnValue("123456"));
      //根据Mock对象获取一个HttpServletRequest对象的代理
      HttpServletRequest request = (HttpServletRequest) mock.proxy();
      assertEquals(true,new LoginServlet().checkUser(request));
    }
    public static void main(String[] args) {
      junit.textui.TestRunner.run(LoginServletMockTest.class);
    }
}


编译运行当然是用 ant 啦,要在相应路径放入所需的类包。
页: [1] 2
查看完整版本: 暑期JAVA学习笔记