- 浏览: 118493 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
panqun:
jquery.mytime.js这个js请问你有么
基于JFinal的后台业务框架通用模块 -
tyc1920:
http://localhost/jcbase/res/js/ ...
基于JFinal的后台业务框架通用模块 -
breeze_86:
哥们有没有源码啊?能不能发一份!353474917@qq.co ...
dwr之IM项目(一) -
逍遥bxf飞雪:
哥们有没有源码啊?能不能发一份!396941223@qq.co ...
dwr之IM项目(一) -
yulon:
w156445045 写道nameKey JSONArray ...
jquery autoComplete 在实际项目的运用
实现用户注册与登陆模块
注册界面:
登陆界面:
一、定义UserService其它接口并将其实现
/** * 用户注册 * @param user */ public void register(User user); /** * 判断用户是否存在 * @param username * @return */ public boolean exsit(String username); /** * 判断用户名及密码是否通过 * @param username * @param password * @return */ public boolean validate(String username,String password); /** * 更新密码 * @param username 用户名 * @param newpassword 新密码 */ public void updatePassword(String username, String newpassword); /** * 判断邮箱是否已注册 * @param email * @return */ public boolean exsitEmail(String email); /** * 更新注册邮箱 * @param username * @param newemail */ public void updateEmail(String username,String newemail);
实现类:
@Service("userServiceBean") public class UserServiceBean extends DaoSupport<User> implements UserService { @Resource(name="userRoleServiceBean") private UserRoleService userRoleService; public void updateEmail(String username,String newemail){ em.createQuery("update User o set o.email=?1 where o.username=?2") .setParameter(1, newemail).setParameter(2, username).executeUpdate(); } public void updatePassword(String username, String newpassword){ em.createQuery("update User o set o.password=?1 where o.username=?2") .setParameter(1, MD5.MD5Encode(newpassword)).setParameter(2, username).executeUpdate(); } public void register(User user){ //对密码进行md5加密 user.setUserrole(userRoleService.getReference("user")); UserGrade userGrade = new UserGrade(); user.setUsergrade(userGrade); UserInfo userInfo = new UserInfo(); userInfo.setNickname(user.getUsername()); user.setUserinfo(userInfo); user.setPassword(MD5.MD5Encode(user.getPassword())); super.save(user); } @Transactional(propagation=Propagation.NOT_SUPPORTED) public boolean exsitEmail(String email){ long count = (Long)em.createQuery("select count(o) from User o where o.email=?1") .setParameter(1, email).getSingleResult(); return count>0; } @Transactional(propagation=Propagation.NOT_SUPPORTED) public boolean exsit(String username){ long count = (Long)em.createQuery("select count(o) from User o where o.username=?1") .setParameter(1, username).getSingleResult(); return count>0; } @Transactional(propagation=Propagation.NOT_SUPPORTED) public boolean validate(String username,String password){ long count = (Long)em.createQuery("select count(o) from User o where o.username=?1 and o.password=?2") .setParameter(1, username).setParameter(2, MD5.MD5Encode(password)).getSingleResult(); return count>0; } }
知识提示: 注册的同时需对密码进行md5加密
二、UserRegAction类的实现
@Controller("userRegAction") @Scope("prototype") public class UserRegAction extends ActionSupport{ private static final long serialVersionUID = 1159518406043666180L; private User user; private String repassword; private String code; @Resource(name="userServiceBean") private UserService userService; public String getRepassword() { return repassword; } public void setRepassword(String repassword) { this.repassword = repassword; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } /** * 打开用户注册界面 * @return * @throws Exception */ public String registerUI()throws Exception{ return Action.SUCCESS; } /** * 用户注册 * @return * @throws Exception */ public String register() throws Exception { String validateCode = (String)ActionContext.getContext().getSession().get("validateCode"); if(!validateCode.equals(this.getCode())){ this.addFieldError("codeerror","验证码有误!"); return Action.INPUT; } //判断用户是否存在 if(userService.exsit(user.getUsername().trim())){ this.addFieldError("user.username", "用户名已存在!"); return Action.INPUT; } //判断邮箱是否已初注册过 if(userService.exsitEmail(user.getEmail().trim())){ this.addFieldError("user.email", "邮箱已被注册过!"); return Action.INPUT; } userService.register(user); return Action.SUCCESS; } }
基于xml的数据验证,文件跟action在同一个目录下,并命名为:UserRegAction-register-validation.xml,register是action名.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"> <validators> <field name="user.username"> <field-validator type="requiredstring"> <!-- 默认为true --> <param name="trim">true</param> <message>用户名不能为空!</message> </field-validator> <field-validator type="stringlength"> <param name="maxLength">15</param> <param name="minLength">6</param> <!-- 给用户显示的提示信息,可以国际化 --> <message>用户名长度在${minLength}~${maxLength}之间!</message> </field-validator> </field> <field name="user.password"> <field-validator type="requiredstring"> <!-- 默认为true --> <param name="trim">true</param> <message>密码不能为空!</message> </field-validator> <field-validator type="stringlength"> <param name="maxLength">15</param> <param name="minLength">6</param> <!-- 给用户显示的提示信息,可以国际化 --> <message>密码长度在${minLength}~${maxLength}之间!</message> </field-validator> </field> <field name="repassword"> <field-validator type="requiredstring"> <!-- 默认为true --> <param name="trim">true</param> <message>重复密码不能为空!</message> </field-validator> <field-validator type="fieldexpression"> <param name="expression"><![CDATA[repassword.equals(user.password)]]></param> <message>密码输入不一致!</message> </field-validator> </field> <field name="user.email"> <field-validator type="requiredstring"> <message>电子邮箱不能为空!</message> </field-validator> <field-validator type="email"> <message>电子邮箱格式不正确!</message> </field-validator> </field> </validators>
知识提示: 这个配置文件支持正则表达式(如:${minLength})和ognl表达式(如:repassword.equals(user.password))
2.2 配置struts-user.xml文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="forward" namespace="/" extends="struts-default"> <!-- 用户注册界面 --> <action name="registerUI" class="userRegAction" method="registerUI"> <result>/WEB-INF/forward/register.jsp</result> </action> <!-- 用户注册 --> <action name="register" class="userRegAction" method="register"> <result name="input">/WEB-INF/forward/register.jsp</result> <result name="success">/WEB-INF/forward/register_comp.jsp</result> </action> <!-- 用户登陆界面 --> <action name="loginUI" class="userLoginAction" method="loginUI"> <result name="success">/WEB-INF/forward/login.jsp</result> </action> <!-- 用户登陆 --> <action name="login" class="userLoginAction" method="login"> <result name="input">/WEB-INF/forward/login.jsp</result> <result name="success" type="redirectAction">index</result> </action> <!-- 判断用户或邮箱是否被注册过 --> <action name="*_Exist" class="usernameOrEmailExistAction" method="{1}"> </action> <!-- 前台主页 --> <action name="index"> <result>/WEB-INF/forward/index.jsp</result> </action> </package> </struts>
2.3 验证码Servlet: VerifyCodeServlet,这个验证的实现也不是很好! 大家有没有更好的实现.在web.xml文件配置:
<!-- 验证码 --> <servlet> <servlet-name>VerifyCodeServlet</servlet-name> <servlet-class>cn.daxia.web.servlet.verify.VerifyCodeServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>VerifyCodeServlet</servlet-name> <url-pattern>/verifyCodeServlet</url-pattern> </servlet-mapping>
2.4 设置basePath: 写一个filter-->MyPrepareAndExecuteFilter,继承StrutsPrepareAndExecuteFilter,重新配置web.xml文件
public class MyPrepareAndExecuteFilter extends StrutsPrepareAndExecuteFilter { @Override public void init(FilterConfig filterConfig) throws ServletException { super.init(filterConfig); } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { //转换成HttpServletRequest HttpServletRequest request = (HttpServletRequest)req; ServletContext context = request.getSession().getServletContext(); if(context.getAttribute("basePath")==null){ String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; context.setAttribute("basePath", basePath); } super.doFilter(req, res, chain); } }
改写filter,此解决方案个人觉得不是很好,大家有没有其他方案
<filter> <filter-name>struts2</filter-name> <filter-class>cn.daxia.web.filter.MyPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
2.5 用户注册js验证文件在/js/user/register.js,验证用户或邮箱是否存在用了ajax实现,使用的js库是jquery1.3,js代码没有重构,比较乱
function ajaxUserNameSumbit(url,post){ $.ajax({ type: "post", url: url, data: post, success: function(msg){ if(msg=='notexist'){ document.forms[0].uservalidate.value='true'; $("#usermsg").css("display","inline").html("<div class='rightSign'></div><font color='green'>您可以使用该用户名!</font>").fadeIn("slow"); }else{ document.forms[0].uservalidate.value='false'; $("#usermsg").css("display","inline").html("<div class='errorSign'></div><font color='red'>此用户名已被使用!</font>").fadeIn("slow");; } } }); }
三、用户登陆部分大家不访自己去实现一下
发表评论
-
dw之IM项目(第一个简单的dwr推送程序)
2011-03-05 14:36 27102.3第一个简单的dwr推送程序 第一步à 将dwr相关 ... -
dw之IM项目(第一个简单的dwr推送程序)
2011-03-05 14:34 02.3第一个简单的dwr推送程序 第一步à 将dwr相关 ... -
js异步加载下拉树的实现
2011-03-05 14:06 6999下拉树图示: 主要实现部分: 第一,freemarker ... -
dwr之IM项目(二)
2011-02-24 00:32 13042.2 领域对象设计 1 用户与用户分 ... -
dwr之IM项目(一)
2011-02-17 20:22 1810本项目的基本架构主要是基于Struts2+JPA1.0+Sp ... -
quartz之任务调度在项目中的运用(可管理)
2011-02-16 17:12 11721、调度任务列表 2、添加任务定义 3、 ... -
多浏览器窗口共享购物车
2010-11-13 08:46 01、首先要说明的是浏览器是同一类型(IE、火狐..)的浏览器。 ... -
跟我一起写大虾网(第2天)
2010-02-06 19:11 1248一、设计用户相关实体类 积分等级类: @Enti ... -
补跟我一起写大虾网(第1天源码)
2010-02-05 11:48 1157补上源码 -
跟我一起写大虾网(第1天)
2010-02-05 11:14 1802一、先整合spring2.5+jpa1.0,使用扫描加注解的方 ... -
跟我一起写大虾网(第0天)
2010-02-04 11:52 44731、项目模块介绍 本项目是提供给用户一个学习和交流 ...
相关推荐
【标题】"跟我一起写大虾网(第2天)"是一个关于编程学习的教程,可能是系列教程的一部分,主要聚焦在代码编写和开发工具的使用上。这个标题暗示了作者将带领读者逐步了解如何构建一个名为“大虾网”的项目,可能是...
标题“补跟我一起写大虾网(第1天源码)”和描述中提到的“博文链接:https://yulon.iteye.com/blog/588083”表明这是一个关于编程学习的系列教程,作者可能正在引导读者逐步了解并编写一个名为“大虾网”的项目。...
跟我一起写Makefile跟我一起写Makefile跟我一起写Makefile跟我一起写Makefile跟我一起写Makefile跟我一起写Makefile跟我一起写Makefile跟我一起写Makefile跟我一起写Makefile跟我一起写Makefile跟我一起写Makefile跟...
《跟我一起写Makefile》是陈皓所著的一本深入探讨Makefile编写的书籍,由祝冬华整理,全文共计78页,于2005年10月14日发布。本书全面覆盖了Makefile的基础知识到高级应用,旨在帮助读者掌握如何有效地编写Makefile,...
《跟我一起写Makefile》是陈皓大佬撰写的一份PDF文档,主要讲解了如何编写和理解Makefile,以便于管理程序的编译和链接过程。Makefile是软件开发中的一个重要工具,它帮助自动化构建过程,使得编译和链接更加高效。 ...
3. Makefile 的工作方式 Makefile 的工作方式是基于依赖关系的。Makefile 会根据依赖关系自动推导出编译和链接的过程。例如,如果 Makefile 中有以下规则: ``` target: dependency1 dependency2 <TAB>commands ```...
Makefile 跟我一起写Makefile;Makefile 跟我一起写Makefile;Makefile 跟我一起写Makefile
《跟我一起写 Makefile》由陈皓撰写,祝冬华整理,是一份深入讲解Makefile的教程。Makefile是Linux环境中用于自动化构建、编译和链接程序的重要工具,它通过简洁的规则定义来管理复杂的项目构建过程。以下是该文档...
make是一个命令工具,它解释Makefile 中的指令(应该说是规则)。在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。Makefile 有自己的书写格式、关键字、函数。像C 语言有自己的格式、关键字和函数一样...
《跟我一起写 Makefile》是由陈皓编著的一本关于Makefile使用的指南,旨在帮助读者理解和掌握这个在软件开发中至关重要的工具。Makefile是Unix和类Unix系统中用于自动化构建、编译和测试程序的文件,它定义了一系列...
### 跟我一起写Makefile (PDF重制版) #### 概述 《跟我一起写Makefile (PDF重制版)》是一本详细介绍如何编写Makefile的指南书,适用于希望深入了解并掌握Makefile编写的程序员。Makefile是用于自动化构建过程的一...
实际上很多接触编程很长时间的人 并不会写MAKEFILE,所以跟我来写MAKEFILE 用ULTRAEDIT来打开。WORD是打不开的
跟我一起写 Makefile 在软件开发中,Makefile 是一种非常重要的工具,它帮助开发者自动化构建、编译和链接过程,提高工作效率。本教程将深入探讨 Makefile 的使用方法和核心概念。 1. 概述 Makefile 是一个文本...