pss_day6

原创 2015年11月19日 21:38:54

day6

一.zTree在项目中的运用

效果展示:

原理

zTree控件需要后台传输相应的json数据到前段,然后它自己解析并出现菜单树效果,所以我们要做的就是得到数据,变成json传输到前端

步骤:

1.创建菜单domian模型

public class Menu {
private Long id;
private String name;
private String url;
private String icon;
//自关联,单向多对一

private Menu parent;
private String target;
....补全get/set....
}

2.hibernate映射文件()、

<hibernate-mapping package="com.gqc.pss.domain">
    <class name="Menu" table="menu">
        <id name="id">
            <generator class="native" />
        </id>
        <property name="name" />
        <property name="url" />
        <property name="icon" />
<!--        //自关联,单向多对一(上级菜单) -->
<!--    private Menu parent; -->
        <many-to-one name="parent" column="parent_id"/>
    </class>
</hibernate-mapping>

3.在IMenuService中定义个查询方法,一个是查询当前用户可以使用的所有菜单。
注意这里一定要定在接口里面写出来,因为spring容器注入的是接口,不然只在实现类里面写,是不能调用此方法的

public List<Menu> findMenusByLogin(Employee employee) {
    String hql = "select distinct  m from Employee e " +
            "join e.roles r " +
            "join r.menus m " +
            "where e.id = ? ";
    return baseDao.findByHql(hql, employee.getId());
}

4.抽取main.jsp中的原左侧菜单栏到一个单独的left.jsp并引入相关插件注意地址和路径;

<link rel="stylesheet" href="/js/zTree/zTreeStyle/zTreeStyle.css" type="text/css">
<script type="text/javascript" src="/js/jquery.js"></script>
<script type="text/javascript" src="/js/zTree/jquery.ztree.core-3.4.js"></script>

5.查看文档,修改JavaScript代码

    $(document).ready(function(){
        $.get("left.action",  function(zNodes){
        $.fn.zTree.init($("#treeDemo"), setting, zNodes);
        zTree_Menu = $.fn.zTree.getZTreeObj("treeDemo");
        curMenu = zTree_Menu.getNodes()[0].children[0];
        zTree_Menu.selectNode(curMenu);
        var a = $("#" + zTree_Menu.getNodes()[0].tId + "_a");
        a.addClass("cur");
    });

6.web层定义一个leftAction

public class LeftAction extends BaseAction{
    private IMenuService menuService;
    private IEmployeeService employeeService;
    public void setEmployeeService(IEmployeeService employeeService) {
        this.employeeService = employeeService;
    }
    public void setMenuService(IMenuService menuService) {
        this.menuService = menuService;
    }
    @Override
    public String execute() throws Exception {
        Employee employee =  (Employee) ServletActionContext.getRequest().
                getSession().getAttribute(BaseAction.LOGIN_USER);
        employee = employeeService.findobjByName(employee.getName());
        List<Menu> menus = menuService.findMenusByLogin(employee);//找到菜单)
        put("map", menus);
        return JSON_RESULT;
    }
}

注意这里返回的结果视图名是JSON_RESULT,那是因为在BaseAction里定义了此常量

public static final String JSON_RESULT = "json_result";

那么在Struts2.xml中的结果视图是怎么样配置的呢?

<package name="default" namespace="/" extends="struts-default,json-default">
<result name="json_result" type="json">
    <param name="root">#map</param>
    <param name="excludeNullProperties">true</param>
</result>

注意这是全局配置,而且这里是用的是json插件来进行json数据的传递,从leftAction中可以看出
是将此用户所对应的菜单查出来并且放在值湛里面名为map的变量里面,那么思考为什么名称只能为map呢?
记住:还差最后一步,就是–排除null的属性不输出,因为有些为空的属性我们不需要输出,这也是此插件的好处,那么排除null该用如下配置:

@JSON(serialize=false)//配置此属性不输出
public Menu getParent() {
    return parent;
}

由于我们在查看用户的所有菜单时,是子菜单和主菜单一起查看,那么主菜单的parent=null,我们不需要输出此空属性,就如上图配置

最后配置如下调整页面

public boolean getIsParent() {
    return this.parent == null;
    }
public String getTarget() {
    return getIsParent() ? null : "main";
}

二.数据的迁移(表数据的导出为excel)

原理

步骤

1.在IBaseService中定义(通用)并在实现类(BaseServiceImpl)中实现

InputStream getIutputStream(String[] heads,List<String[]> lists) throws Exception;

@Override
public InputStream getIutputStream(String[] heads,List<String[]> lists) throws Exception {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    WritableWorkbook workbook = Workbook.createWorkbook(outputStream);
    WritableSheet sheet = workbook.createSheet("First Sheet", 0); 
    //输出标头
    for (int i = 0; i < heads.length; i++) {
        Label label = new Label(i, 0, heads[i]);
        sheet.addCell(label);
    }

    //输出内容
    for (int i = 0; i < lists.size(); i++) {//行数
        String[] strings = lists.get(i);

        for (int j = 0; j < strings.length; j++) {// 列=j
            // i + 1排除表头,//int c 行, int r 列, String content
            Label label = new Label(j, i + 1, strings[j]);
            sheet.addCell(label);
        }
    }
    workbook.write();
    workbook.close();
    return  new ByteArrayInputStream(outputStream
          .toByteArray());

}

2.向EmployeeAction中加入

public String download() throws Exception {
    //表头
    String[] heads = {"编号","姓名","邮箱","部门","年龄"};

    baseQuery.setPageSize(Integer.MAX_VALUE);
    PageList list = employeeService.findByQuery(baseQuery);
    System.out.println(list.getRows().size()+"打印的长度");
    List<Employee> employees = list.getRows();//要导出的数据
    List<String[]> lists = new ArrayList<String[]>();
    for (int i = 0; i < employees.size(); i++) {//列
        Employee employee = employees.get(i);
        String[] strings = new String[heads.length];//行
        strings[0] = employee.getId().toString();
        strings[1] = employee.getName();
        strings[2] = employee.getEmail();
        strings[3] = employee.getDepartment().getName();
        strings[4] = employee.getAge().toString();
        lists.add(strings);//这一句很重要(不然输出的只有表头),草。。。。。。。
    }
    inputStream = employeeService.getIutputStream(heads, lists);
    return "stream";
}

3.在Struts.xml中配置stream的结果视图

<result type="stream" name="stream">
    <param name="contentType">application/vnd.ms-excel</param>
    <param name="inputName">inputStream</param>
    <param name="contentDisposition">filename=${fileName}</param>
    <param name="bufferSize">4096</param>
</result>

4.结果展示

相关文章推荐

6PSS奇异值

  • 2012年03月01日 10:57
  • 2KB
  • 下载

corejava_day5_6_7.txt

  • 2017年10月17日 22:46
  • 25KB
  • 下载

沈阳集训day6 机房模拟赛 t1自动取款机 题解

自动取款机(256M,1s)【问题描述】小沈阳在小品里说过:“人生最痛苦的事情是人死了,钱还没花了”。 于是小宋(80 岁)决定要将所有的储蓄从 ATM 机中取出花光。 小宋忘记了她有多少存款 (银行...
  • NOIAu
  • NOIAu
  • 2017年06月06日 19:32
  • 197

嵌入式实习-day6-网络编程

  • 2017年11月20日 10:54
  • 1.14MB
  • 下载

每日微软面试题——day 6(打印所有对称子串)

题:1、如何判断一个字符串是对称的?如a,aa,aba。             2、如何利用2函数找出一个字符串中的所有对称子串? 分析:         且看第一个问题判断字符串对称...

day60vedio.part6.rar

  • 2012年06月01日 00:38
  • 16.23MB
  • 下载

前端小白Day6-仿照百度制作登录界面

仿照电脑端百度登录框制作一个登录界面。
  • Ivy_ZW
  • Ivy_ZW
  • 2017年04月21日 17:16
  • 155
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:pss_day6
举报原因:
原因补充:

(最多只允许输入30个字)