- 浏览: 77563 次
- 来自: ...
最新评论
-
Linuxboy:
配置介绍原文:https://fedoraproject.or ...
xorg-server禁用hal的配置方法[from Fedora] -
Linuxboy:
网上有很多关于mysql,hibernate,proxool等 ...
T5学习小结之五(tapestry-hibernate的基本应用) -
lucumu:
请问,数据库怎么配置阿
T5学习小结之五(tapestry-hibernate的基本应用) -
Linuxboy:
最新版本的mplayer已经支持ASS了。
gnome-mplayer:轻盈小巧的mplayer前端 -
Linuxboy:
sun58224 写道RequestGlobals, requ ...
Tapestry5学习小结之六(CJK解决方案)
这次是一个简单的登录界面,前台由jquery.form负责判断输入是否非空以及无刷新显示后台登录信息。就这么简单,但是中间还是碰到了一个问题,困扰了很久。
先来看看我最初的代码:
一、数据库查询
用的是guice-persist的DynamicFinder,所以只需要实现一个接口,而不需要具体实现。配置方法见本人前面的文章《sitebricks 学习笔记之guice-persist的配置和使用》。
UserFinder.java:
public interface UserFinder { @Finder(query = "select u from User u where u.name=:name and u.password=:password") User authenticated(@Named("name") String name, @Named("password") String password); }
二、前台登录界面:
使用了sitebricks的decoration技术,详细方法见《sitebricks学习笔记之decoration》。
Login.java:
@Decorated public class Login extends Decorator { public Login() { } @Override public String getPageTitle(){ return "Bricks - 用户登录"; } }
Login.html:
<!DOCTYPE HTML> <html> <head> <title>none</title> @Require <script type="text/javascript" charset="UTF-8" src="static/js/jquery-1.7.2.min.js"></script> @Require <script type="text/javascript" charset="UTF-8" src="static/js/jquery.form.js"></script> </head> <body> <script type="text/javascript"> $(document).ready(function() { $('#loginform').submit(function()//提交表单 { var options = { target:'#msg', url:'/hello', //提交给哪个执行 type:'POST', beforeSubmit: validate, success: function(data){ $('#msg').html(data.info);} //显示操作提示 }; $('#loginform').ajaxSubmit(options); return false; //为了不刷新页面,返回false,反正都已经在后台执行完了,没事! }); } ); function validate(formData, jqForm, options) { for (var i=0; i < formData.length; i++) { if (!formData[i].value) { $('#msg').html('请输入用户名和密码!'); return false; } } } </script> <div class="login_container" id="login"> <div id="msg"></div> <div class="login_box"> <div class="logo_title"> <h1><img src="/static/images/login_title.gif"/>用户登录</h1> </div> <div class="login_operate"> <form id="loginform" method="post" name="loginform"> <div class="username"> <label class="txt_default" for="name">用户名</label> <input class="txt alias" id="name" name="name" type="text" tabindex="1"/> </div> <div class="password"> <label class="txt_default" for="password">密 码</label> <input class="txt password" id="password" name="password" type="password" tabindex="2"/> </div> <div class="about_password"> <input class="remerber_password" id="remerber_password" type="checkbox" disabled/> <label for="remerber_password">记住登录状态</label> <a class="forgetPassword" href="" target="_blank">忘记密码?</a> </div> <div class="login_submit"> <a class="login_btn_wrapper" href=""><input class="login_btn" type="submit" value="登录"/></a> </div> </form> </div> </div> </div> </body> </html>
这里注意两点:1、由于使用了decoration,所以引入的两个必需的js文件,必须使用@Require,不然的话在最终输出的页面中将不会出现这两个js文件。
2、ajax form的具体执行代码需要放在<body>内,原因同上。
三、后台处理
Hello.java:
public class Hello { @Inject private UserFinder finder; private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Post public Reply<Map<String, String>> hello() { User user = finder.authenticated(name, password); Map<String, String> result = new HashMap<String, String>(); if (user!=null) result.put("info", "用户" + name + "登录成功!"); else result.put("info", "用户名或密码错误!"); return Reply.with(result).as(Json.class); } }
这里注意不要忘了name和password的getter/setter。
四、运行时问题出现
当数据库中不存在所查询的对象时,将会抛出NoResultException。
五、解决办法:
方案一:最初的时候,我用的办法是自己写一个Dao,在获取结果时使用try-catch,当jpa返回NoResultException时,使user=null。
UserDao.java:
public class UserDao{ @Inject private EntityManager em; public User authencated(String name, String password){ Query q = em.createQuery("select u from User where u.name=:name and u.password=:password"); User user = null; try{ user = (User) q.getSingleResult(); return user; }catch(NoResultException e){ return null; } finally{return user;} } }然后将Hello.java中的
改为
其他代码不变,运行正常。但是总觉得这样风格太不统一,就像是一个hack。于是google了一下,发现guice-persist的这个问题与warp-persist是一脉相承的,出现NoresultException其实不是@Finder的问题,而是jpa规范的要求。那么,就没有解决办法了吗?warp-persist&sitebricks的作者dhanji告诉了我们解决方案。
方案二:
很简单,只需要修改@Finder的返回类型为ArrayList<User>,然后在Hello.java修改一下判断语句即可。
UserFinder.java:
public interface UserFinder { @Finder(namedQuery = "getUserByNamePwd", returnAs = ArrayList.class) ArrayList<User> authenticated(@Named("name") String name, @Named("password") String password); }
注意,@Finder里必须指明returnAs。
Hello.java:
public class Hello { @Inject private UserFinder finder; private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Post public Reply<Map<String, String>> hello() { ArrayList<User> users = finder.authenticated(name, password); System.out.println("\n>>>[BRICKS] Hello world!"); Map<String, String> result = new HashMap<String, String>(); if (!users.isEmpty()) result.put("info", "用户" + name + "登录成功!"); else result.put("info", "用户名或密码错误!"); return Reply.with(result).as(Json.class); } }这样,即使结果集为空,运行时也不会抛出异常了。
发表评论
-
sitebricks 学习笔记之分页widget(@Pager)
2012-08-15 17:46 1191UPDATE:重新优化了一下代码,减少一次页面请求读取数据库的 ... -
sitebricks 学习笔记之guice-persist的配置和使用
2012-08-13 12:04 1950目前能够通过简单的配置就可以使用的guice 模块,我所知的是 ... -
sitebricks 学习笔记之Decoration
2012-08-13 11:04 1117sitebricks 的 decoration是类似于apac ... -
自定义分页Loop组件:PagedLoop
2011-01-23 22:59 1888T5版本:tapestry-5.2.4 自定义PagedLo ... -
转载:Tapestry5: Caching Method Results
2010-12-29 01:47 1071Tapestry5: Caching Method Res ... -
Tapestry5之日期格式化:Output 组件的使用
2010-12-27 17:47 1228以前一直自己用代码来格式化日期,现在(可能T5在很久以前就已经 ... -
tapestry-5.2.4中context values和request parameters应用
2010-12-25 22:57 1496一、context values tapestry默认使用的 ... -
[Tapestry5.0.6]DateFieldDemo
2007-12-05 18:26 1388DateFieldDemo.tml <html xm ... -
Tapestry5学习小结之六(CJK解决方案)
2007-04-17 20:57 3830转自mail-lists Nick Westgate ... -
T5学习小结之五(tapestry-hibernate的基本应用)
2007-04-05 15:14 4974环境: 1.容器:tomcat-6.0.10 2.Tapest ... -
T5学习小结之四(Form的基本应用2)
2007-03-06 12:46 2687同样是简单的login流程,下面展示如何进行page navi ... -
Tapestry5学习之三(转载:Select的用法)
2007-02-28 10:57 2539本文转自:http://bclxz520.iteye.com/ ... -
Tapestry5学习小结之二(Loop&ActionLink的基本应用)
2007-02-25 17:19 5788Start.html <html xml ... -
T5学习小结(Form的基本应用)
2007-02-22 00:00 2901一个简单的Login流程:Login.html -> S ... -
正在Tapestry和Wicket之间徘徊(一)
2006-12-12 10:05 2699我最早接触的Web框架是struts,但是因为一 ...
相关推荐
ajax 学习笔记源代码ajax 学习笔记源代码ajax 学习笔记源代码ajax 学习笔记源代码ajax 学习笔记源代码ajax 学习笔记源代码ajax 学习笔记源代码ajax 学习笔记源代码ajax 学习笔记源代码ajax 学习笔记源代码ajax 学习...
### Ajax和jQuery学习笔记 #### 一、Ajax基础与原理 **1.1 什么是Ajax?** Ajax(Asynchronous JavaScript and XML,异步JavaScript和XML)是一种用来创建快速动态网页的技术,通过在后台与服务器进行少量数据...
### Ajax学习笔记个人总结 #### 一、XMLHttpRequest对象简介 **XMLHttpRequest** 对象是 AJAX 技术的核心,它负责在客户端与服务器之间发送异步请求,无需刷新整个页面即可实现局部数据更新。要使用 ...
在这份超详细的Ajax学习笔记中,我们将深入探讨以下几个关键知识点: 1. **基础概念**:Ajax的核心是JavaScript对象XMLHttpRequest,它使得前端和后端能够进行异步通信。异步意味着用户在等待服务器响应时可以执行...
AJAX学习笔记。内含Java调用的两个实例,及JavaScript的ajax工具函数,可快速入门,也可当手册使用。个人精心整理,值得收藏。 更多:http://download.csdn.net/user/daillo/all
### AJAX学习笔记 #### 一、引言 Ajax(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。...
Java相关课程系列笔记之十一Ajax学习笔记 Java相关课程系列笔记之十二jQuery学习笔记 Java相关课程系列笔记之十三Struts2学习笔记 Java相关课程系列笔记之十四Hibernate学习笔记 Java相关课程系列笔记之十五Spring...
在本篇Java相关课程系列笔记之十一中,我们聚焦于Ajax的学习,这是一项在Web开发中广泛使用的技术,用于创建动态、无刷新的用户界面。Ajax全称Asynchronous JavaScript and XML,即异步JavaScript和XML,它允许网页...
Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习...
通过以上四天的学习,你将能够熟练掌握Ajax的基本原理和应用,从而在实际项目中提高Web应用的性能和用户体验。在MyEclipse环境下,你可以创建源代码示例,动手实践每个步骤,加深理解和记忆。记得不断练习和尝试,...
本人几年的学习摘要。对想学习ASP.NET的朋友很有帮助。 里面知识面广,内容都是我在实践中遇到的困难的解决方法,和我自己的实现片段代码。现在与大家分享。
云的学习笔记-云的学习笔记系统-云的学习笔记系统源码-云的学习笔记管理系统-云的学习笔记管理系统java代码-云的学习笔记系统设计与实现-基于ssm的云的学习笔记系统-基于Web的云的学习笔记系统设计与实现-云的学习...
云的学习笔记-云的学习笔记系统-云的学习笔记系统源码-云的学习笔记管理系统-云的学习笔记管理系统java代码-云的学习笔记系统设计与实现-基于ssm的云的学习笔记系统-基于Web的云的学习笔记系统设计与实现-云的学习...
"Ajax学习笔记"涵盖了异步JavaScript和XML技术,使网页可以实现局部刷新,提高用户体验。虽然现代Web开发中更多的使用了Fetch API和JSON,但了解Ajax的历史和工作原理仍然很有价值。 "Spring学习笔记"聚焦于Spring...