<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>xyz20003</title>
    <description></description>
    <link>http://xyz20003.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title> (翻译)Spring Security-2.0.1参考文档”技术概述“</title>
        <author>xyz20003</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xyz20003.javaeye.com">xyz20003</a>&nbsp;
          链接：<a href="http://xyz20003.javaeye.com/blog/198190" style="color:red;">http://xyz20003.javaeye.com/blog/198190</a>&nbsp;
          发表时间: 2008年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          技术概述<br />5.1. 运行环境<br /><br />Spring Security可以运行在标准的Java 1.4运行环境下。 它也支持Java 5.0，不过这部分代码单独打包起来，放到发布的，文件名是"tiger"前缀的JAR文件里。 因为Spring Security的目标是自己容器内管理，所以不需要为你的Java运行环境进行什么特别的配置。 特别是，不需要特别配置一个Java Authentication and Authorization Service (JAAS)政策文件，也不需要把Spring Security放到server的classLoader下。<br /><br />上面这些设计，确保了发布时的最大轻便性，你可以简单把你的目标文件（JAR或WAR或EAR）从一个系统复制到另一个系统，它会立即正常工作。<br />5.2. 共享组件<br /><br />让我们展示一些Spring Security中很重要的共享组件。 被成为"shared"的组件，是指它在框架中占有很重要的位置，框架离开它们就没法运行。 这些java类表达了维持系统的构建代码块，所以理解他们的位置是非常重要的，即使你不需要直接跟他们打交道。<br />5.2.1. SecurityContextHolder, SecurityContext 和 Authentication对象<br /><br />最基础的对象就是SecurityContextHolder。 我们把当前应用程序的当前安全环境的细节存储到它里边了。 默认情况下，SecurityContextHolder使用ThreadLocal存储这些信息，这意味着，安全环境在同一个线程执行的方法一直是有效的，即使这个安全环境没有作为一个方法参数传递到那些方法里。 这种情况下使用ThreadLocal是非常安全的，只要记得在处理完当前主体的请求以后，把这个线程清除就行了。 当然，Spring Security自动帮你管理这一切了，你就不用担心什么了。<br /><br />有些程序并不适合使用ThreadLocal，因为它们处理线程的特殊方法。 比如，swing客户端也许希望JVM里的usoyou线程都使用同一个安全环境。 为了这种情况，我们而已使用SecurityContextHolder.MODE_GLOBAL。 其他程序可能想让一个线程创建的线程也使用相同的安全主体。 这时可以使用SecurityContextHolder.MODE_INHERITABLETHREADLOCAL。 想要修改默认的SecurityContextHolder.MODE_THREADLOCAL模式，可以使用两种方法。 第一个是设置系统属性。 另一个是调用SecurityContextHolder的静态方法。 大多数程序不需要修改默认值，但是如果你需要做修改，先看一下SecurityContextHolder的JavaDoc中的详细信息。<br /><br />我们把安全主体和系统交互的信息都保存在SecurityContextHolder中了。 Spring Security使用一个Authentication对应来表现这些信息。 虽然你通常不需要自己创建一个Authentication对象，很常见的，用户查询Authentication对象。 你可以使用下面的代码-在你程序中的任何位置-来做这件事：<br /><br />Object obj = SecurityContextHolder.getContext().getAuthentication().getPrincipal();<br /><br />if (obj instanceof UserDetails) {<br />  String username = ((UserDetails)obj).getUsername();<br />} else {<br />  String username = obj.toString();<br />}<br /><br />上面的代码介绍了一定数量的，有趣的，几个关键对象之间的相互关系。 首先，你会注意到SecurityContextHolder 和 Authentication之间的中间对象。 这个SecurityContextHolder.getContext()方法会直接返回SecurityContext。<br />5.2.2. UserDetailsService<br /><br />从上面的代码片段中还可以看出另一件事，就是你可以从Authentication对象中获得安全主体。 这个安全主体就是一个对象。 大多数情况下，可以强制转换成UserDetails对象。 UserDetails是一个Spring Security的核心接口。 它代表一个主体，是扩展的，而且是为特定程序服务的。 想一下UserDetails章节，在你自己的用户数据库和如何把Spring Security需要的数据放到SecurityContextHolder里。 为了让你自己的用户数据库起作用，我们常常把UserDetails转换成你系统提供的类，这样你就可以直接调用业务相关的方法了（比如getEmail(), getEmployeeNumber()等等）。<br /><br />现在，你可能想知道，我应该什么时候提供这个UserDetails对象呢？ 我怎么做呢？ 我想你说这个东西是声明式的，我不需要写任何代码，怎么办？ 简单的回答是，这里有一个特殊的接口，叫UserDetailsService。 这个接口里的唯一一个方法，接收String类型的用户名参数，返回UserDetails。 大多数验证提供器使用Spring Security代理UserDetailsService，作为验证过程的一部分。 这个UserDetailsService用来建立Authentication对象，保存在SecurityContextHolder里。 好消息是我们提供了好几个UserDetailsService实现，其中一个使用内存里的map，另一个使用JDBC。 虽然，大多数用户倾向于写自己的，使用这些实现常常放到已有的数据访问对象（DAO）上，表示它们的雇员，客户或其他企业应用中的用户。 记住这个优势，无论你用什么UserDetailsService返回的数据都可以通过SecurityContextHolder获得，就像上面的代码片段讲的一样。<br />5.2.3. GrantedAuthority<br /><br />除了主体，另一个Authentication提供的重要方法是getAuthorities()。 这个方法提供了GrantedAuthority对象数组。 毫无疑问，GrantedAuthority是赋予到主体的权限。 这些权限通常使用角色表示，比如ROLE_ADMINISTRATOR 或 ROLE_HR_SUPERVISOR。 这些角色会在后面，对web验证，方法验证和领域对象验证进行配置。 Spring Security的其他部分用来拦截这些权限，期望他们被表现出现。 GrantedAuthority对象通常使用UserDetailsService读取的。<br /><br />通常情况下，GrantedAuthority对象是应用程序范围下的授权。 它们不会特意分配给一个特定的领域对象。 因此，你不能设置一个GrantedAuthority，让它有权限展示编号54的Employee对象，因为如果有成千上网的这种授权，你会很快用光内存（或者，至少，导致程序花费大量时间去验证一个用户）。 当然，Spring Security被明确设计成处理常见的需求，但是你最好别因为这个目的使用项目领域模型安全功能。<br /><br />最后，但不是最不重要的，优势你需要在HTTP请求之间共享SecurityContext. 其他时候，主体会在每个请求里重新验证，虽然大多数情况下它可以存储。 HttpSessionContextIntegrationFilter就是实现在HTTP请求之间存储SecurityContext的。 就像它的类名一样，HttpSession被用来保存这些信息。 你不应该因为安全的问题，直接与HttpSession打交道。 根本不存在这样做的理由-一直使用SecurityContextHolder作替代方式。<br />5.2.4. 小结<br /><br />简单回顾一下，Spring Security主要是由一下几部分组成的：<br /><br />    *<br /><br />      SecurityContextHolder，提供几种访问SecurityContext的方式。<br />    *<br /><br />      SecurityContext，保存Authentication信息，和请求对应的安全信息。<br />    *<br /><br />      HttpSessionContextIntegrationFilter，为了在不同请求使用，把SecurityContext保存到 HttpSession里。<br />    *<br /><br />      Authentication，展示Spring Security特定的主体。<br />    *<br /><br />      GrantedAuthority，反应，在应用程序范围你，赋予主体的权限。<br />    *<br /><br />      UserDetails，通过你的应用DAO，提供必要的信息，构建Authentication对象。<br />    *<br /><br />      UserDetailsService，创建一个 UserDetails，传递一个 String类型的用户名（或者证书ID或其他）。<br /><br />现在，你应该对这种重复使用的组件有一些了解了。 让我们贴近看一下验证的过程。<br />5.3. 验证<br /><br />就像这篇指南开头提到的那样，Spring Security可在很多不同的验证环境下使用。 虽然我们推荐人们使用Spring Security，不与已存在的容器管理认证系统整合，但它也是支持的-使用你自己的属性验证系统进行整合。 让我们先看看Spring Security完全依靠自己，管理web安全，这里会演示最复杂和最常见的情况。<br /><br />讨论一个典型的web应用验证过程：<br /><br />   1.<br /><br />      你访问首页，点击一个链接。<br />   2.<br /><br />      向服务器发送一个请求，服务器判断你是否在访问一个受保护的资源。<br />   3.<br /><br />      如果你还没有进行过认证，服务器发回一个响应，提示你必须进行认证。 响应可能是HTTP响应代码，或者是重新定向到一个特定的web页面。<br />   4.<br /><br />      依据验证机制，你的浏览器将重定向到特定的web页面，这样你可以添加表单， 或者浏览器使用其他方式校验你的身份（比如，一个基本校验对话框，cookie，或者X509证书，或者其他）。<br />   5.<br /><br />      浏览器会发回一个响应给服务器。 这将是HTTP POST包含你填写的表单内容，或者是HTTP头部，包含你的验证信息。<br />   6.<br /><br />      下一步，服务器会判断当前的证书是否是有效的， 如果他们是有效的，下一步会执行。 如果他们是非法的，通常你的浏览器会再尝试一次（所以你返回的步骤二）。<br />   7.<br /><br />      你发送的原始请求，会导致重新尝试验证过程。 有希望的是，你会通过验证，得到猪狗的授权，访问被保护的资源。 如果你有足够的权限，请求会成功。否则，你会收到一个HTTP错误代码403，意思是访问被拒绝。<br /><br />Spring Security使用鲜明的类负责上面提到的每个步骤。 主要的部分是（为了使用他们）是ExceptionTranslationFilter， 一个AuthenticationEntryPoint, 一个验证机制，一个AuthenticationProvider。<br />5.3.1. ExceptionTranslationFilter<br /><br />ExceptionTranslationFilter是一个Spring Security过滤器，用来检测是否抛出了Spring Security异常。 这些异常会被AbstractSecurityInterceptor抛出，它主要用来提供验证服务。 我们会在下一节讨论AbstractSecurityInterceptor，但是现在，我们只需要知道，它是用来生成Java异常，和知道跟HTTP没啥关系，或者如何验证一个主体。 而ExceptionTranslationFilter提供这些服务，使用特点那个的响应，返回错误代码403（如果主题被验证了，但是权限不足-在上边的步骤七），或者启动一个AuthenticationEntryPoint（如果主体没有认证，然后我们需要进入步骤三）。<br />5.3.2. AuthenticationEntryPoint<br /><br />AuthenticationEntryPoint对应中上面列表中的步骤三。 如你所想的，每个web应用程序都有默认的验证策略（好的，这可以在Spring Security里配置一切，但是让我们现在保持简单）。 每个主要验证系统会有它自己的AuthenticationEntryPoint实现， 会执行动作，如同步骤三里的描述一样。<br /><br />在你的浏览器决定提交你的认证证书之后（使用HTTP表单发送或者是HTTP头），服务器部分需要有一些东西来“收集”这些验证信息。 现在我们到了上述的第六步。 在Spring Security里，我们需要一个特定的名字，来描述从用户代码（通常是浏览器）收集验证信息的功能，这个名字就是“验证机制”。 在从用户代码哪里收集了验证细节之后，一个"Authentication 请求"对象会被AuthenticationProvider建立。<br />5.3.3. AuthenticationProvider<br /><br />Spring Security认证过程的最后一个角色是AuthenticationProvider。 非常简单，这是跟获得Authentication请求对象相关的，决定它是否是有效的。 这个供应器或者抛出一个异常，或者返回一个完整的Authentication对象。 还记得我们的好朋友UserDetails和UserDetailsService吗？ 如果不记得，回头看看前面的章节，刷新你的记忆。 大多数AuthenticationProvider都会要求UserDetailsService提供一个UserDetails对象。 像上面提到的那样，大多数程序会提供他们自己的UserDetailsService虽然一些可以使用Spring Security提供的JDBC和内存实现。 由此产生的UserDetails对象-特别是UserDetails中包含的GrantedAuthority[]-将被用来组装Authentication对象。<br /><br />在验证机制重新获得了组装好的Authentication对象以后，他会认为请求有效，把Authentication放到SecurityContextHolder里，然后导致原始请求重审（第七步）。 另一方面，如果AuthenticationProvider驳回了请求，验证机制会让用户代码重试（第二步）。<br />5.3.4. 直接设置SecurityContextHolder的内容<br /><br />虽然这表述了一个典型的验证流程，但是好消息是Spring Security不在意你如何把一个Authentication放到SecurityContextHolder里的。 唯一关键的需求是SecurityContextHolder包含Authentication，用来表现一个主体，在AbstractSecurityInterceptor之前验证请求的。<br /><br />你可以（很多用户都这样做）写一个自己的过滤器或MVC控制器来提供验证系统的交互，这些都不是基于Spring Security的。 比如，你也许使用容器管理验证，从ThreadLocal或JNDI里获得当前用户信息。 或者，你的公司可能有一个遗留系统，它是一个企业标准，你不能控制它。 这种情况下，很容易让Spring Security工作，也能提供验证能力。 你所需要的就是写一个过滤器（或等价物）从指定位置读取第三方用户信息，把它放到SecurityContextHolder里。 实现这些很简单，这种整合是完全被支持的方法。<br />5.4. 安全对象<br /><br />如果你熟悉AOP的话，就会知道有几种不同的拦截方式：之前，之后，抛异常和环绕。 其中环绕是非常有用的，因为advisor可以决定是否执行这个方法，是否修改返回的结果，是否抛出异常。 Spring Security为方法调用提供了一个环绕advice，就像web请求一样。 我们使用AOP联盟制作了一个方法调用的环绕advice，我们使用标准filter建立了对web请求的环绕advice。<br /><br />对那些不熟悉AOP的人，需要理解的关键问题是Spring Security可以帮助你保护方法的调用，就像保护web请求一样。 大多数人对保护服务层里的安全方法非常按兴趣。 这是因为在目前这一代J2EE程序里，服务器放了更多业务相关的逻辑（需要澄清，作者不建议这种设计方法，作为替代的，而是应该使用DTO，集会，门面和透明持久模式压缩领域对象，但是贫血领域对象是当前的主流思路，我们会在这里讨论它）。 如果你只是需要保护服务层的方法调用，使用Spring标准AOP平台（被称作AOP联盟）就够了。 如果你想直接保护领域对象，你会发现AspectJ非常值得考虑。<br /><br />可以选择使用AspectJ还是AOP联盟处理方法验证，或者你可以选择使用filter处理web请求验证。 你可以不选，选择其中一个，选择两个，或者三个都选。 主流的应用是处理一些web请求验证，再结合一些在服务层里的AOP联盟方法调用验证。<br /><br />Spring Security使用"secure object"来表示任何需要安全管理的对象。 Spring Security支持的每个安全对象都有它自己的类，他们都是AbstractSecurityInterceptor的子类。 重要的是，在AbstractSecurityInterceptor运行的时候，如果主体通过了认证，SecurityContextHolder里就会包含一个合法的 Authentication。<br /><br />AbstractSecurityInterceptor提供了一致的流程，来处理安全方法的请求。 这个流程包括查找分配给当前请求的"配置属性"。 这个"配置属性"可以被想像成一个字符串，对AbstractSecurityInterceptor有特殊含义。 通常使用XML配置你的AbstractSecurityInterceptor。 无论如何，AbstractSecurityInterceptor会告诉AccessDecisionManager“这里是配置属性，这里是当前Authentication对象，这里是当前Authentication对象，这里是当前请求的细节-然后，这个特定的主体，是否允许执行这个特定的操作吗？”<br /><br />假设AccessDecisionManager决定允许执行这个请求，AbstractSecurityInterceptor会正常执行这个请求。 话虽如此，罕见情况下，用户可能需要把SecurityContext的Authentication换成另一个Authentication，通过访问RunAsManager。 这也许在，有原因，不常见的情况下有用，比如，服务层方法需要调用远程系统，表现不同的身份。 因为Spring Security自动传播安全身份，从一个服务器到另一个（假设你使用了配置好的RMI或者HttpInvoker远程调用协议客户端），就可以用到它了。<br /><br />按照下面安全对象执行和返回的方式-可能意味着完全的方法调用或过滤器链的执行。 这种状态下AbstractSecurityInterceptor对有可能修改返回对象感兴趣。 你可能想让它发生，因为验证决定不能“关于如何在”一个安全对象调用。 高可插拔性，AbstractSecurityInterceptor通过控制AfterInvocationManager，实际上在需要的时候，修改对象。 这里类实际上可能替换对象，或者抛出异常，或者什么也不做。<br /><br />因为AbstractSecurityInterceptor是中央模板类，更像第一时间为它服务。<br />关键"secure object"模型<br /><br />Figure 5.1. 关键"secure object"模型<br /><br /><br />只有开发者才会关心使用全心的方法，进行拦截和验证请求，将直接使用安全方法。 比如，可能新建一个安全方法，控制对消息系统的权限。 安全需要的任何事情，也可以提供一种拦截的方法（好像AOP的环绕advice语法那样）有可能在安全对象里处理。 这样说的话，大多数Spring应用简单拥有三种当前支持的安全类型（AOP联盟的MethodInvocation，AspectJ JoinPoint和web请求FilterInterceptor）完全透明的。<br />5.5. 结论<br /><br />祝贺你！ 你已经看过了足够多的Spring Security的高级特性，着手于你的程序。 我们探讨了共享组件，验证是如何工作的，并审核了“安全对象”的正常验证过程。 参考指南的后面部分，可能也可能灭有满足你的特定要求，可以使用任何顺序阅读。
          <br/>
          <span style="color:red;">
            <a href="http://xyz20003.javaeye.com/blog/198190#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 29 May 2008 11:56:53 +0800</pubDate>
        <link>http://xyz20003.javaeye.com/blog/198190</link>
        <guid>http://xyz20003.javaeye.com/blog/198190</guid>
      </item>
      <item>
        <title>(翻译)Spring Security-2.0.1参考文档的”使用命名空间简化配置“部分</title>
        <author>xyz20003</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xyz20003.javaeye.com">xyz20003</a>&nbsp;
          链接：<a href="http://xyz20003.javaeye.com/blog/196922" style="color:red;">http://xyz20003.javaeye.com/blog/196922</a>&nbsp;
          发表时间: 2008年05月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Security命名空间配置<br />2.1. 介绍<br /><br />从Spring-2.0开始可以使用命名空间的配置方式。 使用它呢，可以通过附加xml架构，为传统的spring beans应用环境语法做补充。 你可以在spring参考文档得到更多信息。 命名空间元素可以简单的配置单个bean，或使用更强大的，定义一个备用配置语法，这可以更加紧密的匹配问题域，隐藏用户背后的复杂性。 简单元素可能隐藏事实，多种bean和处理步骤添加到应用环境中。 比如，把下面的security命名元素添加到应用环境中，将会为测试用途，在应用内部启动一个内嵌LDAP服务器：<br /><br />  &lt;security:ldap-server /><br /><br />这比配置一个Apache目录服务器bean要简单得多。 最常见的替代配置需求都可以使用ldap-server元素的属性进行配置，这样用户就不用担心他们需要设置什么，不用担心bean里的各种属性。 [1]。使用一个良好的XML编辑器来编辑应用环境文件，应该提供可用的属性和元素信息。 我们推荐你尝试一下 SpringSource工具套件 因为它具有处理spring组合命名空间的特殊功能。<br /><br />要开始在你的应用环境里使用security命名空间，你所需要的就是把架构声明添加到你的应用环境文件里：<br /><br />  <br />&lt;beans xmlns="http://www.springframework.org/schema/beans"<br />  xmlns:security="http://www.springframework.org/schema/security"<br />  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd<br />              http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd"><br />    ...<br />&lt;/beans><br />  <br /><br />在许多例子里，你会看到（在示例中）应用，我们通常使用"security"作为默认的命名空间，而不是"beans"，这意味着我们可以省略所有security命名空间元素的前缀，使上下文更容易阅读。 如果你把应用上下文分割成单独的文件，让你的安全配置都放到其中一个文件里，这样更容易使用这种配置方法。 你的安全应用上下文应该像这样开头<br /><br />&lt;beans:beans xmlns="http://www.springframework.org/schema/security"<br />   xmlns:beans="http://www.springframework.org/schema/beans"><br />    ...<br />&lt;/beans:beans><br /><br />就在这一章里，我们都将假设使用这种语法。<br />2.1.1. 命名空间的设计<br /><br />命名空间被用来设计成，处理框架内最常见的功能，提供一个简化和简洁的语法，使他们在一个应用程序里。 这种设计是基于框架内的大型依赖，可以分割成下面这些部分：<br /><br />    *<br /><br />      Web/HTTP安全 - 最复杂的部分。设置过滤器和相关的服务bean来应用框架验证机制， 保护URL，渲染登录和错误页面还有更多。<br />    *<br /><br />      业务类（方法）安全 - 可选的安全服务层。<br />    *<br /><br />      AuthenticationManager - 通过框架的其它部分，处理认证请求。<br />    *<br /><br />      AccessDecisionManager - 提供访问的决定，适用于web以及方法的安全。一个默认的主体会被注册，但是你也可以选择自定义一个，使用正常的spring bean语法进行声明。<br />    *<br /><br />      AuthenticationProviders - 验证管理器验证用户的机制。 该命名空间提供几种标准选项，意味着使用传统语法添加自定义bean。<br />    *<br /><br />      UserDetailsService - 密切相关的认证供应器，但往往也需要由其他bean需要。<br /><br />下一章中，我们将看到如何把这些放到一起工作。<br />2.2. 开始使用安全命名空间配置<br /><br />在本节中，我们来看看如何使用一些框架里的主要配置，建立一个命名空间配置。 我们假设你最初想要尽快的启动运行，为已有的web应用添加认证支持和权限控制，使用一些测试登录。 然后我们看一下如何修改一下，使用数据库或其他安全信息残酷。 在以后的章节里我们将引入更多高级的命名空间配置选项。<br />2.2.1. 配置web.xml<br /><br />我们要做的第一件事是把下面的filter声明添加到 web.xml 文件中：<br /><br />        <br />&lt;filter><br />  &lt;filter-name>springSecurityFilterChain&lt;/filter-name><br />  &lt;filter-class>org.springframework.web.filter.DelegatingFilterProxy&lt;/filter-class><br />&lt;/filter><br /><br />&lt;filter-mapping><br />  &lt;filter-name>springSecurityFilterChain&lt;/filter-name><br />  &lt;url-pattern>/*&lt;/url-pattern><br />&lt;/filter-mapping><br />      <br /><br />这为Spring Security提供了一个调用钩子。 然后我们准备编辑application context文件。 web安全服务使用&lt;http> 进行元素配置。<br />2.2.2. 最小 &lt;http>配置<br /><br />只需要进行如下配置就可以实现安全配置：<br /><br />  &lt;http auto-config='true'><br />    &lt;intercept-url pattern="/**" access="ROLE_USER" /><br />  &lt;/http><br />  <br /><br />这表示，我们要保护应用程序中的所有URL，只有拥有 ROLE_USER角色的用户才能访问。<br />Note<br /><br />你可以使用多个&lt;intercept-url>元素为不同URL的集合定义不同的访问需求，它们会被归入一个有序队列中，每次取出最先匹配的一个元素使用。 所以你必须把期望使用的匹配条件放到最上边。<br /><br />要是想添加一些用户，你可以直接使用下面的命名空间直接定义一些测试数据：<br /><br />  &lt;authentication-provider><br />    &lt;user-service><br />      &lt;user name="jimi" password="jimispassword" authorities="ROLE_USER, ROLE_ADMIN" /><br />      &lt;user name="bob" password="bobspassword" authorities="ROLE_USER" /><br />    &lt;/user-service><br />  &lt;/authentication-provider><br />  <br />        <br /><br />如果你熟悉以前的版本，你很可能已经猜到了这里是怎么回事。 &lt;http>元素会创建一个FilterChainProxy和filter使用的bean。 以前常常出现的，因为filter顺序不正确产生的问题，不会再出现了，现在这些过滤器的位置都是预定义好的。<br /><br />&lt;authentication-provider>元素创建了一个DaoAuthenticationProvider bean，&lt;user-service>元素创建了一个InMemoryDaoImpl。 一个ProviderManager bean通常是由命名空间过程系统创建的， DaoAuthenticationProvider自动注册到它上面。<br /><br />上面的配置定义了两个用户，他们在应用程序中的密码和角色（用在权限控制上）。 也可以从一个标准properties文件中读取这些信息，使用user-service的properties属性。 参考in-memory authentication获得更多信息。 使用&lt;authentication-provider>元素意味着用户信息将被认证管理用作处理认证请求。<br /><br />现在，你可以启动程序，然后就会进入登录流程了。 试试这个，或者试试工程里的"tutorial"例子。 上述配置实际上把很多服务添加到了程序里，因为我们使用了auto-config属性。 比如，表单登录和"remember-me"服务自动启动了。<br />2.2.2.1. auto-config包含了什么？<br /><br />我们在上面用到的auto-config属性，其实是下面这些配置的缩写：<br /><br />  &lt;http><br />    &lt;intercept-url pattern="/**" access="ROLE_USER" /><br />    &lt;form-login /><br />    &lt;anonymous /><br />    &lt;http-basic /><br />    &lt;logout /><br />    &lt;remember-me /><br />  &lt;/http><br />  <br />          <br /><br />这些元素分别与form-login，匿名认证，基本认证，注销处理和remember-me对应。 他们拥有各自的属性，来改变他们的具体行为。<br />auto-config需要一个UserDetailsService<br /><br />使用auto-config的时候如果没配置UserDetailsService就会出现错误（比如，如果你使用了LDAP认证）。 这是因为remember-me服务在auto-config="true"的时候启动了，它的认证机制需要UserDetailsService来实现（参考Remember-me章获得更多信息）。 如果你遇到了一个因为没定义UserDetailsService造成的问题，那就试着去掉auto-config配置（或者是其他你配置上的remember-me）。<br />2.2.2.2. 表单和基本登录选项<br /><br />你也许想知道，在需要登录的时候，去哪里找这个登录页面，到现在为止我们都没有提到任何的HTML或JSP文件。 实际上，如果我们没有确切的指定一个页面用来登录，Spring Security会自动生成一个，基于可用的功能，为这个URL使用标准的数据，处理提交的登录，然后发送到默认的目标URL。 然而，命名空间提供了许多支持，让你可以自定义这些选项。 比如，如果你想实现自己的登录页面，你可以使用：<br /><br />  &lt;http auto-config='true'><br />    &lt;intercept-url pattern="/login.jsp*" filters="none"/><br />    &lt;intercept-url pattern="/**" access="ROLE_USER" /><br />    &lt;form-login login-page='/login.jsp'/><br />  &lt;/http><br />  <br />        <br /><br />注意，你依旧可以使用auto-config。 这个form-login元素会覆盖默认的设置。 也要注意我们需要添加额外的intercept-url元素，指定用来做登录的页面的URL，这些URL不应该被安全filter处理。 否则，这些请求会被/**部分拦截，它没法访问到登录页面。 如果你想使用基本认证而不是表单登录，可以把配置修改成如下所示：<br /><br />  &lt;http auto-config='true'><br />    &lt;intercept-url pattern="/**" access="ROLE_USER" /><br />    &lt;http-basic /><br />  &lt;/http><br />  <br />        <br /><br />基本身份认证会被优先用到，在用户尝试访问一个受保护的资源时，用来提示用户登录。 在这种配置中，表单登录依然是可用的，如果你还想用的话，比如，把一个登录表单内嵌到其他页面里。<br />2.2.3. 使用其他认证提供器<br /><br />现实中，你会需要更大型的用户信息源，而不是写在application context里的几个名字。 多数情况下，你会想把用户信息保存到数据库或者是LDAP服务器里。 LDAP命名控件会在LDAP章里详细讨论，所以我们这里不会讲它。 如果你自定义了一个Spring Security的UserDetailsService实现，在你的application context中名叫"myUserDetailsService"，然后你可以使用下面的验证。<br /><br />  &lt;authentication-provider user-service-ref='myUserDetailsService'/><br />  <br />        <br /><br />如果你想用数据库，可以使用下面的方式<br /><br />  &lt;authentication-provider><br />    &lt;jdbc-user-service data-source-ref="securityDataSource"/><br />  &lt;/authentication-provider><br />  <br />        <br /><br />这里的"securityDataSource"就是 DataSource bean在application context里的名字，它指向了包含着Spring Security用户信息的表。 另外，你可以配置一个Spring Security JdbcDaoImpl bean，使用user-service-ref属性指定。<br />2.2.3.1. 添加一个密码编码器<br /><br />你的密码数据通常要使用一种散列算法进行编码。 使用&lt;password-encoder>元素支持这个功能。 使用SHA加密密码，原始的认证供应器配置，看起来就像这样：<br /><br />&lt;authentication-provider><br />  &lt;password-encoder hash="sha"/><br />  &lt;user-service><br />    &lt;user name="jimi" password="d7e6351eaa13189a5a3641bab846c8e8c69ba39f" authorities="ROLE_USER, ROLE_ADMIN" /><br />    &lt;user name="bob" password="4e7421b1b8765d8f9406d87e7cc6aa784c4ab97f" authorities="ROLE_USER" /><br />  &lt;/user-service><br />&lt;/authentication-provider><br />  <br />          <br /><br />在使用散列密码时，用盐值防止字典攻击是个好主意，Spring Security也支持这个功能。 理想情况下，你可能想为每个用户随机生成一个盐值，不过，你可以使用从UserDetailsService读取出来的UserDetails对象中的属性。 比如，使用username属性，你可以这样用：<br /><br />&lt;password-encoder hash="sha"><br />  &lt;salt-source user-property="username"/><br />&lt;/password-encoder><br />    <br /><br />你可以通过password-encoder的ref属性，指定一个自定义的密码编码器bean。 这应该包含application context中一个bean的名字，它应该是Spring Security的PasswordEncoder接口的一个实例。<br />2.3. 高级web特性<br />2.3.1. Remember-Me认证<br /><br />参考Remember-Me章获得remember-me命名空间配置的详细信息。<br />2.3.2. 添加HTTP/HTTPS信道安全<br /><br />如果你的同时支持HTTP和HTTPS协议，然后你要求特定的URL只能使用HTTPS，这时可以直接使用&lt;intercept-url>的requires-channel属性：<br /><br />  &lt;http><br />    &lt;intercept-url pattern="/secure/**" access="ROLE_USER" requires-channel="https"/><br />    &lt;intercept-url pattern="/**" access="ROLE_USER" requires-channel="any"/><br />    ...<br />  &lt;/http><br />        <br /><br />使用了这个配置以后，如果用户通过HTTP尝试访问"/secure/**"匹配的网址，他们会先被重定向到HTTPS网址下。 可用的选项有"http", "https" 或 "any"。 使用"any"意味着使用HTTP或HTTPS都可以。<br /><br />如果你的程序使用的不是HTTP或HTTPS的标准端口，你可以用下面的方式指定端口对应关系：<br /><br />          <br />  &lt;http><br />    ...<br />    &lt;port-mappings><br />      &lt;port-mapping http="9080" https="9443"/><br />    &lt;/port-mappings><br />  &lt;/http><br />        <br /><br />你可以在Chapter 7, Channel Security找到更详细的讨论。<br />2.3.3. 同步Session控制<br /><br />如果你希望限制单个用户只能登录到你的程序一次，Spring Security通过添加下面简单的部分支持这个功能。 首先，你需要把下面的监听器添加到你的web.xml文件里，让Spring Security获得session生存周期事件：<br /><br />          <br />&lt;listener><br />  &lt;listener-class>org.springframework.security.ui.session.HttpSessionEventPublisher&lt;/listener-class><br />&lt;/listener><br /><br />然后，在你的application context加入如下部分：<br /><br />  &lt;http><br />    ...<br />    &lt;concurrent-session-control max-sessions="1" /><br />  &lt;/http><br />        <br /><br />这将防止一个用户重复登录好几次-第二次登录会让第一次登录失效。 通常我们更想防止第二次登录，这时候我们可以使用<br /><br />  &lt;http><br />    ...<br />    &lt;concurrent-session-control max-sessions="1" exception-if-maximum-exceeded="true"/><br />  &lt;/http><br />        <br /><br />第二次登录将被阻止。<br />2.3.4. OpenID登录<br /><br />命名空间支持OpenID登录，替代普通的表单登录，或作为一种附加功能，只需要进行简单的修改：<br /><br />  &lt;http auto-config='true'><br />    &lt;intercept-url pattern="/**" access="ROLE_USER" /><br />    &lt;openid-login /><br />  &lt;/http><br />  <br /><br />你应该注册一个OpenID供应器（比如myopenid.com），然后把用户信息添加到你的内存&lt;user-service>中：<br /><br />  &lt;user name="http://jimi.hendrix.myopenid.com/" password="notused" authorities="ROLE_USER" /><br />  <br /><br />你应该可以使用myopenid.com网站登录来进行验证了。<br />2.3.5. 添加你自己的filter<br /><br />如果你以前使用过Spring Security，你应该知道这个框架里维护了一个过滤器链，来提供它的服务。 你也许想把你自己的过滤器添加到链条的特定位置，或者让已存在的过滤器，使用特定的版本。 你如何在命名空间配置里实现这些功能呢？过滤器链现在已经不能之间看到了。<br /><br />过滤器顺序在使用命名空间的时候是被严格执行的。 每个Spring Security过滤器都实现了Spring的Ordered接口，这些过滤器在初始化的时候先被排好序了。 标准的过滤器在命名空间里都有自己的假名：<br /><br />Table 2.1. 标准过滤器假名和顺序<br />Alias	Filter Class<br />CHANNEL_FILTER	ChannelProcessingFilter<br />CONCURRENT_SESSION_FILTER	ConcurrentSessionFilter<br />SESSION_CONTEXT_INTEGRATION_FILTER	HttpSessionContextIntegrationFilter<br />LOGOUT_FILTER 	LogoutFilter<br />X509_FILTER 	X509PreAuthenticatedProcessigFilter<br />PRE_AUTH_FILTER 	Subclass of AstractPreAuthenticatedProcessingFilter<br />CAS_PROCESSING_FILTER 	CasProcessingFilter<br />AUTHENTICATION_PROCESSING_FILTER 	AuthenticationProcessingFilter<br />BASIC_PROCESSING_FILTER 	BasicProcessingFilter<br />SERVLET_API_SUPPORT_FILTER	classname<br />REMEMBER_ME_FILTER 	RememberMeProcessingFilter<br />ANONYMOUS_FILTER 	AnonymousProcessingFilter<br />EXCEPTION_TRANSLATION_FILTER 	ExceptionTranslationFilter<br />NTLM_FILTER 	NtlmProcessingFilter<br />FILTER_SECURITY_INTERCEPTOR 	FilterSecurityInterceptor<br />SWITCH_USER_FILTER 	SwitchUserProcessingFilter<br /><br /><br />你可以把你自己的过滤器添加到队列中，使用custom-filter元素，使用这些名字中的一个，来指定你的过滤器应该出现的位置：<br /><br />  &lt;beans:bean id="myFilter" class="com.mycompany.MySpecialAuthenticationFilter"><br />    &lt;custom-filter position="AUTHENTICATION_PROCESSING_FILTER"/><br />  &lt;/beans:bean><br />  <br /><br />你还可以使用after 或 before属性，如果你想把你的过滤器添加到队列中另一个过滤器的前面或后面。可以使用"FIRST" 或 "LAST"来指定你想让你的过滤器分别出现在队列元素的前面或后面。<br />2.3.6. 防止Session固定攻击<br /><br />Session固定攻击是一个潜在危险，当一个恶意攻击者可以创建一个session访问一个网站的时候，然后说服另一个用户登录到同一个会话上（比如，发送给他们一个包含了session标识参数的链接）。 Spring Security通过在用户登录时，创建一个新session来防止这个问题。 如果你不需要保护，或者它与其他一些需求冲突，你可以通过使用&lt;http>中的session-fixation-protection属性来配置它的行为，它有三个选项<br /><br />    *<br /><br />      migrateSession - 创建一个新session，把原来session中所有属性复制到新session中。这是默认值。<br />    *<br /><br />      none - 什么也不做，继续使用原来的session。<br />    *<br /><br />      newSession - 创建一个新的“干净的”session，不会复制session中的数据。<br /><br />2.3.7. 设置自定义AuthenticationEntryPoint<br /><br />如果你不使用命名空间里的表单登录，OpenID或基本身份验证，你也许想定义个验证过滤器和入口点，使用传统的bean语法，把他们链接到命名空间里。 你可以像Section 2.3.5, “添加你自己的filter”里解释的那样，添加过滤器。 对应的AuthenticationEntryPoint可以使用&lt;http>中的entry-point-ref进行设置。<br /><br />CAS例子，是一个在命名空间里使用自定义bean的好例子，包括这个语法。如果你不熟悉验证入口点，可以看看技术纵览章节中的讨论。<br />2.4. 保护方法<br /><br />Spring Security 2.0大幅改善了对你的服务层方法添加安全。 如果你使用Java 5或更高版本，还支持JSR-250的安全注解，同框架提供的@secured注解相似。 你可以为单个bean提供安全控制，通过使用intercept-methods元素装饰bean声明，或者你可以使用AspectJ方式的切点来控制实体服务层里的多个bean。<br />2.4.1. &lt;global-method-security>元素<br /><br />这个元素用来在你的应用程序中启用基于安全的注解（通过在这个元素中设置响应的属性），也可以用来声明将要应用在你的实体application context中的安全切点组。 你应该只定义一个&lt;global-method-security>元素。 下面的声明同时启用两种类型的注解：<br /><br />  &lt;global-method-security secured-annotations="enabled" jsr250-annotations="enabled"/><br />  <br /><br />2.4.1.1. 使用protect-pointcut添加安全切点<br /><br />protect-pointcut是非常强大的，它让你可以用简单的声明对多个bean的进行安全声明。 参考下面的例子：<br /><br />  &lt;global-method-security><br />    &lt;protect-pointcut expression="execution(* com.mycompany.*Service.*(..))" access="ROLE_USER"/><br />  &lt;/global-method-security><br /><br />          <br /><br />这样会保护application context中的符合条件的bean的所有方法，这些bean要在com.mycompany包下，类名以"Service"结尾。 ROLE_USER的角色才能调用这些方法。 就像URL匹配一样，指定的匹配要放在切点队列的最前面，第一个匹配的表达式才会被用到。<br />2.5. 默认的AccessDecisionManager<br /><br />这章假设你有一些Spring Security权限控制有关的架构知识。 如果没有，你可以跳过这段，以后再来看，因为这章只是为了自定义的用户设置的，需要在简单基于角色安全的基础上加一些客户化的东西。<br /><br />当你使用命名空间配置时，默认的AccessDecisionManager实例会自动注册，然后用来为方法调用和web URL访问做验证，这些都是基于你设置的intercept-url和protect-pointcut权限属性内容（和注解中的内容，如果你使用注解控制方法的权限）。<br /><br />默认的策略是使用一个AffirmativeBased AccessDecisionManager ，以及RoleVoter 和AuthenticatedVoter。<br />2.5.1. 自定义AccessDecisionManager<br /><br />如果你需要使用一个更复杂的访问控制策略，把它设置给方法和web安全是很简单的。<br /><br />对于方法安全，你可以设置global-security里的access-decision-manager-ref属性，用对应 AccessDecisionManager bean在application context里的id：<br /><br />  &lt;global-method-security access-decision-manager-ref="myAccessDecisionManagerBean"><br />    ...<br />  &lt;/global-method-security><br />  <br /><br />web安全安全的语法也是一样，但是放在http元素里：<br /><br />  &lt;http access-decision-manager-ref="myAccessDecisionManagerBean"><br />    ...<br />  &lt;/http><br />  <br /><br />2.5.2. 验证管理器<br /><br />我们大概知道命名空间配置会自动为我们注册一个验证管理器bean。 这是一个Spring Security的ProviderManager类，如果你以前使用过框架，应该对它很熟悉了。<br /><br />你也许想为ProviderManager注册另外的AuthenticationProvider bean，你可以使用&lt;custom-authentication-provider>元素实现。比如：<br /><br />  &lt;bean id="casAuthenticationProvider"<br />      class="org.springframework.security.providers.cas.CasAuthenticationProvider"><br />    &lt;security:custom-authentication-provider /><br />    ...<br />  &lt;/bean><br />  <br /><br />另一个常见的需求是，上下文中的另一个bean可能需要引用AuthenticationManager。 这里有一个特殊的元素，可以让你为AuthenticationManager注册一个别名，然后你可以application context的其他地方使用这个名字。<br /><br />  &lt;security:authentication-manager alias="authenticationManager"/><br /><br />  &lt;bean id="casProcessingFilter" class="org.springframework.security.ui.cas.CasProcessingFilter"><br />     &lt;security:custom-filter position="CAS_PROCESSING_FILTER"/><br />     &lt;property name="authenticationManager" ref="authenticationManager"/><br />     ...<br />  &lt;/bean><br />  <br /><br /><br />[1] 你可以在LDAP的章节里，找到更多有关使用的ldap-server的元素。
          <br/>
          <span style="color:red;">
            <a href="http://xyz20003.javaeye.com/blog/196922#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 26 May 2008 10:59:18 +0800</pubDate>
        <link>http://xyz20003.javaeye.com/blog/196922</link>
        <guid>http://xyz20003.javaeye.com/blog/196922</guid>
      </item>
      <item>
        <title>技术股份5%是个什么概念？</title>
        <author>xyz20003</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xyz20003.javaeye.com">xyz20003</a>&nbsp;
          链接：<a href="http://xyz20003.javaeye.com/blog/190848" style="color:red;">http://xyz20003.javaeye.com/blog/190848</a>&nbsp;
          发表时间: 2008年05月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          拜读完robbin老大推荐的文章<a href="http://www.javaeye.com/topic/190756" target="_blank">http://www.javaeye.com/topic/190756</a>，很奇怪的见到了里边也有一个同志纯技术分股5%。<br /><br />很有趣的是，去年我也听到了分股数目——5%。没有资金投入，技术入股，按5%跟你分配股份。<br />这5%的分股到底有多大的诱惑力呢？拿到5%的分股，会有创业的感觉吗？以现在的感觉来说，对方的行业咱们一点儿不懂，做什么东西都是说了就算。跟<a href="http://www.javaeye.com/topic/190756" target="_blank">http://www.javaeye.com/topic/190756</a>这里讲的还真是有异曲同工之妙了，市场人员怪技术人员不懂变通，跟不上潮流，技术人员觉得市场人员一天三遍，东西没做完就改，每天做无用功。这中间肯定是缺一个工作量计量，但是刚开始的时候，谁也没办法算清。老板会说，我们在创业，要忍耐，要做好，以后才有机会，但5%的股份能推动起创业的感觉吗？何况自己对这个外贸行业完全不懂，只感觉需求变动无穷无尽，这辈子也做不完。<br /><br />5%从理论上说，应该是完全没有任何发言权的吧？尤其在对业务完全不了解的情况下，跟一个打工仔有什么区别呢。感觉更像是到了个地方打工，暂时没有好的待遇条件，所以许给一个股份做远景期望。但是5%能赚多少呢，如果和一个没有股份但待遇高一点儿的地方比较，哪一个更合算呢？<br /><br />瞎说一个：<br />年利润100w，5%是5w。一个月能有2k。2.4 + 5 = 7.4w。<br />基本可以相抵月工资6000吧？<br /><br />要是年利润翻10倍，1000w，5%就是50w，这可了不得，一个月多少工资根本谈不上了。<br /><br />从这点看，老板是百万富翁的时候，咱们就能成为万元户了，这还不算老板已有的资本，咱们是无产阶级对吧，完全靠出卖劳动力过活，没有一点儿生产资料。<br />但是不了解这个行业，年利润千万要几年才能达到呢？何况还要有损耗，纯利润这么高谈何容易。再加上创业型公司前几年都是砸钱，有出没入，老板会仁至义尽的借钱给咱们发工资，咱们就算拿不到钱还有什么可说的呢？<br /><br />技术人员同志们，不知道有没有人能算清这笔帐的，如果决定创业，要在一种什么情况下开始呢。<br />1.5%只能算是打工的一种吧？而且还是风险投资式的打工形式，前几年不但看不到钱，还会给你一顶“同甘共苦”的高帽，好在你要求加工资的时候心有余悸，因为你也是在创业，怎么能不顾合作伙伴只想自己的利益呢？<br />2.如果技术够了，水平够了，产品有了，为什么拿5%啊？传说中不是有个20%的说法么？其实我觉得在技术侧重的公司里拿40%也是有可能的，甚至想，既然那些市场销售都是依靠你的产品过活，为什么不要个50%以上呢？<br /><br /><br />PS:每次想起一件事都感觉特别好笑。一次一个做市场的告诉我：“技术是最没用的，市场才是最重要的，只要拉来活儿，就没有做不了的。所以技术绝对不能拿到50%，一定要比50%少，否则做市场的就会心理不平衡。”
          <br/>
          <span style="color:red;">
            <a href="http://xyz20003.javaeye.com/blog/190848#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 08 May 2008 03:09:43 +0800</pubDate>
        <link>http://xyz20003.javaeye.com/blog/190848</link>
        <guid>http://xyz20003.javaeye.com/blog/190848</guid>
      </item>
      <item>
        <title>使用ext-2.1，将js文件压缩是否违反GPL协议。</title>
        <author>xyz20003</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xyz20003.javaeye.com">xyz20003</a>&nbsp;
          链接：<a href="http://xyz20003.javaeye.com/blog/190566" style="color:red;">http://xyz20003.javaeye.com/blog/190566</a>&nbsp;
          发表时间: 2008年05月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          给js加上GPL协议似乎没有必要，用户浏览网页的时候，所有js源码都会下载到客户机解释执行。不过为了减少网络开销，咱们一般要在系统发布时对所有js进行压缩，去掉注释，去掉无用的空白，甚至对局部变量名进行混淆。这种压缩方式从某种意义上起到了源代码加密的功能，使js代码的可读性变差了，尤其是对局部变量名混淆这一步，让人们很难通过变量名去猜测该变量的功能。<br /><br />其实还有一种方法，把js文件转换成eval的形式，但听说有性能问题。这种加密方式在网上随便就可以找到解密的脚本，将代码转换到“混淆局部变量”的阶段，所以咱们把这种当作“混淆局部变量”来讨论应该也没什么问题。<br /><br />现在的问题是，如果使用了ext-2.1就需要将html和js依据GPL协议开源。如果只提供压缩后的js源代码，是否符合GPL协议。压缩后的js源代码也算是源代码的一种形式吧？<br /><br />如果别人来索取源代码，我能不能声称：“有注释，未压缩的js是我们内部使用版本，不是发布版本，所以不使用GPL开源。”<br /><br /><br /><strong><span style="color: red">问题重点在于，我是否可以只提供“压缩后的js代码”，我是否可以拒绝其他人索取“有注释，未压缩的js代码”的要求。</span></strong>
          <br/>
          <span style="color:red;">
            <a href="http://xyz20003.javaeye.com/blog/190566#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 07 May 2008 13:32:49 +0800</pubDate>
        <link>http://xyz20003.javaeye.com/blog/190566</link>
        <guid>http://xyz20003.javaeye.com/blog/190566</guid>
      </item>
      <item>
        <title> js在图形方面只能算九等公民了。</title>
        <author>xyz20003</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xyz20003.javaeye.com">xyz20003</a>&nbsp;
          链接：<a href="http://xyz20003.javaeye.com/blog/184345" style="color:red;">http://xyz20003.javaeye.com/blog/184345</a>&nbsp;
          发表时间: 2008年04月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          javascript作为一种依附于浏览器的脚本语言，似乎天生就没得到过亲娘的疼爱。<br /><br />最开始同志们都只知道用它在html上搞点儿滚动的文字，鼠标后面拖一长串的(*&$W(%*&，或者是状态栏上不断跳跃的xxx欢迎您。那时候的javascript做出的效果，大多属于画蛇添足，喧宾夺主型的，只是教给一些小孩子玩玩所谓的技术效果，没有其他实际意义。<br /><br />后来很长一段时间里，js的最大作用就是浏览器这边的预先数据校验，什么document.formName.fieldName.value == ''就focus()alert()，即便这样很多人也不会用里边的regex。<br /><br />等到了ajax这个新瓶旧酒的东西蹦出来了，一开始也是缓慢发展，经历了漫长的prototypejs一统江湖的时候，通过它足以看到垄断者的脾气，它完全不提供api文档，还记得当时所有人的建议都是直接去看源代码，汗啊。幸好人民的力量是伟大的，jquery，mootools，yui一个一个追了上来，prototypejs为形式所迫，不得不加上api，为广大劳苦大众提供更为优秀的服务了。还是竞争力量大啊，公平的市场造就完美的服务。<br /><br />前言介绍到此为止，咱们就看看在这个号称ajax百花齐放的年代里，为什么javascript还是不能挺起腰杆，也许在页面控制上很多组件库，比如extjs，yui,jqueryui都迈出了辉煌的一步，但是在其他的方面，比如图形处理上，javascript依然步履维艰。<br /><br />最简单的一个问题就是，javascript到现在也没有自己的内置ui库，想想学c，学java，学python什么的，入门教材里中会有一章会讲讲可视化开发。但是javascript没有。<br />是因为c的第一个hello world是printf在console里的，javascript的第一个hello world是alert在window里的吗？<br /><br />这就是明显的歧视，从来就没人把javascript当作编程语言里的公民来看待，如果是个作坊，它最多就算个学徒打杂的。很多工作都不屑于让它去做。<br /><br />如果我们想用javascript画图，当前可以通过什么途径实现呢？首先咱们先说好，jfreechart那种后台生成图片发送到前台的方法就不要包括进来了，我们就排列一下html+js进行画图的方式。<br />1.使用浏览器支持的图形引擎，比如ie下的vml，firefox,opera,safari支持的svg或者canvas。<br />2.<a href="http://www.walterzorn.com/jsgraphics/jsgraphics_e.htm" target="_blank">http://www.walterzorn.com/jsgraphics/jsgraphics_e.htm</a>，这是一个相当纯正的js图形库，它特立独行的地方就是：“完全使用div来画图。”<br />3.<a href="http://excanvas.sourceforge.net/" target="_blank">http://excanvas.sourceforge.net/</a>，google提供的工具库，可以在ie下使用vml模拟其他浏览器上canvas的api。<br />4.<a href="http://dojotoolkit.org/" target="_blank">http://dojotoolkit.org/</a>，宣传火暴的dojo提供一套2d和3d的图形api，会自动根据浏览器在vml,svg,canvas之间进行切换。<br />5.<a href="http://prototype-graphic.xilinus.com/" target="_blank">http://prototype-graphic.xilinus.com/</a>这也是一套根据浏览器自动切换实现方式的图形api。<br />6.<a href="http://www.lutanho.net/svgvml3d/index.html" target="_blank">http://www.lutanho.net/svgvml3d/index.html</a>还有这个，是专门用svg和vml实现3d效果的。<br /><br />其他一些基于excanvas，jsgraphics的组件库咱们就不列了，基本这几年看到的底层图形库也就只有这些，有一些还常年累月没有更新了。如果你想只使用javascript光是前期的抉择就是死掉亿万个脑细胞。如果选择jsgraphics会不会因为使用那么多div造成效率下降啊，而且它是模拟图形，缩放旋转这些图形变换能保证吗？如果使用vml,svg,canvas的话，ie和其他浏览器完全不对付，就连google出的excanvas都没有实现全部的功能，网上说为什么现在很多基于excanvas的报表工具都没有饼图，就是因为excanvas用vml实现不了arcTo和clipTo。好几兆的dojo就用来画几张图似乎有些不划算。prototype-graphic只有svn，连发布的下载包都没有。svgvml3d自从06年就再没更新过了。也许有的同学又开始不屑支持ie以外的浏览器，那么我偷偷告诉你一件事情，vml在不同版本的ie下面都是有差矣的。<br /><br />想想就知道，依靠这些薄弱的图形库javascript能敌得过flash吗？更别提以后出现的什么wwf了。<br /><br />从某种角度上讲，svg其实蛮适合做javascript的外套的，可adobe收购了macromedia，svgviewer从此流产，flash成了主旋律。即便是ie8宣称会原生支持svg也不知道要等到何年何月了，到时候谁知道ms会不会又搞出一套不兼容w3c的新标准？即便是现在支持svg的浏览器都没有完全实现了svg标准的，opera实现的估计最全了，safari和firefox都没有实现amination动画标签，但是safari的渲染效果更漂亮，挺符合apple一贯作风的。现在想想firefox也就只有调试方便的优点了，pattern,filter好多都没有实现，图形一多还会发顿，估计只能等firefox3了。不知道现在浏览器厂商是如何规划的？如果想支持svg为什么不能实现好标准，半成品用起来实在有够不爽。<br /><br />退一万步讲，就各个浏览器都实现了标准，js图形组件也还完全达不到要求，不可能指望普通开发者拿着文本编辑器从line,rect,cycle开始画起，因为现在各自实现的差矣太大，ide完全没办法下手，而且大多数人需要能拿来就用button,menu,各式各样的window,panel这些svg，vml,canvas也都还不支持，等到满足条件的时候，市场份额怕早被其他的产品瓜分的一干二净了。<br /><br />同志们，现在你们不觉得“用js画图是一种自虐行为”吗？
          <br/>
          <span style="color:red;">
            <a href="http://xyz20003.javaeye.com/blog/184345#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 Apr 2008 10:32:20 +0800</pubDate>
        <link>http://xyz20003.javaeye.com/blog/184345</link>
        <guid>http://xyz20003.javaeye.com/blog/184345</guid>
      </item>
      <item>
        <title>我们的教程竟然也被盗版了</title>
        <author>xyz20003</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xyz20003.javaeye.com">xyz20003</a>&nbsp;
          链接：<a href="http://xyz20003.javaeye.com/blog/180833" style="color:red;">http://xyz20003.javaeye.com/blog/180833</a>&nbsp;
          发表时间: 2008年04月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          担心许久的事情终于还是发生了。<br /><br />有个网站不但抄了我们的教程目录，还抄袭了我们新换的网站版面。<br /><br />网站上头直接写着：<strong>《Ext2.0入门与精通》完整版+完整大型项目代码  全套仅售40元！！</strong>，把我们的价格直接砍掉了一半。<img src="/images/smiles/icon_cry.gif"/>就算是竞争也没有这样打价格战的吧？大家都是要生活的呀。<br /><br />话说我们这个东西，也算是顶着无数骂声和唾沫从07年底一点一点儿爬过来的，写得就算不好，也是出了苦力的，一下子就被别人拿去挂到自己网上，还真蛮受打击。<br /><br />可你又有什么办法呢？电子文档啊，把大标题一改，作者和版权信息去掉，说是谁的就是谁的了。网上就用qq交流，发给你个带密码的包，告诉你给钱就发密码，你说咋办？<br /><br />告他去？你都不知道他是谁。<br />发公告？估计等于给他们做广告了。（我这个帖子估计就帮他们宣传了）<br />要是大网站，也许还可以给他们发一个版权声明的，就一个页面的小网站根本不理这套啊。<br />反正是郁闷了。<br /><br />唉，以前也看到谈论盗版的好坏。有人说盗版坏，盗窃他人的成果；有人说盗版好，因为正版太贵买不起，盗版正是济人所困。
          <br/>
          <span style="color:red;">
            <a href="http://xyz20003.javaeye.com/blog/180833#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 09 Apr 2008 14:48:20 +0800</pubDate>
        <link>http://xyz20003.javaeye.com/blog/180833</link>
        <guid>http://xyz20003.javaeye.com/blog/180833</guid>
      </item>
      <item>
        <title>guice入门手册，算是学习心得</title>
        <author>xyz20003</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xyz20003.javaeye.com">xyz20003</a>&nbsp;
          链接：<a href="http://xyz20003.javaeye.com/blog/179792" style="color:red;">http://xyz20003.javaeye.com/blog/179792</a>&nbsp;
          发表时间: 2008年04月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          guice啊，annotation啊，零配置啊。嘿嘿~<br /><br />我们等于是把guice自带文档的内容整理了一下，把它里边那些零散的例子也都补全的。不过没有按照他们文档里的顺序和内容走，jndiprovider和struts2的部分也没有加上，感觉这两块不属于guice的东西了，现在刚开始学不想搞那么多集成的东西。<br /><br />可是感觉东西有点儿少啊，哪位老大过来指点一下，guice除了这些还有其他酷炫的特性吗？<br /><br />还有就是，asEagerSingleton()的部分，翻译成“立即初始化单例”感觉很别扭，应该怎么说才顺口呢？<br /><br />在线预览 <a href="http://www.family168.com/tutorial/guice/html/" target="_blank">http://www.family168.com/tutorial/guice/html/</a><br /><br /><pre name="code" class="java">
序言
1. Hello World
    1.1. Module绑定
    1.2. 注解绑定
    1.3. 讨论一下

2. Inject注入
    2.1. field注入
    2.2. constructor注入
    2.3. setter注入

3. 一个接口多个实现
    3.1. 自定义注解
    3.2. 不想自己写注解

4. 使用Provider
    4.1. 使用Provider提供依赖
    4.2. 直接注入Provider

5. 绑定常量
    5.1. bindConstant() + 注解 + to()
    5.2. bind() + 注解 + toInstance()

6. 绑定静态属性（static field）
    6.1. requestStaticInjection()

7. 作用域（scope）
    7.1. 使用Module配置
    7.2. 使用注解
    7.3. 立即初始化单例

8. AOP
    8.1. 使用MethodInterceptor

9. 运行阶段（stage）
    9.1. 设置stage

10. 可选注入
    10.1. 找不到注入会抛异常
    10.2. 使用optional=true
    10.3. 使用optional又能找到依赖

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://xyz20003.javaeye.com/blog/179792#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 06 Apr 2008 09:54:48 +0800</pubDate>
        <link>http://xyz20003.javaeye.com/blog/179792</link>
        <guid>http://xyz20003.javaeye.com/blog/179792</guid>
      </item>
      <item>
        <title>新版ext教程基本完成。</title>
        <author>xyz20003</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xyz20003.javaeye.com">xyz20003</a>&nbsp;
          链接：<a href="http://xyz20003.javaeye.com/blog/152295" style="color:red;">http://xyz20003.javaeye.com/blog/152295</a>&nbsp;
          发表时间: 2008年01月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          至0.1.0版，我们的ext教程基本完成了，如果发现有疏漏的地方，请联系我们。<br />www.family168.com上提供一部分免费预览的内容。<br />下面是0.1.0版的目录。<br /><br /><pre name="code" class="java">
说在前头的
1. 闪烁吧！看看extjs那些美丽的例子。

    1.1. 一切从extjs发布包开始
    1.2. 看看ext-1.1.1的文档
    1.3. 看看ext-2.0的文档
    1.4. 为什么有的例子必须放在服务器上才能看到效果？
    1.5. 为什么自己按照例子写的代码，显示出来总找不到图片
    1.6. 我们还需要什么？
    1.7. 入门之前，都看helloworld。
        1.7.1. 直接使用下载的发布包
        1.7.2. 只把必要的东西放进项目中

2. 震撼吧！让你知道ext表格控件的厉害。

    2.1. 功能丰富，无人能出其右
    2.2. 让我们搞一个grid出来耍耍吧。
    2.3. 上边那个是1.x的，2.0稍微有些不同哦
    2.4. 按顺序，咱们先要把常见功能讲到
        2.4.1. 自主决定每列的宽度
        2.4.2. 让grid支持按列排序
    2.5. 让单元格里显示红色的字，图片，按钮，你还能想到什么？
    2.6. 更进一步，自动行号和多选checkbox
        2.6.1. 自动行号
        2.6.2. 全选checkbox的时间了，请允许我让2.0先上场。
        2.6.3. 1.x时代的全选checkbox。
    2.7. 分页了吗？分页了吗？如果还没分就看这里吧。
        2.7.1. 表面工作，先把分页工具条弄出来。
        2.7.2. 2.0赐予我们更大的灵活性
        2.7.3. 迫不得已，要加上后台脚本了。
        2.7.4. 其实分页不一定要踩在脚下，也可以顶在头上。
    2.8. 爱生活，EditorGrid。
        2.8.1. 旋动舞步，看我们怎么把这个EditorGrid炫出来。
        2.8.2. 添加一行，再把它踢掉
        2.8.3. 一切就绪，你可以按保存按钮了。
        2.8.4. 天马行空，保证提交的数据绝对有效
        2.8.5. 限制类型，让用户只能选择我们提供的数据
    2.9. 连坐法，关于选择模型
    2.10. 2.0有，1.x里没有的那些可怕的控件
        2.10.1. 谓之曰PropertyGrid属性表格
        2.10.2. 分组表格，嘻嘻，这是交叉报表吗？
    2.11. 午夜怪谈，论可以改变大小，可以拖拽的表格
        2.11.1. 先看看怎么拖拽改变表格的大小
        2.11.2. 再看怎么在表格里拖动行
            2.11.2.1. 无用功 之 同一个表格里拖拽
            2.11.2.2. 无间道 之 从这个表格拖到另一个表格
            2.11.2.3. 无疆界 之 从表格里拖到树上

3. 歌颂吧！只为了树也要学ext。

    3.1. 真的，我是为了树，才开始学ext的。
    3.2. 传统是先做出一棵树来。
    3.3. 超越一个根
    3.4. 你不会认为2.0里跟1.x是一样的吧？
    3.5. 这种装配树节点的形式，真是让人头大。
    3.6. jsp的例子是一定要有的
    3.7. 让你知道树都可以做些什么
        3.7.1. 检阅树形的事件
        3.7.2. 右键菜单并非单纯的事件
        3.7.3. 默认图标好单调，改一下撒
        3.7.4. 偷偷告诉你咋从节点弹出对话框
        3.7.5. 小小提示
        3.7.6. 给树节点设置超链接
    3.8. 灰壳显灵！让我直接修改树节点的名称吧！
    3.9. 我拖，我拖，我拖拖拖。
        3.9.1. 树形节点的拖拽有三种形式
        3.9.2. 用事件控制拖拽
            3.9.2.1. 叶子不能append
            3.9.2.2. 把节点扔到哪里啦
            3.9.2.3. 裟椤双树，常与无常

4. 祝福吧！把表单和输入控件都改成ext的样式。

    4.1. 不用ext的form啊，不怕错过有趣的东西吗？
    4.2. 慢慢来，先建一个form再说
    4.3. 胡乱扫一下输入控件
    4.4. 起点高撒，从comboBox往上蹦
        4.4.1. 凭空变出个comboBox来。
        4.4.2. 把select变成comboBox。
        4.4.3. 破例研究下comboBox的内在本质哟
        4.4.4. 嘿嘿~本地的做完了，试试远程滴。
        4.4.5. 给咱们的comboBox安上零配件
        4.4.6. 每次你选择什么，我都知道
        4.4.7. 露一小手，组合上面所知，省市县三级级联。哈哈~
            4.4.7.1. 先做一个模拟的，所有数据都在本地
            4.4.7.2. 再做一个有后台的，需要放在服务器上咯
    4.5. 把form里的那些控件全部拿出来看看
    4.6. form提交数据的三重门
        4.6.1. ext中默认的提交形式
        4.6.2. 使用html原始的提交形式
        4.6.3. 单纯ajax
    4.7. 验证苦旅
        4.7.1. 不能为空
        4.7.2. 最大长度，最小长度
        4.7.3. 借助vtype
        4.7.4. 自定义验证规则
        4.7.5. 算不上校验的NumberField
    4.8. 关于表单内部控件的布局问题
        4.8.1. 什么都不做，默认的平铺布局
        4.8.2. 分裂，分列
            4.8.2.1. 分裂，分列。1.x
            4.8.2.2. 分裂，分列。2.0
        4.8.3. fieldset是个神奇的东西
        4.8.4. 当某一天，需要往form加个图片什么的，该咋办？
    4.9. 还要做文件上传哟
    4.10. 非想非想，单选框多选框
        4.10.1. 多选呢checkbox
        4.10.2. 单选呢radio

5. 雀跃吧！超脱了一切的弹出窗口。

    5.1. 呵呵~跳出来和缩回去总给人惊艳的感觉。
    5.2. 先看看最基本的三个例子
        5.2.1. Ext.MessageBox.alert()
        5.2.2. Ext.MessageBox.confirm()
        5.2.3. Ext.MessageBox.prompt()
    5.3. 如果你想的话，可以控制得更多
        5.3.1. 可以输入多行的输入框
        5.3.2. 再看一个例子呗
        5.3.3. 下一个例子是进度条
        5.3.4. 动画效果，跳出来，缩回去
    5.4. 让弹出窗口，显示我们想要的东东，比如表格
        5.4.1. 2.0的弹出表格哦
        5.4.2. 向2.0的window里加表格
        5.4.3. 1.x里的叫做BasicDialog
        5.4.4. 把form放进对话框里

6. 奔腾吧！让不同的浏览器里显示一样的布局。

    6.1. 有了它，我们就可以摆脱那些自称ui设计师的人了。
    6.2. 关于BorderLayout
    6.3. 嗯，不如再看看附加效果
        6.3.1. 先看看split
        6.3.2. 再试试titlebar
        6.3.3. 还不够，还不够，让四周的区域可以缩起来
        6.3.4. 给这些区域都加上个关闭按钮
        6.3.5. 用NestedLayoutPanel在五块中再进行分割，实现更复杂的布局
    6.4. 2.0的ViewPort是完全不同的实现
    6.5. 脑袋上有几个标签的tabPanel
    6.6. 让布局复杂一点儿

7. 低鸣吧！拖拽就像呼吸一样容易。

    7.1. 如此拖拽，简直就像与生俱来的本能一样。
    7.2. 第一！乱拖。
    7.3. 第二！代理proxy和目标target

8. 哭泣吧！现在才开始讲基础问题。

    8.1. Ext.get
    8.2. 要是我们想一下子获得一堆元素咋办？
    8.3. DomHelper和Template动态生成html
        8.3.1. DomHelper用来生成小片段
        8.3.2. 批量生成还是需要Template模板
    8.4. Ext.data命名空间
        8.4.1. proxy系列
            8.4.1.1. 人畜无害的MemoryProxy
            8.4.1.2. 常规武器HttpProxy
            8.4.1.3. 洲际导弹ScriptTagProxy
        8.4.2. reader系列
            8.4.2.1. 简单易行ArrayReader
            8.4.2.2. 灵活轻便JsonReader
            8.4.2.3. 久负盛名XmlReader
        8.4.3. 相信你知道怎么做加法
    8.5. 跟我用json，每天五分钟
        8.5.1. Hello 老爸。
        8.5.2. 老妈等等，孩子先上场。
        8.5.3. 老妈来了，老妈来啦。
        8.5.4. Ext对json的支持力度
        8.5.5. 反向操作，ext把json变成字符串
    8.6. 小声说说scope
    8.7. 菜单和工具条
        8.7.1. 至简至廉的菜单
        8.7.2. 丰富一点儿的多级菜单
        8.7.3. 单选多选，菜单里搞这套
        8.7.4. 小把戏，定制好的菜单
        8.7.5. SplitButton让按钮和菜单结合

9. 沉寂吧！我们要自己的控件。

    9.1. 下拉树形选择框TreeField
    9.2. 带全选的checkbox树形CheckBoxTree
    9.3. 带全选的checkbox的grid
    9.4. fisheye
    9.5. 可以设置时间的日期控件
    9.6. JsonView实现用户卡片拖拽与右键菜单
    9.7. 下拉列表选择每页显示多少数据

10. 撕裂吧！邪魔外道与边缘学科。

    10.1. dwr与ext整合
        10.1.1. 无侵入式整合dwr和ext
        10.1.2. DWRProxy
        10.1.3. DWRTreeLoader
    10.2. localXHR让你在不用服务器就玩ajax
    10.3. 在form中使用fckeditor

A. 常见问题乱弹

    A.1. ext到底是收费还是免费
    A.2. 怎么查看ext2里的api文档
    A.3. 如何在页面中引用ext
        A.3.1. 顺便说说常见的Ext is not defined错误
    A.4. 想把弹出对话框单独拿出来用的看这里
    A.5. 想把日期选择框单独拿出来用的看这里
    A.6. 听说有人现在还不会汉化ext
    A.7. 碰到使用ajax获得数据，或者提交数据出现乱码
    A.8. TabPanel使用autoLoad加载的页面中的js脚本没有执行

B. 修改日志
C. 后记

    C.1. 2007年12月5日，迷茫阶段
        C.1.1. 仇恨
        C.1.2. 反省
    C.2. 关于ext与dwr整合部分的讨论
    C.3. 怎么看文档附件里的范例

D. 贡献者列表

    D.1. 感谢[飘17804726]的大力支持
    D.2. 感谢[吧啦吧啦286556983]的大力支持
    D.3. 感谢[游戏人生395181055]的大力支持
    D.4. 感谢[綄帥77793603]的大力支持
    D.5. 感谢[葡萄5793699]的大力支持
    D.6. 感谢[天外小人442540141]的大力支持
    D.7. 感谢[我想我是海39893874]的大力支持
    D.8. 还要感谢：
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://xyz20003.javaeye.com/blog/152295#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Jan 2008 11:37:55 +0800</pubDate>
        <link>http://xyz20003.javaeye.com/blog/152295</link>
        <guid>http://xyz20003.javaeye.com/blog/152295</guid>
      </item>
      <item>
        <title>自己写了个生成er图的东西，请问如何自动进行布局。</title>
        <author>xyz20003</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xyz20003.javaeye.com">xyz20003</a>&nbsp;
          链接：<a href="http://xyz20003.javaeye.com/blog/149102" style="color:red;">http://xyz20003.javaeye.com/blog/149102</a>&nbsp;
          发表时间: 2007年12月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          现在做的东西使用的是hsqldb数据库，表结构都是手工设计的，现在想获得对应的er关系图，myeclipse的虽然方便，但是就为了这么一张图，每次等待myeclipse启动的时间都超过导出图的时间了，所以想自己做一个方便一些的er图生成工具。<br /><br />目前是使用svg作图，连xml都没用，直接用out.println()写出一行一行的xml，不过这不是关键性问题，遇到的问题是对于外键关系连接线不知道如何做，不知道如何才能做到自动布局，对于这种关联图有没有算法可用？<br /><br />目前代码还比较垃圾，附件是测试用的库和代码，有兴趣的同志给个意见。谢谢。
          <br/>
          <span style="color:red;">
            <a href="http://xyz20003.javaeye.com/blog/149102#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 18 Dec 2007 13:13:37 +0800</pubDate>
        <link>http://xyz20003.javaeye.com/blog/149102</link>
        <guid>http://xyz20003.javaeye.com/blog/149102</guid>
      </item>
      <item>
        <title>哈哈~收费必被骂。</title>
        <author>xyz20003</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xyz20003.javaeye.com">xyz20003</a>&nbsp;
          链接：<a href="http://xyz20003.javaeye.com/blog/148531" style="color:red;">http://xyz20003.javaeye.com/blog/148531</a>&nbsp;
          发表时间: 2007年12月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近跟朋友做写一份教程，因为不是完全免费的，所以被骂了。<br /><br />基本是在群里一听说要钱，就骂个狗血淋头，说我们翻译的质量差，都是从网络上抄袭的。我刚想问问他哪部分像是翻译稿的时候，就被那朋友踢了。<br /><br />然后又在论坛里也看到这样的回帖，说我们不厚道，人家免费的东西，我们写文档竟然也敢要钱。<br /><br />最后直接在论坛上看到帖子说某某技术交流群，欢迎大家加入，收费莫入，鄙视收费者。呵呵~<br /><br /><br />不知道大家有没有遇到这样的情况，如果你对别人说自己的东西不是免费的，别人就先把你鄙视一顿，遇到性格急的上来就骂了。好像现在是程序员群体在要求人们必须提供免费，不管是代码还是服务，如果你这个服务是建立在开源软件的基础上，那么你的服务就更需要免费了。<br /><br />主要是不明白有这种要求的是老手还是新手。新手的话是希望降低入行的门槛，更早钻进行业里，不过钻进一个免费的行业也没钱可赚啊？还是说本来就是想玩玩，玩玩也要收钱那就实在是太过分了。如果是老手的话，我觉得倒很能理解，毕竟自己辛勤耕耘了这么多年，一分没收过，你这点儿三脚猫功夫跑来就想要保护费？<br /><br />中国人在价钱方面一定会先选择不要钱的解决方案，所以免费方面更容易占领市场，不过问题就是以后如何守住，如果免费的资源更新和反馈速度不及时，那些需要及时解决问题的用户只好无奈的接受收费服务。<br /><br />实际上可持续发展绝对是开源社区需要面临的一个问题，如何在免费的基础上保持发展的势头而且还能不断壮大，只靠几个人的努力还是不够的。<br /><br />PS.突然想起之前看到的评论，说jboss卖了3亿，可全球那些为jboss提供建议和补丁的程序员一分没有得到，本来也感到很气愤，后来一想，多少公司免费用jboss卖钱呀？去年买的罗时飞翻译的jboss手册也挺贵的。呵呵~
          <br/>
          <span style="color:red;">
            <a href="http://xyz20003.javaeye.com/blog/148531#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 15 Dec 2007 11:49:15 +0800</pubDate>
        <link>http://xyz20003.javaeye.com/blog/148531</link>
        <guid>http://xyz20003.javaeye.com/blog/148531</guid>
      </item>
      <item>
        <title>在下计划写一份extjs的使用教程，请诸位指教。</title>
        <author>xyz20003</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xyz20003.javaeye.com">xyz20003</a>&nbsp;
          链接：<a href="http://xyz20003.javaeye.com/blog/145942" style="color:red;">http://xyz20003.javaeye.com/blog/145942</a>&nbsp;
          发表时间: 2007年12月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在下才疏学浅，为了整理一下这段时间学习的extjs，计划写一份extjs使用教程，上网搜索了一下才发现现在写extjs学习文档的不少，但似乎没有系统的教程，都是东一榔头，西一棒槌，要么就是全盘翻译api。<br /><br />在下打算系统写一下有关extjs的流程，目前有了一份初稿的目录结构，请大家指点一下，也有一个想法，现在市面上都没有关于extjs的书，不知道我们写完后能不能出书。<br /><br />下面是现在的目录结构，谢谢大家了。<br /><br /><pre name="code" class="java">
说在前头的
1. 闪烁吧！看看extjs那些美丽的例子。

    1.1. 一切从extjs发布包开始
    1.2. 看看ext-1.1.1的文档
    1.3. 看看ext-2.0的文档
    1.4. 为什么有的例子必须放在服务器上才能看到效果？
    1.5. 为什么自己按照例子写的代码，显示出来总找不到图片
    1.6. 我们还需要什么？
    1.7. 入门之前，都看helloworld。

        1.7.1. 直接使用下载的发布包
        1.7.2. 只把必要的东西放进项目中

2. 震撼吧！让你知道ext表格控件的厉害。

    2.1. 功能丰富，无人能出其右
    2.2. 让我们搞一个grid出来耍耍吧。
    2.3. 上边那个是1.x的，2.0稍微有些不同哦
    2.4. 按顺序，咱们先要把常见功能讲到，让grid支持按列排序
    2.5. 让单元格里显示红色的字，图片，按钮，你还能想到什么？
    2.6. 更进一步，自动行号和多选checkbox

        2.6.1. 自动行号
        2.6.2. 全选checkbox的时间了，请允许我让2.0先上场。
        2.6.3. 1.x时代的全选checkbox。

    2.7. 分页了吗？分页了吗？如果还没分就看这里吧。

        2.7.1. 表面工作，先把分页工具条弄出来。
        2.7.2. 2.0赐予我们更大的灵活性
        2.7.3. 迫不得已，要加上后台脚本了。
        2.7.4. 其实分页不一定要踩在脚下，也可以顶在头上。

    2.8. 可编辑表格，改变大小，表格间拖拽，树与表格间拖拽。

3. 歌颂吧！只为了树也要学ext。

    3.1. 真的，我是为了树，才开始学ext的。
    3.2. 传统是先做出一棵树来。
    3.3. 超越一个根
    3.4. 你不会认为2.0里跟1.x是一样的吧？
    3.5. 这种装配树节点的形式，真是让人头大。
    3.6. jsp的例子是一定要有的
    3.7. 让你知道树都可以做些什么

        3.7.1. 检阅树形的事件
        3.7.2. 右键菜单并非单纯的事件
        3.7.3. 默认图标好单调，改一下撒
        3.7.4. 偷偷告诉你咋从节点弹出对话框
        3.7.5. 小小提示

    3.8. 灰壳显灵！让我直接修改树节点的名称吧！
    3.9. 我拖，我拖，我拖拖拖。

        3.9.1. 树形节点的拖拽有三种形式
        3.9.2. 用事件控制拖拽

            3.9.2.1. 叶子不能append
            3.9.2.2. 把节点扔到哪里啦

    3.10. 更深一步，整合起来就是一个完整的树形操作。

4. 祝福吧！把表单和输入控件都改成ext的样式。

    4.1. 不用ext的form啊，不怕错过有趣的东西吗？
    4.2. 慢慢来，先建一个form再说
    4.3. 胡乱扫一下输入控件
    4.4. 起点高撒，从comboBox往上蹦

        4.4.1. 凭空变出个comboBox来。
        4.4.2. 把select变成comboBox。
        4.4.3. 破例研究下comboBox的内在本质哟
        4.4.4. 嘿嘿~本地的做完了，试试远程滴。
        4.4.5. 给咱们的comboBox安上零配件
        4.4.6. 每次你选择什么，我都知道
        4.4.7. 露一小手，组合上面所知，省市县三级级联。哈哈~

            4.4.7.1. 先做一个模拟的，所有数据都在本地
            4.4.7.2. 再做一个有后台的，需要放在服务器上咯

    4.5. 把form里的那些控件全部拿出来看看
    4.6. 还要做，字段验证呀，表单提交啊，表单布局咯，文件上传哟

5. 雀跃吧！超脱了一切的弹出窗口。

    5.1. 呵呵~跳出来和缩回去总给人惊艳的感觉。
    5.2. 先看看最基本的三个例子

        5.2.1. Ext.MessageBox.alert()
        5.2.2. Ext.MessageBox.confirm()
        5.2.3. Ext.MessageBox.prompt()

    5.3. 如果你想的话，可以控制得更多

        5.3.1. 可以输入多行的输入框
        5.3.2. 再看一个例子呗
        5.3.3. 下一个例子是进度条
        5.3.4. 动画效果，跳出来，缩回去

    5.4. 让弹出窗口，显示我们想要的东东，比如表格

        5.4.1. 2.0的弹出表格哦
        5.4.2. 向2.0的window里加表格

    5.5. 更进一步撒。

6. 奔腾吧！让不同的浏览器里显示一样的布局。

    6.1. 有了它，我们就可以摆脱那些自称ui设计师的人了。
    6.2. 关于BorderLayout
    6.3. 嗯，不如再看看附加效果

        6.3.1. 先看看split
        6.3.2. 再试试titlebar
        6.3.3. 还不够，还不够，让四周的区域可以缩起来
        6.3.4. 给这些区域都加上个关闭按钮
        6.3.5. 用NestedLayoutPanel在五块中再进行分割，实现更复杂的布局

    6.4. 2.0的ViewPort是完全不同的实现
    6.5. 稍稍感叹一下2.0的简洁吧，让人吃惊的还在后头呢。

7. 低鸣吧！拖拽就像呼吸一样容易。

    7.1. 如此拖拽，简直就像与生俱来的本能一样。
    7.2. 第一！乱拖。
    7.3. 第二！代理proxy和目标target
    7.4. 再拖！再拖拖。

8. 哭泣吧！现在才开始讲基础问题。

    8.1. Ext.get
    8.2. 要是我们想一下子获得一堆元素咋办？
    8.3. DomHelper和Template动态生成html

        8.3.1. DomHelper用来生成小片段
        8.3.2. 批量生成还是需要Template模板

9. 沉寂吧！我们要自己的控件。

    9.1. 下拉树形选择框TreeField
    9.2. 带全选的checkbox树形CheckBoxTree
    9.3. 带全选的checkbox的grid
    9.4. fisheye
    9.5. 可以设置时间的日期控件
    9.6. JsonView实现用户卡片拖拽与右键菜单
    9.7. 下拉列表选择每页显示多少数据

10. 撕裂吧！邪魔外道与边缘学科。

    10.1. dwr与ext整合

        10.1.1. 无侵入式整合dwr和ext
        10.1.2. DWRProxy
        10.1.3. DWRTreeLoader

    10.2. localXHR让你在不用服务器就玩ajax

A. 常见问题乱弹

    A.1. ext到底是收费还是免费
    A.2. 怎么查看ext2里的api文档
    A.3. 如何在页面中引用ext
    A.4. 想把弹出对话框单独拿出来用的看这里
    A.5. 想把日期选择框单独拿出来用的看这里
    A.6. 听说有人现在还不会汉化ext
    A.7. 碰到使用ajax获得数据，或者提交数据出现乱码
    A.8. TabPanel使用autoLoad加载的页面中的js脚本没有执行

B. 修改日志
C. 后记

    C.1. 2007年12月5日，迷茫阶段

        C.1.1. 仇恨
        C.1.2. 反省

    C.2. 关于ext与dwr整合部分的讨论
    C.3. 怎么看文档附件里的范例

D. 贡献者列表

    D.1. 感谢[飘17804726]的大力支持
    D.2. 感谢[吧啦吧啦286556983]的大力支持
    D.3. 感谢[游戏人生395181055]的大力支持
    D.4. 感谢[綄帥77793603]的大力支持
    D.5. 感谢[葡萄5793699]的大力支持
    D.6. 感谢[天外小人442540141]的大力支持
    D.7. 感谢[我想我是海39893874]的大力支持
</pre><br /><br />在线预览：<a href="http://203.93.254.59:8889/extdoc/html/index.html" target="_blank">http://203.93.254.59:8889/extdoc/html/index.html</a> 2007-12-13内容不断更新中。<br /><br />请大家在看我们的教程前，请先阅读文档的前言“写在前头的”<a href="http://203.93.254.59:8889/extdoc/html/preface.html" target="_blank">http://203.93.254.59:8889/extdoc/html/preface.html</a>，确定对这部分没有异议，再继续浏览其它部分。免得日后有什么争执，谢谢。
          <br/>
          <span style="color:red;">
            <a href="http://xyz20003.javaeye.com/blog/145942#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 04 Dec 2007 17:35:17 +0800</pubDate>
        <link>http://xyz20003.javaeye.com/blog/145942</link>
        <guid>http://xyz20003.javaeye.com/blog/145942</guid>
      </item>
      <item>
        <title>新闻发布0.0.2-M3发布</title>
        <author>xyz20003</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xyz20003.javaeye.com">xyz20003</a>&nbsp;
          链接：<a href="http://xyz20003.javaeye.com/blog/134665" style="color:red;">http://xyz20003.javaeye.com/blog/134665</a>&nbsp;
          发表时间: 2007年10月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          新闻发布0.0.2-M3发布<br />
（milestone里程碑3）<br />
<br />
后台是java的，请使用jdk-1.5以上版本，和tomcat-5.5以上版本。<br />
<br />
项目首页：http://code.google.com/p/anewssystem/<br />
下载地址：https://sourceforge.net/project/showfiles.php?group_id=204197<br />
<br />
发布的anews-0.0.2-M3.war是已经打包好的程序，可以直接放在tomcat下运行，自带了嵌入式数据库hsqldb，无需额外配置：）<br />
<br />
anews-0.0.2-M3.zip是eclipse工程包，svn下的工程是maven2工程，有些包在公网上是找不到的，目前还没有明确哪些包需要额外提供，所以先用eclipse工程吧，那里边是全的。不过对于eclipse的使用经验太少，如果发现什么问题，请尽快反馈给我。echo_o@163.com<br />
<br />
这个版本主要是bug清除和结构重构，删除了一些无用的jar依赖库和源代码，另外有一些增加的功能：<br />
<br />
&nbsp;&nbsp;&nbsp; * 新闻部分的上传图片功能，为了美化上传按钮，把type=file隐藏掉后，放上一个假按钮。<br />
&nbsp;&nbsp;&nbsp; * 修改管理新闻的布局部分，不是使用dialog而是依靠可收缩的south放置编辑新闻的form。<br />
&nbsp;&nbsp;&nbsp; * Ext.lingo.JsonGrid修改了ie下checkbox显示错位的问题，添加翻页后保存选中信息的功能。<br />
&nbsp;&nbsp;&nbsp; * 修改了jcaptcha显示的图片，现在文字更容易辨认了，建议来自（下一道彩虹4612462）<br />
&nbsp;&nbsp;&nbsp; * 修正了dialog标题错位的问题，建议来自（/aiq伊扬贝尔4046921）<br />
&nbsp;&nbsp;&nbsp; * 添加了一个项目跟踪面板，记录修改的问题，地址在http://localhost:8080/anews/tracker/index.htm<br />
<br />
<br />
之前的0.0.2-M2中完成了权限模块的基本功能，包括<br />
<br />
&nbsp;&nbsp;&nbsp; * 照抄springside-2.0中权限模块的RBAC模型<br />
&nbsp;&nbsp;&nbsp; * 资源分为URL与METHOD两种，分别使用filter和aop拦截，实现权限管理<br />
&nbsp;&nbsp;&nbsp; * 角色与资源多对多关联<br />
&nbsp;&nbsp;&nbsp; * 角色与菜单也是多对多关联，实现不同角色显示不同菜单<br />
&nbsp;&nbsp;&nbsp; * 用户与角色多对多关联，一个用户会拥有多个角色中的资源<br />
&nbsp;&nbsp;&nbsp; * 提供extjs与acegi对接，密码MD5加密，可选择cookie自动登录，登录支持图片验证码<br />
<br />
<br />
之前的0.0.2-M1中演示的JsonTree和JsonGrid的使用，这两个封装基本实现了最基本的tree与grid功能，而且在后台封装了对应的java类，前后台一起继承使用，结果就是大量的减少代码总量，看着干净。<br />
<br />
树形实现的功能：<br />
<br />
&nbsp;&nbsp;&nbsp; * 异步读取节点（不过管理分类的时候需要读取所有节点）<br />
&nbsp;&nbsp;&nbsp; * 双击节点编辑节点内容<br />
&nbsp;&nbsp;&nbsp; * 拖拽排序<br />
&nbsp;&nbsp;&nbsp; * 右键弹出菜单，进行详细配置<br />
<br />
grid实现的功能：<br />
<br />
&nbsp;&nbsp;&nbsp; * 分页<br />
&nbsp;&nbsp;&nbsp; * checkbox全选，多选<br />
&nbsp;&nbsp;&nbsp; * 按字段搜索<br />
&nbsp;&nbsp;&nbsp; * 弹出对话框，进行新增或修改数据<br />
          <br/>
          <span style="color:red;">
            <a href="http://xyz20003.javaeye.com/blog/134665#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 23 Oct 2007 10:31:39 +0800</pubDate>
        <link>http://xyz20003.javaeye.com/blog/134665</link>
        <guid>http://xyz20003.javaeye.com/blog/134665</guid>
      </item>
      <item>
        <title>新闻发布0.0.2-M2发布</title>
        <author>xyz20003</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://xyz20003.javaeye.com">xyz20003</a>&nbsp;
          链接：<a href="http://xyz20003.javaeye.com/blog/129020" style="color:red;">http://xyz20003.javaeye.com/blog/129020</a>&nbsp;
          发表时间: 2007年10月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h1>2007-10-02：</h1>
<h1>新闻发布0.0.2-M2发布</h1>
<p><strong><a href="https://sourceforge.net/project/showfiles.php?group_id=204197" rel="nofollow">https://sourceforge.net/project/showfiles.php?group_id=204197</a></strong> </p>
<p>新闻发布0.0.2-M2发布 （milestone里程碑2） </p>
<p>后台是java的，ms平台的用不了。请使用jdk-1.5以上版本，和tomcat-5.5以上版本。 </p>
<p>项目首页：<a href="http://code.google.com/p/anewssystem/" rel="nofollow">http://code.google.com/p/anewssystem/</a> 下载地址：<a href="https://sourceforge.net/project/showfiles.php?group_id=204197" rel="nofollow">https://sourceforge.net/project/showfiles.php?group_id=204197</a> </p>
<p>发布的anews-0.0.2-M2.war是已经打包好的程序，可以直接放在tomcat下运行，自带了嵌入式数据库hsqldb，无需额外配置：） </p>
<p>anews -0.0.2-M2.zip是eclipse工程包，svn下的工程是maven2工程，经csdn上一位，现在使用的镜像网站速度快的离谱，所 以maven2工程也应该可以使用了，就是有些包在公网上是找不到的，目前还没有明确哪些包需要额外提供，所以先用eclipse工程吧，那里边是全的。 不过对于eclipse的使用经验太少，如果发现什么问题，请尽快反馈给我。echo_o@163.com </p>
<p>这个版本完成了权限模块的基本功能，包括 </p>
<ul>
    <li>照抄springside-2.0中权限模块的RBAC模型 </li>
    <li>资源分为URL与METHOD两种，分别使用filter和aop拦截，实现权限管理 </li>
    <li>角色与资源多对多关联 </li>
    <li>角色与菜单也是多对多关联，实现不同角色显示不同菜单 </li>
    <li>用户与角色多对多关联，一个用户会拥有多个角色中的资源 </li>
    <li>提供extjs与acegi对接，密码MD5加密，可选择cookie自动登录，登录支持图片验证码 </li>
</ul>
<p>因 为springside-2.0中没有ACL，没得照抄，听说acegi-1.0.3开始实现了新的ACL模型，springside-1.0中的ACL 还是老的，不想抄老的，新的缺找不到实例。只好等待。。。（PS，1.看不懂acegi-1.0.5中的contact例子，2.找不到解决虎牙子，分页 数据数不一致，的方法，3.对springside使用drools规则引擎，定义ACL规则的方法很感兴趣，可是又看不懂哪里用了） </p>
<p>补充了一些文档，顶多算是个人笔记。 </p>
<p>之前的0.0.2-M1中演示的JsonTree和JsonGrid的使用，这两个封装基本实现了最基本的tree与grid功能，而且在后台封装了对应的java类，前后台一起继承使用，结果就是大量的减少代码总量，看着干净。 </p>
<p>树形实现的功能： </p>
<ul>
    <li>异步读取节点（不过管理分类的时候需要读取所有节点） </li>
    <li>双击节点编辑节点内容 </li>
    <li>拖拽排序 </li>
    <li>右键弹出菜单，进行详细配置 </li>
</ul>
<p>grid实现的功能： </p>
<ul>
    <li>分页 </li>
    <li>checkbox全选，多选 </li>
    <li>按字段搜索 </li>
    <li>弹出对话框，进行新增或修改数据 </li>
</ul>
          <br/>
          <span style="color:red;">
            <a href="http://xyz20003.javaeye.com/blog/129020#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 03 Oct 2007 21:55:57 +0800</pubDate>
        <link>http://xyz20003.javaeye.com/blog/129020</link>
        <guid>http://xyz20003.javaeye.com/blog/129020</guid>
      </item>
  </channel>
</rss>