当前位置: 首页 > 编程日记 > 正文

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

BOS项目 第2

 

今天内容安排:

1、根据提供的pdm文件生成sql

2、持久层和表现层设计---BaseDaoBaseAction

3、实现用户登录功能

4jQuery EasyUI 消息提示控件

5jQuery 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. 基于baseDaoBaseAction实现用户登录

第一步:修改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

相关文章:

服务器 主动 推送 客户端浏览器 消息***

前言 通常情况下&#xff0c;无论是web浏览器还是移动app&#xff0c;我们与服务器之间的交互都是主动的&#xff0c;客户端向服务器端发出请求&#xff0c;然后服务器端返回数据给客户端&#xff0c;客户端浏览器再将信息呈现&#xff0c;客户端与服务端对应的模式是: 客户端请…

数据库表(字段类型、约束、截断表、修改表字段、重命名表)

字段类型&#xff1a; 在这里只列举一些常用的字段类型&#xff1a; 整数类型:int(Integer):普通大小的整数 小数类型&#xff1a; float(m,d)&#xff1a;单精度浮点数&#xff0c;m表示数字长度&#xff0c;d表示小数位数&#xff0c;例如float(5,2)最大值999.99double(m,d…

(转载)动态SLAM系统:VDO-SLAM!

动态SLAM系统&#xff1a;VDO-SLAM&#xff01;这篇博客是转载 计算机视觉life 公众号中的文章。这篇文章是对VDO-SLAM论文的全文翻译&#xff0c;是 &#xff01;&#xff01;真人工翻译&#xff01;&#xff01;不是机器翻译&#xff0c;我看了之后觉得挺好&#xff0c;所以分…

2021年中国工业互联网安全大赛核能行业赛道writeup之入门的黑客

附件题&#xff1a;入门的黑客 题目描述&#xff1a; 在某次工控攻防演练中&#xff0c;防守方使用蜜罐捕捉到了某黑客在入侵时留下的恶意程序样本&#xff0c;现在要对该黑客进行画像&#xff0c;需要从该恶意程序中分析出反连时的IP和端口信息&#xff0c;看看聪明的你能否能…

一种视觉惯性+激光传感器的SLAM系统

一种视觉惯性激光传感器的SLAM系统这篇博客论文摘要一些假设和标注系统总览VI 里程计扫描匹配&#xff08;scan matching&#xff09;优化提高系统鲁棒性的措施闭环检测和临近检测全局位姿图优化总结这篇博客 这篇论文“Robust High Accuracy Visual-Inertial-Laser SLAM Syste…

抽象类和接口的联系与区别

抽象类和接口联系与区别 关键字: 抽象类与接口的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制&#xff0c;正是由于这两种机制的存在&#xff0c;才赋予了Java强大的面向对象能力。 abstract class和interface之间在对于抽象类定义的支持方面具…

P1132 数字生成游戏

题目描述 小明完成了这样一个数字生成游戏&#xff0c;对于一个不包含00的数字ss来说&#xff0c;有以下33种生成新的数的规则&#xff1a; 将ss的任意两位对换生成新的数字&#xff0c;例如143143可以生成314,413,134314,413,134&#xff1b;将ss的任意一位删除生成新的数字&a…

MySQL02-升级

MySQL 版本号由三个数字和可选后缀组成&#xff0c;形式 mysql-x.y.z-suffix。比如 mysql-5.7.21 或者 mysql-5.7.34。 x(5)这位是大版本y(7)这位是小版本&#xff0c;大版本小版本组合成 5.7 就是一个发行版最后一位是bugfix release版本&#xff0c;从1逐渐增加&#xff0c;…

Kinect V1读取图像数据(For Windows)

Kinect V1读取图像数据&#xff08;For Windows&#xff09;这篇博客Kinect V1介绍数据读取的基本流程运行代码和注释结尾这篇博客 刚好有一台现成的Kinect V1相机&#xff0c;所以就拿过来学习一下它的数据读取方式和编程方法&#xff0c;毕竟它还能用于跑RGBD-SLAM。Kinect V…

1.IocDI和Spring

1.面向对象回顾和案例 面向对象程序设计&#xff1a;1 2 3 4 案例分析&#xff1a; 需求分析&#xff1a; 报表功能&#xff1a; 报表服务类&#xff0c;检索数据&#xff0c;并生成图标 报表生成器类&#xff0c;生成不同格式的报表文件&#xff0c;例如PDF格式、Html…

MySQL之模糊查询

先在MySQL数据库里创建一个表&#xff0c;并添加几条数据&#xff1a; create table student(id char(36) primary key,name varchar(8) not null,age int(3) default 0,mobile char(11),address varchar(150) ) insert into student values (9b4435ec-372c-456a-b287-e3c5aa…

rsync工具

rsync工具一、介绍1、可以实现 本地数据 《----------》 远程数据/本地数据 的传输2、两种通信方式&#xff08;man rsync&#xff09;&#xff08;1&#xff09;remote shell&#xff08;一个冒号&#xff1a;&#xff09;&#xff0c;通过sshd协议传输&#xff08;2&#xf…

2021年中国工业互联网安全大赛核能行业赛道writeup之日志分析

附件题&#xff1a;日志分析 题目描述&#xff1a; 核电站新来的运维小王粗心把一个办公网地址映射到外网&#xff0c;遭到大量攻击&#xff0c;你能从日志当中找到有效信息吗。 附件下载&#xff1a; 2021-10-12T15_37_51.61064600_00rizhifenxi.rar-网络攻防文档类资源-CSD…

【POJ1509】Glass Beads 【后缀自动机】

题意 给出一个字符串&#xff0c;求它的最小表示法。 分析 这个题当然可以用最小表示法做啦&#xff01;但是我是为了学后缀自动机鸭&#xff01; 我们把这个字符串长度乘二&#xff0c;然后建SAM&#xff0c;然后在SAM上每次跑最小的那个字母&#xff0c;找出长度为n的时候就停…

order by总结

先在MySQL数据库里建一个表&#xff0c;并添加几条数据&#xff1a; create table student(id char(36) primary key,name varchar(8) not null,age int(3) default 0,mobile char(11),address varchar(150) ) insert into student values (9b4435ec-372c-456a-b287-e3c5aa23…

Gazebo构建小车模型并通过ROS控制

Gazebo构建小车模型并通过ROS控制介绍编写车子的URDF文件编写控制小车移动的插件(与ROS交互)结尾介绍 突然想试试Gazebo这款仿真软件&#xff0c;因为它可以让你在任何时候都有机器人玩。但Gazebo的机制也比较复杂&#xff0c;所以还是先学习一下如何搭一个简单的小车&#xff…

【杂项】SVN服务器的本地搭建和使用

转载于:https://www.cnblogs.com/haizhibin1989/p/6939025.html

编译vim-8.2并配置jedi-vim插件

目录 一、背景 二、编译vim-8.2 三、配置jedi-vim插件 3.1、安装插件vundle 3.2、用vundle安装jedi-vim插件 一、背景 CentOS 7.9上已经安装了anaconda&#xff0c;python3.7的虚拟环境webenv。现在编译安装vim-8.2&#xff0c;使之支持python3&#xff08;yum装包是不支…

group by总结(还有having)

先在MySQL数据库里创建一个表&#xff0c;并添加几条数据用于测试&#xff1a; create table fruit(name varchar(4),address varchar(12),type_name varchar(6) )insert into fruit values (香蕉,广西,大香蕉); insert into fruit values (苹果,山东,红富士); insert into fr…

PHP数组基本的操作方法

1、数组操作的基本函数 数组的键和值&#xff1a;  array_values($arr);获得数组的值  array_keys($arr);获得数组的键名  array_flip($arr);数组中的值与键名互换&#xff08;如果有重复前面的会被后面的覆盖&#xff09;  in_array("apple",$arr);在数组中…

linux kafka进程挂了 自动重启

使用crontab&#xff0c;定时监控 kafka进程&#xff0c;发现挂了后重启。 shell脚本如下&#xff1a; #!/bin/sh source /etc/profile proc_dir"/data/kafka" # 程序目录 proc_name"kafka.Kafka" …

Towards Real-time Semantic RGB-D SLAM in Dynamic Environments(动态语义SLAM)

动态环境下的实时语义SLAM简介摘要系统流程实验结果总结简介 在ICRA 2021上看到这样一篇论文&#xff1a;Towards Real-time Semantic RGB-D SLAM in Dynamic Environments&#xff0c;发现它也是使用的语义网络基于深度图的多视图几何方法来去除图片中的动态对象的。这一方法和…

gpupdate /force 遇报错解决过程

windows server 2008 修改策略后&#xff0c;需要更新。在cmd中执行 gpupdate /force&#xff0c;遇到报错。报错内容为 The processing of Group Policy failed. Windows attempted to read the file \\<domain.name>\SysVol\<domain.name>\Policies\{xxxxxxxx-xx…

pytorch学习——torch.cat和torch.stack的区别

合并tensors torch.cat 沿着特定维数连接一系列张量。torch.stack 沿新维度连接一系列张量。 torch.cat 在给定维度中连接给定的 seq 个张量序列。 所有张量必须具有相同的形状&#xff08;连接维度除外&#xff09;或为空。 torch.cat(tensors, dim0, *, outNone) → Tens…

Docker将容器制作成镜像并提交到远程仓库

Docker将容器制作成镜像并提交到远程仓库 步骤如下 先在dockerhub上创建一个自己的用户https://hub.docker.com/。或者在阿里云也可以。 2. 然后先创建一个空的镜像名。 3. 在终端上登录。 4. 这里有一个容器ID为fe08a32503b1。想把它制作成镜像以备后期自己用。 5. 将容器制作…

关于子业之间相互取得元素或者方法

1.跳转是将页面name带过去 例子&#xff1a; url&#xff1a;"login.jsp?windowName"window.name; 传递参数到子页面 &#xff0c;使得子页面能够通过名字返回数据 2.获取跳转到页面 window.top.frames[0].frames["${param.windowName}"].document转载于:…

windows 2008 (非R2)使用批处理文件调整组策略过程记录

2021年12月8日&#xff0c;对windows server 2008 &#xff08;不是 windows server 2008 R2&#xff09; 调整组策略。其中有一部分&#xff0c;无法通过图形界面&#xff08;gpedit.msc&#xff09;进行&#xff0c;只能在cmd用命令行执行。执行时遇到如下报错。 猜想是由于中…

【Leetcode】 刷题之路1(python)

leetcode 刷题之路1&#xff08;python&#xff09; 看到有大佬总结了一些相关题目&#xff0c;想着先刷一类。 1.两数之和15.三数之和16.最接近的三数之和11.盛最多的水18.四数之和454.四数相加II 1. 两数之和给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你…

MySQL数据库中的内置函数

SQL函数分为单行函数和多行函数&#xff1a; 单行函数: 红色标注的为重点。 … … … …字符串函数: … … … … … … … … … … 1.length() 存储长度 … … … … … … … … … … 2.char_length() 字符个数 … … … … … … … … … … 3.concat()首尾相连 … ……

elasticsearch从入门到出门-01windows上安装使用

elasticsearch 1、安装JDK&#xff0c;至少1.8.0_73以上版本&#xff0c;java -version2、下载和解压缩Elasticsearch安装包&#xff0c;目录结构3、启动Elasticsearch&#xff1a;bin\elasticsearch.bat&#xff0c;es本身特点之一就是开箱即用&#xff0c;如果是中小型应…