工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 6354|回复: 27

暑期JAVA学习笔记

[复制链接]
发表于 2006-8-13 12:56 | 显示全部楼层 |阅读模式
一,JAR基本用法示例
C:新建文件夹叫 Test ,然后新建 HelloWorld.java 文件,内容如下:

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

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

[ 本帖最后由 powerwind 于 2006-9-13 16:11 编辑 ]
发表于 2006-8-13 15:35 | 显示全部楼层

ant基本用法示例

二,ant基本用法示例

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

  1. <?xml version="1.0"?>
  2. <project name="A simple test" default="compile" basedir=".">
  3.   <property environment="env"/>
  4.   <property name="src.dir" value="${basedir}/src"/>
  5.   <property name="classes.dir" value="${basedir}/classes"/>
  6.   <path id="classpath">
  7.         <pathelement location="${classes.dir}"/>
  8.         <pathelement location="${basedir}"/>
  9.         <pathelement location="${env.CLASSPATH}"/>
  10.   </path>
  11.   <target name="init" >
  12.         <delete dir="${classes.dir}"/>
  13.     <mkdir dir="${classes.dir}"/>
  14.   </target>
  15.   <target name="compile" depends="init">
  16.     <javac srcdir="${src.dir}" destdir="${classes.dir}" includes="**/*.java">
  17.           <classpath refid="classpath"/>
  18.     </javac>
  19.   </target>
  20.   <target name="jar" depends="compile">
  21.     <jar jarfile="${classes.dir}/HelloWorld.jar" manifest="${src.dir}/helloworld.txt">
  22.                 <fileset dir="${classes.dir}" includes="**/*.class" />
  23.     </jar>
  24.   </target>
  25.   <target name="run">
  26.     <java classname="powerwind.HelloWorld" fork="yes" dir=".">
  27.       <classpath refid="classpath"/>
  28.     </java>
  29.   </target>
  30. </project>
复制代码

此时,输入命令 antant 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
  1. src.dir=${basedir}/src
  2. classes.dir=${basedir}/classes
复制代码


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

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

使用道具 举报

 楼主| 发表于 2006-8-13 19:10 | 显示全部楼层

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

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

文件结构图如下: 未命名.JPG

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

Student.hbm.xml

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

  4.   <class name="powerwind.Student" table="STUDENTS" >
  5.     <meta attribute="class-scope">public</meta>
  6.    
  7.     <id name="id" type="long" column="ID" >
  8.       <meta attribute="scope-set">protected</meta>
  9.       <generator class="native"/>
  10.     </id>

  11.     <property name="name" type="string" >
  12.       <meta attribute="use-in-tostring">true</meta>
  13.       <meta attribute="finder-method">findByName</meta>
  14.       <column name="NAME" length="15" not-null="true" unique="true" />
  15.     </property>
  16.       
  17.     <property name="age" type="int">
  18.       <meta attribute="field-description">How old is the student</meta>
  19.       <meta attribute="use-in-tostring">true</meta>
  20.       <column name="AGE" check="AGE>18" not-null="true"/>
  21.     </property>
  22.    
  23.     <property name="***" type="char" column="***"/>
  24.    
  25.     <property name="info" type="string">
  26.        <meta attribute="use-in-tostring">true</meta>
  27.        <column name="INFO" sql-type="text"/>
  28.     </property>
  29.        
  30.   </class>

  31. </hibernate-mapping>
复制代码

codegen.cfg.xml

  1. <codegen>
  2.     <generate renderer="net.sf.hibernate.tool.hbm2java.BasicRenderer"/>
  3.     <generate renderer="net.sf.hibernate.tool.hbm2java.FinderRenderer" suffix="Finder"  package="powerwind"/>
  4. </codegen>
复制代码

build.xml

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

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

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

  8.   <target name="hbm2java">
  9.     <taskdef name="hbm2java"
  10.            classname="net.sf.hibernate.tool.hbm2java.Hbm2JavaTask"
  11.            classpathref="class.path"/>
  12.     <hbm2java output="${source.root}" config="${source.root}/codegen.cfg.xml">
  13.       <fileset dir="${source.root}">
  14.         <include name="**/*.hbm.xml"/>
  15.       </fileset>
  16.     </hbm2java>
  17.   </target>

  18. </project>
复制代码


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

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

使用道具 举报

发表于 2006-8-13 19:51 | 显示全部楼层
ant 确实是一个很好的工具...
回复

使用道具 举报

 楼主| 发表于 2006-8-14 00:17 | 显示全部楼层
三(2),由 Hibernate 配置文件生成DDL

在前面的基础上,加上这个文件.
hibernate.properties
  1. hibernate.dialect=net.sf.hibernate.dialect.MySQLDialect
  2. hibernate.connection.driver_class=com.mysql.jdbc.Driver
  3. hibernate.connection.url=jdbc:mysql://localhost:3306/course
  4. hibernate.connection.username=root
  5. hibernate.connection.password=123456
  6. hibernate.show_sql=true
复制代码


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

  8. <target name="schema">
  9.         <taskdef name="schemaexport"
  10.                 classname="net.sf.hibernate.tool.hbm2ddl.SchemaExportTask"
  11.                 classpathref="class.path" />
  12.                 <schemaexport properties="${source.root}/hibernate.properties"
  13.                                           quiet="no" text="no" drop="no" output="${basedir}/student.sql" delimiter=";">
  14.                 <fileset dir="${source.root}" includes="**/*.hbm.xml"/>
  15.                 </schemaexport>
  16. </target>
复制代码

同时还要在原来的  path 元素加上 <pathelement location="${source.root}" />
这样,执行 ant compile后再执行 ant schema 就可能生成DDL文件了:

student.sql
  1. drop table if exists STUDENTS;
  2. create table STUDENTS (
  3.    ID bigint not null auto_increment,
  4.    NAME varchar(15) not null unique,
  5.    AGE integer not null check(AGE>18),
  6.    *** char(1),
  7.    INFO text,
  8.    primary key (ID)
  9. );
复制代码


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

使用道具 举报

发表于 2006-8-14 18:08 | 显示全部楼层

四,有Spring和没有Spring的 IoC

四,有Spring和没有Spring的 IoC

1、使用 Spring  的简单例子:

IHelloWorldService.java
  1. package powerwind;
  2. public interface IHelloWorldService
  3. {
  4.         public String getHello();
  5.         public void setHello(String hello);
  6. }
复制代码


HelloWorldService.java
  1. package powerwind;
  2. public class HelloWorldService implements IHelloWorldService
  3. {
  4.         private String hello;
  5.         public String getHello()
  6.         {
  7.                 return hello;
  8.         }
  9.         public void setHello(String hello)
  10.         {
  11.                 this.hello=hello;
  12.         }
  13. }
复制代码

HelloWorld.java
  1. package powerwind;
  2. import org.springframework.beans.factory.BeanFactory;
  3. import org.springframework.beans.factory.xml.XmlBeanFactory;
  4. import org.springframework.core.io.*;
  5. public class HelloWorld
  6. {
  7.         private IHelloWorldService iHelloWorld;
  8.         public HelloWorld()
  9.         {
  10.                 setService();
  11.         }
  12.         public void setService()
  13.         {
  14.                 Resource resource=new ClassPathResource("appcontext.xml");
  15.                 BeanFactory factory=new XmlBeanFactory(resource);
  16.                 iHelloWorld=(IHelloWorldService)factory.getBean("HelloWorld");
  17.         }
  18.         public IHelloWorldService getService()
  19.         {
  20.                 return iHelloWorld;
  21.         }
  22.         public static void main(String[]args)
  23.         {
  24.                 HelloWorld helloworld=new HelloWorld();
  25.                 System.out.println(helloworld.getService().getHello());
  26.         }
  27. }
复制代码

配置文件 appcontext.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
  3. <beans>
  4.         <bean id="HelloWorld" class="powerwind.HelloWorldService">
  5.                 <property name="hello">
  6.                         <value>Hello,World!This is from spring!</value>
  7.                 </property>
  8.         </bean>
  9. </beans>
复制代码


二,没有Spring的实现

修改 HelloWorld.java 文件
  1. package powerwind;

  2. import java.util.Properties;
  3. import java.io.IOException;
  4. import java.io.FileNotFoundException;
  5. import java.io.InputStream;

  6. public class HelloWorld
  7. {
  8.         private IHelloWorldService iHelloWorld;
  9.         public HelloWorld()
  10.         {
  11.                 setService();
  12.         }
  13.         public void setService()
  14.         {
  15.                 try
  16.                 {
  17.                         Properties p=new Properties();
  18.                         InputStream is=getClass().getClassLoader()
  19.                                 .getResourceAsStream("appcontext.properties");
  20.                         p.load(is);
  21.                         is.close();
  22.                         String cls=p.getProperty("HelloWorld");
  23.                         iHelloWorld=(IHelloWorldService)Class.forName(cls).newInstance();
  24.                         iHelloWorld.setHello(p.getProperty("hello"));
  25.                 }catch(Exception e)
  26.                 {
  27.                         System.out.println(e);
  28.                 }
  29.         }
  30.         public IHelloWorldService getService()
  31.         {
  32.                 return iHelloWorld;
  33.         }
  34.         public static void main(String[]args)
  35.         {
  36.                 HelloWorld helloworld=new HelloWorld();
  37.                 System.out.println(helloworld.getService().getHello());
  38.         }
  39.        
  40. }
复制代码

同时配置文件用 appcontext.properties
  1. HelloWorld=powerwind.HelloWorldService
  2. hello=Hello,World!This is not from spring!
复制代码


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

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

使用道具 举报

 楼主| 发表于 2006-8-14 23:00 | 显示全部楼层

四,有Spring和没有Spring的 IoC

四,有Spring和没有Spring的 AOP

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

IHelloWorldService.java
  1. package powerwind;public interface IHelloWorldService{public String getHello();public void setHello(String hello);}
复制代码

HelloWorldService.java
  1. package powerwind;
  2. public class HelloWorldService implements IHelloWorldService
  3. {
  4.         private String hello;
  5.         public String getHello()
  6.         {
  7.                 return hello;
  8.         }
  9.         public void setHello(String hello)
  10.         {
  11.                 this.hello=hello;
  12.         }
  13. }
复制代码

HelloWorld.java
  1. package powerwind;
  2. import org.springframework.beans.factory.BeanFactory;
  3. import org.springframework.beans.factory.xml.XmlBeanFactory;
  4. import org.springframework.core.io.*;

  5. public class HelloWorld
  6. {
  7.         private IHelloWorldService iHelloWorld;
  8.         public HelloWorld()
  9.         {
  10.                 setService();
  11.         }
  12.         public void setService()
  13.         {
  14.                 Resource resource=new ClassPathResource("appcontext.xml");
  15.                 BeanFactory factory=new XmlBeanFactory(resource);
  16.                 iHelloWorld=(IHelloWorldService)factory.getBean("IHelloWorld");
  17.         }
  18.         public IHelloWorldService getService()
  19.         {
  20.                 return iHelloWorld;
  21.         }
  22.         public static void main(String[]args)
  23.         {
  24.                 HelloWorld helloworld=new HelloWorld();
  25.                 System.out.println(helloworld.getService().getHello());
  26.         }
  27. }
复制代码

BeforeAdvice.java
  1. package powerwind;
  2. import org.springframework.aop.MethodBeforeAdvice;
  3. import java.lang.reflect.Method;

  4. public class BeforeAdvice implements MethodBeforeAdvice
  5. {
  6.         public void before(Method arg0,Object[]arg1,Object arg2)throws Throwable
  7.         {
  8.                 System.out.println("invoke before method ["+arg0+"]");
  9.         }
  10. }
复制代码

appcontext.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
  3. <beans>

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

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

  10.         <bean id="IHelloWorld" class="org.springframework.aop.framework.ProxyFactoryBean">
  11.         <property name="proxyInterfaces">
  12.                 <value>powerwind.IHelloWorldService</value>
  13.         </property>
  14.         <property name="target">
  15.                 <ref local="HelloWorld" />
  16.         </property>
  17.         <property name="interceptorNames">
  18.                 <list>
  19.                         <value>advice</value>
  20.                 </list>
  21.         </property>
  22.         </bean>

  23. </beans>
复制代码


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

  5. public class HelloWorldFactory implements InvocationHandler
  6. {
  7.         private Object proxyObj;

  8.         public Object getBean(String beanName)throws Exception
  9.         {
  10.                 Properties p=new Properties();
  11.                 InputStream is=getClass().getClassLoader()
  12.                                 .getResourceAsStream("appcontext.properties");
  13.                 p.load(is);
  14.                 is.close();
  15.                 proxyObj=Class.forName(p.getProperty(beanName)).newInstance();

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

  20.         public Object invoke(Object obj,Method method,Object[]args)throws Throwable
  21.         {
  22.                 System.out.println("invoke before method ["+method+"]");
  23.                 if(args!=null)
  24.                 {
  25.                         for(int i=0;i<args.length;i++)
  26.                         {
  27.                                 System.out.println(args[i]+"");
  28.                         }
  29.                 }
  30.                 return method.invoke(proxyObj,args);
  31.         }
  32. }
复制代码

HelloWorld.java

  1. package powerwind;
  2. public class HelloWorld
  3. {
  4.         private IHelloWorldService iHelloWorld;
  5.         public HelloWorld()
  6.         {
  7.                 setService();
  8.         }
  9.         public void setService()
  10.         {
  11.                 try
  12.                 {
  13.                         iHelloWorld=(IHelloWorldService)new HelloWorldFactory()
  14.                                 .getBean("IHelloWorld");
  15.                 }catch(Exception e)
  16.                 {
  17.                         System.out.println(e);
  18.                 }
  19.                
  20.         }
  21.         public IHelloWorldService getService()
  22.         {
  23.                 return iHelloWorld;
  24.         }
  25.         public static void main(String[]args)
  26.         {
  27.                 HelloWorld helloworld=new HelloWorld();
  28.                 System.out.println(helloworld.getService().getHello());
  29.         }
  30. }
复制代码

配置文件 appcontext.properties

  1. IHelloWorld=powerwind.HelloWorldService
复制代码

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

使用道具 举报

 楼主| 发表于 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 编辑 ]
回复

使用道具 举报

发表于 2006-8-16 13:12 | 显示全部楼层
昨晚用JBuilder2006 对一本 JBuilder2005的书学习……

可能是版本问题:
  1. JOptionPane.showMessageDialog(this,"hello!");
复制代码

找不到JOptionPane

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

使用道具 举报

 楼主| 发表于 2006-8-16 13:17 | 显示全部楼层
JOptionPane 全名是:javax.swing.JOptionPane
com.borland.dx.dataset.DataSet 是JB 自带的东西,看看包的导入是否正确
回复

使用道具 举报

 楼主| 发表于 2006-8-22 16:55 | 显示全部楼层

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

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

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

1、在 web.xml 中配置

  1. <jsp-property-group>
  2.      <url-pattern>/pages/*</url-pattern>
  3.      <el-ignore>false</el-ignore>
  4.     <page-encoding>GB2312</page-encoding>
  5.     <include-prelude>/include/header.jspf</include-prelude>
  6.     <include-coda>/include/copyright.jspf</include-coda>
  7. </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 包含文件要好。


  1. <filter>
  2.         <filter-name>setCharacterEncoding</filter-name>
  3.         <filter-class>powerwind.filter.SetCharacterEncodingFilter</filter-class>
  4.         <init-param>
  5.                 <param-name>encoding</param-name>
  6.                 <param-value>GB2312</param-value>
  7.         </init-param>
  8. </filter>

  9. <filter-mapping>
  10.         <filter-name>setCharacterEncoding</filter-name>
  11.         <url-pattern>/pages/*</url-pattern>
  12. </filter-mapping>
复制代码

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

2、使用JSTL
个人比较喜欢JSTL的I18N标签厍。
  1. <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
  2. <fmt:setBundle basename="BookStore"  />
  3. <fmt:message key="login.title" />
复制代码

只要这样使用,所谓的国际化也不过如此。

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

使用道具 举报

 楼主| 发表于 2006-8-26 22:31 | 显示全部楼层

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

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

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

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

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

使用道具 举报

 楼主| 发表于 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
两个持久化类都只是一些gettersetter,主要是配置文件。
Info.hbm.xml

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

  4. <hibernate-mapping>
  5.         <class name="powerwind.bean.Info" table="info" catalog="sampledb">
  6.                 <id name="id" type="java.lang.Long">
  7.                         <generator class="foreign">
  8.                         <param name="property">user</param>
  9.                         </generator>
  10.                 </id>
  11.                 <property name="honor" type="java.lang.String">
  12.                         <column name="honor" length="20" />
  13.                 </property>
  14.                 <property name="iconUrl" type="java.lang.String">
  15.                         <column name="icon_url" length="50" />
  16.                 </property>
  17.                 <property name="personality" type="java.lang.String">
  18.                         <column name="personality" />
  19.                 </property>
  20.                 <one-to-one name="user" class="powerwind.bean.User"
  21.                         constrained="true"/>
  22.         </class>
  23. </hibernate-mapping>
复制代码

User.hbm.xml

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

  4. <hibernate-mapping>
  5.     <class name="powerwind.bean.User" table="users" catalog="sampledb">
  6.         <id name="id" type="java.lang.Long">
  7.             <column name="id" />
  8.             <generator class="native"></generator>
  9.         </id>
  10.         <property name="name" type="java.lang.String">
  11.             <column name="name" length="20" not-null="true" unique="true" />
  12.         </property>
  13.         <property name="password" type="java.lang.String">
  14.             <column name="password" length="35" not-null="true" />
  15.         </property>
  16.         <property name="regTime" type="java.util.Date">
  17.             <column name="regTime" length="19" />
  18.         </property>
  19.         <property name="role" type="java.lang.Integer">
  20.             <column name="role" />
  21.         </property>
  22.             <one-to-one name="info" class="powerwind.bean.Info" cascade="all"/>
  23.     </class>
  24. </hibernate-mapping>
复制代码

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

使用道具 举报

 楼主| 发表于 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>

  1. <many-to-one name="role" class="powerwind.bean.Role">
  2.             <column name="role" />
  3.         </many-to-one>
复制代码

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

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

使用道具 举报

 楼主| 发表于 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

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

  4. <hibernate-mapping>
  5.         <class name="powerwind.bean.Article" table="articles"
  6.                 catalog="sampledb">
  7.                 <id name="id" type="java.lang.Long">
  8.                         <column name="id" />
  9.                         <generator class="native"></generator>
  10.                 </id>
  11.                 <many-to-one name="user" class="powerwind.bean.User"
  12.                         cascade="save-update" fetch="select">
  13.                         <column name="author_id" not-null="true" />
  14.                 </many-to-one>
  15.                 <many-to-one name="parent_article"
  16.                         class="powerwind.bean.Article" fetch="select">
  17.                         <column name="article_id" />
  18.                 </many-to-one>
  19.                 <property name="title" type="java.lang.String">
  20.                         <column name="title" not-null="true" />
  21.                 </property>
  22.                 <property name="content" type="java.lang.String">
  23.                         <column name="content" length="65535" />
  24.                 </property>
  25.                 <property name="pubTime" type="java.util.Date">
  26.                         <column name="pubTime" length="19" />
  27.                 </property>
  28.                 <property name="boradId" type="java.lang.Long">
  29.                         <column name="borad_id" not-null="true" />
  30.                 </property>

  31.                 <set name="child_articles" inverse="true">
  32.                         <key>
  33.                                 <column name="article_id" />
  34.                         </key>
  35.                         <one-to-many class="powerwind.bean.Article" />
  36.                 </set>

  37.         </class>
  38. </hibernate-mapping>
复制代码
回复

使用道具 举报

 楼主| 发表于 2006-9-6 22:45 | 显示全部楼层
最后添加版面类,为了简单,假设版面没有嵌套关系,只有外键对应用户(为该版主)。这样,一个最简易的BBS的数据设计完成了。我用几个关联的类去相互导航,发现是可行的。
暂时只做得如此简。
回复

使用道具 举报

 楼主| 发表于 2006-9-9 18:21 | 显示全部楼层
Hibernate 的持久化类和 DAO类都基本完成,才发觉自己对Struts框架的扩展不太了解.
现在只得重新学习一下Struts了.
回复

使用道具 举报

 楼主| 发表于 2006-9-23 23:31 | 显示全部楼层

JSP应用中配置Log4J

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

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

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

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

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

  1. package powerwind.servlet;

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

  4. import javax.servlet.*;
  5. import javax.servlet.http.*;

  6. public class Log4jInit extends HttpServlet {
  7. public void init(ServletConfig config) throws ServletException {
  8.         super.init(config);
  9.         String prefix = getServletContext().getRealPath("/");
  10.         String file = getInitParameter("log4j");
  11.         System.out.println("init log4j...");
  12.         if (file != null){
  13.           PropertyConfigurator.configure(prefix+file);
  14.         }else
  15.         {
  16.                  PropertyConfigurator.configure(prefix+"log4j.properties");
  17.         }
  18. }
  19. }
复制代码

在Web.xml中设置

  1. <servlet>
  2.                 <servlet-name>log4jInit</servlet-name>
  3.                 <servlet-class>powerwind.servlet.Log4jInit</servlet-class>
  4.                 <init-param>
  5.                 <param-name>log4j</param-name>
  6.                 <param-value>WEB-INF/classes/log4j.properties</param-value>
  7.                 </init-param>
  8.                 <load-on-startup>1</load-on-startup>
  9. </servlet>
复制代码

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

  1. import org.apache.log4j.Logger;
  2. ......
  3. static Logger logger = Logger.getLogger(LoginAction.class);
  4. .....
  5. logger.warn("Please input your password and name!");
  6. .....
复制代码


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

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

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

使用道具 举报

 楼主| 发表于 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");
。。。。。。

  1.         private String autoRenameFile(final File file) {
  2.                 File f = file;
  3.                 String d = file.getAbsolutePath();
  4.                 int i = d.lastIndexOf(f.separator);
  5.                 int j = d.lastIndexOf(".");
  6.                 while (f.exists()) {
  7.                         f = new File(d.substring(0, i) + d.substring(i, j)
  8.                                         + new Random().nextInt() + d.substring(j, d.length()));
  9.                 }
  10.                 String str = f.getAbsolutePath();
  11.                 return str.substring(str.lastIndexOf(f.separator) + 1, str.length());
  12.         }
复制代码

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

使用道具 举报

 楼主| 发表于 2006-10-3 19:40 | 显示全部楼层

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

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

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

  1. package powerwind;

  2. import java.io.*;
  3. import javax.servlet.*;
  4. import javax.servlet.http.*;

  5. public class LoginServlet extends HttpServlet {

  6.     public void doGet(HttpServletRequest request, HttpServletResponse response)
  7.             throws ServletException, IOException {
  8.                 checkUser(request);
  9.     }

  10.         public boolean checkUser(HttpServletRequest request)
  11.         {
  12.                 String name = request.getParameter("name");
  13.         String password = request.getParameter("password");
  14.                 if (name != null && password != null &&name.equals("powerwind")&&password.equals("123456"))
  15.                 {
  16.                         System.out.println("成功登录");
  17.                         return true;
  18.                 }
  19.                 else
  20.                 {
  21.                         System.out.println("登录失败");
  22.                         return false;
  23.                 }
  24.         }
  25. }
复制代码


测试类

  1. package powerwind;

  2. import org.jmock.Mock;
  3. import org.jmock.MockObjectTestCase;
  4. import javax.servlet.http.*;

  5. public class LoginServletMockTest extends MockObjectTestCase {

  6.     public void testMockRequest1() {
  7.         //构造Mock对象,参数必须是接口
  8.         Mock mock = new Mock(HttpServletRequest.class);
  9.         mock.expects(atLeastOnce())                       
  10.                         .method("getParameter")       
  11.                         .with(eq("name"))                       
  12.                         .will(returnValue("powerwind"));
  13.         mock.expects(atLeastOnce())
  14.                         .method("getParameter")
  15.                         .with(eq("password"))
  16.                         .will(returnValue("123456"));
  17.         //根据Mock对象获取一个HttpServletRequest对象的代理
  18.         HttpServletRequest request = (HttpServletRequest) mock.proxy();
  19.         assertEquals(true,new LoginServlet().checkUser(request));
  20.     }
  21.     public static void main(String[] args) {
  22.         junit.textui.TestRunner.run(LoginServletMockTest.class);
  23.     }
  24. }
复制代码


编译运行当然是用 ant 啦,要在相应路径放入所需的类包。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-8-30 04:32

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表