zoukankan      html  css  js  c++  java
  • mavenbos项目第二天(msyql操作、ssh配置集成、PowerDesinger、自定义登陆拦截器)

    项目第二天(完整流程)

    1.  第二天 重点内容

    搭建SSH 完成框架

    以用户管理为例

    • 用户登录
    • 用户退出
    • 修改密码

    2.  开发流程

    2.1.  业务分析

    2.2.  数据库设计

    MySQL : 新建 DataBase 、 新建用户 User 、进行授权

    Oracle : 新建用户 User 、 创建表空间 、 在表空间进行操作

    MySQL 操作步骤 :

    步骤: 新建数据库

    查看字符集 show variables like ‘%char%’;  

    clientconnectionresults 这三个字符集 和 安装mysql命令窗口相关

    database server system 这三个字符集服务器 (设置 utf8

    修改 my.ini 文件  [mysqld] 下面

    character-set-server=utf8 

    创建数据库使用默认字符集

    新建用户

    create user 用户名@localhost (本机)/ 用户名@%(远程) identified by 密码’ ;

    为账户授权

    2.3.  完成项目SSH 配置集成

    Spring applicationContext.xml 连接数据库 (整合Hibernate

    步骤:

    整合Hibernate ,配置SessionFactory

    事务管理

    引入外部属性文件,为了项目维护更加方便

    config.properties

    配置事务

    建立项目包结构

    cn.itcast.bos.domain  数据实体类

    cn.itcast.bos.dao  数据层

    cn.itcast.bos.service 业务逻辑层

    cn.itcast.bos.web 表现层

    2.4.  数据库建模工具 PD的使用

    安装12.5版本,进行破解

    PD 是最专业数据建模工具, 是 Sybase 公司一个 产品

    PD 提供四种模型文件

    PDM 物理数据模型,面向数据库表结构设计,直接生成SQL语句或者通过ODBC工具直接导入数据 (JDBC 类型 jdbc-odbc桥、 NativeAPIMiddleware 、 纯java驱动)

    CDM 概念数据模型,类似E-R图 主要数据模型分析

    OOM 面向对象模型,将表关系,表示类之间关系

    BPM 业务流程模型,业务流程图

    CDM PDMOOM 三者相互转换

    PDM 直接生成数据库文件,完成数据库建表

    课程: PDM设计使用

    2.5.  建立 user数据表

    /* 创建user数据表 */

    create table user (

    id varchar(32) primary key,

    username varchar(20),

    password varchar(32), /* md5加密密码 */

    salary double ,

    birthday date ,

    gender varchar(10),

    station varchar(40),

    telephone varchar(11),

    remark varchar(255)

    );

    /* 初始化一条记录  */

    insert into user(id,username,password) values('abcdefghijklmn','admin',md5('admin'));

    作业: 使用PowerDesigner 绘制 user 数据模型

    使用 Hibernate 开发

    第一条: 创建数据表,根据数据表 编写PO类和 hbm映射

    第二条: 面向对象设计 表关系,使用类动态 生成数据表

    使用 MyEclipse 反转引擎,生成

    步骤:

    1、 新建 Database 连接

    2、 新建web项目 temp

    添加myeclipse hibernate 能力

    3Hibernate 反转构建

    User.java 类 复制 src/main/java User.hbm.xml 复制 src/main/resources

    3.  编程实现 用户登录操作

    3.1.  设计 数据访问层 DAO

    ² 企业实际项目中,各层之间面向接口整合 ,好处将业务和实现解耦合,方便程序维护和扩展 ,程序中面向接口编程,在程序中看不到实现类,实现类都是通过Spring 配置

    ² 在企业开发各层内部,一定会存在重复可复用的代码 ,设计BaseXXX 类,是抽象类 ,将重复代码放入抽象类中, 自定义DAO 或者 Service 基础BaseDAO 或者 BaseService

    设计通用 DAO 组件,只编写 一个DAO 工具类完成 所有表 CURD

    需要依赖 反射和泛型 技术

    cn.itcast.bos.dao.impl 提供 GenericDAO 实现

    ² 使用Session操作 Hibernate

    ² 使用HibernateTemplate 操作 Hibernate

    public class GenericDAOImpl<T> extends HibernateDaoSupport implements GenericDAO<T> {

    … 

    }

    因为基础 HibernateDaoSupport DAO 注入SessionFactory 使用HibernateTemplate

    配置具体DAO  

    applicationContext.xml 分离

    <import resource="classpath:applicationContext-common.xml"/>

    <import resource="classpath:applicationContext-dao.xml"/>

    <import resource="classpath:applicationContext-service.xml"/>

    <import resource="classpath:applicationContext-action.xml"/>

    applicationContext-dao.xml 为每张表,配置一个DAO Bean

    <!-- 配置DAO  -->

    <!-- 为每个表 配置一个DAO -->

    <bean id="userDAO" class="cn.itcast.bos.dao.impl.GenericDAOImpl">

    <!-- 构造器注入 ,传入 实体类 完整类名  -->

    <constructor-arg index="0" type="java.lang.String" value="cn.itcast.bos.domain.user.User"></constructor-arg>

    <!-- 注入SessionFactory -->

    <property name="sessionFactory" ref="sessionFactory"></property>

    </bean>

    3.2.  完成用户登录功能

    3.2.1.  修改登陆页面

    login.jsp form 修改为 <s :form>

    好处: 使用 <s :form> 进行数据回显

    通常会将登陆功能,编写单独Action (与用户管理其他功能分离开 )

    好处: 便于进行权限控制

    账户: username

    密码: password

    验证码 checkcode

    点击 提交 链接,提交form表单

    3.2.2.  编写服务器程序

    Web

    public abstract class BaseAction extends ActionSupport {

    }

    public class LoginAction extends BaseAction implements ModelDriven<User> {}

    将可以复用代码 抽取 BaseAction

    Service

    public abstract class BaseService {

    }

    public interface UserService {

    }

    public class UserServiceImpl extends BaseService implements UserService {}

    BaseService 实现代码复用 UserService 接口和Web层整合UserServiceImpl 业务实现类

    ================ 整合

    DAO 注入 BaseService

    Service 注入 BaseAction  

    业务层实现登陆, 需要根据用户名和密码查询 (条件查询

    <!-- 命名查询 -->

        <query name="User.login">

         <![CDATA[from User where username = ? and password = ?]]>

        </query>

    在业务层调用 名称查询时,别忘记对密码 md5 加密

    统一配置

    struts.xml

    <!-- 登陆功能 -->

    <action name="login" class="loginAction">

    <result name="input">/login.jsp</result>

    <result type="redirect">/index.jsp</result>

    </action>

    applicationContext-action.xml

    <!-- 配置Action -->

    <bean id="loginAction" 

    class="cn.itcast.bos.web.action.user.LoginAction" scope="prototype"/>

    applicationContext-service.xml

    <!-- 配置Service -->

    <bean id="userService" 

    class="cn.itcast.bos.service.impl.user.UserServiceImpl" />

    使用注解注入applicationContext-common.xml

    <!-- 使用注解注入对象 -->

    <context:annotation-config />

    =====================================================================

    4.  登陆功能主页完善和系统退出

    4.1.  主页信息显示完善

    4.1.1.  主页面 右上方,登陆用户显示

    /page_common_index.action 对应 /WEB-INF/pages/common/index.jsp

    [<strong>${user.username }</strong>],欢迎你!您使用[<strong>${pageContext.request.remoteAddr }</strong>]IP登录!

    4.1.2.  主页面右下方,弹出窗口提示

    使用 EasyUI 提供 messager控件,制作提示框架效果

    $.messager.show 右下角提示框

    $.messager.alert 弹出警告框

    $.messager.confirm 确认框

    // 1 alert

    $.messager.alert("标题","内容","info");

    // 2 confirm

    $.messager.confirm('标题','确认删除吗?',function(isConfirm){

    if(isConfirm){

    alert("执行删除");

    }else{

    alert("取消...");

    }

    });

    制作右下角提示窗口

    // 3show

    $.messager.show({

    title : '标题',

    msg : '<a href="#">传智播客</a>',

    timeout : 5000 , // 5秒后自动消失

    });

    4.2.  系统退出

    // 退出登录

    function logoutFun() {

    // 询问 用户是否确认退出

    $.messager.confirm("确认窗口","你确定退出系统吗?", function(isConfirm){

    if(isConfirm){

    // 确认退出

    location.href = "${pageContext.request.contextPath}/invalidate.jsp";

    }

    });

    }

    用户确认退出,直接跳转 invalidate.jsp  

    invalidate.jsp 退出操作,销毁当前用户对应的Session

    <%

    // 清除用户Session

    session.invalidate();

    // 重定向 login.jsp

    response.sendRedirect(request.getContextPath()+"/login.jsp");

    %>

    5.  编写自定义拦截器,控制页面访问

    自定义拦截器 LoginInterceptor 实现,如果用户未登陆,阻止访问 WEB-INF 下所有页面和 除登陆之外其它 Action  

    步骤

    1、 编写 拦截器类,实现 Interceptor 接口

    public class LoginInterceptor extends AbstractInterceptor {

    2、 实现intercept 方法,判断当前用户是否登陆

    User user = (User) ServletActionContext.getRequest().getSession().getAttribute("user");

    if (user == null) {

    // 没有登陆

    return "login"; // 登陆页面

    } else {

    // 已经登陆

    return invocation.invoke();

    }

    3、 注册拦截器,配置结果页面

    <!-- 注册拦截器  -->

    <interceptors>

    <interceptor name="login" class="cn.itcast.bos.web.interceptor.LoginInterceptor"></interceptor>

    <!-- 定义新的拦截器栈  -->

    <interceptor-stack name="loginStack">

    <interceptor-ref name="defaultStack"></interceptor-ref>

    <interceptor-ref name="login"></interceptor-ref>

    </interceptor-stack>

    </interceptors>

    将拦截器 设置package默认拦截器

    <!-- 设置默认拦截器栈 -->

    <default-interceptor-ref name="loginStack"></default-interceptor-ref>

    配置全局结果集

    <!-- 配置全局结果集 -->

    <global-results>

    <result name="login">/login.jsp</result>

    </global-results>

    4、 使用拦截器传递错误信息

    ActionSupport action = (ActionSupport) invocation.getAction();

    action.addActionError("你还未登陆或者长时间未使用,请重新登陆!");

    问题: 使用iframe嵌套,主页嵌套主页 情况

    可以,在未登陆,跳转提示信息页面,用户点击链接,跳到登陆 (整个浏览器跳转) 或者

    在登陆form 添加 target=”_top” 

    6.  密码修改

    6.1.  弹出遮罩窗口

    使用 EasyUI window 控件制作 (dialog 是对window扩展,提供 工具栏)

    使用 class=”easyui-window” 将任意div 变为窗口 ,设置属性

    collapsible

    boolean

    定义是否显示折叠按钮。

    true

    minimizable

    boolean

    定义是否显示最小化按钮。

    true

    maximizable

    boolean

    定义是否显示最大化按钮。

    true

    closable

    boolean

    定义是否显示关闭按钮。

    true

    控制window的 按钮,默认四个按钮都是显示

    通过 modal 属性 设置窗口遮罩效果

    打开和关闭窗口。

    $('#win').window('open'); // open a window

    $('#win').window('close'); // close a window

    示例代码:

    <!-- 通过 easyui class 将任意 div 变为 窗口 -->

    <!-- 为窗口 设置标题属性 和 宽高  -->

    <div id="mywindow" class="easyui-window" data-options="title:'自定义窗口',maximizable:false,minimizable:false,modal:true,closed:true" 

    style="200px;height: 150px">传智播客</div>

    <input type="button" value="打开窗口" 

    onclick="$('#mywindow').window('open');"/>

    6.2.  修改密码窗口,进行form校验

    点击修改密码 $('#editPwdWindow').window('open'); 弹出窗口

    输入密码,点击确定 执行js函数 ,对密码进行校验

    // 获得新密码和确认密码的输入内容

    var newPass = $("#txtNewPass").val(); // document.getElementById("txtNewPass").value;

    var rePass = $("#txtRePass").val();

    // 进行校验

    // 新密码是否为空

    if($.trim(newPass)==""){ // 也可以写为 jQuery.trim

    // 新密码输入为空

    $.messager.alert('警告','新密码不能为空或者空白字符!','warning');

    return ;

    }

    // 两次密码是否一致

    if($.trim(newPass) != $.trim(rePass)){

    $.messager.alert('警告','两次密码输入不一致!','warning');

    return ;

    }

    6.3.  Ajax实现密码修改功能

    1、 发起Ajax请求

    // 通过 Ajax 将新密码发送到服务器

    $.post("${pageContext.request.contextPath}/user_editpassword.action", {password: newPass}, function(data){

    });

    2、 编写服务器,完成密码修改功能

    UserAction

    注入 UserService  

    public class UserAction extends BaseAction implements ModelDriven<User> {}

    // 如果修改用户某个属性,先查询,再修改

    User exist = userDAO.findById(user.getId()); // 持久态

    exist.setPassword(MD5Utils.md5(user.getPassword()));

    3、 返回json 格式

    对象 {key:value, key:value}

    数组 [{},{}]

    结果数据转换为json 推荐

    ² flexjson 框架

    ² struts2 自带 json plugin

    使用 struts2 自带json插件

    提供一个新的package json-default , 提供新 result-type json

    插件基于值栈返回的

    // 调用业务层

    try {

    userService.editPassword(user);

    // 修改成功

    Map<String, Object> map = new HashMap<String, Object>();

    map.put("result", "success");

    map.put("msg", "修改密码成功");

    ActionContext.getContext().put("map", map);

    } catch (Exception e) {

    // 修改失败

    Map<String, Object> map = new HashMap<String, Object>();

    map.put("result", "failure");

    map.put("msg", "修改密码失败," + e.getMessage());

    ActionContext.getContext().put("map", map);

    }

    配置 struts.xml  

    配置包 <package name="needlogin" extends="json-default"> 

    配置result

    <!-- 用户管理 -->

    <action name="user_*" class="userAction" method="{1}">

    <!-- 修改密码 -->

    <result name="editpasswordSUCCESS" type="json">

    <!-- 配置root参数,指定将值栈哪个数据返回  -->

    <param name="root">map</param>

    </result>

    </action>

    配置applicationContext-action.xml

    <bean id="userAction" 

    class="cn.itcast.bos.web.action.user.UserAction" scope="prototype" />

    4、使用 firebug调试

    控制台、 网络、脚本 三个面板 启用

    applicationContext-common.xml 配置事务管理

    editPassword 方法添加事务

    <tx:method name="*" propagation="REQUIRED" isolation="DEFAULT"/> 

    5、 编写回调函数

    if(data.result == "success"){

    $.messager.alert("信息", data.msg, "info");

    }else{

    $.messager.alert("信息", data.msg, "info");

    }

    // 窗口关闭

    $("#editPwdWindow").window('close');

    =====================================================================

  • 相关阅读:
    DataType--数值类型
    Scala中List(Map1,Map2,Map3 ....) 转成一个Map
    Scala中集合类型与java中集合类型转换
    oracle查询数据库最大连接数等信息
    kafka_2.11-0.10.2.1中的auto.offset.reset
    IOS设备信息与机型对照表
    shell 后台执行脚本
    Spark的操作列表
    hive表支持中文设置
    编译Spark2.1.2源码
  • 原文地址:https://www.cnblogs.com/wujizun/p/6915210.html
Copyright © 2011-2022 走看看