jb下开发struts+hibernate
jbuilder下开发struts+hibernate
一、用jbuilder建立一个struts项目(略)
二、使用Middlegen生成需要的*.hbm.xml文件,并拷贝到src目录下,同时在jb中将xml文件定义为copy
1、确保需要的数据库驱动存在于lib目录下
2、在config\database目录下配置相应的数据库配置文件
3、修改build.xml文件
]>
4、使用ant编译运行
5、手动修改生成的文件
三、将需要的jar包导入项目(hibernate、dbdriver)
四、编写hibernate.cfg.xml,置于src目录下
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
(所有的*.hbm.xml文件都添加到这里)
五、编写HibernatePlugIn.java文件
import org.apache.struts.action.PlugIn;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.config.ModuleConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletContext;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.cfg.Configuration;
public class HibernatePlugIn
implements PlugIn {
public void destroy() {
}
public void init(ActionServlet servlet, ModuleConfig config) throws
ServletException {
try {
ServletContext context = servlet.getServletContext();
SessionFactory sf = new Configuration().configure().buildSessionFactory();
context.setAttribute("net.sf.hibernate.SessionFactory",sf);
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}
六、修改struts-config.xml文件,加入plugin
七、使用hibernate
Context ctx = new InitialContext();
SessionFactory sf = (SessionFactory) ctx.lookup("hibernate/session_factory");
Session s = sf.openSession();
……
注:这部分可以抽象出来
---------------------------------
-----------------------------------
----------------------------------------------------------------------
"http://www.springframework.org/dtd/spring-beans.dtd">
-------------------------------------------------------------------
--------------------------------------------------------------------
-------------------------------------------------------------------
-------------------------------------------------------------------
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
------------------------------------------------------------------
UserHibernateDao.java
------------------------------------------------------------------
/*
* 创建日期 2005-4-7
*
* 更改所生成文件模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
package com.yaya.service.dao.hibernate;
import java.util.List;
import org.springframework.orm.ObjectRetrievalFailureException;
import org.springframework.orm.hibernate.support.HibernateDaoSupport;
import com.yaya.hb.TSysuser;
import com.yaya.service.dao.IUserDao;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author Administrator
*
* 更改所生成类型注释的模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
public class UserHibernateDao extends HibernateDaoSupport implements IUserDao {
private Log log = LogFactory.getLog(UserHibernateDao.class);
/* (非 Javadoc)
* @see com.jandar.dao.IUserDAO#getUsers()
*/
public List getUsers() {
return getHibernateTemplate().find("from TSysuser");
}
/* (非 Javadoc)
* @see com.jandar.dao.IUserDAO#getUser(java.lang.Long)
*/
public TSysuser getUser(String username) {
// TODO 自动生成方法存根
//String msg = getHibernateTemplate().get(TSysuser.class,username).toString();
TSysuser user = (TSysuser) getHibernateTemplate().get(TSysuser.class,username);
//TSysuser user = (TSysuser) getHibernateTemplate().find("from TSysuser where username = ?",username);
System.out.println(user.getUserdesc());
System.out.println(user.getHeadship());
if (user == null) {
throw new ObjectRetrievalFailureException(TSysuser.class, username);
}
return user;
}
/* (非 Javadoc)
* @see com.jandar.dao.IUserDAO#saveUser(com.jandar.model.User)
*/
public void saveUser(TSysuser user) {
log.debug("xxxxxxx");
System.out.println("yyyy");
getHibernateTemplate().saveOrUpdate(user);
if (log.isDebugEnabled()) {
log.debug("username set to " + user.getUsername());
}
}
/* (非 Javadoc)
* @see com.jandar.dao.IUserDAO#removeUser(java.lang.Long)
*/
public void removeUser(String username) {
Object user = getHibernateTemplate().load(TSysuser.class, username);
getHibernateTemplate().delete(user);
if (log.isDebugEnabled()) {
log.debug("del user " + username);
}
}
}
-------------------------------------------------------------------
useraction.java
--------------------------------------------------------------------
/*
* 创建日期 2005-4-11
*
* 更改所生成文件模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
package com.yaya.action;
import java.util.Date;
import org.apache.struts.actions.DispatchAction;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionErrors;
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;
import org.apache.struts.action.DynaActionForm;
import org.apache.struts.util.MessageResources;
import com.yaya.hb.TSysuser;
import com.yaya.service.spring.UserManagerImpl;
/**
* @author Administrator
*
* 更改所生成类型注释的模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
public class UserAction extends DispatchAction {
private static Log log = LogFactory.getLog(UserAction.class);
private UserManagerImpl mgr = null;
public void setUserManager(UserManagerImpl userManager) {
this.mgr = userManager;
}
public ActionForward delete(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
if (log.isDebugEnabled()) {
log.debug("entering 'delete' method...");
}
mgr.removeUser(request.getParameter("user.username"));
ActionMessages messages = new ActionMessages();
messages.add(
ActionMessages.GLOBAL_MESSAGE,
new ActionMessage("user.deleted"));
saveMessages(request, messages);
return list(mapping, form, request, response);
}
public ActionForward edit(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
if (log.isDebugEnabled()) {
log.debug("entering 'edit' method...");
}
DynaActionForm userForm = (DynaActionForm) form;
String username = request.getParameter("username");
// null userId indicates an add
if (username != null) {
try
{
TSysuser user = mgr.getUser(username);
if (user == null) {
ActionMessages errors = new ActionMessages();
errors.add(
ActionMessages.GLOBAL_MESSAGE,
new ActionMessage("user.missing"));
saveErrors(request, (ActionErrors) errors);
return mapping.findForward("list");
}
userForm.set("user", user);
request.setAttribute("user",user);
}
catch(Exception e)
{
e.printStackTrace();
}
}
return mapping.findForward("edit");
}
public ActionForward list(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
if (log.isDebugEnabled()) {
log.debug("entering 'list' method...");
}
request.setAttribute("users", mgr.getUsers());
return mapping.findForward("list");
}
public ActionForward save(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
if (log.isDebugEnabled()) {
log.debug("entering 'save' method...");
}
if (isCancelled(request)) {
return list(mapping, form, request, response);
}
// run validation rules on this form
ActionMessages errors = form.validate(mapping, request);
if (!errors.isEmpty()) {
saveErrors(request, (ActionErrors) errors);
return mapping.findForward("edit");
}
DynaActionForm userForm = (DynaActionForm) form;
TSysuser user = (TSysuser) userForm.get("username");
mgr.saveUser(user);
ActionMessages messages = new ActionMessages();
messages.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage("user.saved", user.getUsername()));
saveMessages((HttpServletRequest) request.getSession(), messages);
return mapping.findForward("users");
}
public ActionForward unspecified(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
return list(mapping, form, request, response);
}
}
-------------------------------------------------------------------
UserMenuActionForm.java
-------------------------------------------------------------------
/*
* 创建日期 2005-3-28
*
* 更改所生成文件模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
package com.yaya.actionform;
import java.sql.Date;
import org.apache.struts.action.ActionForm;
/**
* @author Administrator
*
* 更改所生成类型注释的模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
public class UserMenuActionForm extends ActionForm {
/** identifier field */
private String username;
/** identifier field */
private String fitemcode;
/** identifier field */
private String itemcode;
/** identifier field */
private String itemdesc;
/** identifier field */
private String itemtype;
/** identifier field */
private Integer itemid;
/** identifier field */
private String lastmodif;
/** identifier field */
private Date lastmdate;
/** identifier field */
private String creadtor;
/** identifier field */
private Date creatdate;
/** identifier field */
private String title;
/** identifier field */
private String url;
/** identifier field */
private String target;
/** identifier field */
private String icon;
/** identifier field */
private String iconopen;
/** identifier field */
private Integer open;
/** identifier field */
private Integer id;
/** identifier field */
private Integer pid;
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
public String getFitemcode() {
return this.fitemcode;
}
public void setFitemcode(String fitemcode) {
this.fitemcode = fitemcode;
}
public String getItemcode() {
return this.itemcode;
}
public void setItemcode(String itemcode) {
this.itemcode = itemcode;
}
public String getItemdesc() {
return this.itemdesc;
}
public void setItemdesc(String itemdesc) {
this.itemdesc = itemdesc;
}
public String getItemtype() {
return this.itemtype;
}
public void setItemtype(String itemtype) {
this.itemtype = itemtype;
}
public Integer getItemid() {
return this.itemid;
}
public void setItemid(Integer itemid) {
this.itemid = itemid;
}
public String getLastmodif() {
return this.lastmodif;
}
public void setLastmodif(String lastmodif) {
this.lastmodif = lastmodif;
}
public Date getLastmdate() {
return this.lastmdate;
}
public void setLastmdate(Date lastmdate) {
this.lastmdate = lastmdate;
}
public String getCreadtor() {
return this.creadtor;
}
public void setCreadtor(String creadtor) {
this.creadtor = creadtor;
}
public Date getCreatdate() {
return this.creatdate;
}
public void setCreatdate(Date creatdate) {
this.creatdate = creatdate;
}
public String getTitle() {
return this.title;
}
public void setTitle(String title) {
this.title = title;
}
public String getUrl() {
return this.url;
}
public void setUrl(String url) {
this.url = url;
}
public String getTarget() {
return this.target;
}
public void setTarget(String target) {
this.target = target;
}
public String getIcon() {
return this.icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
public String getIconopen() {
return this.iconopen;
}
public void setIconopen(String iconopen) {
this.iconopen = iconopen;
}
public Integer getOpen() {
return this.open;
}
public void setOpen(Integer open) {
this.open = open;
}
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getPid() {
return this.pid;
}
public void setPid(Integer pid) {
this.pid = pid;
}
}
------------------------------------------------------------------
package com.yaya.hb;
import java.io.InputStream;
import java.io.Serializable;
import java.util.Date;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
/** @author Hibernate CodeGenerator */
public class TSysuser implements Serializable {
/** identifier field */
private String username;
/** identifier field */
private String userdesc;
/** identifier field */
private String passwords;
/** identifier field */
private String deptno;
/** identifier field */
private String headship;
/** identifier field */
private String sex;
/** identifier field */
private String tel;
/** identifier field */
private String email;
/** identifier field */
private String url;
/** identifier field */
private String pcall;
/** identifier field */
/** identifier field */
private String userphoto;
/** identifier field */
private Integer facerefutime;
/** identifier field */
private String facelanguage;
/** identifier field */
private String lastmodif;
/** identifier field */
private Date lastmdate;
/** identifier field */
private String creadtor;
/** identifier field */
private Date creatdate;
/** full constructor */
public TSysuser(String username, String userdesc, String passwords, String deptno, String headship, String sex, String tel, String email, String url, String pcall, InputStream userimage, String userphoto, Integer facerefutime, String facelanguage, String lastmodif, Date lastmdate, String creadtor, Date creatdate) {
this.username = username;
this.userdesc = userdesc;
this.passwords = passwords;
this.deptno = deptno;
this.headship = headship;
this.sex = sex;
this.tel = tel;
this.email = email;
this.url = url;
this.pcall = pcall;
this.userphoto = userphoto;
this.facerefutime = facerefutime;
this.facelanguage = facelanguage;
this.lastmodif = lastmodif;
this.lastmdate = lastmdate;
this.creadtor = creadtor;
this.creatdate = creatdate;
}
/** default constructor */
public TSysuser() {
}
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUserdesc() {
return this.userdesc;
}
public void setUserdesc(String userdesc) {
this.userdesc = userdesc;
}
public String getPasswords() {
return this.passwords;
}
public void setPasswords(String passwords) {
this.passwords = passwords;
}
public String getDeptno() {
return this.deptno;
}
public void setDeptno(String deptno) {
this.deptno = deptno;
}
public String getHeadship() {
return this.headship;
}
public void setHeadship(String headship) {
this.headship = headship;
}
public String getSex() {
return this.sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getTel() {
return this.tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
public String getUrl() {
return this.url;
}
public void setUrl(String url) {
this.url = url;
}
public String getPcall() {
return this.pcall;
}
public void setPcall(String pcall) {
this.pcall = pcall;
}
public String getUserphoto() {
return this.userphoto;
}
public void setUserphoto(String userphoto) {
this.userphoto = userphoto;
}
public Integer getFacerefutime() {
return this.facerefutime;
}
public void setFacerefutime(Integer facerefutime) {
this.facerefutime = facerefutime;
}
public String getFacelanguage() {
return this.facelanguage;
}
public void setFacelanguage(String facelanguage) {
this.facelanguage = facelanguage;
}
public String getLastmodif() {
return this.lastmodif;
}
public void setLastmodif(String lastmodif) {
this.lastmodif = lastmodif;
}
public Date getLastmdate() {
return this.lastmdate;
}
public void setLastmdate(Date lastmdate) {
this.lastmdate = lastmdate;
}
public String getCreadtor() {
return this.creadtor;
}
public void setCreadtor(String creadtor) {
this.creadtor = creadtor;
}
public Date getCreatdate() {
return this.creatdate;
}
public void setCreatdate(Date creatdate) {
this.creatdate = creatdate;
}
public String toString() {
return new ToStringBuilder(this)
.append("username", getUsername())
.append("userdesc", getUserdesc())
.append("passwords", getPasswords())
.append("deptno", getDeptno())
.append("headship", getHeadship())
.append("sex", getSex())
.append("tel", getTel())
.append("email", getEmail())
.append("url", getUrl())
.append("pcall", getPcall())
.append("userphoto", getUserphoto())
.append("facerefutime", getFacerefutime())
.append("facelanguage", getFacelanguage())
.append("lastmodif", getLastmodif())
.append("lastmdate", getLastmdate())
.append("creadtor", getCreadtor())
.append("creatdate", getCreatdate())
.toString();
}
public boolean equals(Object other) {
if ( !(other instanceof TSysuser) ) return false;
TSysuser castOther = (TSysuser) other;
return new EqualsBuilder()
.append(this.getUsername(), castOther.getUsername())
.append(this.getUserdesc(), castOther.getUserdesc())
.append(this.getPasswords(), castOther.getPasswords())
.append(this.getDeptno(), castOther.getDeptno())
.append(this.getHeadship(), castOther.getHeadship())
.append(this.getSex(), castOther.getSex())
.append(this.getTel(), castOther.getTel())
.append(this.getEmail(), castOther.getEmail())
.append(this.getUrl(), castOther.getUrl())
.append(this.getPcall(), castOther.getPcall())
.append(this.getUserphoto(), castOther.getUserphoto())
.append(this.getFacerefutime(), castOther.getFacerefutime())
.append(this.getFacelanguage(), castOther.getFacelanguage())
.append(this.getLastmodif(), castOther.getLastmodif())
.append(this.getLastmdate(), castOther.getLastmdate())
.append(this.getCreadtor(), castOther.getCreadtor())
.append(this.getCreatdate(), castOther.getCreatdate())
.isEquals();
}
public int hashCode() {
return new HashCodeBuilder()
.append(getUsername())
.append(getUserdesc())
.append(getPasswords())
.append(getDeptno())
.append(getHeadship())
.append(getSex())
.append(getTel())
.append(getEmail())
.append(getUrl())
.append(getPcall())
.append(getUserphoto())
.append(getFacerefutime())
.append(getFacelanguage())
.append(getLastmodif())
.append(getLastmdate())
.append(getCreadtor())
.append(getCreatdate())
.toHashCode();
}
}
---------------------------------------------------------------------
/*
* 创建日期 2005-4-11
*
* 更改所生成文件模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
package com.yaya.service;
import java.util.List;
import com.yaya.hb.TSysuser;
import com.yaya.service.dao.IUserDao;
/**
* @author Administrator
*
* 更改所生成类型注释的模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
public interface IUserManager {
public void setUserDAO(IUserDao dao);
public TSysuser getUser(String username);
public List getUsers();
public TSysuser saveUser(TSysuser user);
public void removeUser(String username);
}
--------------------------------------------------------------------
/*
* 创建日期 2005-4-7
*
* 更改所生成文件模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
package com.yaya.service.dao;
/**
* @author Administrator
*
* 更改所生成类型注释的模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
public interface IDAO {
}
--------------------------------------------------------------
/*
* 创建日期 2005-4-11
*
* 更改所生成文件模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
package com.yaya.service.dao;
import java.util.List;
import com.yaya.hb.TSysuser;
/**
* @author Administrator
*
* 更改所生成类型注释的模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
public interface IUserDao extends IDAO {
public List getUsers();
public TSysuser getUser(String username);
public void saveUser(TSysuser user);
public void removeUser(String username);
}
----------------------------------------------------------
/*
* 创建日期 2005-4-11
*
* 更改所生成文件模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
package com.yaya.service.spring;
import com.yaya.hb.TSysuser;
import com.yaya.service.IUserManager;
import com.yaya.service.dao.IUserDao;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author Administrator
*
* 更改所生成类型注释的模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
public class UserManagerImpl implements IUserManager {
private static Log log = LogFactory.getLog(UserManagerImpl.class);
public IUserDao userDao;
/**
* @return 返回 userDao。
*/
public void setUserDAO(IUserDao dao) {
this.userDao = dao;
}
public IUserDao getUserDao() {
return userDao;
}
/**
* @param userDao 要设置的 userDao。
*/
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}
public TSysuser getUser(String username) {
try
{
TSysuser user = userDao.getUser(username);
return user;
}
catch(Exception e)
{
e.printStackTrace();
}
return userDao.getUser(username);
}
/* (非 Javadoc)
* @see com.jandar.service.IUserManager#getUsers()
*/
public List getUsers() {
// TODO 自动生成方法存根
return userDao.getUsers();
}
/* (非 Javadoc)
* @see com.jandar.service.IUserManager#saveUser(com.jandar.model.User)
*/
public TSysuser saveUser(TSysuser user) {
// TODO 自动生成方法存根
userDao.saveUser(user);
return user;
}
/* (非 Javadoc)
* @see com.jandar.service.IUserManager#removeUser(java.lang.String)
*/
public void removeUser(String username) {
// TODO 自动生成方法存根
userDao.removeUser(username);
}
}
整合struts与hibernate
使用struts的plugin机制将Hibernate配置进去,下面转贴一篇说明的文章
1、建立一个Class,HibernatePlugIn 放在src下
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.cfg.Configuration;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.action.PlugIn;
import org.apache.struts.config.ModuleConfig;
public class HibernatePlugIn implements PlugIn {
public void destroy() {
}
public void init(ActionServlet servlet, ModuleConfig config) throws ServletException {
try{
ServletContext context = null;
context = servlet.getServletContext();
SessionFactory sf = new Configuration().configure().
buildSessionFactory();
context.setAttribute("net.sf.hibernate.SessionFactory", sf);
}
catch(Exception e){
e.printStackTrace();
}
}
}
2、在struts-config.xml中添加
3、将hibernate.cfx.xml放在src目录下,并且属性设为copy
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
这样以后就可以在任何地方调用了
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.Configuration;
import net.sf.hibernate.tool.hbm2ddl.SchemaExport;
import javax.naming.InitialContext;
import javax.naming.Context;
public class MyService {
private SessionFactory sf;
public LoginService() throws Exception {
Context ctx = new InitialContext();
sf = (SessionFactory) ctx.lookup("hibernate/session_factory");
}
}
sourceBuild-srcIncluded-2.1.1.zip
http://download2.eclipse.org/downloads/drops/R-2.1.1-200306271545/eclipse-examples-2.1.1-win32.zip
Eclipse 教学的例子:
ftp://download2.eclipse.org/R-2.1.1-200306271545/eclipse-examples-2.1.1-win32.zip
http://download2.eclipse.org/downloads/drops/R-2.1.1-200306271545/download.php?dropFile=eclipse-examples-2.1.1-win32.zip
Jetty launcher for Eclipse:http://sourceforge.net/projects/spindle/
Tomcat launcher for Eclipse:http://www.sysdeo.com/eclipse/tomcatPlugin.html
EASIE,JBoss launcher for Eclipse:http://www.genuitec.com/products_easie.htm
这个 launcher 已经不提供单独下载,需要的可以与我联系。
Lomboz,另一个开源的 JBoss/Tomcat launcher for Eclipse:
http://www.objectlearn.com/products/lomboz.jsp
顺便说一句,这个 Lomboz 可以做很多事情,是使用 Eclipse+JBoss 做 J2EE 的首选。
Eclipse PDF 文档:http://eclipsewiki.swiki.net/239
Eclipse 教程:
http://www.3plus4software.de/eclipse/index_en.html
几个德国人写了一套不错的教程。
http://www.cs.umanitoba.ca/~eclipse/
比较有趣的是教程中有一篇在 Windows 上使用 GCJ 编译 native 的 Eclipse 应用程序的文档:
http://www.cs.umanitoba.ca/~eclipse/6-Compiling.pdf
使用的工具就是以前我和 robbin 等朋友讨论过的 GCJ for Windows。例子中访问 MySQL 数据库也是采用使用 GCJ 将 JDBC Driver 编译成 native 代码再连接的方法,看来老外也没什么好的招数。
Eclipse Platform Technical Overview
http://www.eclispe.org/whitepapeers/eclipse-overview.pdf
Open Source Tools: A Look At Eclipse
http://www.theopenenterprise.com/story/TOE20021007S0005
OMG Joins Eclipse Open Source Group
http://news.com.com/2110-1001_3-976783.html
Open-Source Eclipse Will Gain Independence, Broader Appeal
http://www.gartner.com/DisplayDocument?doc_cd=117260
$40 Million Donation Of Software To Open Source Community
http://www.ibm.com/news/us/2001/11/05.html
XML Development With The Open Source Eclipse Platform
http://www.linuxdevices.com/news/NS7141113481.html
Eclipse Loads Open Source Technology Project
http://www.aspnews.com/news/article/0,,4191_1455131,00.html
Eclipse Workbench
http://www.eclipse-workbench.com/jsp/
IBM's Open Source Plan To "Eclipse"
http://linuxtoday.com/developer/2002110401826NWSWDV
Microsoft And Eclipse Open Source
http://www.hi.is/~joner/eaps/to_ecli.htm
Review: Eclipse 3,0 Milestone Build 2
http://javaboutique.internet.com/reviews/eclipse_build2/
Java-Based, Open Source Eclipse
http://www.trilug.org/pipermail/trilug/Week-of-Mon-20011105/001814.html
Eclipse Sheds Light On Tool Update
http://msn-cnet.com.com/2100-1007_3-1010704.html
IBM's Open-Source Platform Earns Praise From Developers
http://www.eweek.com/article2/0,3959,3963,00.asp
JavaOne: HP Intros Open Source Eclipse IDE Tool
http://www.iapplianceweb.com/story/OEG20030612S0048
Java Development Gains Consistency Under Eclipse IDE
http://www.newtechusa.com/Viewpoints/EclipseProject.asp
Open Source Content Management For Midsze, Large Enterprises
http://eclipseadvisor.com/doc/12694
Eclipse Adds Open Source Visual Tools Project
http://websphereadvisor.com/doc/09719
JESS: Open Source Java IDE
http://www.mail-archive.com/jess-users@sandia.gov/msg05635.html
Eclipse Launches Technology Project Supporting Research, Education And Engineering Initiatives
http://www.realtime-info.be/VPR/layout/display/pr.asp?PRID=3524
HP Brews Up Open Source Java Tool
http://www.computerworld.com/developmenttopics/development/webdev/story/0,10801,82005,00.html
New Eclipse Project Addresses Automated Software Quality
http://www.devx.com/DevX/Article/10395
C/C++ Development Eclipse Platform
http://www.artima.com/forums/flat.jsp?forum=141&thread=8263
Predicting The Open Source Eclipses
http://www.indiawebdevelopers.com/technology/open_source/predicting_eclipses.asp
Eclipse 2.1 Available For Download
http://openstandardsadvisor.com/doc/12213
Eclipse: An Open Source Tool Framework
http://130.157.198.5/blogs/archives/oscon2003/000013.html
Open Source: IBM's Deadly Weapon
http://techupdate.zdnet.com/techupdate/stories/main/0,14179,2860394,00.html
Open Source 生力军, 开发平台新星-- Eclipse
http://www.itnet.org.tw/ssl/html-new/technical_trend/2003_10.pdf
PHPEclipse - An Open Source PHP IDE
http://phpeclipse.sourceforge.net/
Get Up To Speed On Open Source
http://rss.com.com/2001-7344_3-0.html
How To Set Up Your Eclipse Environment
http://aikernel.sourceforge.net/participation/configuration.shtml
Eclipse Restructuring Seeks Broader Industry Input
http://www.cbronline.com/print_friendly/b096965887e6c9a380256d940018c964
Eclipse Must Be Truly Rich !
http://www.manageability.org/blog/stuff/eclipse-must-be-truly-rich/view
What's Eclipse ?
http://portals.devx.com/ibm/Article/6884
IBM's Eclipse vs. SUN's NetBeans ? Not Really
http://www.oreillynet.com/pub/wlg/1164
IBM To Release New Eclipse To Run On Jikes VM (NewsForge)
http://lwn.net/Articles/47017/?format=printable
Eclipse Plans Open Source UML Testing Tools
http://www.computerwire.com/cgnews/5628769C2CABDF0000256D01007C0800
Open Source Java - Eclipse
http://www.oreillynet.com/pub/d/1220
Eclipse 2 For java Developers (Book) 2003
http://www.amazon.co.uk/exec/obidos/ASIN/0470869054/ref=pd_sim_b_dp_5/026-7881181-8150061
Eclipse In Action: A Guide For Java Developers (Book) 2003
http://www.amazon.co.jp/exec/obidos/ASIN/1930110960/249-2372347-3785935
The Java Developer's Guide To Eclipse (Book) 2003
http://www.amazon.co.jp/exec/obidos/ASIN/0321159640/ref=pd_sim_dp_1/249-2372347-3785935
Eclipse.org Releases Improved Open Source Platform
http://www.infoworld.com/article/03/04/08/HNeclipse_1.html
Open-Source Software Environment To Challenge Proprietaries
http://www.eetuk.com/bus/news/st/OEG20011210S0016
Eclipse - Commercial Grade Java Development Environment
http://dynalinks.dnsalias.org/?section=category&ss=48
EclipseUML
http://www.omondo.com/
The Best Java/UML Reverse Engineering Tool _EclipseUML Free Edition 1.1.9
http://www.javalobby.com/thread.jsp?forum=76&thread=7235
Eclipse Modeling Framework (EMF)
http://www.eclipse.org/emf/
Eclipse Modeling Framework (Book) 2003
http://www.amazon.com/exec/obidos/tg/detail/-/0131425420/103-0155393-1131826?v=glance
Eclipse: Step By Step (Book) 2003
http://www.amazon.com/exec/obidos/tg/detail/-/1583470441/ref=pd_sim_books_3
常常在网上看到有人询问:如何把 java 程序编译成 .exe 文件。通常回答只有两种,一种是制作一个可执行的 JAR 文件包,然后就可以像.chm 文档一样双击运行了;而另一种是使用 JET 来进行 编译。但是 JET 是要用钱买的,而且据说 JET 也不是能把所有的 Java 程序都编译成执行文件,性能也要打些折扣。所以,使用制作可执行 JAR 文件包的方法就是最佳选择了,何况它还能保持 Java 的跨平台特性。
下面就来看看什么是 JAR 文件包吧:
1. JAR 文件包
JAR 文件就是 Java Archive File,顾名思意,它的应用是与 Java 息息相关的,是 Java 的一种文档格式。JAR 文件非常类似 ZIP 文件——准确的说,它就是 ZIP 文件,所以叫它文件包。JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中,包含了一个 META-INF/MANIFEST.MF 文件,这个文件是在生成 JAR 文件的时候自动创建的。举个例子,如果我们具有如下目录结构的一些文件:
==
`-- test
`-- Test.class
把它压缩成 ZIP 文件 test.zip,则这个 ZIP 文件的内部目录结构为:
test.zip
`-- test
`-- Test.class
如果我们使用 JDK 的 jar 命令把它打成 JAR 文件包 test.jar,则这个 JAR 文件的内部目录结构为:
test.jar
|-- META-INF
| `-- MANIFEST.MF
`-- test
`--Test.class
2. 创建可执行的 JAR 文件包
制作一个可执行的 JAR 文件包来发布你的程序是 JAR 文件包最典型的用法。
Java 程序是由若干个 .class 文件组成的。这些 .class 文件必须根据它们所属的包不同而分级分目录存放;运行前需要把所有用到的包的根目录指定给 CLASSPATH 环境变量或者 java 命令的 -cp 参数;运行时还要到控制台下去使用 java 命令来运行,如果需要直接双击运行必须写 Windows 的批处理文件 (.bat) 或者 Linux 的 Shell 程序。因此,许多人说,Java 是一种方便开发者苦了用户的程序设计语言。
其实不然,如果开发者能够制作一个可执行的 JAR 文件包交给用户,那么用户使用起来就方便了。在 Windows 下安装 JRE (Java Runtime Environment) 的时候,安装文件会将 .jar 文件映射给 javaw.exe 打开。那么,对于一个可执行的 JAR 文件包,用户只需要双击它就可以运行程序了,和阅读 .chm 文档一样方便 (.chm 文档默认是由 hh.exe 打开的)。那么,现在的关键,就是如何来创建这个可执行的 JAR 文件包。
创建可执行的 JAR 文件包,需要使用带 cvfm 参数的 jar 命令,同样以上述 test 目录为例,命令如下:
jar cvfm test.jar manifest.mf test
这里 test.jar 和 manifest.mf 两个文件,分别是对应的参数 f 和 m,其重头戏在 manifest.mf。因为要创建可执行的 JAR 文件包,光靠指定一个 manifest.mf 文件是不够的,因为 MANIFEST 是 JAR 文件包的特征,可执行的 JAR 文件包和不可执行的 JAR 文件包都包含 MANIFEST。关键在于可执行 JAR 文件包的 MANIFEST,其内容包含了 Main-Class 一项。这在 MANIFEST 中书写格式如下:
Main-Class: 可执行主类全名(包含包名)
例如,假设上例中的 Test.class 是属于 test 包的,而且是可执行的类 (定义了 public static void main(String[]) 方法),那么这个 manifest.mf 可以编辑如下:
Main-Class: test.Test <回车>
这个 manifest.mf 可以放在任何位置,也可以是其它的文件名,只需要有 Main-Class: test.Test 一行,且该行以一个回车符结束即可。创建了 manifest.mf 文件之后,我们的目录结构变为:
==
|-- test
| `-- Test.class
`-- manifest.mf
这时候,需要到 test 目录的上级目录中去使用 jar 命令来创建 JAR 文件包。也就是在目录树中使用“==”表示的那个目录中,使用如下命令:
jar cvfm test.jar manifest.mf test
之后在“==”目录中创建了 test.jar,这个 test.jar 就是执行的 JAR 文件包。运行时只需要使用 java -jar test.jar 命令即可。
需要注意的是,创建的 JAR 文件包中需要包含完整的、与 Java 程序的包结构对应的目录结构,就像上例一样。而 Main-Class 指定的类,也必须是完整的、包含包路径的类名,如上例的 test.Test;而且在没有打成 JAR 文件包之前可以使用 java <类名> 来运行这个类,即在上例中 java test.Test 是可以正确运行的 (当然要在 CLASSPATH 正确的情况下)。
3. jar 命令详解
jar 是随 JDK 安装的,在 JDK 安装目录下的 bin 目录中,Windows 下文件名为 jar.exe,Linux 下文件名为 jar。它的运行需要用到 JDK 安装目录下 lib 目录中的 tools.jar 文件。不过我们除了安装 JDK 什么也不需要做,因为 SUN 已经帮我们做好了。我们甚至不需要将 tools.jar 放到 CLASSPATH 中。
使用不带任何的 jar 命令我们可以看到 jar 命令的用法如下:
jar {ctxu}[vfm0M] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...
其中 {ctxu} 是 jar 命令的子命令,每次 jar 命令只能包含 ctxu 中的一个,它们分别表示:
-c 创建新的 JAR 文件包
-t 列出 JAR 文件包的内容列表
-x 展开 JAR 文件包的指定文件或者所有文件
-u 更新已存在的 JAR 文件包 (添加文件到 JAR 文件包中)
[vfm0M] 中的选项可以任选,也可以不选,它们是 jar 命令的选项参数
-v 生成详细报告并打印到标准输出
-f 指定 JAR 文件名,通常这个参数是必须的
-m 指定需要包含的 MANIFEST 清单文件
-0 只存储,不压缩,这样产生的 JAR 文件包会比不用该参数产生的体积大,但速度更快
-M 不产生所有项的清单(MANIFEST〕文件,此参数会忽略 -m 参数
[jar-文件] 即需要生成、查看、更新或者解开的 JAR 文件包,它是 -f 参数的附属参数
[manifest-文件] 即 MANIFEST 清单文件,它是 -m 参数的附属参数
[-C 目录] 表示转到指定目录下去执行这个 jar 命令的操作。它相当于先使用 cd 命令转该目录下再执行不带 -C 参数的 jar 命令,它只能在创建和更新 JAR 文件包的时候可用。
文件名 ... 指定一个文件/目录列表,这些文件/目录就是要添加到 JAR 文件包中的文件/目录。如果指定了目录,那么 jar 命令打包的时候会自动把该目录中的所有文件和子目录打入包中。
下面举一些例子来说明 jar 命令的用法:
1) jar cf test.jar test
该命令没有执行过程的显示,执行结果是在当前目录生成了 test.jar 文件。如果当前目录已经存在 test.jar,那么该文件将被覆盖。
2) jar cvf test.jar test
该命令与上例中的结果相同,但是由于 v 参数的作用,显示出了打包过程,如下:
标明清单(manifest)
增加:test/(读入= 0) (写出= 0)(存储了 0%)
增加:test/Test.class(读入= 7) (写出= 6)(压缩了 14%)
3) jar cvfM test.jar test
该命令与 2) 结果类似,但在生成的 test.jar 中没有包含 META-INF/MANIFEST 文件,打包过程的信息也略有差别:
增加:test/(读入= 0) (写出= 0)(存储了 0%)
增加:test/Test.class(读入= 7) (写出= 6)(压缩了 14%)
4) jar cvfm test.jar manifest.mf test
运行结果与 2) 相似,显示信息也相同,只是生成 JAR 包中的 META-INF/MANIFEST 内容不同,是包含了 manifest.mf 的内容
5) jar tf test.jar
在 test.jar 已经存在的情况下,可以查看 test.jar 中的内容,如对于 2) 和 3) 生成的 test.jar 分别应该此命令,结果如下;
对于 2)
META-INF/
META-INF/MANIFEST.MF
test/
test/Test.class
对于 3)
test/
test/Test.class
6) jar tvf test.jar
除显示 5) 中显示的内容外,还包括包内文件的详细信息,如:
0 Wed Jun 19 15:39:06 GMT 2002 META-INF/
86 Wed Jun 19 15:39:06 GMT 2002 META-INF/MANIFEST.MF
0 Wed Jun 19 15:33:04 GMT 2002 test/
7 Wed Jun 19 15:33:04 GMT 2002 test/Test.class
7) jar xf test.jar
解开 test.jar 到当前目录,不显示任何信息,对于 2) 生成的 test.jar,解开后的目录结构如下:
==
|-- META-INF
| `-- MANIFEST
`-- test
`--Test.class
jar xvf test.jar
运行结果与 7) 相同,对于解压过程有详细信息显示,如:
创建:META-INF/
展开:META-INF/MANIFEST.MF
创建:test/
展开:test/Test.class
9) jar uf test.jar manifest.mf
在 test.jar 中添加了文件 manifest.mf,此使用 jar tf 来查看 test.jar 可以发现 test.jar 中比原来多了一个 manifest。这里顺便提一下,如果使用 -m 参数并指定 manifest.mf 文件,那么 manifest.mf 是作为清单文件 MANIFEST 来使用的,它的内容会被添加到 MANIFEST 中;但是,如果作为一般文件添加到 JAR 文件包中,它跟一般文件无异。
10) jar uvf test.jar manifest.mf
与 9) 结果相同,同时有详细信息显示,如:
增加:manifest.mf(读入= 17) (写出= 19)(压缩了 -11%)
4. 关于 JAR 文件包的一些技巧
1) 使用 unzip 来解压 JAR 文件
在介绍 JAR 文件的时候就已经说过了,JAR 文件实际上就是 ZIP 文件,所以可以使用常见的一些解压 ZIP 文件的工具来解压 JAR 文件,如 Windows 下的 WinZip、WinRAR 等和 Linux 下的 unzip 等。使用 WinZip 和 WinRAR 等来解压是因为它们解压比较直观,方便。而使用 unzip,则是因为它解压时可以使用 -d 参数指定目标目录。
在解压一个 JAR 文件的时候是不能使用 jar 的 -C 参数来指定解压的目标的,因为 -C 参数只在创建或者更新包的时候可用。那么需要将文件解压到某个指定目录下的时候就需要先将这具 JAR 文件拷贝到目标目录下,再进行解压,比较麻烦。如果使用 unzip,就不需要这么麻烦了,只需要指定一个 -d 参数即可。如:
unzip test.jar -d dest/
2) 使用 WinZip 或者 WinRAR 等工具创建 JAR 文件
上面提到 JAR 文件就是包含了 META-INF/MANIFEST 的 ZIP 文件,所以,只需要使用 WinZip、WinRAR 等工具创建所需要 ZIP 压缩包,再往这个 ZIP 压缩包中添加一个包含 MANIFEST 文件的 META-INF 目录即可。对于使用 jar 命令的 -m 参数指定清单文件的情况,只需要将这个 MANIFEST 按需要修改即可。
3) 使用 jar 命令创建 ZIP 文件
有些 Linux 下提供了 unzip 命令,但没有 zip 命令,所以需要可以对 ZIP 文件进行解压,即不能创建 ZIP 文件。如要创建一个 ZIP 文件,使用带 -M 参数的 jar 命令即可,因为 -M 参数表示制作 JAR 包的时候不添加 MANIFEST 清单,那么只需要在指定目标 JAR 文件的地方将 .jar 扩展名改为 .zip 扩展名,创建的就是一个不折不扣的 ZIP 文件了,如将上一节的第 3) 个例子略作改动:
jar cvfM test.zip test zmbbs=1;
//需要把lotus里的notes.jar,ncso.jar放入classpath
**
*
Title: 图形化设计
*
Description:
*
Copyright: Copyright (c) 2004
*
Company:
* @author zhongweihai newwei2001@yahoo.com.cn
* @version 1.0
*/
import lotus.domino.*;
public class ConnDomino {
public Session getSession(String sip,String username,String password)
{
lotus.domino.Session s;
String sior;
try {
sior =NotesFactory.getIOR(sip+":63148");
s = NotesFactory.createSessionWithIOR(sior,username,password);
}
catch (Exception ex) {
s = null;
}
return s;
}
public static void main(String[] args)
{
String host="10.81.3.11";
String user="admin";
String pwd="domino";
Session s;
ConnDomino conn = new ConnDomino();
s = conn.getSession(host,user,pwd);
try{
System.out.println(s.getUserName());
}
catch(Exception e){}
}
}
Web应用框架Echo2近日宣布发行新版本2.0 rc2,其中对主要功能作了改进。
ECHO2是一个基于Mozilla Public License的开源WEB框架。它采用全新的AJAX(Asynchronous JavaScript and XML) Web界面绘制引擎。所有的client/server的交互采用XMLHttpRequest方式。这样就使用户感觉到像操作桌面应用程序一样的流畅, 同传统的WEB应用程序相比,性能也发生戏剧性的改善。在ECHO2中,所有的WEB界面的绘制功能都是ECHO2的基于java的UI工具完成的。开发者只需要像开发swing界面一样,用它的UI工具来写界面就行了。
新版本的使用指南现在可以从Echo2网页上下载。新版中增加了一个聊天室的程序示例,以此来展示Echo2的服务器推技术。此外,该版本中还添加了设置还原滚动条的功能,修补了一些bug。
下载地址:http://freshmeat.net/redir/echo2/58178/url_tgz/download
Author:sungo
前言:
本来我都是使用JBuilderX当主力IDE、但使用了Eclipse后
发现...Eclipse原来也这么好用...渐渐的就爱上了它......
Eclipse优点:免费、程序代码排版功能、有中文化包、可增
设许多功能强大的外挂、支持多种操作系统(Windows、
Linux、Solaris、Mac OSX)..等等。
开此篇讨论串的目的,是希望能将Eclipse的一些使用技巧集
合起来...欢迎大家继续补充下去...由于Eclipse的版本众多
,希望补充的先进们能顺便说明一下您所使用的版本~
Eclipse网站:http://www.eclipse.org/ ;
Eclipse中文化教学:JavaWorld站内文章参考
(使用版本:Eclipse 2.1.2 Release + 中文化)
热键篇:
Template:Alt + /
修改处:窗口->喜好设定->工作台->按键->编辑->内容辅助。
个人习惯:Shift+SPACE(空白)。
简易说明:编辑程序代码时,打sysout +Template启动键,就
会自动出现:System.out.println(); 。
设定Template的格式:窗口->喜好设定->Java->编辑器->模板。
程序代码自动排版:Ctrl+Shift+F
修改处:窗口->喜好设定->工作台->按键->程序代码->格式。
个人习惯:Alt+Z。
自动排版设定:窗口->喜好设定->Java->程序代码格式制作程序。
样式页面->将插入tab(而非空格键)以内缩,该选项取消勾选
,下面空格数目填4,这样在自动编排时会以空格4作缩排。
快速执行程序:Ctrl + F11
个人习惯:ALT+X
修改处:窗口->喜好设定->工作台->按键->执行->启动前一次的启动作业。
简易说明:第一次执行时,它会询问您执行模式,
设置好后,以后只要按这个热键,它就会快速执行。
自动汇入所需要的类别:Ctrl+Shift+O
简易说明:
假设我们没有Import任何类别时,当我们在程序里打入:
BufferedReader buf =
new BufferedReader(new InputStreamReader(System.in));
此时Eclipse会警示说没有汇入类别,这时我们只要按下Ctrl+Shift+O
,它就会自动帮我们Import类别。
查看使用类别的原始码:Ctrl+鼠标左键点击
简易说明:可以看到您所使用类别的原始码。
将选取的文字批注起来:Ctrl+/
简易说明:Debug时很方便。
修改处:窗口->喜好设定->工作台->按键->程序代码->批注
视景切换:Ctrl+F8
个人习惯:Alt+S。
修改处:窗口->喜好设定->工作台->按键->窗口->下一个视景。
简易说明:可以方便我们快速切换编辑、除错等视景。
密技篇:
一套Eclipse可同时切换,英文、繁体、简体显示:
1.首先要先安装完中文化包。
2.在桌面的快捷方式后面加上参数即可,
英文-> -nl "zh_US"
繁体-> -nl "zh_TW"
简体-> -nl "zh_CN"。
(其它语系以此类推)
像我2.1.2中文化后,我在我桌面的Eclipse快捷方式加入参数-n1 "zh_US"。
"C:\Program Files\eclipse\eclipse.exe" -n "zh_US"
接口就会变回英文语系噜。
利用Eclipse,在Word编辑文书时可不必将程序代码重新编排:
将Eclipse程序编辑区的程序代码整个复制下来(Ctrl+C),直接贴(Ctrl+V)到
Word或WordPad上,您将会发现在Word里的程序代码格式,跟Eclipse
所设定的完全一样,包括字型、缩排、关键词颜色。我曾试过JBuilder
、GEL、NetBeans...使用复制贴上时,只有缩排格式一样,字型、颜
色等都不会改变。
外挂篇:
外挂安装:将外挂包下载回来后,将其解压缩后,您会发现features、
plugins这2个数据夹,将里面的东西都复制或移动到Eclipse的features
、plugins数据夹内后,重新启动Eclipse即可。
让Eclipse可以像JBuilderX一样使用拖拉方式建构GUI的外挂:
1.Jigloo SWT/Swing GUI Builder :
http://cloudgarden.com/jigloo/index.html ;
下载此版本:Jigloo plugin for Eclipse (using Java 1.4 or 1.5)
安装后即可由档案->新建->其它->GUI Form选取要建构的GUI类型。
2.Eclipse Visual Editor Project:
http://www.eclipse.org/vep/ ;
点选下方Download Page,再点选Latest Release 0.5.0进入下载。
除了VE-runtime-0.5.0.zip要下载外,以下这2个也要:
EMF build 1.1.1: (build page) (download zip)
GEF Build 2.1.2: (build page) (download zip)
3.0 M8版本,请下载:
EMF build I200403250631
GEF Build I20040330
VE-runtime-1.0M1
安装成功后,便可由File->New->Visual Class开始UI设计。
安装成功后,即可由新建->Java->AWT与Swing里选择
所要建构的GUI类型开始进行设计。VE必须配合着对应
版本,才能正常使用,否则即使安装成功,使用上仍会
有问题。
使用Eclipse来开发JSP程序:
外挂名称:lomboz(下载页面)
http://forge.objectweb.org/project/showfiles.php?group_id=97 ;
请选择适合自己版本的lomboz下载,lomboz.212.p1.zip表示2.1.2版,
lomboz.3m7.zip表示M7版本....以此类推。
lomboz安装以及设置教学:
Eclipse开发JSP-教学文件
Java转exe篇:
实现方式:Eclipse搭配JSmooth(免费)。
1.先由Eclipse制作包含Manifest的JAR。
制作教学
2.使用JSmooth将做好的JAR包装成EXE。
JSmooth下载页面:
http://jsmooth.sourceforge.net/index.php ;
3.制作完成的exe文件,可在有装置JRE的Windows上执行。
Eclipse-Java编辑器最佳设定:
编辑器字型设定:工作台->字型->Java编辑器文字字型。
(建议设定Courier New -regular 10)
编辑器相关设定:窗口->喜好设定->Java->编辑器
外观:显示行号、强调对称显示的方括号、强调显示现行行、
显示打印边距,将其勾选,Tab宽度设4,打印编距字段设80。
程序代码协助:采预设即可。
语法:可设定关键词、字符串等等的显示颜色。
附注:采预设即可。
输入:全部字段都勾选。
浮动说明:采预设即可。
导览:采预设即可。
使自动排版排出来的效果,最符合Java设计惯例的设定:
自动排版设定:窗口->喜好设定->Java->程序代码制作格式。
换行:全部不勾选。
分行:行长度上限设:80。
样式:只将强制转型后插入空白勾选。
内缩空格数目:设为4。
Eclipse的教学文件:
Eclipse 3.0系列热键表 - 中英对照解说版 (by sungo) ~New~
Window+GCC+CDT用Eclipse开发C、C++ (by sungo) ~New~
其它:
扩充Eclipse的Java 开发工具(中文)
使用Eclipse开发J2EE 应用程序(中文)
使用Eclipse平台进行除错(中文)
用Eclipse进行XML 开发(中文)
开发Eclipse外挂程序(中文)
国际化您的Eclipse外挂程序(英文)
将Swing编辑器加入Eclipse(英文)
如何测试你的Eclipse plug-in符合国际市场需求(英文)
Eclipse的相关网站:
http://eclipse-plugins.2y.net/eclipse/index.jsp ;
http://www.eclipseplugincentral.com/ ;
Eclipse相关教学[简体]
写程序写到很累了,想休息一下??玩玩小Game是
不错的选择,下面介绍使用Eclipse玩Game的Plug-in。
补充外挂篇:
Eclipse-Games:
http://eclipse-games.sourceforge.net/ ;
版本选:Latest Release 3.0.1 (Release Notes) Sat, 3 Jan 2004
外挂安装完后,重新开启Eclipse。
窗口->自订视景->其它->勾选Game Actions。
再将Eclipse关闭,重新再启动,就可以开始玩噜。
(共有4种:采地雷I、采地雷II、贪食蛇、仓库番。)
(Eclipse 2.1.2 +中文化 玩Game -仓库番)
补充:(于Eclipse使用assertion机制)
Eclipse版本:2.1.3 release。
JDK1.4版新加入的assertion机制(关键词:assert),由于JDK1.4编译器
预设是兼容1.3,所以要使用assert必须在编译时加上-source 1.4的参数。
C:\>javac -source 1.4 XXX.java
执行时则必须加-ea 或-enableassertions参数启动。
C:\>java -ea XXX
如要在Eclipse中使用assertion机制,请作以下设定:
设定一:(编译设定)
Windows->Preferance->Java->Compiler->Compliance and Classfiles
页面。将..JDK Compliance level->Compiler compliance level调成1.4。
设定二:(执行设定)
Run->Run->(x)=Arguments页面,在VM arguments加入-da参数,按下
Run button便可看到启动assertion后的执行结果。
(Eclipse 2.1.3 release + assertion测试)
新版(m8+)的eclipse可以设vm arguments
另外提供一种设法,是在eclipse启动时加入vm arguments(跟加大eclipse预设内存大小的方式一样)
这样就不用每次run都得需去设vm arguments
来源:www.javajia.com
(1)Easy:Java的语法比C++的相对简单,另一个方面就是Java能使软件在很小的机器上运行,基础解释其和类库的支持的大小约为40kb,增加基本的标准库和线程支持的内存需要增加125kb。
(2)分布式:Java带有很强大的TCP/IP协议族的例程库,Java应用程序能够通过URL来穿过网络来访问远程对象,由于servlet机制的出现,使Java编程非常的高效,现在许多的大的web server都支持servlet。
(3)OO:面向对象设计是把重点放在对象及对象的接口上的一个编程技术.其面向对象和C++有很多不同,在与多重继承的处理及Java的原类模型。
(4)健壮特性:Java采取了一个安全指针模型,能减小重写内存和数据崩溃的可能型。
(5)安全:Java用来设计网路和分布系统,这带来了新的安全问题,Java可以用来构建防病毒和防攻击的System.事实证明Java在防毒这一方面做的比较好。
(6)中立体系结构:Java编译其生成体系结构中立的目标文件格式可以在很多处理器上执行,编译器产生的指令字节码(Javabytecode)实现此特性,此字节码可以在任何机器上解释执行。
(7)可移植性:Java中对基本数据结构类型的大小和算法都有严格的规定所以可移植性很好。
(8)多线程:Java处理多线程的过程很简单,Java把多线程实现交给底下操作系统或线程程序完成.所以多线程是Java作为服务器端开发语言的流行原因之一。
(9)Applet和servlet:能够在网页上执行的程序叫Applet,需要支持Java的浏览器很多,而applet支持动态的网页,这是很多其他语言所不能做到的。
基本概念
1.OOP中唯一关系的是对象的接口是什么,就像计算机的销售商她不管电源内部结构是怎样的,他只关系能否给你提供电就行了,也就是只要知道can or not而不是how and why.所有的程序是由一定的属性和行为对象组成的,不同的对象的访问通过函数调用来完成,对象间所有的交流都是通过方法调用,通过对封装对象数据,很大限度上提高复用率。
2.OOP中最重要的思想是类,类是模板是蓝图,从类中构造一个对象,即创建了这个类的一个实例(instance)。
3.封装:就是把数据和行为结合起在一个包中)并对对象使用者隐藏数据的实现过程,一个对象中的数据叫他的实例字段(instance field)。
4.通过扩展一个类来获得一个新类叫继承(inheritance),而所有的类都是由Object根超类扩展而得,根超类下文会做介绍。
5.对象的3个主要特性
behavior---说明这个对象能做什么.
state---当对象施加方法时对象的反映.
dentity---与其他相似行为对象的区分标志.
每个对象有唯一的indentity 而这3者之间相互影响.
6.类之间的关系:
use-a :依赖关系
has-a :聚合关系
is-a :继承关系--例:A类继承了B类,此时A类不仅有了B类的方法,还有其自己的方法.(个性存在于共性中)
7.构造对象使用构造器:构造器的提出,构造器是一种特殊的方法,构造对象并对其初始化。
例:Data类的构造器叫Data
new Data()---构造一个新对象,且初始化当前时间.
Data happyday=new Data()---把一个对象赋值给一个变量happyday,从而使该对象能够多次使用,此处要声明的使变量与对象变量二者
是不同的.new返回的值是一个引用。
构造器特点:构造器可以有0个,一个或多个参数
构造器和类有相同的名字
一个类可以有多个构造器
构造器没有返回值
构造器总是和new运算符一起使用.
8.重载:当多个方法具有相同的名字而含有不同的参数时,便发生重载.编译器必须挑选出调用哪个方法。
9.包(package)Java允许把一个或多个类收集在一起成为一组,称作包,以便于组织任务,标准Java库分为许多包.java.lang java.util java,net等,包是分层次的所有的java包都在java和javax包层次内。
10.继承思想:允许在已经存在的类的基础上构建新的类,当你继承一个已经存在的类时,那么你就复用了这个类的方法和字段,同时你可以在新类中添加新的方法和字段。
11.扩展类:扩展类充分体现了is-a的继承关系. 形式为:class (子类) extends (基类)。
12.多态:在java中,对象变量是多态的.而java中不支持多重继承。
13.动态绑定:调用对象方法的机制。
(1)编译器检查对象声明的类型和方法名。
(2)编译器检查方法调用的参数类型。
(3)静态绑定:若方法类型为priavte static final 编译器会准确知道该调用哪个方法。
(4)当程序运行并且使用动态绑定来调用一个方法时,那么虚拟机必须调用x所指向的对象的实际类型相匹配的方法版本。
(5)动态绑定:是很重要的特性,它能使程序变得可扩展而不需要重编译已存代码。
14.final类:为防止他人从你的类上派生新类,此类是不可扩展的。
15.动态调用比静态调用花费的时间要长。
16.抽象类:规定一个或多个抽象方法的类本身必须定义为abstract。
例: public abstract string getDescripition
17.Java中的每一个类都是从Object类扩展而来的。
18.object类中的equal和toString方法。
equal用于测试一个对象是否同另一个对象相等。
toString返回一个代表该对象的字符串,几乎每一个类都会重载该方法,以便返回当前状态的正确表示.
(toString 方法是一个很重要的方法)
19.通用编程:任何类类型的所有值都可以同object类性的变量来代替。
20.数组列表:ArrayList动态数组列表,是一个类库,定义在java.uitl包中,可自动调节数组的大小。
21.class类 object类中的getclass方法返回ckass类型的一个实例,程序启动时包含在main方法的类会被加载,虚拟机要加载他需要的所有类,每一个加载的类都要加载它需要的类。
22.class类为编写可动态操纵java代码的程序提供了强大的功能反射,这项功能为JavaBeans特别有用,使用反射Java能支持VB程序员习惯使用的工具。
能够分析类能力的程序叫反射器,Java中提供此功能的包叫Java.lang.reflect反射机制十分强大.
1.在运行时分析类的能力。
2.在运行时探察类的对象。
3.实现通用数组操纵代码。
4.提供方法对象。
而此机制主要针对是工具者而不是应用及程序。
反射机制中的最重要的部分是允许你检查类的结构.用到的API有:
java.lang.reflect.Field 返回字段.
java.reflect.Method 返回方法.
java.lang.reflect.Constructor 返回参数.
方法指针:java没有方法指针,把一个方法的地址传给另一个方法,可以在后面调用它,而接口是更好的解决方案。
23.接口(Interface)说明类该做什么而不指定如何去做,一个类可以实现一个或多个interface。
24.接口不是一个类,而是对符合接口要求的类的一套规范。
若实现一个接口需要2个步骤:
1.声明类需要实现的指定接口。
2.提供接口中的所有方法的定义。
声明一个类实现一个接口需要使用implements 关键字
class actionB implements Comparable 其actionb需要提供CompareTo方法,接口不是类,不能用new实例化一个接口.
25.一个类只有一个超类,但一个类能实现多个接口。Java中的一个重要接口:Cloneable
26.接口和回调.编程一个常用的模式是回调模式,在这种模式中你可以指定当一个特定时间发生时回调对象上的方法。
例:ActionListener 接口监听.
类似的API有:java.swing.JOptionPane
java.swing.Timer
java.awt.Tookit
27.对象clone:clone方法是object一个保护方法,这意味着你的代码不能简单的调用它。
28.内部类:一个内部类的定义是定义在另一个内部的类。
原因是:
1.一个内部类的对象能够访问创建它的对象的实现,包括私有数据。
2.对于同一个包中的其他类来说,内部类能够隐藏起来。
3.匿名内部类可以很方便的定义回调。
4.使用内部类可以非常方便的编写事件驱动程序。
29.代理类(proxy):
1.指定接口要求所有代码
2.object类定义的所有的方法(toString equals)
30.数据类型:Java是强调类型的语言,每个变量都必须先申明它都类型,java中总共有8个基本类型.4种是整型,2种是浮点型,一种是字符型,被用于Unicode编码中的字符,布尔型。
软件世界 于瑶
如今JAVA语言在全世界范围正如火如荼般的流行,它广范地应用在INTERNET的数据库、多媒体、CGI、及动态网页的制作方面。1999年在美国对JAVA程序员的需求量首次超过C++!
作者因最近分析一些JAVA程序,对JAVA的反编译进行了一番了解,下面将我所了解的情况作以下介绍,希望对JAVA爱好者有所帮助。
JAVA是采用一种称做“字节编码”的程序结构,分为小程序(嵌入到HTML文件中)和应用程序(直接在命令状态下执行)两种类型。无论哪种结构,一旦用JAVAC 命令编译后,均变成后缀为CLASS的同名可执行文件。这种文件是不可阅读的代码。
经查阅了SUN公司的JDK(JDK1.1.3)文档资料后,我找到了一个据称是可反编译JAVA的JAVAP文件(EXE),这个文件位于\JDK\BIN\ 下面,经按说明使用后,感到失望,原来这个“反编译”仅可反编译出JAVA程序的数据区(定义)、若干方法和类的引用等。
这里我用了一个简单例子来说明问题。
JAVA的源程序hello_java.java如下:
import java.applet.*;
import java.awt.*;
public class hello_java extends Applet
{
public void paint(Graphics g)
{
g.drawString("Hello Java!\n",20,20);
}
}
经用反编译命令:javap -c -package -public -private hello_java hello.java
得到的反编译结果(hello.java)如下:(有关javap命令的选择参数请见其使用说明,这里-c表示选择了反编译)
Compiled from hello_java.java
public synchronized class hello_java extends java.applet.Applet
/* ACC_SUPER bit set */
{
public void paint(java.awt.Graphics);
public hello_java();
Method void paint(java.awt.Graphics)
0 aload_1
1 ldc #1
3 bipush 20
5 bipush 20
7 invokevirtual #6
10 return
Method hello_java()
0 aload_0
1 invokespecial #5 ()V>
4 return
}
从上述结果不难看出该反编译未能将源程序全译出来,像语句g.drawString("Hello Java!\n",20,20); 就没有。随着程序量增加,未能编译的JAVA语句还会更多。所以这个反编译程序仅能起个参考作用。
幸亏有了INTERNET,笔者通过YAHOO很快找到了一个JAVA反编译“自由软件”(SHAREWARE),http://www.inter.nl.net/users/H.P.van.Vliet/mocha.htm 。 这个软件叫MOCHA,据说是一位30来岁的加拿大的研究生所完成,仅是个“?”版,原因是这位叫做H.P.VAN.VLIET的小伙子患癌逝世了,十分可惜呀!
经使用MOCHA反编译软件,感到这个软件十分好用,笔者试反编译多个JAVA程序,均得到很好的结果。
这里给出如何使用这个软件,首先,用WINZIP等将"mocha-b1.zip" 解开得到"mocha.zip"文件,"mocha.zip"不须再解开,这个包内包括了反编译的类文件,只需将其拷贝到JDK所在的目录下,如:c:\jdk\bin\ 此外,须设置路径:SET CLASSPATH=c:\myclasses;c:\jdk\bin\mocha.zip
MOCHA用法:
java mocha.Decompiler [-v] [-o] Class1.class Class2.class ...
"java" 调用Java虚拟机
"mocha.Decompiler" 指示要进行JAVA反编译
"-v" 选择详细输出
"-o" 选写入已有的.mocha 文件
"ClassX.class" 指出要反编译类名
注意,不需给出输出的JAVA文件名,因为MOCHA自动产生一个与CLASS同名但扩展名为MOCHA的JAVA源文件。
对于上例,可用命令:
java mocha.Decompiler [-v] [-o] hello_java.class
得到的源文件:
/* Decompiled by Mocha from hello_java.class */
/* Originally compiled from hello_java.java */
import java.applet.Applet;
import java.awt.Graphics;
public synchronized class hello_java extends Applet
{
public void paint(Graphics g)
{
g.drawString("Hello Java!\n", 20, 20);
}
public hello_java()
{
}
}
我们不难发现,此文件与编译前的JAVA源文件完全一样!笔者曾经用MOCHA反编译出最大为80K的源文件,均取得成功。
在此,笔者向英年早逝的VLIET表示敬意,感谢他给我们留下这个工具软件。