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 οnclick="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 οnclick="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语句,用于修改密码

转载于:https://www.cnblogs.com/wujizun/p/6925912.html

BOS项目 第2天(BaseDao、BaseAction、用户登录、自定义strust登录拦截器)相关推荐

  1. 【struts2+hibernate+spring项目实战】用户登录校验(struts拦截器)

    一.概述 项目中所有页面均放入WEB-INF,所有页面安全性得到了很大程度的提高.但是当用户登录后长时间没有操作时,会造成Session数据的过期,如果此时获取Session中的数据,必定会引发WEB ...

  2. Spring Boot项目学习06之用户登陆模块与登录拦截器

    1.登陆功能基本思路 首先,在数据库中查询这条用户记录,如果不存在这条记录则表示身份验证失败,登录流程终止:如果存在这条记录,则表示身份验证成功,接下来则需要进行登录状态的存储和验证了,用户登录成功后 ...

  3. vue拦截器刷新登陆页面_Vue + Spring Boot 项目实战(六):前端路由与登录拦截器-Go语言中文社区...

    前言 这一篇主要讲前端路由与登录拦截器的实现.放在一起讲是因为我在开发登录拦截器时因为这个路由的问题遇到了很多坑,花费了很长时间,网上的解决方案都不怎么靠谱,综合了好几种办法才最终成功,其实关于这个部 ...

  4. SpringBoot项目使用JWT+拦截器实现token验证

    利用token进行用户身份验证 流程 客户端使用用户名和密码请求登录 服务端收到登录请求,验证用户名和密码 验证成功后,服务端会签发一个token,再把这个token返回给客户端 客户端收到token ...

  5. SpringBoot——使用拦截器拦截未登录用户

    前置知识SpringBoot配置拦截器基于HandlerInterceptor接口实现,关键三个方法 preHandle()执行目标之前 postHandle()执行目标之后 afterComplet ...

  6. BOS项目01_02_项目的相关概述、MySQL创建新用户并授权、数据库环境的配置、Mysql命令行

    系列文章目录 文章目录 系列文章目录 前言 一.项目的相关概述 二.数据库环境的配置--MySQL创建新用户并授权 前言 我们这里的BOS系统是指: 物流业务操作系统 一.项目的相关概述 1.1> ...

  7. 浙江理工大学信息学院本科生创新项目总结报告——简单的后台用户管理项目

    信息学院本科生创新项目总结报告 研究目的与意义 基于Spring Boot框架等技术实现一个简单的后台用户管理系统项目,具有良好的用户交互体验.良好的信息反馈能力.安全防护措施,包括用户登录.用户注册 ...

  8. JAVA中使用bos做视频上传_JAVA语言之搭建物流BOS项目骨架

    本文主要向大家介绍了JAVA语言之搭建物流BOS项目骨架,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 提供pom.xml 4.0.0 com.itheima bos-parent ...

  9. 听书项目开发过程及重难点总结(用户管理)

    文章目录 一.需求分析 二.前后端交互 1. 注册 **前端** **后端** 2.登录 前端 后端 三.项目开发重难点 1.编写一个Servlet 2.session和session会话机制 1)S ...

最新文章

  1. ionic4中实现时间线
  2. 简历写的好,就赢了90%的人了
  3. golang 调用库函数错误 cannot refer to unexported name
  4. es获取最大时间的记录_大屏幕大智慧,腕上私教+生理周期,荣耀手表ES评测
  5. ChartDirector Python创建建多层甘特图的代码
  6. opencv-api SIFT_create()
  7. UI设计为什么要使用Figma?
  8. Ajax封装2.0版
  9. 设计模式之禅——模板方法模式钩子方法
  10. Android反编译工具dex2jar的使用
  11. 2020年中国轴承套圈行业市场现状分析,国内市场格局十分分散「图」
  12. 文件夹如何改名,教你批量重命名文件夹名方法
  13. 微信们开放外链,互联网“圈地”成历史?
  14. grep正则表达式后面的单引号和双引号的区别?
  15. Simplest NodeJS server
  16. 短信验证码的新对手:本机号码校验
  17. 北大软微学院计算机金融方向考研,北大软微金服方向2016年考研经验贴---初试410分...
  18. 我是如何接单的! 全网最强的接单 避坑指南 都在这里!
  19. Aspose.Words 通过书签导出数据
  20. 美通社日历 | 会展及重要事件信息、企业财报发布,节假日备忘(3月15日—3月21日)...

热门文章

  1. 素数、最大公约数、最下公倍数、质因数分解
  2. c#技巧教程(连载)
  3. Python基础20-面向对象:静态、组合、继承与派生、多态、封装、反射、内置attr方法等
  4. php拍照从手机相册中选择,微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例...
  5. 白盒测试--基本路径测试法
  6. java 查询 代码_java使用es查询的示例代码
  7. Python:UTF-8编码转换成GBK编码
  8. wamp多站点访问设置
  9. 大叔也说并行和串行`性能提升N倍(N由操作系统位数和cpu核数决定)
  10. struts2 validate验证