zoukankan      html  css  js  c++  java
  • 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语句,用于修改密码

     

     

  • 相关阅读:
    知识:CSS 词汇表(中英对照)_CSS Vocabulary
    js基础学习笔记(三)
    js基础学习笔记(二)
    js基础学习笔记(一)
    自己写的一个分页控件类(WinForm)
    JS判断浏览器是否支持某一个CSS3属性
    JavaScript用JQuery呼叫Server端方法
    ASP.NET MVC中的Json Binding和Validate
    ASP.NET Web Forms的改进
    8 种提升ASP.NET Web API性能的方法
  • 原文地址:https://www.cnblogs.com/wujizun/p/6925912.html
Copyright © 2011-2022 走看看