• 2009-05-27

    在Eclipse中生成英文框架的Javadoc

    Views: 26469 | No Comments

    虽然我写中文注释, 但我不喜欢Javadoc的框架是中文(比如显示"类"而不是"Class"). Javadoc有几个有用的选项:

    -locale <名称> 要使用的语言环境,例如 en_US 或 en_US_WIN(可以决定生成的框架是否是英文)
    -charset 用于跨平台查看生成的文档的字符集。(决定HTML源码中声明字符集的标签内容)
    -encoding <名称> 源文件编码名称(决定javadoc把Java源码文件当做何种字符集)
    -docencoding 输出编码名称(决定生成的HTML文档的字符集)

    不过, Eclipse中不支持-locale选项, 会提示出错"选项 -locale 必须为第一个选项。", 因为Eclipse在这些自定义的参数之前还加上了其它的参数, 你又不能改变这一点. 还好, 可以利用vm的参数:

    -J-Duser.language=en_US

    而Extra Javadoc options:

    -encoding UTF-8
    -charset UTF-8
    -docencoding UTF-8

    Posted by ideawu at 2009-05-27 11:29:50
  • 2009-04-02

    非常反感那些以时间长度来标记时间的垃圾做法

    Views: 21513 | No Comments

    有一种垃圾经常做的一种垃圾做法, 就是用距离现在的时间长度来标记时间, 比如两天前, 1小时前, 10分钟前. 我想说: 这么做的垃圾都见鬼去吧! 你一会给我一个精度是天的时间, 一会给我一个精度是小时的时间, 一会又给我一个精度是分钟的时间, 你SB啊!

    两天多1分钟也是两天, 两天前多12小时也是两天, SB才会认为这两个时间是相同的. 都差了半天. 还有些SB认为两天多23小时也是相同的!

    如果你认为时间精度到天就够了, 那就给出精确到天的时间, 别一会S, 一会B.

    Posted by ideawu at 2009-04-02 11:50:17
  • 2007-07-16

    Spring + Hibernate Web 开发者笔记

    Views: 22477 | No Comments

    我将使用 Java 技术开发一个网上商店系统. 使用 Java 1.5, JSP 2.0, JSTL 1.1, Tomcat 5.5, MySQL 5.0, Spring Framework 2.0, Hibernate 3.2, XHTML 1.1, CSS 2.0 等技术, 有些地方会用到某些 JavaScript 库和 AJAX 技术.

    因为是开发笔记, 所以我不会详细介绍 Spring 和 Hibernate 的技术细节, 我只使用我需要的技术. 你可以参考 Spring 和 Hibernate 的书籍和官方网站.

    文档的访问网址为 http://www.ideawu.net/person/spring_hibernate_web_dev/

    欢迎你和我一起讨论. 访问我的网站 http://www.ideawu.net/, 在上面留言, 或者直接发 Email 给我, 发到 ideawu 在 163.com 的邮箱.

    Posted by ideawu at 2007-07-16 09:05:48
  • 2006-10-08

    Web应用中基于组的用户权限管理在Spring框架下的实现

    Views: 27616 | 4 Comments

    在几乎所有的web应用中都需要对访问者(用户)进行权限管理, 因为我们希望某些页面只对特定的用户开放, 以及某些操作只有符合身份的用户才能进行. 这之中涉及到了身份验证和权限管理. 只有单用户系统和多用户单权限系统才不需要权限管理.

    在本文中, 使用了基于组的权限管理, 并在Spring框架下利用HandlerInterceptorAdapter和Hibernate进行实现.

    User的结构是:

    public class User {
    
    	private int id;
    
    	private String name;
    
    	private String password;
    
    	private Set<String> groups = new HashSet<String>();
    }
    

    UserGroup表:

    user:int
    group:String
    

    使用联合主键, 在Java中没有对应的类.

    Hibernate映射文件是:

    <hibernate-mapping auto-import="true" default-lazy="false">
    	<class name="net.ideawu.User" table="User">
    		<cache usage="read-write" />
    		<id name="id" column="id">
    			<generator class="native"/>
    		</id>
    		<property name="name" column="name"/>
    		<property name="password" column="password"/>
    		<set name="groups" table="UserGroup" cascade="save-update" lazy="false">
    			<key column="user" />
    			<element column="`group`" type="string" />
    		</set>
    	</class>
    </hibernate-mapping>
    

    一切的身份验证交给一个继承HandlerInterceptorAdapter的类来做:

    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    import org.springframework.web.util.UrlPathHelper;
    import org.springframework.util.AntPathMatcher;
    import org.springframework.util.PathMatcher;
    ...
    
    public class AuthorizeInterceptor extends HandlerInterceptorAdapter {
    
    	private UrlPathHelper urlPathHelper = new UrlPathHelper();
    
    	private PathMatcher pathMatcher = new AntPathMatcher();
    
    	private  Properties groupMappings;
    
    	/**
    	 * Attach URL paths to group.
    	 */
    	public void setGroupMappings(Properties groupMappings) {
    		this.groupMappings = groupMappings;
    	}
    
    	public boolean preHandle(HttpServletRequest request,
    			HttpServletResponse response,
    			Object handler) throws Exception {
    		String url = urlPathHelper.getLookupPathForRequest(request);
    		String group = lookupGroup(url);	// 找出资源所需要的权限, 即组名
    		if(group == null){	// 所请求的资源不需要保护.
    			return true;
    		}
    		// 如果已经登录, 一个User实例被保存在session中.
    		User loginUser = (User)request.getSession().getAttribute("loginUser");
    		ModelAndView mav = new ModelAndView("system/authorizeError");
    		if(loginUser == null){
    			mav.addObject("errorMsg", "你还没有登录!");
    			throw new ModelAndViewDefiningException(mav);
    		}else{
    			if(!loginUser.getGroups().contains(group)){
    				mav.addObject("errorMsg", "授权失败! 你不在 <b>" + group + "</b> 组!");
    				throw new ModelAndViewDefiningException(mav);
    			}
    			return true;
    		}
    	}
    
    	/*
    	 * 查看 org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.lookupHandler()
    	 * Ant模式的最长子串匹配法.
    	 */
    	private String lookupGroup(String url){
    		String group =  groupMappings.getProperty(url);
    		if (group == null) {
    			String bestPathMatch = null;
    			for (Iterator it = this.groupMappings.keySet().iterator(); it.hasNext();) {
    				String registeredPath = (String) it.next();
    				if (this.pathMatcher.match(registeredPath, url) &&
    							(bestPathMatch == null || bestPathMatch.length() <= registeredPath.length())) {
    					group = this.groupMappings.getProperty(registeredPath);
    					bestPathMatch = registeredPath;
    				}
    			}
    		}
    		return group;
    	}
    }
    

    下面我们需要在Spring的应用上下文配置文件中设置:

    <bean id="authorizeInterceptor" class="net.ideawu.AuthorizeInterceptor">
    	<property name="groupMappings">
    		<value>
    			<!-- Attach URL paths to group -->
    			/admin/*=admin
    		</value>
    	</property>
    </bean>
    
    <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    	<property name="interceptors">
    		<list>
    			<ref bean="authorizeInterceptor" />
    		</list>
    	</property>
    	<property name="mappings">
    		<value>
    			/index.do=indexController
    			/browse.do=browseController
    			/admin/removeArticle.do=removeArticleController
    		</value>
    	</property>
    </bean>
    

    注意到"/admin/*=admin", 所以/admin目录下的所有资源只有在admin组的用户才能访问, 这样就不用担心普通访客删除文章了. 使用这种方法, 你不需要在removeArticleController中作身份验证和权限管理, 一切都交给AuthorizeInterceptor.

    Posted by ideawu at 2006-10-08 20:10:23
  • 2006-10-08

    ideabook 采用GPLv2发布

    Views: 21617 | No Comments

    ideabook 采用GPLv2发布, 因为我不愿意自己再写一个许可证, 而且也没有必要. 以前没使用, 是因为我没有时间阅读GPL.

    Posted by ideawu at 20:01:49
  • 2006-09-06

    ideabook 新版本发布

    Views: 21722 | No Comments

    这个版本的 ideabook 相对前一个 jsp + javabean 版本性能提高了. 当然, 结构似乎有点复杂.

    一些特性:

    1. 基于 Spring 框架.
    2. 使用数据库连接池.
    3. 使用 jstl, 所以 jsp 代码更加简洁.
    4. 增加 access 层, 实现最新留言的缓存, 从而减少数据库连接次数, 提高性能.

    访问 ideabook 首页

    Posted by ideawu at 2006-09-06 19:33:34
|<<<123>>>| 1/3 Pages, 16 Results.