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

 

 

原文地址:https://www.cnblogs.com/wujizun/p/6925912.html