没有比人更高的山

一些国人开发的好用JS控件0

以前都是用国外开发的像FCKEditor(已经更名为CKEditor)、Flexigrid等,很多英文文档看得头大,而且代码不一定写得很好,比如Flexigrid,我找到了至少2处bug,开发中很多时间都花费在看那上千行的js脚本上了。这里介绍几款国人开发的js控件,非常好用

My97日期控件:http://www.my97.net/dp
好处:可以选择时间,可以显示周,自定义格式,有多种皮肤可供选择,选择老年份非常方便:

KindEditor: http://www.kindsoft.net
一款可见即所得编辑器,用起来非常简单,相比CKEditor和TinyMCE要简单很多,特别是TinyMCE一大堆插件,一看头就晕了,项目开发期紧张,哪有那么多时间去看这些个插件是干嘛的哟。
支持两种皮肤,其中一种就是TinyMCE的皮肤,呵呵。

基于JQuery的Inline Editor插件http://www.wbfsaworkstation.com.cn
实在是不好意思,我不知道inline这个词怎么用中文来表达,我想每个开发人员应该心里明白是啥意思吧。支持单选按钮、多选列表、文本域、软键盘等,还有评分插件以及日历插件(日历插件基于My97)

如果遇到好的,会继续推荐,呵呵…

VN:F [1.7.5_995]
Rating: 1.0/10 (1 vote cast)
VN:F [1.7.5_995]
Rating: 0 (from 2 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: 7.8/10 (4 votes cast)
VN:F [1.7.5_995]
Rating: -1 (from 1 vote)

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)

JSP中获取表单中多选列表(Multiple Select)提交的值0

在select标签中添加multiple=”multiple”属性,可以使下拉列表(drop down list)变成多选列表(multiple select list),但是在jsp与servlet中使用获取表单值常用的request.getParameter(”value”)获取到的只是多选列表中的第一个选中值,经过查询资料,原来HttpServletRequest还有一个方法getParameterValues(String key),其返回值为String类型的数组,里面存放的正是多选列表中的选中的值。

也就是说,jsp和servlet中对于表单中的多选控件提交的值都是通过此getParameterValues方法来获取的,比如checkbox list(复选框列表)等,示例代码如下:
<form action=”index.jsp” method=”POST”>
    <select name=”value” multiple=”multiple”>
        <option value=”val1″>Value 1</option>
        <option value=”val2″>Value 2</option>
        <option value=”val3″>Value 3</option>
        <option value=”val4″>Value 4</option>
        <option value=”val5″>Value 5</option>
     </select>
     <input type=”submit” value=”Submit”>
</form>

<%
out.write(”<h3>selected values : <h3>”);
String[] selected = request.getParameterValues(”value”);
if(selected != null){
    for(int i=0; i<selected.length; i++){
        out.write(”<p>” + selected[i] + “<p>”);
    }
}else{
    out.write(”<p> No value selected <p>”);
}
%>

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