没有比人更高的山

JSF中CommandButton与CommandLink传值0

f:param标签能够将一个参数添加到组件。需要注意的是f:param标签的不同表现依赖于它所关联的组件类型

【1】如果为 h:outputText添加f:param标签,那么JSF实现将使用参数来填充占位符,例如{0}、{1}等。

【2】如果添加f:param标签到h:commandLink,JSF实现会将参数值作为请求参数传递到服务器,如:

1
2
3
<h :commandLink actionListener="#{userListBean.checkUser}" value="审核通过">
    <f :param name="userId" value="#{user.userId}" />
</h>

在服务器端可以使用如下方法来获取传递到服务器端的值:

1
2
3
4
private void checkUser(ActionEvent actionEvent){
    String uid = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("userId");
    // other code
}

但是f:param的传值方式对于h:commandButton是没有作用的,(如果你是用搜索引擎搜到这篇文章的话,相信你肯定是遇到了这个问题),详情可以参考http://www.javaeye.com/topic/93388

如果是h:commandButton,那么可以使用f:attribute来进行传值,示例如下:

1
2
3
<h :commandButton actionListener="#{userListBean.resetPassword}" value="审核通过">
    <f :attribute name="userId" value="#{user.userId}"/>
</h>

在服务器端可以使用如下方法来获取传递到服务器端的值:

1
2
3
4
private void resetPassword(ActionEvent actionEvent){
    long userIdString = (Long) actionEvent.getComponent().getAttributes().get("userId");
    //other code ……
}
VN:F [1.7.5_995]
Rating: 0.0/10 (0 votes cast)
VN:F [1.7.5_995]
Rating: 0 (from 0 votes)

JSP & Servlet讲座PPT3

如果听了讲座的小盆友请给个评价吧,如果没听的话给ppt一个评价吧,谢谢。

VN:F [1.7.5_995]
Rating: 9.0/10 (2 votes cast)
VN:F [1.7.5_995]
Rating: +1 (from 1 vote)

Appfuse中文教程0

现在的Web应用开发人员是幸福的,有如此多的选择,Web层有Sturts2、JSF、Spring MVC、Tapestry等,持久层可以选择Hibernate、iBATIS或者JPA等,还有极为强大的Spring作为粘合剂,完美地运行时自动创 建所需的一切对象(依赖注入)。然而我们这些开发人员也是不幸的,因为要让一切完美的运行有太多太多的配置——XML、Annotation甚至是 Properties文件。当开始一个新项目时,要搭建起一个能正常运行、能真正简化开发、能真正实现模块化开发的Web应用开发骨架太难了,更不用说还 要加入DbUnit等自动测试框架。

但是有了Appfuse,一切变得简单起来,Appfuse是一个开源的Web应用骨架生成工具,支持上文提到的任何一种开发工具的组合,包括Web Services、工作流、任务调度等,能方便的生成Web开发中常用CRUD骨架,够诱人了吧。

吹了这么多,Appfuse其实很简单,你甚至不需要下载,因为她实质上是一个Maven插件,你运行mvn命令时,maven会自动帮你搞定任何事情,也就是说你只需要知道命令就行了,而且实际上你也不需要记住命令,http://appfuse.org/display/APF/AppFuse+QuickStart+-+Chinese 这个页面可以帮助你生成命令,而且是中文的,虽然翻译得不怎么样,不过看得懂。

选择好你需要的Web框架,将它帮你生成的mvn命令直接复制到命令行中,如果你已经按http://appfuse.org/display/APF/Development+Environment 配置好了环境变量的话,你可以看到maven开始下载一切需要的东西了。其实配置环境变量没有说得那么复杂,只需要将JDK、Maven、MySQL的bin目录都加入到path里面就行了,linux的用户请自己摸索一下,我不是很懂。

其实上面这些如果你是标准SSH(Struts2+Spring+Hibernate架构)还有一个选择就是Springside, 国人开发的,异常不错,强烈推荐,个人认为在SSH方面比Appfuse要更好一些。不过Appfuse还有个绝招,它还提供了一个VMWare 虚拟机镜像,可以直接下下来,里面已经装好了Subversion(版本控制), CruiseControl(持续集成工具) 和Trac(bug追踪工具以及wiki),不过我没有尝试,不知道具体使用起来怎么样。

第一篇就到这里,要知后事如何,且听下回分解。

VN:F [1.7.5_995]
Rating: 0.0/10 (0 votes cast)
VN:F [1.7.5_995]
Rating: 0 (from 0 votes)

JSP中Session、Cookie的使用与“记住我的登录状态”示例程序2

本文为原创文章,转载请注明来源http://www.zhlwish.com

《session、cookie与“记住我的登录状态”的功能的实现》一文中详细讲解了Cookie和Session的原理以及“记住我的登录状态”功能的实现原理,本文以Servlet、JSP技术为例讲解Servlet中Cookie和Session的使用以及以此为基础的“记住我的登录状态”功能的实现方式,最后附上例子程序的源代码。

EL表达式

本文的样例源代码中用到了JSP EL表达式,JSP1.0中EL表达式是作为JSTL的一部分,即只能在JSTL标签中使用。JSP2.0中EL表达式可以在文本模板中使用,即可以直接在JSP页面中使用,本文的样例源代码使用${pageContext.request.contextPath}在JSP页面中获取当前Web应用的路径(context path),关于EL表达式的使用请参见《JSTL入门:表达式语言》,关于Web应用的路径请参见《Servlet、JSP中获取Web应用路径(context path)的方法》

Servlet中的Session

javax.servlet.http.HttpSession是Servlet API中定义的一个接口,其中比较重要的方法有:
将一个对象实例存放在Session中:

1
public void setAttribute(String name, Object value);

通过名称获取Session中的对象实例:

1
public Object getAttribute(String name);

Session对象可以用过HttpServletRequest对象获取,一般在Servlet中通过request.getSession();获取一个Session对象。

Web服务器每接收到一个新的请求,服务器就会新建一个Session对象,一般会将当前用户帐号存放于Session中,当然你可以放更多的对象,这样会增加服务器的负担。Session会在一定时间后由Servlet容器销毁,这个时间可以在Web应用的web.xml里面进行设置。

Servlet中的Cookie

javax.servlet.http.Cookie是一个类,有一个构造函数public Cookie(String name, String value),一般用下面的方式创建一个Cookie对象:

1
2
3
4
5
String cookieName = "userinfo";
String cookieValue = "admin,123";
Cookie cookie = new Cookie(cookieName, cookieValue);
cookie.setMaxAge(14 * 24 * 3600);//设置Cookie的过期时间
cookie.setPath(request.getContextPath());//设置路径

上面仅仅创建了一个Cookie,要使其产生作用,还需要使用response.addCookie(cookie);将Cookie发送到用户浏览器。

一般使用下面的方法将一个Cookie删除,也就是将Cookie设成过期并发送到客户端:

1
2
3
cookie.setMaxAge(0);
cookie.setPath(request.getContextPath());
response.addCookie(cookie);

记住我的登录状态的实现

Servlet中一般使用Filter来保护需要经过认证才能访问的资源,当Filter被调用时对Session以及Cookie中的数据进行检查,如果通过了认证,则放行这次请求;如果未通过认证,则强制跳转到登录页面。具体流程如下图所示:

记住我的登录状态序列图

图中的ForceLoginFilter和DoLoginServlet的实现请参见示例代码。

示例代码中,受保护的资源是admin文件夹下的所有内容,所以web.xml中ForceLoginFilter的url-pattern设置为/admin/*,如果你需要更灵活的资源控制,可以将url-pattern设置为/*,然后在ForceLoginFilter通过检查请求的URL来实现更为详细的控制。

示例代码中,密码使用明文存储在Cookie中,这是不可取的,需要加密。

示例代码使用eclipse开发,直接可以导入到eclipse工程中,在JDK5.0、Tomcat 6.0上测试通过,如果你在运行过程中发现bug,请留言提出,谢谢。

示例代码下载

VN:F [1.7.5_995]
Rating: 8.3/10 (3 votes cast)
VN:F [1.7.5_995]
Rating: 0 (from 0 votes)

Servlet、JSP中获取Web应用路径(context path)的方法0

在Servlet中可以直接使用request.getContextPath()获取当前web应用的路径(context path)

在JSP 2.0页面中可以使用el表达式${pageContext.request.contextPath}

如果是JSF页面,因为JSF默认使用#作为el表达式的起始符,所以应该写成#{pageContext.request.contextPath}

因为JSP2.0之前的版本不支持文本模板中的el表达式,故可以使用嵌入java代码来实现,和Servlet中一样

如果在JSP2.0之前的版本中使用了JSTL标签(el表达式的概念是JSTL 1.0推出来的),所以仍然可以配合JSTL的标签使用el表达式输出当前Web应用路径(context path)

VN:F [1.7.5_995]
Rating: 0.0/10 (0 votes cast)
VN:F [1.7.5_995]
Rating: 0 (from 0 votes)