2005年12月4日
#
- 基本包的安装
sudo apt-get install tetex-base tetex-bin tetex-extra
- CJK包安装
sudo apt-get install latex-cjk-chinese
- CJK UTF8字体生成
将下面的code复制到文件cvtfont.sh中:
#!/bin/sh#
# Origin By Edward G.J. Lee 2001.11.25
# http://www.study-area.org/tips/latex/pdftex.html
# This code is Public Domain.
#
# Enhanced by intron@intron.ac, 2006.1.9
# Modified for NetBSD by jungle@soforge.com, 2006.1.14
# Italic support added by robert.zhangle@gmail.com, 2006.5.19
#
if [ $# -ne 3 ]
then
cat << EOF
Usage: `basename $0` font.ttf <TeX_Internal_Font_Name> <Tex_Font_Name>
<TeX_Internal_Font_Name>: Used to name *.enc, *.afm, *.pfb, *.tfm & *.map
<Tex_Font_Name>: Used in TeX source: \\CJKencfamily{UTF8}{Tex_Font_Name}
An example: `basename $0` gbsn00lp.ttf gbsn00lp songpt1
EOF
exit 1
fi
if ! which ttf2pt1; then
echo "Please install pkgsrc fonts/ttf2pt1 before you can run me."
exit 1
fi
if ! which t1asm; then
echo "Please install pkgsrc fonts/t1utils before you can run me."
exit 1
fi
if ! which extconv; then
echo "Please install pkgsrc chinese/CJK before you can run me."
exit 1
fi
cat <<EOF
***************************************************************************
* Please confirm that current working directory is EMPTY except scripts *
* and HAS ENOUGH SPACE to contain so many intermediate files. *
* If it is not empty, this script may DAMAGE INNOCENT FILES!!! *
***************************************************************************
EOF
read -p "Go ahead?[n]" a
if [ "$a" != "y" ] && [ "$a" != "Y" ]; then
exit 0
fi
FONTFILENAME="$1"
FONTNAME="$2"
FONTTEXNAME="$3"
#TEXMFHOME=`kpsexpand '$TEXMFHOME'`
TEXMFMAIN=`kpsexpand '$TEXMFMAIN'`
TEXMFHOME='/usr/share/texmf-tetex/'
TTFONTFILEDIR=${TEXMFHOME}/fonts/truetype/chinese/
ENCDIR=${TEXMFHOME}/fonts/enc/dvips/chinese/${FONTNAME}
AFMDIR=${TEXMFHOME}/fonts/afm/chinese/${FONTNAME}
TFMDIR=${TEXMFHOME}/fonts/tfm/chinese/${FONTNAME}
PFBDIR=${TEXMFHOME}/fonts/type1/chinese/${FONTNAME}
MAPDIR=${TEXMFHOME}/fonts/map/dvips/chinese
UPDMAPCFG=${TEXMFHOME}/web2c/updmap.cfg
if [ ! -f $UPDMAPCFG ]
then
SYSUPDMAPCFG=`kpsewhich -format 'web2c files' updmap.cfg`
cp $SYSUPDMAPCFG $UPDMAPCFG
fi
CIDXMAP=${TEXMFHOME}/dvipdfm/config/cid-x.map
if [ ! -f $CIDXMAP ]
then
touch $CIDXMAP
fi
CJKDIR=${TEXMFMAIN}/tex/latex/CJK/UTF8
INSTALLDIRMODE="-m 0755"
INSTALLMODE="-m 0644"
FONTFILEBASENAME=`basename "$FONTFILENAME"`
FDNAME=c70${FONTTEXNAME}.fd
#MAPFILE=/usr/local/share/ttf2pt1/maps/cugb.map
PLANENUM=255
# Initialize ${FONTNAME}.map
echo -n "" > ${FONTNAME}.map
n=0
echo "Generating subfonts from plane $n to plane $PLANENUM ..."
while [ $n -le $PLANENUM ]
do
m=`printf %02x $n`
echo -n "[$n]"
SUBFONTNAME=${FONTNAME}${m}
# Generate *.t1a *.afm *.enc
ttf2pt1 -GAE -pft -OHUBs -W0 -l plane+pid=3,eid=1,0x$m \\
"$FONTFILENAME" ${SUBFONTNAME}
# avoid dvips(k)(before v5.86) t1part module bug.
perl -pi -e 's/_/Z/g' ${SUBFONTNAME}.t1a ${SUBFONTNAME}.afm
# Generate *.pfb
t1asm -b ${SUBFONTNAME}.t1a > ${SUBFONTNAME}.pfb 2>/dev/null
# Generate *.tfm
afm2tfm ${FONTNAME}$m.afm ${FONTNAME}$m.tfm >/dev/null
afm2tfm ${FONTNAME}$m.afm -s .167 ${FONTNAME}sl$m.tfm >/dev/null
# Generate ${FONTNAME}.map
AFMNAME=`grep -m 1 -i fontname ${SUBFONTNAME}.afm | cut -d ' ' -f 2`
echo "${FONTNAME}$m ${AFMNAME} <${FONTNAME}$m.pfb" >> ${FONTNAME}.map
echo "${FONTNAME}sl$m ${AFMNAME} \\" .167 SlantFont \\" <${FONTNAME}$m.pfb" \\
>> ${FONTNAME}.map
n=`expr $n + 1`
done
echo
cat > ${FDNAME} << EOF
% This file is automatically generated by `basename $0`
\\\\def\\\\fileversion{0.0.1}
\\\\def\\\\filedate{`date +%Y/%m/%d`}
\\\\ProvidesFile{${FDNAME}}[\\\\filedate\\\\space\\\\fileversion]
\\\\DeclareFontFamily{C70}{${FONTTEXNAME}}{\\\\hyphenchar \\\\font\\\\m@ne}
\\\\DeclareFontShape{C70}{${FONTTEXNAME}}{m}{n}{<-> CJK * ${FONTNAME}}{}
\\\\DeclareFontShape{C70}{${FONTTEXNAME}}{bx}{n}{<-> CJKb * ${FONTNAME}}{\\\\CJKbold}
\\\\DeclareFontShape{C70}{${FONTTEXNAME}}{m}{it}{<-> CJK * ${FONTNAME}sl}{}
\\\\DeclareFontShape{C70}{${FONTTEXNAME}}{bx}{it}{<-> CJKb * ${FONTNAME}sl}{\\\\CJKbold}
\\\\DeclareFontShape{C70}{${FONTTEXNAME}}{m}{sl}{<-> CJK * ${FONTNAME}sl}{}
\\\\DeclareFontShape{C70}{${FONTTEXNAME}}{bx}{sl}{<-> CJKb * ${FONTNAME}sl}{\\\\CJKbold}
\\\\endinput
EOF
#exit 0;
echo
echo "Installing ..."
install -d $INSTALLDIRMODE $TTFONTFILEDIR $ENCDIR $AFMDIR $TFMDIR $PFBDIR $MAPDIR $CJKDIR
install $INSTALLMODE $FONTFILENAME $TTFONTFILEDIR
n=0
while [ $n -le $PLANENUM ]
do
m=`printf %02x $n`
echo -n "[$n]"
install $INSTALLMODE ${FONTNAME}${m}.enc $ENCDIR
install $INSTALLMODE ${FONTNAME}${m}.afm $AFMDIR
install $INSTALLMODE ${FONTNAME}${m}.tfm $TFMDIR
install $INSTALLMODE ${FONTNAME}sl${m}.tfm $TFMDIR
install $INSTALLMODE ${FONTNAME}${m}.pfb $PFBDIR
n=`expr $n + 1`
done
echo
install $INSTALLMODE ${FONTNAME}.map $MAPDIR
install $INSTALLMODE $FDNAME $CJKDIR
echo >> $UPDMAPCFG
echo "Map ${FONTNAME}.map" >> $UPDMAPCFG
# update cid-x.map
echo "${FONTNAME}@Unicode@ unicode :0:${FONTFILENAME}" >> $CIDXMAP
echo "${FONTNAME}sl@Unicode@ unicode :0:${FONTFILENAME}" >> $CIDXMAP
mktexlsr
#updmap-sys
updmap
read -p "Do you want remove all intermediate files?[n]" a
if [ "$a" = "y" ] || [ "$a" = "Y" ]; then
n=0
while [ $n -le $PLANENUM ]
do
m=`printf %02x $n`
echo -n "[$n]"
rm -f ${FONTNAME}${m}.enc ${FONTNAME}${m}.afm ${FONTNAME}${m}.t1a \\
${FONTNAME}${m}.pfb ${FONTNAME}sl${m}.tfm ${FONTNAME}${m}.tfm
n=`expr $n + 1`
done
echo
rm -fv $FDNAME ${FONTNAME}.map
fi
echo
echo "OK, all done. :-)"
echo
根据自己的需要可以将TEXMFHOME目录设置成不同的地方,只要Latex能找到即可
我将该目录改为了/usr/share/texmf-tetex,如果相应的目录不存在,则需要自己新建。
将windows系统中的字体文件拷到脚本所在目录执行脚本即可生成Latex所需字体文件,以simhei.ttf为例:
sudo ./cvtfont.sh simhei.ttf simhei simhei
摘要: 很久没有看Java相关的东西了,这几天才发现Struts2 已经发布了,以前就听说Struts2就是以前的Webwork2,只是作了少许的改动而已,我以前也没看过Webwork,所以赶紧下来试了一把。Struts2的地址:http://struts.apache.org/2.x在Eclipse中新建了一个Tomcat工程(如果用WTP插件的话Dynamic Web工程)struts2Test,以下...
阅读全文
前几天按照Ubuntu How-To上的NVIDIA驱动安装说明安装了8672版的驱动,结果发现只要退出X-Window,系统就会没有反应,网上搜了搜,发现有人也有一样的情况,按照说明重新安装、重新配置Xorg,问题依然没有解决,X-Window也起不来了。
到NVIDIA网站上下了最新的8774版驱动后,赶紧找找看怎么自己装,有人已经写好了
在恢复模式下:
需要gcc支持,如果没有安装则:
apt-get install build-essential gcc
删除已经安装的NVIDIA驱动:
apt-get --purge remove linux-restricted-modules-`uname -r` linux-restricted-modules-common nvidia-glx nvidia-settings nvidia-kernel-common
安装内核headers
apt-get install linux-headers-`uname -r`
将下载下来的NVIDIA-Linux-x86-1.0-8774-pkg1.run解压缩:
sh ./NVIDIA-Linux-x86-1.0-8774-pkg1.run --extract-only
进入解压后的NVIDIA-Linux-x86-1.0-8774-pkg1文件夹,执行安装:
./nvidia-installer -n --x-prefix=/usr/lib/xorg/
最后由于默认安装到了/usr/lib/xorg/lig/xorg,需要将文件拷到对应的目录下:
cp --no-dereference /usr/lib/xorg/lib/xorg/libX* /usr/lib/xorg/modules/
cp /usr/lib/xorg/lib/xorg/modules/drivers/* /usr/lib/xorg/modules/drivers/
cp --no-dereference /usr/lib/xorg/lib/xorg/modules/extensions/* /usr/lib/xorg/modules/extensions/
前天刚装了个Qt4for windows,发现安装的时候MySQL等数据库插件都没有安装,像Qt X11版一样,都需要自己安装这些插件。
在Qt的安装目录C:\Qt4.1.2\下,有个src目录,进入plugins\sqldrivers\mysql,可以看到两个文件,main.cpp和mysql.pro,很显然要用qmake来完成编译、生成目标。
编译前,首先保证依赖的MySQL头文件和库文件正确。首先MySQL安装目录下的include中的所有文件拷到qmake时能找到的目录下,接着从lib/opt目录下拷出libmysql.a,其实lib/opt下只有libmysql.lib和libmysql.dll,从网上搜了一下找到一个方法从libmysql.dll生成libmysql.a:
1 、安装好MySQL (如果不愿意安装,找个libmySQL.dll文件也可以)
2、下载Pexports工具
3、转换操作: pexports libmysql.dll > libmysql.def
4、使用MinGW的 dlltool转换成为libmysql.a文件。dlltool --input-def libmysql.def --dllname libmysql.dll --output-lib libmysql.a -k
5、尝试是否成功:
将生成的libmysql.a 拷到qmake的lib搜索路径下后在plugins\sqldrivers\mysql目录下做:
qmake -project
qmake
make
如果再出现象mysql_connect@xx (xx是数字)的错误提示。就执行第6步。
6、修改libmysql.def文件,给mysql_connect加上@xx,即mysql_connect@xx
7、重做第4步
8、然后尝试第5步,如果还是出现错误提示。就作第6步。一直到没有错误为止。
最后C:\Qt4.1.2\plugins\sqldrivers下将会生成需要的libqsqlmysql.a和qsqlmysql.dll。
找了一个测试文件,通过。
#include <QtSql>
#include <QtGui>
bool createConnection(){
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("test");
db.setUserName("test");
db.setPassword("");
if(!db.open()){
QMessageBox::critical(0, QObject::tr("Database Error"),
db.lastError().text());
return false;
}
QSqlQuery query;
//query.exec("insert into book values( 3, 'title', 'author') ");
query.exec("select title , author from book ");
while (query.next()) {
QString title = query.value(0).toString();
QString author = query.value(1).toString();
QMessageBox::critical(0, title,author);
}
return true;
}
int main(int argc,char** argv){
QApplication app(argc, argv);
if (!createConnection()){
return 1;
}
return app.exec();
}
摘要: 一直想做一个 EJB3.0 结合 Struts 的例子,前天刚好从网上找到了一个相关的 Tutorial ,于是小试了一把,虽然只是完成了 Tutorial 上的一小点功能,但是感觉还是有必要写下来,免得以后还要再去看别人的Tutorial 。
开发环境: Eclipse3.2 + WTP1.5 , JBoss 4.0.3SP1 , jboss-EJB-3.0_RC...
阅读全文
SSH(Spring + Struts + Hibernate)小试 之三
前面通过PlugIn我们实现了Spring Context的加载,不过仅仅加载Context并没有什么实际
意义,我们还需要修改配置,将Struts Action交给Spring容器进行管理。下面将通过一个Regsit
实例加以说明。
首先准备好regist.jsp和login.jsp,在regist.jsp中 的form有name,password,password2,email域。
在struts-config.xml中添加配置:
<form-bean name="registForm" type="com.lzy.forum.form.RegistForm" />
<action path="/regist" name="registForm"
type="org.springframework.web.struts.DelegatingActionProxy"
validate="true" input="/regist.jsp" scope="request">
<forward name="failure" path="/regist.jsp" />
<forward name="success" path="/login.jsp" />
</action>
RegistForm,RegistAction按照原来Struts的方法去写,我在RegistAction中加入了一个UserDAO对象
userDAO,这个对象由Spring注入。
<bean name="/regist" class="com.lzy.forum.action.RegistAction"
singleton="false">
<property name="userDAO">
<ref local="userDAO" />
</property>
</bean>
基本上SSH的架构已经完成,经确认后可以自己测试一下了。(完)
Spring和Struts结合有几种方法,我选了最常用的PlugIn方式,在struts-config.xml中加入
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/action-servlet.xml" />
</plug-in>
WEB-INF目录下的action-servlet.xml就是Spring的配置文件,下面给出的是整个的action-servlet.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
//Data Source
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/forum</value>
</property>
<property name="username">
<value>test</value>
</property>
<property name="password">
<null />
</property>
</bean>
// For Hibernate
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource" />
</property>
<property name="mappingResources">
<list>
<value>com/lzy/forum/domain/User.hbm.xml</value>
<value>com/lzy/forum/domain/Article.hbm.xml</value>
<value>com/lzy/forum/domain/Board.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
// For DAO
<bean id="userDAO"
class="com.lzy.forum.dao.impl.UserDAOHibernate">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="boardDAO"
class="com.lzy.forum.dao.impl.BoardDAOHibernate">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="articleDAO"
class="com.lzy.forum.dao.impl.ArticleDAOHibernate">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
//For Struts Action
<bean name="/regist" class="com.lzy.forum.action.RegistAction"
singleton="false">
<property name="userDAO">
<ref local="userDAO" />
</property>
</bean>
<bean name="/login" class="com.lzy.forum.action.LoginAction"
singleton="false">
<property name="userDAO">
<ref local="userDAO" />
</property>
</bean>
<bean name="/boardManage"
class="com.lzy.forum.action.BoardManageAction" singleton="false">
<property name="userDAO">
<ref local="userDAO" />
</property>
<property name="boardDAO">
<ref local="boardDAO" />
</property>
</bean>
<bean name="/boardNavigate"
class="com.lzy.forum.action.BoardNavigateAction" singleton="false">
<property name="boardDAO">
<ref local="boardDAO" />
</property>
</bean>
<bean name="/boardDisplay"
class="com.lzy.forum.action.BoardDisplayAction" singleton="false">
<property name="boardDAO">
<ref local="boardDAO" />
</property>
</bean>
<bean name="/articleManage"
class="com.lzy.forum.action.ArticleManageAction" singleton="false">
<property name="userDAO">
<ref local="userDAO" />
</property>
<property name="boardDAO">
<ref local="boardDAO" />
</property>
<property name="articleDAO">
<ref local="articleDAO" />
</property>
</bean>
</beans>
经过这样的配置之后,Hibernate事务交由Spring管理,sessionFactory从Spring容器获得。下面通过其中的一个DAO实例来看看这样做带来的方便。
//BoardDAO.java
package com.lzy.forum.dao;
import java.util.ArrayList;
import com.lzy.forum.domain.Board;
public interface BoardDAO {
public boolean isBoardExist(String name);
public void addBoard(Board board);
public void deleteBoard(Board board);
public Board loadBoard(int id);
public Board loadBoard(String name);
public Board loadBoardWithArticles(int id);
public ArrayList getRootBoardsList();
}
//BoardDAOHibernate.java
package com.lzy.forum.dao.impl;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;
import java.util.Set;
import org.hibernate.Hibernate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.lzy.forum.dao.BoardDAO;
import com.lzy.forum.domain.Board;
public class BoardDAOHibernate extends HibernateDaoSupport implements BoardDAO {
public void deleteBoard(Board board) {
// TODO Auto-generated method stub
this.getHibernateTemplate().delete(board);
}
public void addBoard(Board board) {
// TODO Auto-generated method stub
this.getHibernateTemplate().saveOrUpdate(board);
}
public boolean isBoardExist(String name) {
// TODO Auto-generated method stub
ArrayList list = (ArrayList) this.getHibernateTemplate().find(
"from Board where name = ? ", new Object[] { name });
if (list.size() > 0) {
// System.out.println("find it");
return true;
}
return false;
}
public Board loadBoard(int id) {
// TODO Auto-generated method stub
ArrayList list = (ArrayList) this.getHibernateTemplate().find(
"from Board where id = ? ", new Object[] { id });
Board b = null;
if (list.size() > 0) {
b = (Board) list.get(0);
}
return b;
}
public Board loadBoard(String name) {
// TODO Auto-generated method stub
ArrayList list = (ArrayList) this.getHibernateTemplate().find(
"from Board where name = ? ", new Object[] { name });
Board b = null;
if (list.size() > 0) {
b = (Board) list.get(0);
}
return b;
}
public ArrayList getRootBoardsList() {
// TODO Auto-generated method stub
ArrayList list = (ArrayList) this.getHibernateTemplate().find(
"from Board b left join fetch b.ChildBoards where b.Parent = null order by b.id");
System.out.println(list.size() + " root boards found ");
ListIterator index = list.listIterator();
while (index.hasNext()) {
Board s = (Board) index.next();
//this.getSession(true);
//Hibernate.initialize(s.getChildBoards());
///*
Set children = (Set) s.getChildBoards();
Iterator it = children.iterator();
while(it.hasNext()){
Board b = (Board)it.next();
//Hibernate.initialize(b);
System.out.println(b.getName());
}
//*/
//System.out.println(children.size() + "child(ren) found ");
//s.setChildBoards(s.getChildBoards());
}
return list;
}
public Board loadBoardWithArticles(int id) {
// TODO Auto-generated method stub
ArrayList list = (ArrayList) this.getHibernateTemplate().find(
"from Board b left join fetch b.Articles where b.Id = ? ", new Object[] { id });
Board b = null;
if (list.size() > 0) {
b = (Board) list.get(0);
}
return b;
}
}
BoardDAOHibernate继承 HibernateDaoSupport后,通过getHibernateTemplate()得到一个HibernateTemplate实例,然后执行CRUD操作,非常简单。需要注意的是,由于执行一次CRUD操作后,Hibernate session关闭,如果有使用延迟加载策略的对象没有加载,在后面的Web层很容易出现如下错误:
failed to lazily initialize a collection of role
从网上搜到的解决方法是Open Session In View,
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<!-- singleSession默认为true,若设为false则等于没用OpenSessionInView -->
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
我试了试,还是有一些问题,所以后来还是放弃了这种方法,所有在Web层中需要的对象都必须在Business层中加载完成。如下面的代码所示:
ArrayList list = (ArrayList) this.getHibernateTemplate().find(
"from Board b left join fetch b.Articles where b.Id = ? ", new Object[] { id });
这样Hibernate和Spring的结合也算完成了。其他的一些DAO类和实现代码我没有给出,但是大同小异,和Board的实现类似。
最后将是Struts 和Spring的结合,将在下一篇给出。(未完待续)
之前对Spring Struts Hibernate都稍有了解,Spring的IOC给我留下了很深的印象,容器管理的对象生成
方法极大地简化了程序逻辑,Spring也提供了用于Web的Spring MVC 框架,由于我感觉其易用性还是不及
Struts,所以我还是选择Struts作为前端WEB框架,Hibernate我一直没有在Web应用中试过,这次当然不会
错过机会了。
开发环境的塔建我就不多说了,具体可以参考我以前的几篇日志。
在Eclipse中新建一个动态Web工程,将Struts 、Spring、Hibernate需要的jar都添加到WEB-INF/lib目录下,
将Struts标签所需的tld文件、struts-config.xml文件(可以由StrutsIDE生成)添加到WEB-INF下,另外在
此目录下添加一个Spring的配置文件applicationContext.xml。
我参考的例子是夏昕的《深入浅出Hibernate》上的第6章,很好的一个论坛示例。
首先按照书上的ER模型,在数据库(MySQL)中建立相应的数据库。
create database forum;
use forum;
create table user(
id int not null auto_increment primary key,
name varchar(50),
pwd varchar(50),
email varchar(50)
)type=innodb;
create table board(
id int not null auto_increment primary key,
parent_id int,
create_by int not null,
name varchar(50) not null,
remark varchar(255),
create_time datetime,
index(parent_id),
index(create_by),
foreign key(parent_id) references board(id) on delete cascade,
foreign key(create_by) references user(id) on delete no action
)type=innodb;
create table article(
id int not null auto_increment primary key,
parent_id int ,
board_id int not null,
article_type int not null,
title varchar(255),
body text,
create_by int not null,
create_time datetime,
hits int unsigned,
bytes int unsigned,
last_update_by int not null,
last_update_time datetime,
index(parent_id),
index(board_id),
index(create_by),
index(last_update_by),
foreign key(parent_id) references article(id) on delete no action,
foreign key(board_id) references board(id) on delete cascade,
foreign key(create_by) references user(id) on delete no action,
foreign key(last_update_by) references user(id) on delete no action
)type=innodb;
之后,我选择了用Hibernate Sychonizer来生成映射文件和实体类,然后对生成的类进行修改(删掉了生成的Base类),
实际上Hibernate Sychonizer生成的映射文件也有错误,需要修改,我也是后来在使用中发现的。
//User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd
" >
<hibernate-mapping package="com.lzy.forum.domain">
<class
name="User"
table="user"
>
<id
name="Id"
type="integer"
column="id"
>
<generator class="native"/>
</id>
<property
name="Name"
column="name"
type="string"
not-null="false"
length="50"
/>
<property
name="Pwd"
column="pwd"
type="string"
not-null="false"
length="50"
/>
<property
name="Email"
column="email"
type="string"
not-null="false"
length="50"
/>
<set name="ArticlesByLastUpdateBy" inverse="true" lazy="true">
<key column="last_update_by"/>
<one-to-many class="Article"/>
</set>
<set name="ArticlesByCreateBy" inverse="true" lazy="true">
<key column="create_by"/>【这里的create_by是后来修改的,Hibernate Sychonizer生成的有错,后面有几处同样的错误】
<one-to-many class="Article"/>
</set>
<set name="Boards" inverse="true" lazy="true">
<key column="create_by"/>【这里的create_by是后来修改的】
<one-to-many class="Board"/>
</set>
</class>
</hibernate-mapping>
//User.java
package com.lzy.forum.domain;
public class User{
private static final long serialVersionUID = 1L;
// primary key
private java.lang.Integer id;
// fields
private java.lang.String name;
private java.lang.String pwd;
private java.lang.String email;
// collections
private java.util.Set<Article> articlesByLastUpdateBy;
private java.util.Set<Article> articlesByCreateBy;
private java.util.Set<Board> boards;
public java.util.Set<Article> getArticlesByCreateBy() {
return articlesByCreateBy;
}
public void setArticlesByCreateBy(java.util.Set<Article> articlesByCreateBy) {
this.articlesByCreateBy = articlesByCreateBy;
}
public java.util.Set<Article> getArticlesByLastUpdateBy() {
return articlesByLastUpdateBy;
}
public void setArticlesByLastUpdateBy(
java.util.Set<Article> articlesByLastUpdateBy) {
this.articlesByLastUpdateBy = articlesByLastUpdateBy;
}
public java.util.Set<Board> getBoards() {
return boards;
}
public void setBoards(java.util.Set<Board> boards) {
this.boards = boards;
}
public java.lang.String getEmail() {
return email;
}
public void setEmail(java.lang.String email) {
this.email = email;
}
public java.lang.Integer getId() {
return id;
}
public void setId(java.lang.Integer id) {
this.id = id;
}
public java.lang.String getName() {
return name;
}
public void setName(java.lang.String name) {
this.name = name;
}
public java.lang.String getPwd() {
return pwd;
}
public void setPwd(java.lang.String pwd) {
this.pwd = pwd;
}
}
//Board.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd
" >
<hibernate-mapping package="com.lzy.forum.domain">
<class
name="Board"
table="board"
>
<meta attribute="sync-DAO">false</meta>
<id
name="Id"
type="integer"
column="id"
>
<generator class="native"/>
</id>
<property
name="Name"
column="name"
type="string"
not-null="true"
length="50"
/>
<property
name="Remark"
column="remark"
type="string"
not-null="false"
length="255"
/>
<property
name="CreateTime"
column="create_time"
type="timestamp"
not-null="false"
length="19"
/>
<many-to-one
name="CreateBy"
column="create_by"
class="User"
not-null="true"
>
</many-to-one>
<many-to-one
name="Parent"
column="parent_id"
class="Board"
not-null="false"
lazy="false">
</many-to-one>
<set name="Articles" inverse="true" lazy="true" order-by="id">
<key column="board_id"/>【这里的board_id是后来修改的】
<one-to-many class="Article"/>
</set>
<set name="ChildBoards" inverse="true" lazy="true" order-by="id">
<key column="parent_id"/>【这里的parent_id是后来修改的】
<one-to-many class="Board"/>
</set>
</class>
</hibernate-mapping>
//Board.java
package com.lzy.forum.domain;
public class Board {
private static final long serialVersionUID = 1L;
// primary key
private java.lang.Integer id;
// fields
private java.lang.String name;
private java.lang.String remark;
private java.util.Date createTime;
// many to one
private com.lzy.forum.domain.User createBy;
private com.lzy.forum.domain.Board parent;
// collections
private java.util.Set<com.lzy.forum.domain.Article> articles;
private java.util.Set<com.lzy.forum.domain.Board> childBoards;
public java.util.Set<com.lzy.forum.domain.Article> getArticles() {
return articles;
}
public void setArticles(java.util.Set<com.lzy.forum.domain.Article> articles) {
this.articles = articles;
}
public java.util.Set<com.lzy.forum.domain.Board> getChildBoards() {
return childBoards;
}
public void setChildBoards(java.util.Set<com.lzy.forum.domain.Board> childBoards) {
this.childBoards = childBoards;
}
public com.lzy.forum.domain.User getCreateBy() {
return createBy;
}
public void setCreateBy(com.lzy.forum.domain.User createBy) {
this.createBy = createBy;
}
public java.util.Date getCreateTime() {
return createTime;
}
public void setCreateTime(java.util.Date createTime) {
this.createTime = createTime;
}
public java.lang.Integer getId() {
return id;
}
public void setId(java.lang.Integer id) {
this.id = id;
}
public java.lang.String getName() {
return name;
}
public void setName(java.lang.String name) {
this.name = name;
}
public com.lzy.forum.domain.Board getParent() {
return parent;
}
public void setParent(com.lzy.forum.domain.Board parent) {
this.parent = parent;
}
public java.lang.String getRemark() {
return remark;
}
public void setRemark(java.lang.String remark) {
this.remark = remark;
}
}
//Article.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd
" >
<hibernate-mapping package="com.lzy.forum.domain">
<class
name="Article"
table="article"
>
<meta attribute="sync-DAO">false</meta>
<id
name="Id"
type="integer"
column="id"
>
<generator class="native"/>
</id>
<property
name="ArticleType"
column="article_type"
type="integer"
not-null="true"
length="11"
/>
<property
name="Title"
column="title"
type="string"
not-null="false"
length="255"
/>
<property
name="Body"
column="body"
type="string"
not-null="false"
/>
<property
name="Hits"
column="hits"
type="integer"
not-null="false"
length="10"
/>
<property
name="Bytes"
column="bytes"
type="integer"
not-null="false"
length="10"
/>
<property
name="CreateTime"
column="create_time"
type="timestamp"
not-null="false"
length="19"
/>
<property
name="LastUpdateTime"
column="last_update_time"
type="timestamp"
not-null="false"
length="19"
/>
<many-to-one
name="LastUpdateBy"
column="last_update_by"
class="User"
not-null="true"
>
</many-to-one>
<many-to-one
name="CreateBy"
column="create_by"
class="User"
not-null="true"
>
</many-to-one>
<many-to-one
name="Parent"
column="parent_id"
class="Article"
not-null="false"
>
</many-to-one>
<many-to-one
name="Board"
column="board_id"
class="Board"
not-null="true"
>
</many-to-one>
<set name="Articles" inverse="true" lazy="false" order-by="id">
<key column="parent_id"/>【这里的parent_id是后来修改的】
<one-to-many class="Article"/>
</set>
</class>
</hibernate-mapping>
//Article.java
package com.lzy.forum.domain;
import java.util.Date;
public class Article {
private static final long serialVersionUID = 1L;
// primary key
private java.lang.Integer id;
// fields
private java.lang.Integer articleType;
private java.lang.String title;
private java.lang.String body;
private java.lang.Integer hits;
private java.lang.Integer bytes;
private java.util.Date lastUpdateTime;
private java.util.Date createTime;
// many to one
private com.lzy.forum.domain.User lastUpdateBy;
private com.lzy.forum.domain.User createBy;
private com.lzy.forum.domain.Article parent;
private com.lzy.forum.domain.Board board;
// collections
private java.util.Set<com.lzy.forum.domain.Article> articles;
public java.util.Set<com.lzy.forum.domain.Article> getArticles() {
return articles;
}
public void setArticles(java.util.Set<com.lzy.forum.domain.Article> articles) {
this.articles = articles;
}
public java.lang.Integer getArticleType() {
return articleType;
}
public void setArticleType(java.lang.Integer articleType) {
this.articleType = articleType;
}
public com.lzy.forum.domain.Board getBoard() {
return board;
}
public void setBoard(com.lzy.forum.domain.Board board) {
this.board = board;
}
public java.lang.String getBody() {
return body;
}
public void setBody(java.lang.String body) {
this.body = body;
}
public java.lang.Integer getBytes() {
return bytes;
}
public void setBytes(java.lang.Integer bytes) {
this.bytes = bytes;
}
public com.lzy.forum.domain.User getCreateBy() {
return createBy;
}
public void setCreateBy(com.lzy.forum.domain.User createBy) {
this.createBy = createBy;
}
public java.lang.Integer getHits() {
return hits;
}
public void setHits(java.lang.Integer hits) {
this.hits = hits;
}
public java.lang.Integer getId() {
return id;
}
public void setId(java.lang.Integer id) {
this.id = id;
}
public com.lzy.forum.domain.User getLastUpdateBy() {
return lastUpdateBy;
}
public void setLastUpdateBy(com.lzy.forum.domain.User lastUpdateBy) {
this.lastUpdateBy = lastUpdateBy;
}
public java.util.Date getLastUpdateTime() {
return lastUpdateTime;
}
public void setLastUpdateTime(java.util.Date lastUpdateTime) {
this.lastUpdateTime = lastUpdateTime;
}
public com.lzy.forum.domain.Article getParent() {
return parent;
}
public void setParent(com.lzy.forum.domain.Article parent) {
this.parent = parent;
}
public java.lang.String getTitle() {
return title;
}
public void setTitle(java.lang.String title) {
this.title = title;
}
public java.util.Date getCreateTime(){
return createTime;
}
public void setCreateTime(java.util.Date createTime) {
// TODO Auto-generated method stub
this.createTime = createTime;
}
}
接下来将会在web中加入Spring支持和为实体类提供DAO支持。(未完待续)
环境:
(1)安装Eclipse + CDT + MinGW
(2)安装QT for Windows
(3)安装QT plugin for Eclipse :org.eclipse.qt-1.0.2.zip,在Preference里设好相关路径。
新建一个 QT project,将hello。cpp复制到工程中:
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[]){
QApplication app(argc, argv);
QPushButton hello("Hello world!");
hello.resize(100, 30);
hello.show();
return app.exec();
}
build后生成Makefile,新建两个Make Target:all,clean
Make all 后发现找不到libQtCored4.a等文件,在QT的lib目录下找到相应的libQtCore4.a,复制后重命名为libQtCored4.a,
其他库文件类似,最后编译通过,运行后出现带hello按钮的窗口。
Eclipse + CDT + MinGW环境的搭建比较简单,由于机器内存不够大,我在preference里将C++的indexer都置为NO INDEXER。
安装MinGW后可以看到,在Include和Lib目录下有了与OpenGL相关的头文件和静态库。为了使用GLUT,我将glut.h放到了相应的
GL目录下,看到Lib目录下有libglut.a库文件,我没有将glut。lib放进去(后来发现libglut。a好像在windows不可用)。
新建一个Standtart Make C++ project,将原来可运行的OpenGL程序复制过来,写好Makefile,结果编译的时候还是出现错误。
还好找到了这个非常有用的网页:http://www.mingw.org/MinGWiki/index.php/Glut
按照上面列出的错误,我在每个#include<GL/glut.h>前都加上#define _STDCALL_SUPPORTED,然后又将glut32。lib、
opengl32.lib、glu32.lib都放到当前的工程目录下,用”glut32。lib opengl32.lib glu32.lib“ 代替原来的 ”-lglut -lopengl32 -lglu32",
最后终于编译通过。
摘要: 在EJB 3.0 学习笔记——准备工作中只是简单的搭好了EJB3.0开发的基本环境,之
后就可以开发最简单的Session Bean了,我感兴趣的还是Entity Bean,所以接下来
我想先试验一下Entity Bean。 一、在JBoss中配置好Data Source我使用的是MySQL数据库,所以首先将MySQL的JDBC驱动复制到jboss-4.0.3SP1\server\al...
阅读全文
Java Script
调用
java
可以在网页里使用
<script language=javascript>
document.applet_name.method_name();
</script>
可以对
applet
进行控制,也可以从
applet
返回值。
Java
调用
Java Script
需要导入
netscape.javascript.jsobject
这个类 (jre/lib/plugin.jar)
比如:
JSObject window=JSObject.getWindow(this);
JSObject window=(JSObject)window.getMember("document");
来获取对当前窗口的控制权。
当点击链接
MakeCall
时,会触发
Java Script
函数
function makeCall(s){
window.document.ctiApplet.testJavascript(s);
alert("call maked!");
}
在这个
Java Script
函数中,
ctiApplet
是一个
Applet
,这样完成了
java script
调用
Applet
。
以下是
ctiApplet
中的
testJavascript
函数和运行结果,其中又调用了
Java Script
。
public void testJavascript(String msg){
try {
// create JSObject
JSObject.getWindow (this).eval ("javascript:alert('Java Script in Applet!')") ;
}
catch (Exception ex) {
// Error on create JSObject
showStatus( "Error call javascript err=" + ex );
}
System.out.println(msg);
}
在开发EJB3.0 之前,首先应该去下载它的一个实现和一个相应的支持EJB3的服务器,我下载的是jboss-EJB-3.0_RC5-PFD和JBoss 4.0.3SP1 ,jboss-EJB-3.0_RC5-PFD里面有安装说明和一些不错的tutorial。
根据安装说明,JBoss 4.0.3SP1中的EJB3实现不是最新的,应用下载的jboss-EJB-3.0_RC5-PFD中的一些包去替换。
将jboss-EJB-3.0_RC5-PFD中lib目录下的
(1)ejb3.deployer/
(2)ejb3-clustered-sfsbcache-service.xml
(3)ejb3-interceptors-aop.xml
(4)jboss-aop-jdk50.deployer/
拷贝到jboss-4.0.3SP1/server/all/deploy目录下
将jboss-EJB-3.0_RC5-PFD中lib目录下的
(5)jboss-remoting.jar
(6)jboss-serialization.jar
(7)jboss-j2ee.jar
拷贝到jboss-4.0.3SP1/server/all/lib目录下
删除jboss-4.0.3SP1/server/all/lib 下的
(1)ejb3-persistence.jar
(2)hibernate3.jar
(3)hibernate-annotations.jar
(4)hibernate-entitymanager.jar
和jboss-4.0.3SP1/server/all/deploy下的
(5)jboss-aop.deployer/
到此EJB3 的运行环境准备好了,你可以用jboss-4.0.3SP1\bin\run -c all 测试JBoss是否能成功启动。
我用的IDE是Eclipse 3.2,JDK 1.5 ,为了方便在Eclipse中新建一个User Library:EJB3_JBoss,
将jboss-EJB-3.0_RC5-PFD\lib下的
jboss-j2ee.jar
和jboss-EJB-3.0_RC5-PFD\lib\ejb3.deployer下的
ejb3-persistence.jar
jboss-ejb3x.jar
jboss-ejb3.jar
jboss-annotations-ejb3.jar
hibernate3.jar
hibernate-annotations.jar
hibernate-entitymanager.jar
添加到EJB_JBoss中,现在环境基本上搭好了。
在FreeBSD 5.x中,kernel配置文件的设备名改为sound,不是FreeBSD 4.x中的pcm了,以后还有可能改为snd。
#cd /usr/src/sys/i386/conf/
#make LINT
可生成LINT文件,将kernel配置里的项全部列出了。
在kernel配置文件里加上
device sound
device snd_foo 或
device "snd_foo" <----注意这里foo表示不同的声卡种类,可参考LINT文件。
如果不知道你的声卡应该用哪一个,可以先用
#kldload snd_driver 将所有常用的声卡驱动装载,然后用
#cat /dev/sndstat 察看是否有相应的声卡信息,如:
FreeBSD Audio Driver (newpcm)
Installed devices:
pcm0: at io 0xd800, 0xdc80 irq 5 bufsz 16384
kld snd_ich (1p/2r/0v channels duplex default)
这里snd_inc就是对应的应该装载的设备。
注意如果对应的声卡种类中有数字,就应该加上引号。
这样重新编译内核就可以了。当然如果不编译内核,用load module的方式也可以。
那么我的问题是什么呢? 我用
#dmesg|grep pcm 能察看到声卡信息。
用 #cat /dev/sndstat 也能看到正确的声卡信息。
并且能够播放CD,但是使用xmms等软件播放mp3文件的时候,播放条根本不走。而后从dmesg可看到如下信息:
pcm0:play:0: play interrupt timeout, channel dead
经过Google查询,怀疑问题出在系统ICQ冲突上。最后,在启动FreeBSD 5.3时,选择了ACPI Disable,就能够正确地用xmms播放了。
最后补充以下,我的机器安装了两块网卡,一块SCSI卡。使用的是版载声卡。怎么解决在ACPI情况下使用还不清楚。但问题基本确定的确是ICQ资源的问题。
五一这几天没事闲的装了FreeBSD,时间可没少花,问题却还是不少,也许对系统还不是太熟悉吧.
1.USB鼠标的问题
第一次装的时候,测试鼠标的时候没动静,不知当时是不是鼠标没插好
只好用PS/2口了,后来编译了一遍内核,USB才能用.
然而最后一次装的时候,USB口可以用,但是startx进入KDE的时候总是失败,找不到什么Pointer,将鼠标插入
PS/2口后重启,上述现象又没了,感觉很是奇怪,进入kde后将鼠标插入USB口也正常.
2..xinitrc文件的问题
第一次装的时候是按照书上装的,当时把xinitrc文件复制过来
cp /usr/X11R6/lib/X11/xinitrc/xinitrc /root/.xinitrc
3.中文字体和输入法
首先安装cvsup,更新ports,然后安装kde-zh******,之后就可以看到kde的一些界面已经中文化了,但是还是有乱码,弄个中文字体过来就可以了
将windows中的simsun.ttc改名为simsun.ttf后复制到/usr/X11R6/lib/X11/fonts/TTF中,然后运行命令
fc-cache -f -v就可以了
中文输入法很简单.fcitx,不过以前装的时候没有更新ports时好象不行.
目前预留的 50 到 999 之间的 UID。
bind:*:53:53:Bind Sandbox:/:/sbin/nologin
majordom:*:54:54:Majordomo Pseudo User:/usr/local/majordomo:/nonexistent
rdfdb:*:55:55:rdfDB Daemon:/var/db/rdfdb:/bin/sh
spamd:*:58:58:SpamAssassin user:/var/spool/spamd:/sbin/nologin
cyrus:*:60:60:the cyrus mail server:/nonexistent:/nonexistent
gnats:*:61:1:GNATS database owner:/usr/local/share/gnats/gnats-db:/bin/sh
proxy:*:62:62:Packet Filter pseudo-user:/nonexistent:/nonexistent
uucp:*:66:66:UUCP pseudo-user:/var/spool/uucppublic:/usr/libexec/uucp/uucico
xten:*:67:67:X-10 daemon:/usr/local/xten:/nonexistent
pop:*:68:6:Post Office Owner (popper):/nonexistent:/sbin/nologin
wnn:*:69:7:Wnn:/nonexistent:/nonexistent
pgsql:*:70:70:PostgreSQL pseudo-user:/usr/local/pgsql:/bin/sh
oracle:*:71:71::0:0:Oracle:/usr/local/oracle7:/sbin/nologin
ircd:*:72:72:IRC daemon:/nonexistent:/nonexistent
ircservices:*:73:73:IRC services:/nonexistent:/nonexistent
simscan:*:74:74:Simscan User:/nonexistent:/sbin/nologin
ifmail:*:75:66:Ifmail user:/nonexistent:/nonexistent
www:*:80:80:World Wide Web Owner:/nonexistent:/sbin/nologin
alias:*:81:81:QMail user:/var/qmail/alias:/nonexistent
qmaild:*:82:81:QMail user:/var/qmail:/nonexistent
qmaill:*:83:81:QMail user:/var/qmail:/nonexistent
qmailp:*:84:81:QMail user:/var/qmail:/nonexistent
qmailq:*:85:82:QMail user:/var/qmail:/nonexistent
qmailr:*:86:82:QMail user:/var/qmail:/nonexistent
qmails:*:87:82:QMail user:/var/qmail:/nonexistent
mysql:*:88:88:MySQL Daemon:/var/db/mysql:/sbin/nologin
vpopmail:*:89:89:VPop Mail User:/usr/local/vpopmail:/nonexistent
firebird:*:90:90:Firebird Database Administrator:/usr/local/firebird:/bin/sh
mailman:*:91:91:Mailman User:/usr/local/mailman:/sbin/nologin
gdm:*:92:92:GDM Sandbox:/:/sbin/nologin
jabber:*:93:93:Jabber Daemon:/nonexistent:/nonexistent
p4admin:*:94:94:Perforce admin:/usr/local/perforce:/sbin/nologin
interch:*:95:95:Interchange user:/usr/local/interchange:/sbin/nologin
squeuer:*:96:96:SQueuer Owner:/nonexistent:/bin/sh
mud:*:97:97:MUD Owner:/nonexistent:/bin/sh
msql:*:98:98:mSQL-2 pseudo-user:/var/db/msqldb:/bin/sh
rscsi:*:99:99:Remote SCSI:/usr/local/rscsi:/usr/local/sbin/rscsi
squid:*:100:100:squid caching-proxy pseudo user:/usr/local/squid:/sbin/nologin
quagga:*:101:101:Quagga route daemon pseudo user:/usr/local/etc/quagga:/sbin/nologin
ganglia:*:102:102:Ganglia User:/nonexistent:/sbin/nologin
sgeadmin:*:103:103:Sun Grid Engine Admin:/nonexistent:/sbin/nologin
slimserv:*:104:104:Slim Devices SlimServer pseudo-user:/nonexistent:/sbin/nologin
dnetc:*:105:105:distributed.net client and proxy pseudo-user:/nonexistent:/sbin/nologin
clamav:*:106:106:Clamav Antivirus:/nonexistent:/sbin/nologin
cacti:*:107:107:Cacti Sandbox:/nonexistent:/sbin/nologin
webkit:*:108:108:WebKit Default User:/usr/local/www/webkit:/bin/sh
quickml:*:109:109:quickml Server:/nonexistent:/sbin/nologin
vscan:*:110:110:Scanning Virus Account:/var/amavis:/bin/sh
fido:*:111:111:Fido System:/usr/local/fido:/bin/sh
dcc:*:112:112:Distributed Checksum Clearinghouse:/nonexistent:/sbin/nologin
amavis:*:113:113:Amavis-stats Account:/nonexistent:/sbin/nologin
dhis:*:114:114:DHIS Daemon:/nonexistent:/sbin/nologin
_symon:*:115:115:Symon Account:/var/empty:/sbin/nologin
postfix:*:125:125:Postfix Mail System:/var/spool/postfix:/sbin/nologin
rbldns:*:153:153:rbldnsd pseudo-user:/nonexistent:/sbin/nologin
sfs:*:171:171:Self-Certifying File System:/nonexistent:/sbin/nologin
agk:*:172:172:AquaGateKeeper:/nonexistent:/nonexistent
polipo:*:173:173:polipo web cache:/nonexistent:/sbin/nologin
bogomilter:*:174:174:milter-bogom:/nonexistent:/sbin/nologin
moinmoin:*:192:192:MoinMoin User:/nonexistent:/sbin/nologin
sympa:*:200:200:Sympa Owner:/nonexistent:/sbin/nologin
dspam:*:202:202:Dspam:/nonexistent:/sbin/nologin
_tor:*:256:256:Tor anonymising router:/var/db/tor:/bin/sh
ldap:*:389:389:OpenLDAP Server:/nonexistent:/sbin/nologin
drweb:*:426:426:Dr.Web Mail Scanner:/nonexistent:/sbin/nologin
courier:*:465:465:Courier Mail Server:/nonexistent:/sbin/nologin
_bbstored:*:505:505::0:0:BoxBackup Store Daemon:/nonexistent:/bin/sh
qtss:*:554:554:Darwin Streaming Server:/nonexistent:/sbin/nologin
ircdru:*:555:555:Russian hybrid IRC server:/nonexistent:/bin/sh
messagebus:*:556:556:D-BUS Daemon User:/nonexistent:/sbin/nologin
bnetd:*:700:700:Bnetd user:/nonexistent:/sbin/nologin
bopm:*:717:717:Blitzed Open Proxy Monitor:/nonexistent:/bin/sh
bacula:*:910:910:Bacula Daemon:/var/db/bacula:/sbin/nologin
下面是目前预留的 GID。
bind:*:53:
rdfdb:*:55:
spamd:*:58:
cyrus:*:60:
proxy:*:62:
authpf:*:63:
uucp:*:66:
xten:*:67:
dialer:*:68:
network:*:69:
pgsql:*:70:
simscan:*:74:
www:*:80:
qnofiles:*:81:
qmail:*:82:
mysql:*:88:
vpopmail:*:89:
firebird:*:90:
mailman:*:91:
gdm:*:92:
jabber:*:93:
p4admin:*:94:
interch:*:95:
squeuer:*:96:
mud:*:97:
msql:*:98:
rscsi:*:99:
squid:*:100:
quagga:*:101:
ganglia:*:102:
sgeadmin:*:103:
slimserv:*:104:
dnetc:*:105:
clamav:*:106:
cacti:*:107:
webkit:*:108:
quickml:*:109:
vscan:*:110:
fido:*:111:
dcc:*:112:
amavis:*:113:
dhis:*:114:
_symon:*:115:
postfix:*:125:
maildrop:*:126:
rbldns:*:153:
sfs:*:171:
agk:*:172:
polipo:*:173:
moinmoin:*:192:
sympa:*:200:
dspam:*:202:
_tor:*:256:
ldap:*:389:
drweb:*:426:
courier:*:465:
_bbstored:*:505:
qtss:*:554:
ircdru:*:555:
messagebus:*:556:
realtime:*:557:
bnetd:*:700:
bopm:*:717:
bacula:*:910:
以前遇到JSP 处理MySQL数据库时的中文问题时,采取的是很笨的一种方法,直接用字符串编码转换函数进行转换,这次从网上搜了一下,找到了一个使用Filter的可行方法。在Tomcat 5.5+ MySQL4.0.16下通过。
filter类源码是从网上找的,如下
/**
*
*/
package com.lzy;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* @author lzy
*
*/
public class SetCharacterEncodingFilter implements Filter {
protected String encoding = null;
protected FilterConfig filterConfig = null;
protected boolean ignore = true;
/* (non-Javadoc)
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
String value = filterConfig.getInitParameter("ignore");
if (value == null)
this.ignore = true;
else if (value.equalsIgnoreCase("true"))
this.ignore = true;
else if (value.equalsIgnoreCase("yes"))
this.ignore = true;
else
this.ignore = false;
}
/* (non-Javadoc)
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}
chain.doFilter(request, response);
}
/* (non-Javadoc)
* @see javax.servlet.Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
this.encoding = null;
this.filterConfig = null;
}
protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}
在web.xml 文件中作如下设置:(我使用的是Struts框架)
<filter>
<filter-name>Encoding</filter-name>
<filter-class>com.lzy.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Encoding</filter-name>
<servlet-name>action</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>Encoding</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
最后,连接数据库时,使用下面的url:
jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=GBK
1.下载Spring相关的开发包
下载地址:http://sourceforge.net/project/showfiles.php?group_id=73357
有spring-framework-1.2.6-with-dependencies.zip,一個是spring-framework-1.2.6.zip,最好下载with-dependencies的,里面有另外一些附加包,下载后解压缩,dist目录下是spring自身的jar,lib目录下是附加的jar。
2.新建Java Project,将spring.jar(dist目录下)和commons-logging.jar(lib目录下)添加到project的build path中。
3.新建POJO Bean类:HelloBean
//HelloBean.java
/**
*
*/
package com.lzy;
/**
* @author lzy
*
*/
public class HelloBean{
private String hello;
public void sayHello(){
System.out.println(this.getHello());
}
/**
* @return Returns the hello.
*/
public String getHello() {
return hello;
}
/**
* @param hello The hello to set.
*/
public void setHello(String hello) {
this.hello = hello;
}
}
4.新建文件bean.xml,将在这个XML文件中为一个HelloBean的实例的hello属性赋值。
//bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<description>Spring Quick Start</description>
<bean id="helloBean" class="com.lzy.HelloBean">
<property name="hello">
<value>hello world</value>
</property>
</bean>
</beans>
5.新建测试类:TestSpring
//TestSpring.java
/**
*
*/
package com.lzy;
import java.util.Locale;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
/**
* @author lzy
*
*/
public class TestSpring {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext ctx=new FileSystemXmlApplicationContext("bean.xml");
HelloBean hello=(HelloBean)ctx.getBean("helloBean");
hello.sayHello();
}
}
6.运行测试类:
如果没有出错,输出中将会看到“hello world”。
1.开发环境
Eclipse 3.2+MySQL 4.0.16+Hibernate3.0
首先应该安装好Eclipse和MySQL,此外准备好MySQL的JDBC Driver和Hibernate3.0,相关下载地址如下:
Eclipse SDK:
http://www.eclipse.org/downloads/index.php
MySQL及MySQL的JDBC Driver:
http://www.mysql.org
Hibernate:
http://www.hibernate.org
此外我还安装了Eclipse的一个Hibernate插件:
Hibernate synchronizer
http://hibernatesynch.sourceforge.net
Plugin Search:
http://eclipse-plugins.2y.net/eclipse/search.jsp
Hibernate synchronizer插件的安装和配置有问题请直接Google。
在工程中其实只用到了Hibernate synchronizer插件的一部分功能,Hibernate依赖的相关jar包最好还是手动添加,因为最开始用Hibernate synchronizer添加时总是发生错误。
将下载的Mysql driver和Hibernate包解压缩,我们需要的只是里面相关的jar,在Eclipse中新建Mysql_Driver和Hibernate两个user library,将mysql-connector-java-3.0.15-ga-bin.jar加入Mysql_Driver中,将hibernate3.jar,
,log4j-1.2.11.jar,antlr-2.7.5H3.jar,asm.jar,asm-attrs.jar,cglib-2.1.2.jar,commons-collections-2.1.1.jar,commons-logging-1.0.4.jar,dom4j-1.6.1.jar,ehcache-1.1.jar,jta.jar加入到Hibernate中。
2.开始
在Mysql中新建test数据库(Mysql其实有个空的test数据库),然后新建下面的Table
create table user (
id int(10) not null auto_increment primary key,
name varchar(20) not null,
password varchar(20) not null,
email varchar(50),
address varchar(100)
)type=innodb;
新建Java Project,将Mysql_Driver,Hibernate两个user library添加到该工程的java build path中。
新建与数据表对应的POJO类:User和Contact
/**
*
*
*/
package com.user;
/**
* @author lzy
*
*/
public class User{
private Integer id;
private String name;
private String password;
private Contact contact;
/**
* @return Returns the id.
*/
public Integer getId() {
return id;
}
/**
* @param id The id to set.
*/
public void setId(Integer id) {
this.id = id;
}
/**
* @return Returns the name.
*/
public String getName() {
return name;
}
/**
* @param name The name to set.
*/
public void setName(String name) {
this.name = name;
}
/**
* @return Returns the password.
*/
public String getPassword() {
return password;
}
/**
* @param password The password to set.
*/
public void setPassword(String password) {
this.password = password;
}
/**
* @return Returns the contact.
*/
public Contact getContact() {
return contact;
}
/**
* @param contact The contact to set.
*/
public void setContact(Contact contact) {
this.contact = contact;
}
}
/**
*
*/
package com.user;
/**
* @author lzy
*
*/
public class Contact {
private String email;
private String address;
/**
* @return Returns the address.
*/
public String getAddress() {
return address;
}
/**
* @param address The address to set.
*/
public void setAddress(String address) {
this.address = address;
}
/**
* @return Returns the email.
*/
public String getEmail() {
return email;
}
/**
* @param email The email to set.
*/
public void setEmail(String email) {
this.email = email;
}
}
之后可以用synchronizer插件生成Hibernate配置文件和映射文件(相关过程可以参考http://www.ideagrace.com/html/doc/2005/08/01/00315.html),不过映射文件必须稍作修改。
hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory >
<!-- local connection properties -->
<property name="hibernate.connection.url">jdbc:mysql://localhost/test</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.username"></property>
<property name="hibernate.connection.password"></property>
<!-- property name="hibernate.connection.pool_size"></property -->
<!-- dialect for MySQL -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">True</property>
<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<mapping resource="User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="com.user">
<class
name="User"
table="user"
>
<id
name="Id"
type="integer"
column="id"
>
<generator class="native"/>
</id>
<property
name="Name"
column="name"
type="string"
not-null="true"
length="20"
/>
<property
name="Password"
column="password"
type="string"
not-null="true"
length="20"
/>
<component name="Contact" class="Contact">
<property
name="Email"
column="email"
type="string"
not-null="false"
length="50"
/>
<property
name="Address"
column="address"
type="string"
not-null="false"
length="100"
/>
</component>
</class>
</hibernate-mapping>
3.测试
添加一个测试类:HibernateTest
package com.user;
import java.util.List;
import java.util.ListIterator;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class HibernateTest {
public static void main(String[] args) throws HibernateException {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
//
//testInsert(sessionFactory);
//
testQuery(sessionFactory);
sessionFactory.close();
}
public static void testInsert( SessionFactory sessionFactory )throws HibernateException {
Session session = sessionFactory.openSession();
Transaction tx= session.beginTransaction();
User user = new User();
Contact contact=new Contact();
contact.setEmail("email");
contact.setAddress("address");
user.setName("caterpillar");
user.setPassword("password");
user.setContact(contact);
session.save(user);
tx.commit();
session.close();
System.out.println("OK!");
}
public static void testQuery( SessionFactory sessionFactory )throws HibernateException {
Session session = sessionFactory.openSession();
Transaction tx= session.beginTransaction();
User user = new User();
Contact contact=new Contact();
Query query=session.createQuery("from User as user");
//query.setCharacter(1, 'M');
List names =query.list();
for(ListIterator it=names.listIterator();it.hasNext();){
user= (User)it.next();
System.out.println("Id: " + user.getId());
System.out.println("name: " + user.getName());
System.out.println("password: " + user.getPassword());
if(user.getContact()!=null){
if(user.getContact().getEmail()!=null){
System.out.println("Email: " + user.getContact().getEmail());
}
if(user.getContact().getAddress()!=null){
System.out.println("Address: " + user.getContact().getAddress());
}
}
}
tx.commit();
session.close();
}
}
1.开发环境
与Eclipse下Struts的开发类似,安装好Eclipse和Tomcat之后,还需要两个插件:tomcat 插件和JSF插件(如果相关插件还没有安装),以下是相关下载地址:
Eclipse SDK:
http://www.eclipse.org/downloads/index.php JSF:
https://sourceforge.jp/projects/amateras/files/
FaceIDE+htmlEditor,htmlEditer也是必要的
Tomcat :
http://www.sysdeo.com/eclipse/tomcatplugin Plugin Search:
http://eclipse-plugins.2y.net/eclipse/search.jsp 插件的安装和配置有问题请直接Google。
2.开始
入门嘛,我们就找一个最简单的Login就可以了
新建Tomcat project
加入JSF支持
新建一个ManagedBean:
/**
*
*/
package com.jsf;
/**
* @author lzy
*
*/
public class UserBean {
private String name;
private String password;
public String verify() {
if(this.name.equals("name")&&this.password.equals("password"))
return "failure";
else
return "success";
}
/**
* @return Returns the name.
*/
public String getName() {
return name;
}
/**
* @param name The name to set.
*/
public void setName(String name) {
this.name = name;
}
/**
* @return Returns the password.
*/
public String getPassword() {
return password;
}
/**
* @param password The password to set.
*/
public void setPassword(String password) {
this.password = password;
}
}
新建两个JSP页面,login.jsp,welcom.jsp
login.jsp
<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="
http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="
http://java.sun.com/jsf/core" prefix="f" %>
<html>
<head>
<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="
http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="
http://java.sun.com/jsf/core" prefix="f" %>
<html>
<head>
<link href="main.css" rel="stylesheet"/>
<title></title>
</head>
<body>
<f:view>
<f:loadBundle basename="com.jsf.MessageResources" var="msgs"></f:loadBundle>
<h:form>
<h:panelGrid columns="3" headerClass="header" rowClasses="evenRow,oddRow">
<f:facet name="header" >
<h:outputText value="#{msgs.header}"/>
</f:facet>
<h:outputText value="#{msgs.namePromt}"></h:outputText>
<h:inputText id="name" required="true" value="#{user.name}">
<f:validateLength minimum="2" maximum="10"></f:validateLength>
</h:inputText>
<h:message for="name" errorClass="errors"/>
<h:outputText value="#{msgs.passwordPromt}"></h:outputText>
<h:inputSecret id="password" value="#{user.password}" required="true" redisplay="true">
<f:validateLength minimum="2"></f:validateLength>
</h:inputSecret>
<h:message for="password"/>
<f:facet name="footer" >
<h:outputText value="#{msgs.footer}"/>
</f:facet>
</h:panelGrid>
<h:commandButton value="#{msgs.submitPromt}" action="#{user.verify}"/>
<h:commandButton value="#{msgs.resetPromt}" type="reset"/>
</h:form>
</f:view>
</body>
</html>
welcome.jsp
<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="
http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="
http://java.sun.com/jsf/core" prefix="f" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK"/>
<title></title>
</head>
<body>
<f:view>
<h:outputText value="#{user.name}"/> is a good boy!
<h3>welcome JavaServer Faces</h3>
</f:view>
</body>
</html>
编辑WEB-INF/lib下的faces-config.xml
struts-config.xml
<?xml version="1.0"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "
http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>
<navigation-rule>
<from-view-id>/login.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/welcome.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>failure</from-outcome>
<to-view-id>/login.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<managed-bean>
<managed-bean-name>user</managed-bean-name>
<managed-bean-class>com.jsf.UserBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
</faces-config>
最后是资源文件
# --login.jsp--
header=Welcom
namePromt=Name:
passwordPromt=Password:
amountPromt=Amount:
datePromt=Date:
submitPromt=Submit
resetPromt=Reset
footer=Thank you!
3.测试
在test工程中选择tomcat project->Update context definition
然后运行Tomcat
http://127.0.0.1:8080/jsfTest/login.jsf
1.开发环境
开发之前首先应该准备好开发环境,Eclipse 3.X是一个不错的Java IDE,有很多插件可以供我们选择,服务器用Tomcat就行了。安装好Eclipse和Tomcat之后,还需要两个插件:tomcat 插件和Struts插件,以下是相关下载地址:
Eclipse SDK:
http://www.eclipse.org/downloads/index.php
Struts:
https://sourceforge.jp/projects/amateras/files/ StrutsIDE+htmlEditor,htmlEditer也是必要的
Tomcat :
http://www.sysdeo.com/eclipse/tomcatplugin
Plugin Search:
http://eclipse-plugins.2y.net/eclipse/search.jsp
插件的安装和配置有问题请直接Google。
2.开始
入门嘛,我们就找一个最简单的Login就可以了
新建Tomcat project,如下图
加入struts支持
新建一个FormBean:LoginForm
/**
*
*/
package com.test;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
/**
* @author lzy
*
*/
public class LoginForm extends ActionForm {
private String name=null;
private String password=null;
/* (non-Javadoc)
* @see org.apache.struts.action.ActionForm#reset(org.apache.struts.action.ActionMapping, javax.servlet.http.HttpServletRequest)
*/
@Override
public void reset(ActionMapping arg0, HttpServletRequest arg1) {
// TODO Auto-generated method stub
name=null;
password=null;
}
/* (non-Javadoc)
* @see org.apache.struts.action.ActionForm#validate(org.apache.struts.action.ActionMapping, javax.servlet.http.HttpServletRequest)
*/
@Override
public ActionErrors validate(ActionMapping arg0, HttpServletRequest arg1) {
// TODO Auto-generated method stub
ActionErrors errors=new ActionErrors();
if(name==null||name.length()<1){
errors.add("username",new ActionMessage("errors.login.name.empty"));
}
if(password==null||password.length()<1){
errors.add("password",new ActionMessage("errors.login.password.empty"));
}
return errors;
}
/**
* @return Returns the name.
*/
public String getName() {
return name;
}
/**
* @param name The name to set.
*/
public void setName(String name) {
this.name = name;
}
/**
* @return Returns the password.
*/
public String getPassword() {
return password;
}
/**
* @param password The password to set.
*/
public void setPassword(String password) {
this.password = password;
}
}
新建一个Action:LoginAction
/**
*
*/
package com.test;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.*;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
/**
* @author lzy
*
*/
public class LoginAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
LoginForm loginForm=(LoginForm)actionForm;
String name=loginForm.getName();
String password=loginForm.getPassword();
if(name.equals("name")&&password.equals("password")){
HttpSession session=request.getSession(true);
session.setAttribute("LOGGED_USER",name);
return mapping.findForward("success");
}
else{
ActionMessages errors=new ActionMessages();
errors.add("login.failure",new ActionMessage("errors.login.failure"));
this.saveErrors(request,errors);
return mapping.findForward("failure");
}
}
}
新建两个JSP页面,login.jsp,index.jsp
login.jsp
<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-tiles" prefix="tiles" %>
<html:html>
<head>
<html:base />
</head>
<body>
<center>
<html:errors />
<html:form action="/login.do" method="POST">
<table border="1">
<tr>
<td colspan="2"><bean:message key="login.jsp.form.title"/></td>
</tr>
<tr>
<td align="right"><bean:message key="login.jsp.name"/></td>
<td><html:text property="name" size="20"></html:text></td>
</tr>
<tr>
<td align="right"><bean:message key="login.jsp.password"/></td>
<td><html:password property="password" size="20"></html:password></td>
</tr>
<tr>
<td colspan="2">
<html:submit><bean:message key="form.submit"/></html:submit>
<html:reset><bean:message key="form.reset"/></html:reset>
</td>
</tr>
</table>
</html:form>
</center>
</body>
</html:html>
index.jsp
<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-nested" prefix="nested" %>
<html:html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK"/>
<title></title>
</head>
<body>
hello
<logic:present name="LOGGED_USER">,<bean:write name="LOGGED_USER"/>
</logic:present>
</body>
</html:html>
编辑WEB-INF/lib下的struts-config.xml
struts-config.xml
<?xml version="1.0"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<data-sources>
</data-sources>
<form-beans>
<form-bean name="loginForm" type="com.lzy.LoginForm"/>
</form-beans>
<global-exceptions>
</global-exceptions>
<global-forwards>
</global-forwards>
<action-mappings>
<action path="/login" name="loginForm" type="com.lzy.LoginAction" scope="session" validate="true" input="/login.jsp">
<forward name="failure" path="/login.jsp"/>
<forward name="success" path="/index.jsp"/>
</action>
</action-mappings>
<controller processorClass="org.apache.struts.tiles.TilesRequestProcessor"/>
<message-resources parameter="MessageResources"/>
</struts-config>
最后是资源文件
# -- standard errors --
errors.header=<UL><font color="red"><h2>Errors:</h2>
errors.prefix=<LI>
errors.suffix=</LI>
errors.footer=</font></UL><hr>
form.submit=Submit
form.reset=Reset
# -- login.jsp --
login.jsp.title=Login
login.jsp.form.title=Login
login.jsp.name=Name:
login.jsp.password=Password:
# -- login errors --
errors.login.name.empty=The name can not be empty!
errors.login.password.empty=The password can not be empty!
errors.login.failure=Login failed!<br> Please check your username and password!
3.测试
在test工程中选择tomcat project->Update context definition
然后运行Tomcat
http://127.0.0.1:8080/test/login.jsp
这几天在图书馆看到了一本书《Java SOAP编程指南》,出于对正兴起的web service的好奇,借了回来。看了一下SOAP的介绍,没太明白,只知道是Simple Object Access Protocol,和XML结合可以提供跨平台的服务。
编程的人总有这么一个爱好,开始的时候总要拿一个HelloWorld似的例子试试,我也不例外。 要试当然要有SOAP的运行环境。按照书上的指示,装好了Tomcat,下载了相关的包,将soap.jar ,mail.jar,activatio.jar,xercesImpl.jar 加入到了环境变量classpath中,将soap.war拷贝到了TOMCAT的webapps目录下。
运行SOAP的测试目录:HTTP://127.0.0.1:8080/soap/发现soap已经正常工作。 接着便是部署新的SOAP服务了,按照书上的源码,写好了测试用的部署类和客户端类,编译通过。在部署新的SOAP的web页面下按照书上的步骤添好表单并部署完成。将测试所在目录添加到classpath中。 重启tomcat。 运行刚才编译好的客户端类,结果NoClassDefError。
试了好几遍,都是这样,很是让我郁闷啊。 看了另一本书《java web服务应用开发详解》终于找到了答案: 运行客户端测试程序时,***Client.class是在Package test中的 运行时退回到test的上级目录,java test.***Client 即可。 我想遇到类似问题,还是对java的包不熟悉。
Eclipse,我想任何一个学习Java的人都会知道它,一个很不错的开发环境,不光能开发基于Java的各种程序,还能做C++开发,比起JBuilder,我觉得Eclipse有过之而无不及,尤其它还是一个开源项目,很多东西都是JBuilder没有的。
Eclipse 是一个基于插件的开发平台,很多功能都是通过插件来完成的。比如说要做Java图形界面开发,如使用AWT和SWING的开发,就需要下载相应的插件,因此使用Eclipse时除了基本的Eclipse SDK还需要下载安装相应的插件。
下面是一些相关的下载地址:
Eclipse SDK:
http://www.eclipse.org/downloads/index.php(v3.1.1)
SWING+AWT:
Visual Editor: http://www.eclipse.org/vep/ (v1.1.0.1 released)
Struts:
StrutsIDE+htmlEditor: https://sourceforge.jp/projects/amateras/files/( v1.1.7+1.6.7)
J2EE:
Tomcat : http://www.sysdeo.com/eclipse/tomcatplugin
Lomboz: http://forge.objectweb.org/project/showfiles.php?group_id=97
JSF:
faceIDE https://sourceforge.jp/projects/amateras/files/( v1.1.7+1.6.7)
Hibernate:
Hibernate synchronizer http://hibernatesynch.sourceforge.net
Plugin Search:
http://eclipse-plugins.2y.net/eclipse/search.jsp
安装完JBuilder 9 Enterprise版后,看到介绍中说可以支持J2ME的开发,所以想试一下。
因为J2ME需要另外的jdk支持,所以第一步就是安装相应的wireless toolkit jdk.
相应的jdk可以从sun的官方网站上下载,安装过程也非常简单
这里不再详叙。
安装完后,将新的jdk添加到JBuilder的配置中,Tools->Configure JDKs
之后,新建工程,选择刚才的jdk。
打开Project->Project Properties,在run 选项卡中点New
在弹出框中选择run, type改为MIDlet(原来为Application)。
之后就可以新建MIDlet了。
//留言bean
package userinfobean;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
public class memoBean {
private String id;//1.用户名
private String email;//2.密码
private String content;//3.留言
public memoBean() {
}
//1.用户名
public void setId(String s){
this.id=s;
}
//2.密码
public void setEmail(String s){
this.email=s;
}
//3.留言
public void setContent(String s){
this.content=s;
}
//1.用户名
public String getId( ){
return this.id;
}
//2.密码
public String getEmail(){
return this.email;
}
//3.留言
public String getContent(){
return this.content;
}
}
//// 用于数据库操作的bean
package userinfobean;
import userinfobean.*;
import java.io.*;
import java.util.*;
import java.sql.*;
public class databaseBean{
private String dbName;
private String dbUser;
private String dbPass;
private Vector memoVector;
Connection connection;
public databaseBean(){
dbName=new String("×××××××");
dbUser=new String("××××××");
dbPass=new String("×××××××");
String connectionUrl="jdbc:mysql://localhost/"+dbName;
try{
Class.forName("org.gjt.mm.mysql.Driver");
connection=DriverManager.getConnection(connectionUrl,dbUser,dbPass);
}
catch(Exception e){
System.out.println(e.toString());
}
}
public void dbQueryMemos(){
try{
memoVector=new Vector();
Statement stmt=connection.createStatement();
ResultSet rs=stmt.executeQuery("select * from memo;");
while(rs.next()){
memoBean temp=new memoBean();
temp.setId(rs.getString(2));
temp.setEmail(rs.getString(3));
temp.setContent(rs.getString(4));
memoVector.add(temp);
}
}
catch(SQLException e){
System.out.println(e.toString());
}
}
public void setDbName(String s){
this.dbName=s;
}
public void setDbUser(String s){
this.dbUser=s;
}
public void setDbPass(String s){
this.dbPass=s;
}
public String getDbName(){
return this.dbName;
}
public String getDbUser(){
return this.dbUser;
}
public String getDbPass(){
return this.dbPass;
}
public Vector getMemoVector(){
return this.memoVector;
}
}
///以下是网页源码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ page language="java" import="java.util.*" %>
<%@ page import="java.text.*" %>
<%@ page import="userinfobean.*" %>
<jsp:useBean id="memoInfo" scope="page" class="userinfobean.memoBean"/>
<jsp:useBean id="memoQuery" scope="page" class="userinfobean.databaseBean"/>
<%!
int totalPages;
int countPerPage=3;
int totalCount;
int currentPage=0;
int currentStart;
%>
<%
memoQuery.dbQueryMemos();
Vector vt=memoQuery.getMemoVector();
totalCount=vt.size();
totalPages=totalCount/countPerPage;
if(totalCount%countPerPage>0)totalPages=totalPages+1;
if(request.getParameter("page")==null)
{
currentPage=1;
}
else
{
currentPage=Integer.parseInt(request.getParameter("page"));
if(currentPage>totalPages)currentPage=totalPages;
if(currentPage<1)currentPage=1;
}
currentStart=totalCount-1-countPerPage * (currentPage-1);
%>
<html>
<head>
<title>NetGreen</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link rel="stylesheet" href="main.css">
</head>
<script language="JavaScript" >
function page_check()
{
if(document.pageForm.page.value=="")
{alert("请输入页数");
document.pageForm.page.focus();
return false;
}
return true;
}</script>
<body bgcolor="ffffff" >
<center>
<table width="800" border="0" height="622">
<tr>
<td height="71" align="center" valign="middle"> <table width="100%" border="1" cellpadding="0" cellspacing="0" bordercolor="#0099CC">
<tr>
<td width="19%" height="60" align="left" valign="bottom" bgcolor="#FFFFFF"><b><font size="4" color="#00cc66" ><img src="image/logo.gif" width="156" height="60"></font></b></td>
<td width="57%" align="left" valign="bottom" bgcolor="#FFFFFF"><img src="image/banner.gif" width="100%" height="60"></td>
<td width="24%" align="left" valign="bottom"> <table width="102%" height="60" border="1" cellpadding="0" cellspacing="0" bordercolor="#0099CC" bgcolor="#FFFFFF">
<tr>
<td width="50%" height="27" align="center">上 传</td>
<td width="50%" align="center">收藏本页</td>
</tr>
<tr>
<td height="21" align="center" bgcolor="#FFFFFF" >退 出 </td>
<td align="center"><a href="memoForm.htm" target="_self">我要留言</a></td>
</tr>
</table></td>
</tr>
</table></td>
</tr>
<tr>
<td height="31"><table width="100%" border="1" bordercolor="#0099CC">
<tr bgcolor="#00CC66">
<td width="12%" height="23" align="center" bgcolor="#CCFFFF"><a href="index.htm" >首页</a></td>
<td width="12%" align="center" bgcolor="#CCFFFF"><a href="loginForm.htm" >登陆</a></td>
<td width="12%" align="center" bgcolor="#CCFFFF"> </td>
<td width="12%" align="center" bgcolor="#CCFFFF"> </td>
<td width="12%" align="center" bgcolor="#CCFFFF" > </td>
<td width="12%" align="center" bgcolor="#CCFFFF"> </td>
<td width="12%" align="center" bgcolor="#CCFFFF"><a href="memoDisplay.jsp" >留言板</a></td>
<td width="12%" align="center" bgcolor="#CCFFFF"><a href="registForm.htm">注册</a></td>
</tr>
</table></td>
</tr>
<tr>
<td height="435" align="center" valign="top" nowrap>
<table width="100%" border="1" cellpadding="0" cellspacing="0" bordercolor="#0099CC">
<tr>
<td width="18%" height="431" align="center" valign="middle" bgcolor="#CCFFFF">
</td>
<td width="83%" align="center" valign="top" bgcolor="#FFFFFF"><table width="100%" border="1"><form name="pageForm" method="post" onSubmit="return page_check();"action="memoDisplay.jsp">
<tr>
<td width="36%">共有留言<%out.print(totalPages);%> 页,现在是第<%out.print(currentPage);%> 页</td>
<td width="64%">
<a href="memoDisplay.jsp?page=<%=currentPage-1%>" >上一页 </a>
<a href="memoDisplay.jsp?page=<%=currentPage+1%>" >下一页 </a>
<a href="memoDisplay.jsp?page=1" >首页 </a>
<a href="memoDisplay.jsp?page=<%=totalPages%>" >尾页 </a>
<input type="submit" name="Submit" value="G0">
<input name="page" type="text" size="10">
页</td>
</tr>
</form></table>
<%
for(int i=0;i<countPerPage&¤tStart-i>=0;i++)
{
memoInfo.setId(((memoBean)vt.get(currentStart-i)).getId());
memoInfo.setEmail(((memoBean)vt.get(currentStart-i)).getEmail());
memoInfo.setContent(((memoBean)vt.get(currentStart-i)).getContent());
out.print("<table width='100%' border='1' ><tr><td width='19%'>");
out.print(memoInfo.getId());
out.print("</td><td width='81%'>");
out.print(memoInfo.getEmail());
out.print("</td></tr><tr><td height='44' colspan='2'>");
out.print(memoInfo.getContent());
out.print("</td></tr></table> ");
out.print("<br>");
}
%>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td height="73" align="center" valign="top" nowrap>
<table width="100%" border="0">
<tr>
<td height="21" align="center" bgcolor="#FFFFFF"><hr width="85%" noshade color="#00CC66"></td>
</tr>
<tr>
<td height="12" align="center">Copyright @ HomeLee. All rights reserved.
</td>
</tr>
<tr>
<td height="12" align="center" bgcolor="#FFFFFF"> </td>
</tr>
</table></td>
</tr>
</table>
</center></body>
</html>
Step1:
查找驱动程序 MySQL目前提供的java驱动程序为Connection/J,可以从MySQL官方网站下载,并找到mysql-connector-java-3.0.15-ga-bin.jar文件,此驱动程序为纯java驱动程序,不需做其他配置。
Step2:
动态指定classpath 如果需要执行时动态指定classpath,就在执行时采用-cp方式。否则将上面的.jar文件加入到classpath环境变量中。
Step3:
加载驱动程序
try{
Class.forName("com.mysql.jdbc.Driver");
System.out.println("Success loading Mysql Driver!");
}
catch(Exception e) {
System.out.println("Error loading Mysql Driver!");
e.printStackTrace();
}
Step4:
设置连接的url jdbc:mysql://localhost/databasename[?pa=va][&pa=va]
以前有过在linux下装Apache+PHP+MySQL的经验,这几天装了FreeBSD,我想在下面也装个数据库玩玩,当然首选MySQL了,这个简单呀.
1.MySQL
找到了/usr/ports/databases/mysql50-server
cd /usr/ports/databases/mysql50-server
make install clean
之后的数据库并没有生成
需要添加用户mysql:mysql
运行mysql_install_db
就会发现在/var/db下生成了mysql目录,里面就是mysql的数据库文件了
chown -R mysql:mysql /var/db/mysql
在rc.conf中加入mysql_enable="YES"
/usr/local/etc/rc.d/mysql-server.sh -start
如果没有错误的话mysql就运行了
装了这个当然挂个服务器测试测试了
2.Apache
cd /usr/ports/www/apache20/
以前在linux下装的时候有个参数--enable-so
我给加到了Makefile里,不知道有没有必要,反正后来也装好了
make install clean
安装成功
修改一下配置文件httpd.conf
在rc.conf中加入apache2_enable="YES"
/usr/local/etc/rc.d/apache2.sh start
启动成功的话也就可以了
3.PHP
cd /usr/ports/www/mod_php5
make install clean
安装的时候选中那个with apache什么的就可以了
安装后将httpd.conf中的loadmodule 最后一个刚加进去的php的#去掉
Addtype 行加入.php .phps
写一个phpinfo()测试一下就可以了
4.PHP+MySQL
装mod_php5的时候没有加入mysql支持
cd /usr/ports/databases/php5-mysql
make install clean就可以了
到此就架好了Apache+PHP+MySQL
5.安装Tomcat
以前装好了jdk-1.4.2 装Tomcat之前unset JAVA_HOME
cd /usr/ports/www/jakarta-tomcat5
make install clean就可以了
/usr/local/bin/tomcat50ctl start
http://127.0.0.1:8180/
测试通过
6.Tomcat+MySQL
到mysql的官方网站下一个联接器,将相应的jar文件放到
tomcat相应目录下
7.Apache + Tomcat
我刚开始的时候装了mod_jk2-apache2
结果没有成功,又装mod_jk-apache2,也没有成功啊
后来想起在windows下成功过,去看了看,发现用的是mod_jk2
没办法,又回去装了mod_jk2-apache2
将httpd.conf中加载mod_jk2的行启用
之后我将windows下的workers2.properties文件拷到了
/usr/local/etc/apache2下,只做了一处修改
以下是修改后的:
[shm]
info=Scoreboard. Requried for reconfiguration and status with multiprocess servers.
file=/var/log/shm.file
size=1048576
# Defines a load balancer named lb. Use even if you only have one machine.
[lb:lb]
# Example socket channel, override port and host.
[channel.socket:localhost:8009]
port=8009
host=localhost
# define the worker
[ajp13:localhost:8009]
channel=channel.socket:localhost:8009
group=lb
# Map the Tomcat examples webapp to the Web server uri space
[uri:/examples/*]
group=lb
[uri:/admin/*]
group=lb
[status:]
info=Status worker, displays runtime information
[uri:/jkstatus/*]
info=The Tomcat /jkstatus handler
group=status:
[uri:/*.jsp]
worker=ajp13:localhost:8009
之后touch /var/log/shm.file创建shm.file
chown -R www:www var/log/shm.file
之后重启Apache和Tomcat
测试:http://127.0.0.1/index.jsp
发现成功了
呵呵,大功告成
Red Hat 9:Linux下安装mplayer播放器 |
|
在Linux RH9下安装mplayer很多次了,以前都是以失败而告终,前两天终于装成功了,为自己感到庆幸。大家以后安装的时候可以作为一个参考(有些地方我也是参考别人的)。
mplayer是linux下播放速度最快(正确安装了显卡驱动),支持媒体格式最多的播放器之一 ,它几乎能播放所有的win媒体文件!下面介绍它的安装方法:
安装大前提: 要编译这个软件,确认你系统安装了相应的XFree86-devel,还有如果你要编译gui操作界面 (./configure --enable-gui),还请确认你的系统有libpng,libpng-devel,gtk和 gtk-devel(要求版本大于1.2)这四个软件,可以在www.rpmfind.net找到相应的rpm包 (这些包通过安装Gnome桌面可以获得) 1、在下载mplayer的最新版本及安装所需软件包的集合包
2、升级gcc: (必要,推荐gcc版本为2.9.5和3.2.x) 检查你的gcc版本,运行gcc -v看输出是多少,如果是3.0以下的话,则建议安装gcc3.0以 上(根据mplayer的官方说明,3.0以下的gcc可以用./configre --disable-gcc-checking 参数编译,但可能不稳定),安装gcc3的方法是:进入gcc3目录,运行rpm -ivh *.rpm --nodeps,全部百分百安装后,开一个终端窗口,运行mv /usr/bin/gcc /usr/bin/gcc2 和mv /usr/bin/gcc3 /usr/bin/gcc,再运行gcc -v,看输出是否为3.0.2,如果是,则ok ,不是,则检查安装步骤。
3、编译安装mplayer: tar vxf MPlayer-****.tar,cd MPlayer-****,./configure (如果你想 要gui的操作界面,则换用这个命令./configrue --enable-gui,但似乎这个版本的gui编 译有错,我和linuxCN都无法成功,pre4版本则没问题),make,make install,都成功运行一下mplayer(这是为了让它在家目录下建立.mplayer这个配置目录 (.mplayer为隐藏目录,用ls -a指令可以看见,cd ~/.mplayer指令可以进入),好进行下一 步操作)
./configure --prefix=/usr/local --enable-gui --enable-live --enable-menu --enable-freetype --enable-fontconfig --enable-win32 --enable-dshow --enable-real --enable-divx4linux --enable-xvid --disable-arts --language=zh_CN --enable-dynamic-plugins --with-codecsdir=/usr/local/lib/codecs --with-win32libdir=/usr/local/lib/codecs --with-reallibdir=/usr/local/lib/codecs --with-livelibdir=/usr/local/lib/live --with-freetype-config=/usr/bin/freetype-config 重要参数说明: --prefix= 安装路径为/usr/local --enable-gui 使用图形界面,mplayer有命令行和图形界面两种运行方式 --enable-live 使用流媒体支持 --enable-freetype 字幕字体可以使用ttf字体 --enable-win32 可以使用win32的.dll格式的解码器 --enable-real 支持real格式 --language=zh_CN mplayer界面的格式为中文 --with-codecsdir=/usr/local/lib/codecs 指定解码器搜索路径 --with-win32libdir=/usr/local/lib/codecs 指定win32解码器搜索路径 --with-reallibdir=/usr/local/lib/codecs 指定real解码器搜索路径 --with-livelibdir=/usr/local/lib/live 指定live解码器搜索路径
现在使用 make 自动编译软件,可以去吃饭,回来再看
make install //安装
运行mplayer ./mplayer
4、拷贝配置文件:(注意:下面这个etc目录是上一步中解压出来的MPlayer-***目 录下的,非/etc) cp etc/codecs.conf ~/.mplayer cp etc/example.conf ~/.mplayer/config
5、安装font和skin:(如果你选择了./configure --enable-gui那才需要skin,否则skin 不用安装) 进入自己的home目录,显示隐藏文件,进入.mplayer文件夹,创2个建文件夹:font和 Skin。
下载font文件,(mplayer官方网站上有)拷入到font内拷贝simsun.ttf到~/.mplayer目录中 拷贝Blue皮肤目录到/usr/local/share/mplayer/Skins目录中
6、运行方式 两种:(1)mplayer /路径/要播放的媒体文件名;(2)gmplayer(只有用./configure --enable-gui编译的这个命令才有效)
现在可以运行mplayer和gmplayer了。但是gmplayer字幕出现问题,提示找不到
字幕字体文件。按照提示拷贝simsun.ttf(其他字体文件也可以)到~/.mplayer目录中(改文件名)。
7、关于~/.mplayer/config文件的一些配置说明 vo=xv(选择默认的播放模式,xv模式是支持显卡硬加速功能的模式,对cpu的占用很小, 推荐;更多的显示模式可以用命令mplayer -vo help看,其中的vesa模式可以在不启动 xwin界面时播放,有点象当年DOS下的金山影霸) ao=oss(选择声音的播放模式,oss是兼容性最好的播放模式,推荐;你也可以试试sdl模 式) fs=yes(全屏模式,yes的话默认以全屏播放,no或前面加#号注释掉这行的话则默认是1 :1播放模式) zoom=yes(即时改变电影画面大小,yes的话则可以用鼠标随意将播放画面拉大拉小,no 的话不能) gui = yes(默认是图形化操作界面,这需要你先前用./configure --enable-gui来编译 ,否则的话就算yes也没有gui操作界面) skin = default(设置默认的skin,将等号右边的值换成skin所放目录就可以设置想要的 skin为默认了,这个参数在用gui操作界面才有效) cache = 8192(默认的播放缓存大小,如果机器内存够大,则将它加大一点,如果不是很 大,譬如128以下,还是用默认的算了) framedrop = yes(允许跳帧,如果你的机器CPU速度非常非常慢的话请将这个yes,默认 是no或前面加#号将这行禁止;对于366MHZ以上的机器,建议都设成no或前面加#号) 其他设置用默认就行 。
|
******************************************************************************
先安装Mysql
******************************************************************************
shell> groupadd mysql
shell> useradd -g mysql mysql
shell> gunzip < mysql-VERSION.tar.gz | tar -xvf -
shell> cd mysql-VERSION
shell> ./configure --prefix=/usr/local/mysql
shell> make
shell> make install
shell> cp support-files/my-medium.cnf /etc/my.cnf
shell> cd /usr/local/mysql
shell> bin/mysql_install_db
shell> chown -R root .
shell> chown -R mysql var
shell> chgrp -R mysql .
shell> bin/mysqld_safe --user=mysql &
******************************************************************************
再安装PHP和apache
******************************************************************************
1. gzip -d httpd-2_0_NN.tar.gz
2. tar xvf httpd-2_0_NN.tar
3. gunzip php-NN.tar.gz
4. tar -xvf php-NN.tar
5. cd httpd-2_0_NN
6. ./configure --enable-so
7. make
8. make install
现在您已经将 Apache 2.0.NN 安装在 /usr/local/apache。本安装支持可装载模块
和标准的 MPM prefork。之后,可以使用如下命令启动 Apache 服务器:
/usr/local/apache2/bin/apachectl start
如果成功,您可以停止 Apache 服务器并继续安装 PHP:
/usr/local/apache2/bin/apachectl stop.
9. cd ../php4-NN
10. 现在我们需要配置 PHP。在这里您可以用各种各样的参数来自定义PHP,例如启动哪
些扩展功能包的支持等。用 ./configure --help 命令可以列出当前可用的所有参
数。在我们的例子中,我们将给出一个在有 MySQL 支持的 Apache 2 上进行配置的
范例。您本地的 apxs 的路径可能会不同,事实上,在您的系统中,它可能被命名为
apxs2。
./configure --with-apxs2=/usr/local/apache2/bin/apxs
11. make
12. make install
如果您决定在安装后改变配置选项,您只需重复最后的三步,然后需要重新启动
Apache 使新模块生效。无需重新编译。
请注意,除非明确有提示,否则 'make install' 命令将安装 PEAR、各种 PHP 工具
诸如 phpize,安装 PHP CLI 等等。
13. 配置 php.ini
cp php.ini-dist /usr/local/lib/php.ini
您可以编辑 php.ini 文件以修改 PHP 的选项。如果您想要把此文件放到另外的位置,
您需要在步骤 10 添加 --with-config-file-path=/path 选项。
如果您选择 php.ini -recommended,请务必阅读其中的变更的列表,它们将影响
PHP 的执行。
14. 编辑 httpd.conf 文件以调用 PHP 模块。LoadMolude 表达式右边的路径必须指向您
系统中的 PHP。以上的 make install 命令可能已经帮您完成了这些,但务必要检查。
对于 PHP 4:
LoadModule php4_module modules/libphp4.so
对于 PHP 5:
LoadModule php5_module modules/libphp5.so
15. 告知 Apache 将特定的扩展名解析成 PHP,例如,我们让 Apache 将扩展名 .php
解析成 PHP。您可以将任何扩展名指定为 PHP,只需添加它们,每一个用空格分隔。
例如,我们要添加 .phtml:
AddType application/x-httpd-php .php .phtml
通常,我们还将 .phps 扩展名设置成显示高亮的 PHP 源文件,可以这样来完成:
AddType application/x-httpd-php-source .phps
16. 启动您的 Apache 服务器:
/usr/local/apache2/bin/apachectl start
按照上面的步骤您便可以使 Apache 2.0 将 PHP 作为 SAPI 模块了。当然 Apache 和
PHP 都还有很多配置选项,您可以在相应的源代码目录中使用 ./configure --help 获得
更多信息。假如您要编译一个多线程版本的 Apache 2.0,您必须覆盖标准的
MPM-Module
prefork,或者 worker 或者 perchild。要这样,您需要在上面的第 6 步使用
--with-mpm=worker 或者 --with-mpm=perchild 选项。之前您需要了解您正在做什么。
更
多信息请参考 Apache 文档中关于 MPM-Modules 的部分。
linux下编写OpenGL程序的一些准备工作 |
|
需要用到的软件包有两个,glut 和tmake,分别可以从以下两个网址下载: http://www.opengl.org/resources/libraries/glut/glut-3.7.tar.gz ftp://ftp.trolltech.com/freebies/tmake/tmake-1.8.tar.gz
下载后的文件假设都放在/usr/src中
首先是安装glut库,以下是从www.linux.com找到的编译glut库的手册。
Install GLUT 3.7 Distribution (optional)
If you installed the MesaDemos/MesaLib package, then you have already installed GLUT 3.7 since it is included with MesaDemos. However, you may be interested in installing the GLUT
manpages and you can skip right to the "Install GLUT manual pages", below ...
Installing GLUT is a bit tricky. I'm not too familiar with imake, the program that it uses to manage the Makefiles, and didn't quite see how to get GLUT to install to where I wanted it (/usr/lib,
but MesaDemos will do this without any trouble though). It can be done manually anyhow:
cd /usr/src tar -xvzf glut-3.7.tar.gz cd glut-3.7
Read the file: README.linux cd linux READ the file: README cp Glut.cf .. cd .. Edit Glut.cf: remove any Mesa references. Replace any -lMesaGL -lMesaGLU with -lGL -lGLU if needed. In particular, replace: OPENGL = $(TOP)/../lib/libMesaGL.so GLU = $(TOP)/../lib/libMesaGLU.so with: OPENGL = -lGL GLU = -lGLU
./mkmkfiles.imake cd lib/glut cp /usr/src/glut-3.7/linux/Makefile . Edit the Makefile: remove any Mesa references. Replace any -lMesaGL -lMesaGLU with -lGL -lGLU if needed. In particular, replace: OPENGL = $(TOP)/../lib/libMesaGL.so GLU = $(TOP)/../lib/libMesaGLU.so with: OPENGL = -lGL GLU = -lGLU
make ln -s libglut.so.3.7 libglut.so ln -s libglut.so.3.7 libglut.so.3 cp -d libglut.* /usr/lib cd .. cd gle # make a shared lib for libgle make gcc -shared -o libgle.so.3.7 *.o ln -s libgle.so.3.7 libgle.so ln -s libgle.so.3.7 libgle.so.3 cp -d libgle.* /usr/lib cd .. cd mui # make a shared lib for libmui make gcc -shared -o libmui.so.3.7 *.o ln -s libmui.so.3.7 libmui.so ln -s libmui.so.3.7 libmui.so.3 cp -d libmui.* /usr/lib
# Install the GLUT manual pages (not included with MesaDemos) cd /usr/src/glut-3.7 make SUBDIRS=man Makefile cd man/glut make install.man ldconfig
cd ../../progs/demos/ideas # edit the Makefile, change OPENGL = -lGL and GLU = -lGLU make ./ideas # test compiling some demos # take a look at which libraries have to be linked (-lX11 ...) in # the Makefiles. Qt's tmake program available at www.troll.no # is a quick way to make a Makefile but you have to edit it # and add the -l needed. ideas如果运行成功的话,说明glut已经可以用了,这时可以将include/GL下的glut等头文件复制到/usr/include中去。
上面的几步中,下载的glut包放在/usr/src目录下,如果放在其他目录下,将/usr/src改为相应的目录即可。 此外应该注意的是两个Makefile文件的修改 改 · OPENGL = $(TOP)/../lib/libMesaGL.so GLU = $(TOP)/../lib/libMesaGLU.so 为 OPENGL = -lGL GLU = -lGLU 因为所指定的目录中没有libMesaGL.so和libMesaGLU.so。
之后是tmake的配置,后面我们可以用它来生成pro工程文件和makefile文件。
先将下载的tmake解压缩,tar -zxvf tmake-1.8.tar.gz 得到tmake-1.8目录,之后设置两个环境变量:PATH和TMAKEPATH PATH=$PATH:/usr/src/tmake-1.8/bin export PATH TMAKEPATH=/usr/src/tmake-1.8/lib/linux-g++ export TMAKEPATH
新建一个测试目录test,将glut-3.7目录下的progs/redbook目录下的hello.c复制到test目录中
之后生成一个pro文件:progen -o hello.pro
然后生成makefile文件:tmake hello.pro -o Makefile
编辑生成的Makefile文件,在加载动态连接库的行里面加入 -lglut -lXi -lXmu
保存,make。
./hello 可以看到运行结果就可以了。 |
|
|
五一期间装了个FreeBSD,5.3 release,KDE桌面,感觉还是不错
前些天在Redhat Linux弄过OpenGL的开发环境,那时是自己编译的glut库,然后用tmake编写makefile,感觉很方便。
五一期间装了个FreeBSD,5.3 release,KDE桌面,感觉还是不错的,用多了感觉图形界面都快赶上WindowsXP了。
还是入正题吧。我想试试glut,pkg_info|grep glut
发现有个libglut.6...的,是支持OpenGL的,不知道是不是我想要的glut.
查找libglut.so,发现在/usr/X11R6/lib里面了,版本3,对头。
把在linux里用过的tmake,和opengl redbook源码拷了过来,设置好tmake相关的环境变量
当然最重要的是改相应的tmake.conf文件了,将glut相关的库加进去
新建目录test,将hello.c拷进去,
progen -o hello.pro
tmake hello.pro "CONFIG+=opengl" -o Makefile
可以先检查一下生成的Makefile,我没有发现问题
make,成功,生成可执行的hello
./hello出现一新窗口,本来应该高兴的,却有点不对劲,窗口上什么也没话
而且是白色背景,应该是黑色背景然后画一个白色的正方形。
google了好久,终于发现有人跟我遇到过同样的问题
解决的方法很简单 link的时候加上 -pthread选项,我先改了一下生成的Makefile,加上了-pthread
make,也通过了,看来问题有可能解决了
./hello 终于正确的结果出现了
使用tmake生成Qt程序的makefile文件
使用tmake生成Qt程序的makefile文件真的是很简单,本来tmake就是发布Qt那个公司的产品啊. 自己编写.h和.cpp文件时,tmake的用法可以在安装文档里找到. 使用Qt Designer时呢,生成的是.ui文件,这时也可以用tmake的: 假设生成的.ui文件名为mainform.ui,自己写一个简单的main.cpp文件:
#include "mainform.h"
int main(int argc,char **argv)
{
QApplication app(argc,argv);
MainForm mainform;
app.setMainWidget(&mainform);
mainform.show();
return app.exec();
}
接下来就可以使用tmake了
progen -o main.pro
tmake main.pro -o Makefile
make
./main 呵呵,可以了
使用Eclipse+Lomboz+JBoss开发EJB时,有时会遇到javax.ejb找不到的错误信息,其实是在构建的ejb client项目里没有导入JBoss的ejb类路径,原因是原来默认的server是Tomcat,在tomcat中是没有ejb相关的包的。可以在ejb client项目中导入相关的包来解决。