暑期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 编辑 ]
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 编辑 ]
三,由 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源文件了。 ant 确实是一个很好的工具... 三(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。
四,有Spring和没有Spring的 IoC
四,有Spring和没有Spring的 IoC1、使用 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 编辑 ]
四,有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 编辑 ]
五、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 编辑 ] 昨晚用JBuilder2006 对一本 JBuilder2005的书学习……
可能是版本问题:JOptionPane.showMessageDialog(this,"hello!");
找不到JOptionPane
JAVABean (问题该怎么描述就不清楚了……016,我只是照书中说的实例做,没看原理……)
找不了 com.borland.dx.dataset.DataSet 类 JOptionPane 全名是:javax.swing.JOptionPane
com.borland.dx.dataset.DataSet 是JB 自带的东西,看看包的导入是否正确
六、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 编辑 ]
七、在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 在正则表达式方面应该还有很多功能的,正在摸索中。
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>
现在两个类是双向关联,但实际上好像单向就够用了。 一个用户属于某个用户组,一个用户组包括很多用户。这样看来,应该是一个多对一的关系。
用户还是原先的 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 编辑 ] 发帖的文章之间应该是怎样的关系呢?我这样想:如果一篇文章是主题帖,它还会有回帖,这些帖子的关系就是一对多双向自关联。一个帖是主题就没有父帖,反之则有父帖,每个父帖有若干子帖。而文章和作者的关系也是一对多关系,如果我们不需要从作者去了解文章的信息,而只需要从文章中知道作者,就只要在 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>
最后添加版面类,为了简单,假设版面没有嵌套关系,只有外键对应用户(为该版主)。这样,一个最简易的BBS的数据设计完成了。我用几个关联的类去相互导航,发现是可行的。
暂时只做得如此简。 Hibernate 的持久化类和 DAO类都基本完成,才发觉自己对Struts框架的扩展不太了解.
现在只得重新学习一下Struts了.
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 编辑 ] 使用欧莱礼的文件上传工具 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 编辑 ]
使用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