Java

Ehcache is good!

非常轻量,而且可以跟Spring集成。 据说还有人搞出了相关的Annotation,这样一来真的可以对任何对象透明地进行缓存。

Autowire一个 FactoryBean时,代码里要把变量的类型定义为FactoryBean.getObjectType()

以   <bean id="myCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean"> 为例, //正确 @Autowired private Ehcache myCache; //因为 EhCacheFactoryBean.getObjectType() == Ehcache //错误: @Autowired private Cache myCache; //会报错,虽然Cache是Ehcache的子类。具体错误为“No unique bean of type [net.sf.ehcache.Cache] is defined”

[MVC]分解一个Action/Controller的功能点/测试点

开发/测试一个 Struts Action/Spring Controller时,要注意覆盖到以下所有功能点/测试点.   1.Form Rendering         a.first rendering      b.rendering after submission         i.successful submission        ii.failed submission   2.Validation      a.Show Field Errors/Action Errors in validation fails   3.Show Correct Results      a. What if no result?      b. Results are too few to be paginated.      c. Results are so many …

[MVC]分解一个Action/Controller的功能点/测试点 Read More »

[Spring Security] 研究了一下Spring Security如何处理 Redirect after Login

为了用户体验,在Login之后应该自动跳到Login之前的页面 Spring Security作为最成熟的WEB安全框架,它是如何处理这个问题的呢? 我研究了一下代码,其机制大概如下:   1.基本步骤     a.某个未登录的用户执行某个操作     b.Spring Security发现它未登录,于是把当前的请求信息(包括URL,参数,POST/GET)存入SESSION     c.然后302到登录页面     d.用户登录     e.Spring Security 发现用户名密码无误,准备执行登录前的请求     f.Spring Security从session中取出上次存入的请求信息,然后发送redirect即可   2.如果上一次请求是POST怎么办? 看代码发现,Spring Security仍然只redirect一个不带参数的URL。但这样的话岂不是导致参数丢失?  不会。因为下一个处理者会从session里面去拿参数。当然下一个处理者不用显式地去访问HttpSession,它仍然只调用 request.getParameter(),只不过这里的request已经被Spring Security封装成为一个特殊的request,这个request覆盖了原始的getParameter()方法。在覆盖的方法中,它会去session里面找参数。    

Trying to find “BaseStrutsTestCase” in www.arsenalist.com ?

"Struts2 in Action" 里提到可以用 "BaseStrutsTestCase" 做为action测试的基类,并且说可以在 www.arsenalist.com 找到。但www.arsenalist.com 是阿森纳俱乐部相关的一个网站! 幸好在Manning的论坛里提到了这个问题,消息灵通人士透露,这个类可以在以下网址找到。 http://depressedprogrammer.wordpress.com/2007/06/18/unit-testing-struts-2-actions-spring-junit/

让extremeTable在翻页后跳到页面上某个 anchor

如果你的 extremeTable 处在页面下方,则每当你翻一页时,就可以必须把滚动条拖下来才能看到table中的下半部分数据。 如果我们让它在翻页后跳到某个anchor,再把这个anchor的位置设置在表格附近,那这个问题就没那么严重了。 那怎么自动跳到某个anchor呢? 很简单:    <ec:table            items="apps"            action="action.do#resultAnchor"    </ec:table>

Struts2 + extremTable 简单分页

我们都知道分页查询包括数据库端分页和UI前端分页。   1.如果数据量很小,则无须数据库分页,让extremeTable直接进行UI分页即可。   2.如果数据量比较大,则应该进行数据库分页,并让extremeTable配合。数据库分页大家有自己的方案,这里就不提;我们只说一下extremeTable应该如何配合。     a. 首先,extremeTable显示的“记录总条数”不能等于它即将处理的items数,因为items只代表当页记录。那怎么显示一个记录总条数呢?                         i.Struts2里应该先忽悠一下,强行指定记录总条数。 //在action里添加这样一个"totalRows"属性 public int getTotalRows() { return 记录总条数; } // "totalRows" 对应的是org.extremecomponents.table.core.TableConstants.TOTAL_ROWS 这个常量。 通过下面的设置,我们将让extremeTable标签从http context中读取"totalRows"。        ii.让extremeTable标签从http context中读取 "totalRows"                 <@ec.table                   items="records"                   …                   retrieveRowsCallback="limit"               >          必须做这个设置,否则extremeTable将把 records.size()当作总记录数。     b.未完待续    

一个Trim Interceptor

很多人想要这个东西,都说可以Interceptor来自动trim掉输入,但为什么就没有人整出来呢? 既然没人弄,那我就弄一个呗。不过,其实,这个类基本是从’Apache Struts 2 Web Application Development’中抄来的,我另外做了一点修改。 public class TrimInterceptor extends MethodFilterInterceptor { private List<String> excluded = new ArrayList<String>(); protected String doIntercept(ActionInvocation invocation) throws Exception { Map<String, Object> parameters = invocation.getInvocationContext().getParameters(); for (String param : parameters.keySet()) { if (isIncluded(param)) { String[] vals = (String[]) parameters.get(param); boolean allNull = true; for (int i = 0; i …

一个Trim Interceptor Read More »

Struts2中如何用Select标签来映射Enum类型?

假设   Role是枚举类型,   而 candidateRoles= Role.values() 如果要设定user的roles,则select标签就应该这样写 <@s.select   name="user.roles" list="candidateRoles"  multiple="true"   />   1. 使用candidateRoles作为候选项   2. name的表达式也直接使用Role类型,同时,不要指定 listKey 和 listValue标签   3. 这样的标签在增/改时都会展现所有侯选Roles,并且,在“修改”页面会自动选中当前已有的Roles.

Hibernate如何判断当前值是否满足 nullable=false ?

经过测试发现,     如果 user.name == null,则"name"字段上的 nullable=false 就被违反,hibernate会抛出异常,防止错误数据进入数据库     但如果user.name == "",则 "name"字段上的 nullable=false 没被违反,这个数据会被插到数据库里