2009年11月13日
以前用SVN以及CVS都是别人配置好的,只要装一个客户端就可以用了。今天在网上搜了一下,好不容易才配置好了,在此分享一下,以后要配置也可以看看,呵呵
Subversion是SVN的服务端,下载地址:我下载的是svn-win32-1.6.5.zip,只要解压就可以了。
http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100&expandFolder=8100&folderID=91
SVN客户端的下载地址:
http://tortoisesvn.net/downloads
TortoiseSVN 是一个客户端程序,用来与 subvers 服务器端通讯。Subversion 自带一个客户端程序 svn.exe ,但 TortoiseSVN 更好操作,提高效率。
SVN服务端跟客户端下载好了,接下来就可以安装。
我的服务端是解压在D:/svn下,把SVN下bin的路径在Windows环境里配置一下,Path指定为D:/svn/bin
接下来就进入命令行,在运行里输入CMD,进入命令行后,输入以下命令:
sc create svn binpath= "D:\svn1.6.5\bin\svnserve.exe --service -r D:\svn" displayname= "Subversion Server" depend= Tcpip start= auto
这命令中的D:\svn1.6.5\bin\为服务端的路径,D:\svn为存放SVN库的路径,以后所有的项目都存放在这里。这样,SVN就交给Windows服务管理,服务名为svn。每次启动电脑的时候就会自动启动SVN服务,你也可以在Windows服务里更改启动设置,比如:手动。
如果不想交给Windows服务管理,你也可以在命令行输入以下命令:
sc detele svn //删除名为svn的服务
一旦定义了服务,就可以使用标准GUI工具(服务管理控制面板)进行停止、启动和查询,或者是通过命令行:
net stop svn
net start svn
运行Subversion服务器需要首先要建立一个版本库(Repository)。版本库可以看作是服务器上集中存放和管理数据的地方。
开始建立版本库。以之前建立的D:\svn空文件夹作为所有版本库的根目录。然后,进入命令行输入如下命令:
svnadmin create d:\svn\repos1
此命令在 d:\svn 下建立一个版本库 repos1 。repos1 下面会自动生成一些文件夹和文件。
我们也可以使用 TortoiseSVN 图形化的完成这一步:
先建立空目录 d:\svn\repos1 ,注意一定是要空的。然后在 repos1 文件夹上“右键->TortoiseSVN->Create Repository here...”,然后可以选择版本库模式,这里使用默认的FSFS即可,然后就创建了一系列文件夹和文件,同命令行建立的一样。
如果subversion 服务还没有开启,需要启动SVN服务,启动SVN服务的方法有多种,没有没有交给Windows管理,可以在命令行中输入:
svnserve.exe --daemon --root d:\svn
如果交给Windows服务管理,可以在命令窗口输入:
net start svn
然后在TortoiseSVN中的版本库浏览器URL输入为:svn://localhost/repo1即可查看SVN里的文件。
下面就是将我们的数据(项目)导入到这个版本库,以后就由版本库管理我们的数据。我们的任何改动都回被版本库记录下来,甚至我们自己丢失、改错数据时版本库也能帮我们找回数据。
比如,我在 d:\wwwroot 下有个 guestbook 文件夹,里面存放的是我编写的项目。在此文件夹上“右键 -> TortoiseSVN -> Import...” ,在弹出对话框的“URL of repository”输入“svn://localhost/repos1/guestbook”。在“Import message”输入“导入整个留言簿”作为注释。
点 OK 后要求输入帐号。我们在用户名和密码处都输入 用户名跟密码(如果没有设置就不要输入)。完成后 guestbook 中的内容全部导入到了 svn://localhost/repo1/guestbook 。
我们看到在 d:\svn\repo1 没有任何变化,连个 guestbook 文件夹都没有建立,唯一的变化就是d:\svn\repo1容量变大了。实际上我们源guestbook中的内容已经导入 repo1 版本库了,源 guestbook 文件夹可以删除了。
需要注意的是,这一步操作可以完全在另一台安装了 TortoiseSVN 的客户机上进行。例如运行svnserve的主机的IP是133.96.121.22,则URL部分输入的内容就是“svn://133.96.121.22/repo1/guestbook” 。
配置用户和权限
用文本编辑器打开d:\svn\repos1\conf目录,修改svnserve.conf:
将:
# password-db = passwd
改为:
password-db = passwd
即去掉前面的 # 注释符,注意前面不能有空格。
然后修改同目录的passwd文件,增加一个帐号:
将:
[users]
# harry = harryssecret
# sally = sallyssecret
增加帐号:
[users]
#harry = harryssecret
#sally = sallyssecret
test = test
基本操作流程
1、取出(check out)
取出版本库到一个工作拷贝:
来到任意空目录下,比如在f分区建立一个空文件夹 f:\work 。“右键 -> SVN Checkout”。在“URL of repository”中输入“svn://localhost/repo1/guestbook”,这样我们就得到了一份 guestbook 中内容的工作拷贝。
2、存入(check in)/提交(commit)
在工作拷贝中作出修改并提交:
在 guestbook 工作拷贝中随便打开一个文件,作出修改,然后“右键 -> SVN Commit... ”。这样我们就把修改提交到了版本库,版本库根据情况存储我们提交的数据。
在修改过的文件上“右键 -> TortoiseSVN -> Show Log” ,可以看到对这个文件所有的提交。在不同的 revision 条目上“右键 -> Compare with working copy”,我们可以比较工作拷贝的文件和所选 revision 版本的区别。
如果要与eclipse或myeclipse集成,只须下一个eclipse插件就可以了。下面是插件的下载地址。
http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240 阅读全文
类别:j2ee编程 查看评论文章来源:
http://hi.baidu.com/ninky/blog/item/f101d9395ca492f93b87cee6.html
posted @
2009-11-13 11:38 niuky 阅读(685) |
评论 (0) |
编辑 收藏
前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的。
总结如下:
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。
DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问 时,DataSource实际为SessionFactory,TransactionManager的实现为 HibernateTransactionManager。
根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下:
第一种方式:每个Bean都有一个代理
- <bean id="sessionFactory"
- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="configLocation" value="classpath:hibernate.cfg.xml" />
- <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
- </bean>
-
- <!-- 定义事务管理器(声明式的事务) -->
- <bean id="transactionManager"
- class="org.springframework.orm.hibernate3.HibernateTransactionManager">
- <property name="sessionFactory" ref="sessionFactory" />
- </bean>
-
- <!-- 配置DAO -->
- <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
- <property name="sessionFactory" ref="sessionFactory" />
- </bean>
-
- <bean id="userDao"
- class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
- <!-- 配置事务管理器 -->
- <property name="transactionManager" ref="transactionManager" />
- <property name="target" ref="userDaoTarget" />
- <property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" />
- <!-- 配置事务属性 -->
- <property name="transactionAttributes">
- <props>
- <prop key="*">PROPAGATION_REQUIRED</prop>
- </props>
- </property>
- </bean>
- lt;/beans>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml" /> <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> </bean> <!-- 定义事务管理器(声明式的事务) --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 配置DAO --> <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <bean id="userDao" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <!-- 配置事务管理器 --> <property name="transactionManager" ref="transactionManager" /> <property name="target" ref="userDaoTarget" /> <property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" /> <!-- 配置事务属性 --> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> </beans>
第二种方式:所有Bean共享一个代理基类
- <bean id="sessionFactory"
- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="configLocation" value="classpath:hibernate.cfg.xml" />
- <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
- </bean>
-
- <!-- 定义事务管理器(声明式的事务) -->
- <bean id="transactionManager"
- class="org.springframework.orm.hibernate3.HibernateTransactionManager">
- <property name="sessionFactory" ref="sessionFactory" />
- </bean>
-
- <bean id="transactionBase"
- class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
- lazy-init="true" abstract="true">
- <!-- 配置事务管理器 -->
- <property name="transactionManager" ref="transactionManager" />
- <!-- 配置事务属性 -->
- <property name="transactionAttributes">
- <props>
- <prop key="*">PROPAGATION_REQUIRED</prop>
- </props>
- </property>
- </bean>
-
- <!-- 配置DAO -->
- <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
- <property name="sessionFactory" ref="sessionFactory" />
- </bean>
-
- <bean id="userDao" parent="transactionBase" >
- <property name="target" ref="userDaoTarget" />
- </bean>
- </beans>
第三种方式:使用拦截器
- <bean id="sessionFactory"
- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="configLocation" value="classpath:hibernate.cfg.xml" />
- <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
- </bean>
-
- <!-- 定义事务管理器(声明式的事务) -->
- <bean id="transactionManager"
- class="org.springframework.orm.hibernate3.HibernateTransactionManager">
- <property name="sessionFactory" ref="sessionFactory" />
- </bean>
-
- <bean id="transactionInterceptor"
- class="org.springframework.transaction.interceptor.TransactionInterceptor">
- <property name="transactionManager" ref="transactionManager" />
- <!-- 配置事务属性 -->
- <property name="transactionAttributes">
- <props>
- <prop key="*">PROPAGATION_REQUIRED</prop>
- </props>
- </property>
- </bean>
-
- <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
- <property name="beanNames">
- <list>
- <value>*Dao</value>
- </list>
- </property>
- <property name="interceptorNames">
- <list>
- <value>transactionInterceptor</value>
- </list>
- </property>
- </bean>
-
- <!-- 配置DAO -->
- <bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl">
- <property name="sessionFactory" ref="sessionFactory" />
- </bean>
- </beans>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml" /> <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> </bean> <!-- 定义事务管理器(声明式的事务) --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager" ref="transactionManager" /> <!-- 配置事务属性 --> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <list> <value>*Dao</value> </list> </property> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> </list> </property> </bean> <!-- 配置DAO --> <bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl"> <property name="sessionFactory" ref="sessionFactory" /> </bean> </beans>
第四种方式:使用tx标签配置的拦截器
- <context:annotation-config />
- <context:component-scan base-package="com.bluesky" />
-
- <bean id="sessionFactory"
- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="configLocation" value="classpath:hibernate.cfg.xml" />
- <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
- </bean>
-
- <!-- 定义事务管理器(声明式的事务) -->
- <bean id="transactionManager"
- class="org.springframework.orm.hibernate3.HibernateTransactionManager">
- <property name="sessionFactory" ref="sessionFactory" />
- </bean>
-
- <tx:advice id="txAdvice" transaction-manager="transactionManager">
- <tx:attributes>
- <tx:method name="*" propagation="REQUIRED" />
- </tx:attributes>
- </tx:advice>
-
- <aop:config>
- <aop:pointcut id="interceptorPointCuts"
- expression="execution(* com.bluesky.spring.dao.*.*(..))" />
- <aop:advisor advice-ref="txAdvice"
- pointcut-ref="interceptorPointCuts" />
- </aop:config>
- </beans>
<context:annotation-config /> <context:component-scan base-package="com.bluesky" /> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml" /> <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> </bean> <!-- 定义事务管理器(声明式的事务) --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="interceptorPointCuts" expression="execution(* com.bluesky.spring.dao.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" /> </aop:config> </beans>
第五种方式:全注解
- <context:annotation-config />
- <context:component-scan base-package="com.bluesky" />
-
- <tx:annotation-driven transaction-manager="transactionManager"/>
-
- <bean id="sessionFactory"
- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="configLocation" value="classpath:hibernate.cfg.xml" />
- <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
- </bean>
-
- <!-- 定义事务管理器(声明式的事务) -->
- <bean id="transactionManager"
- class="org.springframework.orm.hibernate3.HibernateTransactionManager">
- <property name="sessionFactory" ref="sessionFactory" />
- </bean>
-
- </beans>
<context:annotation-config /> <context:component-scan base-package="com.bluesky" /> <tx:annotation-driven transaction-manager="transactionManager"/> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml" /> <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" /> </bean> <!-- 定义事务管理器(声明式的事务) --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> </beans>
此时在DAO上需加上@Transactional注解,如下:
- package com.bluesky.spring.dao;
-
- import java.util.List;
-
- import org.hibernate.SessionFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
- import org.springframework.stereotype.Component;
-
- import com.bluesky.spring.domain.User;
-
- @Transactional
- @Component("userDao")
- public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
-
- public List<User> listUsers() {
- return this.getSession().createQuery("from User").list();
- }
-
-
- }
阅读全文
类别:j2ee编程 查看评论文章来源:
http://hi.baidu.com/ninky/blog/item/d60da5ecece8982e63d09fbc.html
posted @
2009-11-13 11:38 niuky 阅读(364) |
评论 (0) |
编辑 收藏
用myEclipse在进行javamail程序开发的时候,在准备阶段就遇到问题,导入了所需的jar包之后运行时可出现以下的错误:
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
原因是jar包版本不统一,解决方法如下:
删除Java EE 5 Libraries/javaee.jar/mail里的包有东西.
具体方法如下:
用rar打开X:/Program Files/MyEclipse 6.0/myeclipse/eclipse/plugins/com.genuitec.eclipse.j2eedt.core_6.0.1.zmyeclipse601200710/data/libraryset/EE_5/javaee.jar
,然后删除mail,就ok了.
ps:最好将原来的jar包备份
我一开始使用了merak邮件服务器,希望可以实现本地机的邮件收发,但是发现,其pop3和IMAP协议并非一直开启,如果不开启,则无法连接到邮件服务器。
查询到几个邮件服务器的设置:
163邮箱设置
接收邮件服务器(pop、IMAP或HTTP):pop.163.com、
发送邮件服务器(SMTP):smtp.163.com
sina设置
接收邮件服务器(pop、IMAP或HTTP):pop.sina.com.cn
发送邮件服务器(SMTP):smtp.sina.com.cn
tom设置
接收邮件服务器(pop、IMAP或HTTP):pop.tom.com
发送邮件服务器(SMTP)smtp.tom.com
sohu设置
接收邮件服务器(pop、IMAP或HTTP)pop3.sohu.com
发送邮件服务器(SMTP):smtp.sohu.com
126设置
接收邮件服务器(pop、IMAP或HTTP):pop3.126.com
发送邮件服务器(SMTP):smtp.126.com
QQ邮箱的POP3服务器:
pop.qq.com,SMTP服务器: smtp.qq.com
开发代码如下:
import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import com.rjt.JavaMailWeb.Entity.User;
public class MailClientSina {
protected Session session;
protected Store store;
private String sendHost="smtp.sina.com.cn"; //发送邮件服务器
private String receiveHost="pop.sina.com.cn"; //接收邮件服务器
private String sendProtocol="smtp"; //发送邮件协议
private String receiveProtocol="pop3"; //接收邮件协议
private String username = "";
private String password = "";
private String fromAddr=""; //发送者地址
private String toAddr=""; //接收者地址
public void init()throws Exception{
//设置属性
Properties props = new Properties();
//props.put("mail.transport.protocol", sendProtocol);
//props.put("mail.store.protocol", receiveProtocol);
//props.put("mail.smtp.class", "com.sun.mail.smtp.SMTPTransport");
//props.put("mail.imap.class", "com.sun.mail.imap.IMAPStore");
//props.put("mail.pop3.class", "com.sun.mail.pop3.POP3Store");
props.put("mail.smtp.host", sendHost); //设置发送邮件服务器
props.put("mail.smtp.auth", "true");//需要经过授权,也就是有户名和密码的校验,这样才能通过验证(一定要有这一条)
SmtpAuth smtpAuth=new SmtpAuth(username,password);
smtpAuth.getPasswordAuthentication();
// 创建邮件Session对象
session = Session.getDefaultInstance(props,smtpAuth);
session.setDebug(true); //输出跟踪日志
}
public void close()throws Exception{
store.close();
}
public void sendMessage(String fromAddr,String toAddr)throws Exception{
try
{
//创建一个邮件
Message msg = createSimpleMessage(fromAddr,toAddr);
//创建一个Transport对象
Transport transport=session.getTransport("smtp");
//连接SMTP服务器
transport.connect(sendHost,username, password);
//发送邮件
transport.send(msg,msg.getAllRecipients());
}catch(Exception e)
{
System.out.print(e);
}
}
public Message createSimpleMessage(String fromAddr,String toAddr)throws Exception{
//创建一封纯文本类型的邮件
Message msg = new MimeMessage(session);
InternetAddress[] toAddrs =InternetAddress.parse(toAddr, false);
msg.setRecipients(Message.RecipientType.TO, toAddrs);
msg.setSentDate(new Date());
msg.setSubject("Register Success!");
msg.setFrom(new InternetAddress(fromAddr));
msg.setText("Success!");
msg.saveChanges();
return msg;
}
public static void main(String[] args)throws Exception {
MailClientSina client=new MailClientSina();
client.init();
client.sendMessage(client.fromAddr,client.toAddr);
// client.receiveMessage();
}
}
//以下是SmtpAuth类的描述
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
public class SmtpAuth extends Authenticator {
String user,password;
//设置账号信息
public SmtpAuth(String user,String password){
this.user=user;
this.password=password;
}
//取得PasswordAuthentication对象
protected PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication(user,password);
}
}
阅读全文
类别:Java 查看评论文章来源:
http://hi.baidu.com/ninky/blog/item/e2cd99caef3f158fc81768b7.html
posted @
2009-11-13 11:38 niuky 阅读(469) |
评论 (0) |
编辑 收藏
一,先修改TOMCAT的配置文件server.xml ,在其中找到以下内容:
<!-- Define a SSL HTTP/1.1 Connector on port 443 -->
<!--
<Connector port="443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
-->
去掉注释。
二,到你的JDK的bin目录下,执行下面代码:
%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA (Windows)
$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA (Unix)
//TOMCAT的初始密码为changit,如果你在生成KEY时修改了密码,则必须在server.xml中的Connector="443"中加上这个属性: keystorePass="你修改的密码"。
此时,启动TOMCAT,就可以访问https://localhost:443
三,在
acegi Security中实现SSL,只须修改起配置文件(如:security.xml,一般为这个,或者是其他文件名)中的
<bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
<property name="authenticationEntryPoint">
<bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
<property name="loginFormUrl" value="/public/requireLogin.jsp"/>
<!--<property name="forceHttps" value="false"/> -->
<!-- in order to enable the https -->
<property name="forceHttps" value="true"/>
</bean>
</property>
</bean>
//把其中的forceHttps的值改为true,这样就可以对那些需要安全访问的页面自动转为https://形式的URL。
接着,再修改:
<bean id="channelProcessingFilter" class="org.acegisecurity.securechannel.ChannelProcessingFilter">
<property name="channelDecisionManager" ref="channelDecisionManager"/>
<property name="filterInvocationDefinitionSource">
<value>
PATTERN_TYPE_APACHE_ANT
/admin/**=REQUIRES_SECURE_CHANNEL
/login*=REQUIRES_SECURE_CHANNEL
/j_security_check*=REQUIRES_SECURE_CHANNEL
/editProfile.html*=REQUIRES_SECURE_CHANNEL
/signup.html*=REQUIRES_SECURE_CHANNEL
/saveUser.html*=REQUIRES_SECURE_CHANNEL
/secure/**=REQUIRES_SECURE_CHANNEL
/**=REQUIRES_INSECURE_CHANNEL
</value>
</propert
//在其中加入你想要实现安全访问的页面的URL,/**这个一定要放在最后面。REQUIRES_SECURE_CHANNEL这个表示需要安全通道,REQUIRES_INSECURE_CHANNEL 这个表示不需要。
最后,再修改web.xml,在其中添加如下的过滤器:
<!-- in order to enable the ssl http -->
<filter>
<filter-name>
Acegi Channel Processing Filter</filter-name>
<filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
<init-param>
<param-name>targetClass</param-name>
<param-value>org.acegisecurity.securechannel.ChannelProcessingFilter</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>
Acegi Channel Processing Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这样,就可以通过
Acegi Security实现SSL访问了。
阅读全文
类别:j2ee编程 查看评论文章来源:
http://hi.baidu.com/ninky/blog/item/6b7d22ddd55045d08c10291c.html
posted @
2009-11-13 11:38 niuky 阅读(277) |
评论 (0) |
编辑 收藏
Keytool使用指南:
http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/keytool.html
Tomcat-ssl配置指南:
http://tomcat.apache.org/tomcat-5.5-doc/ssl-howto.html
配置过程
1. 生成 server key :
以命令行方式切换到目录%TOMCAT_HOME%,在command命令行输入如下命令(jdk1.4以上带的工具):
keytool -genkey -alias tomcat -keyalg RSA -keypass changeit -storepass changeit -keystore server.keystore -validity 3600
用户名输入域名,如localhost(开发或测试用)或hostname.domainname(用户拥有的域名),其它全部以 enter 跳过,最后确认,此时会在%TOMCAT_HOME%下生成server.keystore 文件。
注:参数 -validity 指证书的有效期(天),缺省有效期很短,只有90天。
2. 将证书导入的JDK的证书信任库中:
这步对于Tomcat的SSL配置不是必须,但对于CAS SSO是必须的,否则会出现如下错误:edu.yale.its.tp.cas.client.CASAuthenticationException: Unable to validate ProxyTicketValidator。。。
导入过程分2步,第一步是导出证书,第二步是导入到证书信任库,命令如下:
keytool -export -trustcacerts -alias tomcat -file server.cer -keystore server.keystore -storepass changeit
keytool -import -trustcacerts -alias tomcat -file server.cer -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit
如果有提示,输入Y就可以了。
其他有用keytool命令(列出信任证书库中所有已有证书,删除库中某个证书):
keytool -list -v -keystore D:/sdks/jdk1.5.0_11/jre/lib/security/cacerts
keytool -delete -trustcacerts -alias tomcat -keystore D:/sdks/jdk1.5.0_11/jre/lib/security/cacerts -storepass changeit
3. 配置TOMCAT :
修改%TOMCAT_HOME%\conf\server.xml,以文字编辑器打开,查找这一行:
xml 代码
将之后的那段的注释去掉,并加上 keystorePass及keystoreFile属性。
注意,tomcat不同版本配置是不同的:
Tomcat4.1.34配置:
xml 代码 <Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="8443" enableLookups="true" scheme="https" secure="true" acceptCount="100" useURIValidationHack="false" disableUploadTimeout="true" clientAuth="false" sslProtocol="TLS" keystoreFile="server.keystore" keystorePass="changeit"/> Tomcat5.5.9配置:
xml 代码
<Connector port="8443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="server.keystore"
keystorePass="changeit"/>
Tomcat5.5.20配置(此配置同样可用于Tomcat6.0):
xml 代码
<Connector protocol="org.apache.coyote.http11.Http11Protocol"
port="8443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="server.keystore"
keystorePass="changeit"/>
Tomcat6.0.10配置:
xml 代码
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol"
port="8443" minSpareThreads="5" maxSpareThreads="75"
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="D:/tools/apache-tomcat-6.0.10/server.keystore"
keystorePass="changeit"/>
tomcat6支持3种,请参考以下文档:
http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html
验证配置
访问 https://localhost:8443/
<connector protocol="org.apache.coyote.http11.Http11NioProtocol"></connector>
阅读全文
类别:j2ee编程 查看评论文章来源:
http://hi.baidu.com/ninky/blog/item/efe6389b5c7376bcc8eaf440.html
posted @
2009-11-13 11:38 niuky 阅读(862) |
评论 (0) |
编辑 收藏
快捷键(eclipse)
1. 常用快捷键
(1)Ctrl+Space
说明:内容助理。提供对方法,变量,参数,javadoc等得提示,应运在多种场合,总之需要提示的时候可先按此快捷键。
注:避免输入法的切换设置与此设置冲突
(2)Ctrl+Shift+Space
说明:变量提示
(3)Ctrl+/
说明:添加/消除//注释,在eclipse2.0中,消除注释为Ctrl+\
(4)Ctrl+Shift+/
说明:添加/* */注释
(5)Ctrl+Shift+\
说明:消除/* */注释
(6)Ctrl+Shift+F
说明:自动格式化代码
(7)Ctrl+1 //*****************************
说明:批量修改源代码中的变量名,此外还可用在catch块上.
(8)Ctril+F6
说明:界面切换
(9)Ctril+Shift+M
说明:查找所需要得包
(10)Ctril+Shift+O
说明:自动引入所需要得包
(11)Ctrl+Alt+S
说明:源代码得快捷菜单。其中的Generate getters and setters 和 Surround with try/catch
block比较常用.建议把它们添加为快捷键.快捷键设置在windows->preferences->Workbench->Keys
2. 快捷键列表
编辑
作用域 功能 快捷键
全局 查找并替换 Ctrl+F
文本编辑器 查找上一个 Ctrl+Shift+K
文本编辑器 查找下一个 Ctrl+K
全局 撤销 Ctrl+Z
全局 复制 Ctrl+C
全局 恢复上一个选择 Alt+Shift+↓
全局 剪切 Ctrl+X
全局 快速修正 Ctrl1+1
全局 内容辅助 Alt+/
全局 全部选中 Ctrl+A
全局 删除 Delete
全局 上下文信息 Alt+?Alt+Shift+?Ctrl+Shift+Space
Java编辑器 显示工具提示描述 F2
Java编辑器 选择封装元素 Alt+Shift+↑
Java编辑器 选择上一个元素 Alt+Shift+←
Java编辑器 选择下一个元素 Alt+Shift+→
文本编辑器 增量查找 Ctrl+J
文本编辑器 增量逆向查找 Ctrl+Shift+J
全局 粘贴 Ctrl+V
全局 重做 Ctrl+Y
查看
作用域 功能 快捷键
全局 放大 Ctrl+=
全局 缩小 Ctrl+-
窗口
作用域 功能 快捷键
全局 激活编辑器 F12
全局 切换编辑器 Ctrl+Shift+W
全局 上一个编辑器 Ctrl+Shift+F6
全局 上一个视图 Ctrl+Shift+F7
全局 上一个透视图 Ctrl+Shift+F8
全局 下一个编辑器 Ctrl+F6
全局 下一个视图 Ctrl+F7
全局 下一个透视图 Ctrl+F8
文本编辑器 显示标尺上下文菜单 Ctrl+W
全局 显示视图菜单 Ctrl+F10
全局 显示系统菜单 Alt+-
导航
作用域 功能 快捷键
Java编辑器 打开结构 Ctrl+F3
全局 打开类型 Ctrl+Shift+T
全局 打开类型层次结构 F4
全局 打开声明 F3
全局 打开外部javadoc Shift+F2
全局 打开资源 Ctrl+Shift+R
全局 后退历史记录 Alt+←
全局 前进历史记录 Alt+→
全局 上一个 Ctrl+,
全局 下一个 Ctrl+.
Java编辑器 显示大纲 Ctrl+O
全局 在层次结构中打开类型 Ctrl+Shift+H
全局 转至匹配的括号 Ctrl+Shift+P
全局 转至上一个编辑位置 Ctrl+Q
Java编辑器 转至上一个成员 Ctrl+Shift+↑
Java编辑器 转至下一个成员 Ctrl+Shift+↓
文本编辑器 转至行 Ctrl+L
搜索
作用域 功能 快捷键
全局 出现在文件中 Ctrl+Shift+U
全局 打开搜索对话框 Ctrl+H
全局 工作区中的声明 Ctrl+G
全局 工作区中的引用 Ctrl+Shift+G
文本编辑
作用域 功能 快捷键
文本编辑器 改写切换 Insert
文本编辑器 上滚行 Ctrl+↑
文本编辑器 下滚行 Ctrl+↓
文件
作用域 功能 快捷键
全局 保存 Ctrl+X Ctrl+S
全局 打印 Ctrl+P
全局 关闭 Ctrl+F4
全局 全部保存 Ctrl+Shift+S
全局 全部关闭 Ctrl+Shift+F4
全局 属性 Alt+Enter
全局 新建 Ctrl+N
项目
作用域 功能 快捷键
全局 全部构建 Ctrl+B
源代码
作用域 功能 快捷键
Java编辑器 格式化 Ctrl+Shift+F //*****************
Java编辑器 取消注释 Ctrl+\
Java编辑器 注释 Ctrl+/
Java编辑器 添加导入 Ctrl+Shift+M
Java编辑器 组织导入 Ctrl+Shift+O
Java编辑器 使用try/catch块来包围 未设置,太常用了,所以在这里列出,建议自己设置。也可以使用Ctrl+1自动修正。
运行
作用域 功能 快捷键
全局 单步返回 F7
全局 单步跳过 F6
全局 单步跳入 F5
全局 单步跳入选择 Ctrl+F5
全局 调试上次启动 F11
全局 继续 F8
全局 使用过滤器单步执行 Shift+F5
全局 添加/去除断点 Ctrl+Shift+B
全局 显示 Ctrl+D
全局 运行上次启动 Ctrl+F11
全局 运行至行 Ctrl+R
全局 执行 Ctrl+U
重构
作用域 功能 快捷键
全局 撤销重构 Alt+Shift+Z
全局 抽取方法 Alt+Shift+M
全局 抽取局部变量 Alt+Shift+L
全局 内联 Alt+Shift+I
全局 移动 Alt+Shift+V
全局 重命名 Alt+Shift+R
全局 重做 Alt+Shift+Y
阅读全文
类别:j2ee编程 查看评论文章来源:
http://hi.baidu.com/ninky/blog/item/5c8243c212f8733de4dd3b12.html
posted @
2009-11-13 11:38 niuky 阅读(1623) |
评论 (0) |
编辑 收藏
本文主要以Spring为核心来总结一些以前web开发常用的开源工具和开源类库。
1.持久层
1) Hibernate
这个不用介绍了,用的很频繁,用的比较多的是映射,包括继承映射和父子表映射
对于DAO在这里介绍个在它基础上开发的包bba96,目前最新版本是bba96 2.0它对Hibernate进行了封装, 查询功能包括执行hsql或者sql查询/更新的方法,如果你要多层次逻辑的条件查询可以自己组装QueryObject.可以参考它做HibernateDAO.也可以直接利用它
2) iBATIS
另一个ORM工具,Apache的,没有Hibernate那么集成,自由度比较大
2.SpringMVC
原理说明和快速入门:
配置文件为:
Spring的配置文件默认为WEB-INF/xxxx-servelet.xm其中xxx为web.xml中org.springframework.web.servlet.DispatcherServlet的servlet-name。
Action分发:
Spring将按照配置文件定义的URL,Mapping到具体Controller类,再根据URL里的action= xxx或其他参数,利用反射调用Controller里对应的Action方法。
输入数据绑定:
Spring提供Binder 通过名字的一一对应反射绑定Pojo,也可以直接从request.getParameter()取数据。
输入数据验证
Sping 提供了Validator接口当然还可以使用开源的Commons-Validaor支持最好
Interceptor(拦截器)
Spring的拦截器提供接口需要自己编写,在这点不如WebWork做的好.全面
(这里提一下WebWork和Struts的区别最主要的区别在于WebWork在建立一个Action时是新New一个对象而Struts是SingleMoule所有的都继承它的一个Action,所以根据项目需要合适的选择.)
3.View层
1) 标签库:JSP2.0/JSTL
由于Webwork或Spring的标签确实很有限,一般view层用JSTL标签,而且据说JSTL设计很好速度是所有标签中最快的使用起来也很简单
2) 富客户端:DOJO Widgets, YUI(YahooUI),FCKEditor, Coolest日历控件
Dojo主要提供Tree, Tab等富客户端控件,可以用其进行辅助客户端开发
YahooUI和DOJO一样它有自己的一套javascript调试控制台,主要支持ajax开发也有很多Tree,Table,Menu等富客户端控件
FCKEditor 最流行的文本编辑器
Coolest日历控件 目前很多日历控件可用,集成在项目中也比较简单,这个只是其中的一个,界面不错的说..
3) JavaScript:Prototype.js
Prototype.js作为javascript的成功的开源框架,封装了很多好用的功能,通过它很容易编写AJAX应用,现在AJAX技术逐渐成熟,框架资源比较丰富,比如YUI,DWR等等,也是因为JavaScript没有合适的调试工具,所以没有必要从零开始编写AJAX应用,个人认为多用一些成熟的Ajax框架实现无刷新更新页面是不错的选择.
4)表格控件:Display Tag ,Extreme Table
这两个的功能差不多,都是View层表格的生成,界面也比较相向,可以导出Excel,Pdf,对Spring支持很容易.
相比较而言比较推荐ExtremeTable,它的设计很好功能上比DisplayTag多一些,支持Ajax,封装了一些拦截器,而且最方面的是在主页wiki中有详细的中文使用文档.
5):OSCache
OSCache是OpenSymphony组织提供的一个J2EE架构中Web应用层的缓存技术实现组件,Cache是一种用于提高系统响应速度、改善系统运行性能的技术。尤其是在Web应用中,通过缓存页面的输出结果,可以很显著的改善系统的稳定性和运行性能。
它主要用在处理短时间或一定时间内一些数据或页面不会发生变化,或将一些不变的统计报表,缓冲在内存,可以充分的减轻服务器的压力,防治负载平衡,快速重启服务器(通过硬盘缓存).
6)SiteMesh
sitemesh应用Decorator模式主要用于提高页面的可维护性和复用性,其原理是用Filter截取request和response,把页面组件head,content,banner结合为一个完整的视图。通常我们都是用include标签在每个jsp页面中来不断的包含各种header, stylesheet, scripts and footer,现在,在sitemesh的帮助下,我们删掉他们轻松达到复合视图模式.
Sitemesh也是 OpenSymphony的一个项目现在最近的版本是2.2,目前OpenSymphony自从04年就没有更新的版本了..感觉它还是比较有创新的一种页面组装方式, OpenSymphony开源组织的代码一般写的比较漂亮,可以改其源代码对自己的项目进行适配.
测试发现Sitemesh还存在一些问题,比如中文问题,它的默认编码是iso-8859-1在使用时候需要做一些改动.
7)CSS,XHTML
这个不用说了,遵循W3C标准的web页面开发.
8)分页标签: pager-taglib组件
Pager-taglib 是一套分页标签库,可以灵活地实现多种不同风格的分页导航页面,并且可以很好的与服务器分页逻辑分离.使用起来也比较简单.
9)Form: Jodd Form taglib
Jodd Form taglib使用比较简单,只要把form的头尾以包住
就会自动绑定mybean, 自动绑定mybean的所有同名属性到普通html标记input, selectbox, checkbox,radiobox.....在这些input框里不用再写任何代码…
10)Ajax:DWR
J2EE应用最常用的ajax框架
11)报表 图表
Eclipse BIRT功能比较强大,也很庞大..好几十M,一般没有特别需求或别的图表设计软件可以解决的不用它
JasperReports+ iReport是一个基于Java的开源报表工具,它可以在Java环境下像其它IDE报表工具一样来制作报表。JasperReports支持PDF、HTML、XLS、CSV和XML文件输出格式。JasperReports是当前Java开发者最常用的报表工具。
JFreeChart主要是用来制作各种各样的图表,这些图表包括:饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。
琴棋报表,国产的..重点推荐,适合中国的情况,开放源代码,使用完全免费。纯JAVA开发,适用多种系统平台。特别适合B/S结构的系统。官方网站有其优点介绍,看来用它还是不错的选择,最重要的是支持国产呵呵
4.权限控制: Acegi
Acegi是Spring Framework 下最成熟的安全系统,它提供了强大灵活的企业级安全服务,如完善的认证和授权机制,Http资源访问控制,Method 调用访问控制等等,支持CAS
(耶鲁大学的单点登陆技术,这个单点登陆方案比较出名.我也进行过配置使用,可以根据项目需要,如果用户分布在不同的地方不同的系统通用一套登陆口令可以用它进行解决,一般注册机登陆机就是这样解决的)
Acegi只是于Spring结合最好的安全框架,功能比较强大,当然还有一些其他的安全框架,这里列举一些比较流行的是我从网上找到的,使用方法看其官方文档把…
JAAS, Seraph, jSai - Servlet Security, Gabriel, JOSSO, Kasai, jPAM, OpenSAML都是些安全控制的框架..真够多的呵呵
5.全文检索
1) Lucene
Lucene是一套全文索引接口,可以通过它将数据进行倒排文件处理加入索引文件,它的索引速度和查询速度是相当快的,查询百万级数据毫秒级出结果,现在最火的Apache开源项目,版本更新速度很快现在已经到了2.0,每个版本更新的都比较大,目前用的最多的版本应该是1.4.3,但它有个不太方面的地方单个索引文件有2G文件限制,现在2.0版本没有这个限制,我研究的比较多,它的扩展性比较好,可以很方面的扩充其分词接口和查询接口.
基于它的开发的系统很多,比如最常用的Eclipse的搜索功能,还有一些开源的软件比如Compass,Nutch,Lius,还有我最近做的InSearch(企业级FTP文件网页搜索) < form> < /form>
6.公共Util类
主要是Jakarta-Commons类库,其中最常用得是以下几个类库
1) Jakarta-Commons-Language
最常用得类是StringUtils类,提供了使用的字符串处理的常用方法效率比较高
2) Jakarta-Commons-Beantuils
主要用Beantuils能够获得反射函数封装及对嵌套属性,map,array型属性的读取。
3) Jakarta-Commons-Collections
里面有很多Utils方法
7.日志管理
Log4J
任务是日志记录,分为Info,Warn,error几个层次可以更好的调试程序
8 开源的J2EE框架
1) Appfuse
Appfuse是Matt Raible 开发的一个指导性的入门级J2EE框架, 它对如何集成流行的Spring、Hibernate、iBatis、Struts、Xdcolet、JUnit等基础框架给出了示范. 在持久层,AppFuse采用了Hibernate O/R映射工具;在容器方面,它采用了Spring,用户可以自由选择Struts、Spring/MVC,Webwork,JSF这几个Web框架。
2) SpringSide
SpringSide较完整的演示了企业应用的各个方面,是一个电子商务网站的应用 SpringSide也大量参考了Appfuse中的优秀经验。最重要的是它是国内的一个开源项目,可以了解到国内现在的一些实际技术动态和方向很有指导意义…
9.模版 Template
主要有Veloctiy和Freemarker
模板用Servlet提供的数据动态地生成 HTML。编译器速度快,输出接近静态HTML页面的速度。
10.工作流
主要有JBpm Shark Osworkflow.
项目管理软件
dotProject:是一个基于LAMP的开源项目管理软件。最出名的项目管理软件
JIRA: 项目计划,任务安排,错误管理
Bugzilla:提交和管理bug,和eclipse集成,可以通过安装MyEclipse配置一下即可使用
BugFree借鉴微软公司软件研发理念、免费开放源代码、基于Web的精简版Bug管理
CVS:这个就不介绍了都在用.
SVN: SubVersion已逐渐超越CVS,更适应于JavaEE的项目。Apache用了它很久后,Sourceforge刚刚推出SVN的支持。
测试用例:主要JUnit单元测试,编写TestCase,Spring也对Junit做了很好的支持
后记:
以Spring为主的应用开发可选用的组件中间件真是眼花缭乱,所以针对不同的项目需求可以利用不同的开源产品解决,比如用Spring+Hibernate/ iBATIS或Spring+WebWork+Hibernate/ iBATIS或Spring+Struts+Hibernate/ iBATIS,合理的框架设计和代码复用设计对项目开发效率和程序性能有很大的提高,也有利于后期的维护。
(责任编辑:龚勋)
阅读全文
类别:j2ee编程 查看评论文章来源:
http://hi.baidu.com/ninky/blog/item/4046a8c26b6f21130ff47728.html
posted @
2009-11-13 11:38 niuky 阅读(227) |
评论 (0) |
编辑 收藏
David Heinemeier Hansson 受雇与 37 Signal ,但是仍然可以自己选择建立自己的 Rails 框架来完成项目,他应该算是个"主动程序员"。Firebird 数据库的领导者同时也是 Interbase 数据库的创始人 Jim Starkey 将自己的公司卖给了 Mysql AB 而不得不给 Mysql 干活,从某方面说,他应该是个"被动程序员"。大多数第三世界国家的程序员应该属于"被动程序员",他们编程只是为了一份养家糊口的工作,他们无权选择自 己喜欢的编程语言或者框架,因为这是公司给他选择的,因为如果选了其他,他可能就找不到工作了。曾经有个即将离职的同事让我给他推荐一个比较好的编程框 架,可以很容易完成一个网站的制作,我给他推荐了 Zope, 还有 Rails, 他听我的介绍觉得不错 ,当我告诉他必须学习 python 和 Ruby 编程语言时,他显得很惊愕,"那能找到工作吗?"。这话其实也表达了大多数国内程序员的想法。看看招聘网站就知道,现在最需要的程序员是 Java 程序员,最需要了解的框架是 Struts。如果不会你很难得到面试的机会,所以就算你不会也要在自己的简历中"修饰"一下。
有些自己创业的人可以自己选择喜欢的编程语言和框架,当然那毕竟是少数。如果我能够选择的话,我肯定不用 Java 来做网站应用。因为它完成一个简单的工作太麻烦了,很难快速适应需求的变化。当然我也不会去用 PHP ,因为我已经习惯了面向对象的编程方式了。 我发现一个奇怪的现象:大多数转向学习 Ruby on rails 框架的人都是来自 Java 阵营的程序员,而转向Python 框架Zope,django 的程序员大多有 ASP,PHP 背景。因为 Ruby 是一个真正的面向对象的语言, 它同时具备了脚本语言的特点,而 Python 首先是一个脚本语言,它具备了一些 OO 的特征。Java 程序员 很难忍受走回头路,所以他们选择了一个比Java更面向对象的语言 Ruby ,而PHP,ASP程序员没有那么重的思想负担,他们选择 Python 可能是因为它的代码更 Beauty ,远比他们以前写的"意大利面条"式的PHP,ASP 代码要干净的多。
无论是 python, 还是 Ruby 这些非主流程序语言开发的框架,使用起来都异常的简便,他们可谓是真正从程序员角度考虑的框架。为什么 Ruby 一出,搅的 Java 的世界一片混乱,我想原因还是出在 Java 这里,当 Java 程序员想当然地认为程序开发应该如此麻烦的时候,Rails 的出现让他们立刻觉得被这些所谓的 Java 流行框架和 Sun 给欺骗了,这种欺骗是如此之深,以至于他们中间有的人"头也不回"的离开了 Java, 转而攻击 Java 的种种不是。这其中比较有名的人就是 Bruce Tate ,这位老兄写了两本轰动 Java 世界的书,Spring: A Developer's Notebook 和 Better, Faster, Lighter Java (该书可是获得 Jolt 大奖的,恰好我还都读过),随着 Rails 的流行,这位仁兄立刻叛逃出 Java 阵营,写了 Beyond Java 一书,着重介绍了一些非Java 框架,比如 Smalltalk 的Seaside, 和 Rails。
Java 为什么这么复杂,我想了很久,得出这么个结论:这是因为 Sun 希望它那么复杂。为什么这么说呢?Sun 不是一个好的软件公司,它最擅长做的是制定规范,这很类似Java 编程中的 Interface, 经常编写 Java 程序的人,会发现 Interface 可能是出现最多的一个词汇了,任何框架中都充满了Interface —接口,大多数编程书都推荐面向接口编程(当然这不是Java的错,是设计模式要求的,不过 Java 将此发挥的最好)。首先定义接口,然后针对接口编写不同的实现,至少提供默认的实现。Sun 也是如此,看看 J2ee 的规范包含了多少 J 打头的技术, JDBC,JNI,JCA,JDO,JPA .... ,现在的 JCP 组织更加如此,每隔一段时间,就有大量的规范问世,Draft 的,还是 Final 的,充斥着Java 世界,这是 Sun 希望的, 每定义一个规范,就会有很多厂商来实现它,Java 的软件市场就做大了,这样 Sun 就可以靠授权,认证拿更多的钱,你看 Sun 的股票那么低迷,而却拥有那么雄厚的流动资金,原因再明白不过了,只要 Sun 还拥有 Java ,它就拥有了一切。
Sun 希望 Java 变得复杂,就如同程序员希望 Perl 代码难看一样,这样做是可以带来好处的。Java 的复杂性也带来了产业链上其他行业的繁荣,比如咨询,在 Php ,Perl 流行 Internet 的年代,网站开发似乎还不需要咨询师,包括 C/S 盛行的时候,企业开发也不需要咨询师,然而随着 J2EE 逐步主宰企业级开发,咨询行业也开始兴旺起来。企业大把大把的把钱投入到开发咨询中,究竟效果如何,不得而知。我想对大多数程序员,尤其是那些有自己想法 的程序员来说,请求咨询公司,还不如自己去了解来得清楚。软件开发咨询师在我看来,有点象是"律师"—"代表贪婪的公司,让这个世界变得更糟糕一些"(中 Alex 的对白)。如果说国外的咨询师是希望通过主观的努力来解决客观存在的开发复杂性的话,那么国内的咨询行业可能把原本复杂的软件开发变得更加复杂了。我不相 信他们,我宁可选择某个软件的培训,而不希望有人来从头到尾指点你如何开发,因为国内咨询师的水平比你从书本上了解的高不到哪里去,公司又何必花费这笔冤 枉钱呢。
那么如果你是个"主动程序员",你会跟着 Sun 的指挥棒走吗? 我想离开 Java 世界,你选择的机会应该很多,但是前提是:你愿不愿意离开 Java 。因为大多数人觉得改变现状其实并不是个好事情,学习一个新语言和框架意为着你过去所有的经验就消失了,这其中有风险。对大多数程序员 来说,编程其实就是份工作,跟卖盒饭,装机器没什么区别,只要搞好本职工作就可以。试图改变现状的人很痛苦,了解差异的人也是如此,就如同 Neo 在接受红药丸和蓝药丸。
我在当年学习 Perl 的时候曾经买过一本《Learning perl》,书的作者曾经这么说,学习 Perl 是为了让自己把更多的时间用在去滑雪, PHP 的创始人 Rasmus Lerdorf 也曾经这样表示过,他希望自己能够减少盯着电脑的时间,可是这么多年过去了,他发现自己还是要继续盯着该死的电脑。其实我对选择框架语言也并没什么兴趣, 我只是希望能够以简单的方式完成工作,而把时间省下来去听听音乐,看看电影。实际上我跟不希望改变现状的人没什么不同,他们不希望学习新的东西,因为现有 的东西很熟悉了,学习新框架,还不如把时间放到玩上去,我的目的一样,我学习只是希望自己的工作更轻松一点,这样可以用更多的时间来玩。所以每当我看到各 种技术论坛上充斥着Java, .net , ROR ,Python 之类的争吵,我都觉得很好笑。其实为了维护一个语言而争吵最没有意义。编程语言就和英语,计算机一样,就是个工具,选择它们只是为了尽可能简单地完成工 作,提高生活质量。为了语言而语言,为了框架而框架都是没必要的。"主动程序员"可以选择自己的方式来工作,这是大多数人做不到的。如果有可能,我也希望 做一个"主动程序员"。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/tianya111/archive/2007/03/12/1527176.aspx
阅读全文
类别:美文转载 查看评论文章来源:
http://hi.baidu.com/ninky/blog/item/b8ec6b09c02b9cc73bc76395.html
posted @
2009-11-13 11:38 niuky 阅读(145) |
评论 (0) |
编辑 收藏
原文:50+ Amazing Jquery Examples- Part1
jQuery是近段时间里比较流行的一个JavaScript框架,不断有使用者开发出新的 jQuery插件。下面收集了50个开发者最喜欢使用的jQuery插件。这仅仅是第一个系列,你先品尝,第二道大餐即将到来。
Sliding Panels -滑动门控制
1) Sliding Panels For jQuery -元素可以展开或关闭,创建出手风琴的滑动效果。
(2) jQuery Collapse -这个jQuery插件同样点击后滑动展开或关闭DIV层。
Menu - 菜单
3) LavaLamp
(4) A Navigation Menu- 锚链接的无序列表嵌套, 可以添加2级菜单
(5) SuckerFish Style
Tabs - 选项卡
6) jQuery UI Tabs / Tabs 3 - 基于 jQuery 的一个Tab选项卡导航
(7) TabContainer Theme - 当用户在选项卡之间进行切换时,产生JQuery风格的淡出动效果。
Accordion- 手风琴效果
8 ) jQuery Accordion
Demo
(9) Simple JQuery Accordion menu
SlideShows - 幻灯片
10) jQZoom-让你在你的网页上很简单的实现图片的缩放功能。
(11) Image/Photo Gallery Viewer- 一个图像/相片的画廊展示插件。可以让你对图片进行分组、并产生像Flash一样的多种浏览特效。
Transition Effects - 过渡特效
12) InnerFade - 可以让网页中的任何元素产生淡化效果
(13) Easing Plugin-另外一个简单的过渡效果插件
(14) Highlight Fade
(15) jQuery Cycle Plugin- 拥有多种过渡效果的一个Gallery插件。
奇幻的jQuery
16) Riding carousels with jQuery - 这个jQuery插件可以生成一个水平或垂直的列表,并且允许你控制DIV层的滑动显示。
Demo :
Color Picker -拾色器
17) Farbtastic -这个 jQuery 插件可以让你通过Javascript添加一个或多个拾色器widgets到一个页面中。
Demo :
(18) jQuery Color Picker
LightBox -灯箱效果
19) jQuery ThickBox - is a webpage user interface dialog widget written in JavaScript.
Demo :
(20) SimpleModal Demos - its goal is providing developers with a cross-browser overlay and container that will be populated with content provided to SimpleModal.
Demo :
(21) jQuery lightBox Plugin - simple, elegant, unobtrusive, no need extra markup and is used to overlay images on the current page through the power and flexibility of jQuery′s selector.
Demo :
(
iframe
22) JQuery iFrame Plugin
Form Validation -表单验证器
23) Validation - 有一套完整相当的形式验证规则。该插件还动态地创建ID和联系信息。
Demo :
(24) Ajax Form Validation - 在客户端使用jquery验证的一种形式,它可以验证用户名是否有效等。
Demo :
(25) jQuery AlphaNumeric -欢迎对对表单域中的某些字符进行限制
Form Elements - 表单事件
(26) jquery.Combobox - 从现在的选择元素中创建一个个性的HTML组合 Demo is here.
(27) jQuery Checkbox -样式化选择框,从而提高交互能力。
(28) File Style Plugin for jQuery -File Style插件让你可以使用图像做为文件浏览按钮,你还可以样式化文件名称区域。
Star Rating - 星形评级系统
(29) Simple Star Rating System
30)Half-Star Rating Plugin
ToolTips -提示工具
31) Tooltip Plugin Examples - 一个花俏的提示应用。 可以对提示信息进行自定义位置, 设置阴影效果和添加更多内容等.你可以点击demo 演示.
(32) The jQuery Tooltip
Tables Plugins -表格插件
33) Zebra Tables Demo -使用jQuery来创建出斑马线风格的数据表格,鼠标悬浮时能改变背景色。
Demo :
(34) Table Sorter Plugin - 把一个标准的HTML表格分解成Thead和Tbody标签构成的分类表格,不需要刷新。它能够成功地解析和整理多种类型的数据,包括联系资料。
(35) AutoScroll for jQuery -可以生成网页表格的热点自动滚动效果
(36) Scrollable HTML table plugin- 用来转换表格为普通的滚动HTML。不需要额外的编码。
Demo :
Draggable Droppables And Selectables 拖拽
37) Sortables - 一个简单强大的拖拽插件。
(38) Draggables and droppables- 这是一个很好的演示。用来实现拖拽树形菜单项目的操作
Style Switcher - 切换风络
39) Switch stylesheets with jQuery允许访客选择他们喜欢的网站样式,使用了Cookie记录,也就是同一个用户下次再访问时,除非他不切换,否则会保留他选择的样式。
Demo演示.
Rounded Corners 圆角效果
40) jQuery Corner Demo
(41) JQuery Curvy Corners- 这个插件可以让你生成光滑、无锯齿的圆角效果。
Must See jQuery Examples 应该了解的一些jQuery应用实例
42) jQuery Air - 一个非常非常特别的客户管理界面应用插件,太特别了,太太太特别了。
Demo :
(43) HeatColor
Demo :
(44) Simple jQuery Examples
(45) Date Picker -一个灵活个性的jQuery日历组件。
Demo :
(46) ScrollTo -这个jQuery插件可以让你实现当点击链接时中滚动到页面中的某一对象
(47) 3-Column Splitter Layout 一个3栏布局分配插件。
(48) Pager jQuery -一个小巧的 jQuery插件,用来增加分页的页码效果
(49) Select box manipulation
(50) Cookie Plugin for jQuery
51) JQuery BlockUI Plugin
标签: Ajax, Drag&Drop, Efftect, Javascript, jquery, Round corners, Sliding, Style Switcher, Table, Transtion, 生成器, 相册画廊, 菜单, 表单, 转换器
阅读全文
类别:Jquery 查看评论文章来源:
http://hi.baidu.com/ninky/blog/item/81f105f71983732a730eecc9.html
posted @
2009-11-13 11:38 niuky 阅读(724) |
评论 (0) |
编辑 收藏
现在很多朋友用jQuery来编写javascript啦,要是有jQuery的代码提示功能就更好了,其实有很多这样的插件,这里就说说Spket吧!
以下内容转自http://www.cnblogs.com/meetrice/archive/2008/06/16/1223146.html 和
http://blog.sina.com.cn/s/blog_4b81125f0100bhxy.html
1. Spket的安装(三种方式):
(1)Plugin:
最低要求: eclipse平台运行时3.2.x ,
文件为: spket-1.6.16.zip别的插件的安装无异,相信不用我多说了吧
(2)Spket IDE:
最低要求:你需要java 1.5或更高版本运行安装程序,可独立使用(不用装Eclipse
文件为: spket-1.6.16.jar
安装步骤:
1、打开cmd,
2、在spket-1.6.16.jar文件目录下输入java -jar spket-1.6.16.jar
3、回车(相信你已看到安装画面
(3)Update Site
这是更新网站,为spket的ide 。
使用它,打开eclipse的updatemanager (在eclipse下的帮助菜单) ,并新增一个书签为:
http://www.spket.com/update
2. Elipse开发jQuery环境设置(Spket):
首先需要安装Spket,如上,之后进行JQuery的配置:
(1)从http://jquery.com/下载开发用的Javascript文件,如下图,一定要选择红框里面的选项
(2)配置Eclipse里面的Spket Javascript Profiles,如下图:
1) 从window->Preferences...进去
2) 如上图选择Spket -> Javascript Profiles
3) 点击New...输入JQuery建立新的profile
4) 点击Add Library,并选择JQuery,建立新的Library
5) 点击Add File, 选择刚下载的JQuery文件
6) 如果想让JQuery成为缺省的Javascript Profile,则点击Default。
然后新建Js文件,就可以使用JQuery的代码提示功能了:
阅读全文
类别:Js 查看评论文章来源:
http://hi.baidu.com/ninky/blog/item/16d2b6a18b17c48347106485.html
posted @
2009-11-13 11:38 niuky 阅读(1504) |
评论 (0) |
编辑 收藏