BOS项目 第2天(BaseDaoBaseAction用户登录自定义strust登录拦截器)
Posted 无极尊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BOS项目 第2天(BaseDaoBaseAction用户登录自定义strust登录拦截器)相关的知识,希望对你有一定的参考价值。
BOS项目 第2天
今天内容安排:
1、根据提供的pdm文件生成sql
2、持久层和表现层设计---BaseDao、BaseAction
3、实现用户登录功能
4、jQuery EasyUI 消息提示控件
5、jQuery EasyUI menubutton菜单按钮
6、自定义struts2拦截器,实现用户未登录自动跳转到登录页面
7、基于ajax实现修改密码功能
1. 根据pdm生成sql脚本
2. 设计持久层和表现层
2.1 持久层设计(基于泛型+反射)
通用接口:
/** * 抽取持久层通用方法 * @author zhaoqx * * @param <T> */ public interface IBaseDao<T> { public void save(T entity); public void delete(T entity); public void update(T entity); public T findById(Serializable id); public List<T> findAll(); } |
通用实现:
/** * 持久层通用实现 * @author zhaoqx * */ public class BaseDaoImpl<T> extends HibernateDaoSupport implements IBaseDao<T>{ //实体类型 private Class<T> entityClass; //使用注解方式进行依赖注入 @Resource public void setMySessionFactory(SessionFactory sessionFactory){ super.setSessionFactory(sessionFactory); }
/** * 在构造方法中动态获得操作的实体类型 */ public BaseDaoImpl() { //获得父类(BaseDaoImpl<T>)类型 ParameterizedType genericSuperclass = (ParameterizedType) this.getClass().getGenericSuperclass(); //获得父类上的泛型数组 Type[] actualTypeArguments = genericSuperclass.getActualTypeArguments(); entityClass = (Class<T>) actualTypeArguments[0]; }
public void save(T entity) { this.getHibernateTemplate().save(entity); }
public void delete(T entity) { this.getHibernateTemplate().delete(entity); }
public void update(T entity) { this.getHibernateTemplate().update(entity); }
public T findById(Serializable id) { return this.getHibernateTemplate().get(entityClass, id); }
public List<T> findAll() {//FROM User String hql = "FROM " + entityClass.getSimpleName(); return this.getHibernateTemplate().find(hql); } } |
2.2 表现层设计
public class BaseAction<T> extends ActionSupport implements ModelDriven<T>{ //模型对象 private T model; public T getModel() { return model; } /** * 在构造方法中动态获得实现类型,通过反射创建模型对象 */ public BaseAction() { ParameterizedType genericSuperclass = (ParameterizedType) this.getClass().getGenericSuperclass(); Type[] actualTypeArguments = genericSuperclass.getActualTypeArguments(); //获得实体类型 Class<T> entityClass = (Class<T>) actualTypeArguments[0]; try { //通过反射创建对象 model = entityClass.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } |
3. 基于baseDao和BaseAction实现用户登录
第一步:修改login.jsp页面,点击登录按钮,提交表单
<a onclick="document.forms[0].submit()" id="loginform:j_id19" name="loginform:j_id19"> <span id="loginform:loginBtn" class="btn btn-login" style="margin-top:-36px;">登录</span> </a> |
第二步:在UserAction中提供login方法
@Resource private IUserService userService;
//通过属性驱动接收验证码 private String checkcode; public void setCheckcode(String checkcode) { this.checkcode = checkcode; } public String login(){ //生成的验证码 String key = (String) ServletActionContext.getRequest().getSession().getAttribute("key");
//判断用户输入的验证码是否正确 if(StringUtils.isNotBlank(checkcode) && checkcode.equals(key)){ //验证码正确 User user = userService.login(model); if(user != null){ //登录成功,将User放入session域,跳转到系统首页 ServletActionContext.getRequest().getSession().setAttribute("loginUser", user); return "home"; }else{ //登录失败,设置错误提示信息,跳转到登录页面 this.addActionError(this.getText("loginError")); return "login"; } }else{ //验证码错误,设置错误提示信息,跳转到登录页面 this.addActionError(this.getText("validateCodeError")); return "login"; } } |
第三步:提供UserService类
@Service @Transactional public class UserServiceImpl implements IUserService{ //注入dao @Autowired private IUserDao userDao; public User login(User user) { String username = user.getUsername(); String password = user.getPassword();//明文 password = MD5Utils.md5(password);//md5加密 return userDao.findByUsernameAndPassword(username,password); } } |
第四步:在UserDao中扩展方法,根据用户名和密码查询用户
/** * 根据用户名和密码查询用户 */ public User findByUsernameAndPassword(String username, String password) { String hql = "FROM User u WHERE u.username = ? AND u.password = ?"; List<User> list = this.getHibernateTemplate().find(hql, username,password); if(list != null && list.size() > 0){ return list.get(0); } return null; } |
第五步:在struts.xml中注册国际化文件
第六步:在login.jsp页面中使用struts2提供的标签展示错误提示信息
4. jQuery EasyUI消息提示控件
4.1 alert方法
$.messager.alert("标题","内容信息","question");
4.2 show方法
window.setTimeout(function(){
$.messager.show({
title:‘欢迎信息‘,
msg:‘欢迎张三登录系统‘,
timeout:3000,
showType:‘slide‘
});
}, 3000);
效果:
4.3 confirm方法
$.messager.confirm("提示信息","你确定删除当前数据吗?",function(r){
alert(r);
});
4.4 prompt方法
$.messager.prompt("提示信息","你确定删除当前数据吗?",function(r){
alert(r);
});
效果:
4.5 progress
$.messager.progress();
window.setTimeout(function(){
$.messager.progress(‘close‘);
}, 3000);
效果:
5. jQuery EasyUI 下拉菜单制作
<a data-options="iconCls:‘icon-help‘,menu:‘#mm‘" class="easyui-menubutton">控制面板</a> <!-- 使用div制作下拉菜单选项 --> <div id="mm"> <!-- 使用子div制作具体的一个选项 --> <div onclick="alert(111)" data-options="iconCls:‘icon-edit‘">修改密码</div> <div>联系管理员</div> <div class="menu-sep"></div> <div>退出系统</div> </div> |
效果:
6. 自定义struts2拦截器
第一步:定义一个拦截器类
public class BOSLoginInterceptor extends MethodFilterInterceptor { // 拦截方法 protected String doIntercept(ActionInvocation invocation) throws Exception { User user = (User) ServletActionContext.getRequest().getSession() .getAttribute("loginUser"); if(user == null){ //未登录,跳转到登录页面 return "login"; } return invocation.invoke();// 放行 } } |
第二步:在struts.xml中注册拦截器
<interceptors> <!-- 注册拦截器 --> <interceptor name="BOSLoginInterceptor" class="com.itheima.bos.web.interceptor.BOSLoginInterceptor"> <param name="excludeMethods">login</param> </interceptor> <!-- 拦截器栈 --> <interceptor-stack name="myStack"> <interceptor-ref name="BOSLoginInterceptor"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> <!-- 指定默认栈 --> <default-interceptor-ref name="myStack"/> <global-results> <result name="login">/login.jsp</result> </global-results> |
7. 基于ajax实现修改密码
/WEB-INF/pages/common/index.jsp
第一步:为密码输入框进行输入校验,使用easyUI提供的easyui-validatebox
<table cellpadding=3> <tr> <td>新密码:</td> <td><input id="txtNewPass" type="Password" class="txt01 easyui-validatebox" required="true" data-options="validType:‘length[4,8]‘" /></td> </tr> <tr> <td>确认密码:</td> <td><input id="txtRePass" type="Password" class="txt01 easyui-validatebox" required="true" data-options="validType:‘length[4,8]‘" /></td> </tr> </table> |
第二步:为“确定”按钮绑定事件
<script type="text/javascript"> //为“确定”按钮绑定事件 $("#btnEp").click(function(){ //进行表单校验 var v = $("#editPasswordForm").form("validate");//对应表单中的所有输入框进行校验 if(v){//表单校验通过 //判断两次输入是否一致 var v1 = $("#txtNewPass").val(); var v2 = $("#txtRePass").val(); if(v1 == v2){ //输入一致,发送ajax请求,修改当前用户的密码 var url = "${pageContext.request.contextPath}/userAction_editPassword.action"; $.post(url,{"password":v1},function(data){ if(data == ‘1‘){ //修改密码成功 $.messager.alert("提示信息","密码修改成功!","info"); }else{ //修改失败 $.messager.alert("提示信息","密码修改失败!","warning"); } //关闭修改密码的窗口 $("#editPwdWindow").window("close"); }); }else{ //输入不一致,提示用户输入不一致 $.messager.alert("提示信息","两次输入密码不一致!","warning"); } } }); </script> |
第三步:在UserAction中提供editPassword方法,修改密码
/** * 修改当前登录用户密码 * @throws IOException */ public String editPassword() throws IOException{ User user = (User) ServletActionContext.getRequest().getSession().getAttribute("loginUser"); String password = model.getPassword();//新密码 password = MD5Utils.md5(password); String flag = "1"; try{ userService.editPassword(password,user.getId()); }catch (Exception e) { //修改密码失败 flag = "0"; } ServletActionContext.getResponse().setContentType("text/html;charset=UTF-8"); ServletActionContext.getResponse().getWriter().print(flag); return NONE; } |
第四步:在BaseDao中扩展一个通用的更新方法
/** * 通用更新方法 */ public void executeUpdate(String queryName, Object... objects) { Session session = this.getSession();// 从本地线程中获得session对象 // 使用命名查询语句获得一个查询对象 Query query = session.getNamedQuery(queryName); // 为HQL语句中的?赋值 int i = 0; for (Object arg : objects) { query.setParameter(i++, arg); } query.executeUpdate();// 执行更新 } |
第五步:在User.hbm.xml中定义一个HQL语句,用于修改密码
以上是关于BOS项目 第2天(BaseDaoBaseAction用户登录自定义strust登录拦截器)的主要内容,如果未能解决你的问题,请参考以下文章
BOS项目 第2天(BaseDaoBaseAction用户登录自定义strust登录拦截器)
BOS项目 第10天(activiti工作流第二天,流程变量组任务排他网关spring整合activiti项目中实现流程定义管理)
BOS项目 第6天(业务受理自动分单工作单快速录入datagrid行编辑)
BOS项目 第8天(权限管理添加角色管理添加用户管理添加shiro权限框架使用ecache缓存)
BOS项目 第9天(activiti工作流第一天,工作流概念工作流所需要的23张表eclipse安装流程设计插件流程api基本操作)