SpringMVC +mybatis+spring 结合easyui用法及常见问题总结

1.FormatString的用法.

2.用postAjaxFillGrid实现dataGrid 把form表单转换成一个map对象传入后台实现条件查询.

Js代码:

var oPage = {

    pageIndex: 1,

    pageSize: 20

};

   postAjaxFillGrid(‘#FormID‘,‘${contextPath}/discountController/selectDiscount‘,‘#DataGridId‘, oPage);

 

参数说明: formID为查询条件的formId属性值,DataGridId为实现datagrid的Id属性值.opage为设置显示多少条.

 

 

Java代码:

@ResponseBody

@RequestMapping(value = "/selectDiscount", method = RequestMethod.POST)

public DataGrid selectDiscount(@RequestBody ConditionEx condition){

        Page<Discount> discountPage=discountService.selectDiscountPage(condition.getCondition(),

                Integer.valueOf(condition.getPage().get("pageIndex").toString())-1,

                Integer.valueOf(condition.getPage().get("pageSize").toString()));

        return new DataGrid(discountPage);

  }

参数说明:

method = RequestMethod.POST 设置为Post 必须设置

@RequestBody ConditionEx condition @RequestBody为前台传过来的json字符串绑定到condition对象或者集合上.所以我们得到了数据

解析postAjaxFillGrid

function postAjaxFillGrid(formId,url,gridId){

var condition = $.serializeObject(formId);//通过formId把里面的数据转换成json对象

    jQuery.ajax({

        type: ‘POST‘,

        contentType: ‘application/json‘,

        url: url,

        data: jQuery.toJSON({condition: condition, page: oPage}),//json对象转换成json字符串

        dataType: ‘json‘,//按照json格式传入后台

        success: function (data) {

            $(gridId).datagrid(‘loadData‘, data);

        },

        error: function (data) {

            console.error("读取数据失败");

        }

    });

}

 

3.把form表单转换成json对象.

$.serializeObject = function(form) {

    var o = {};

    $.each($(form).serializeArray(), function(index) {

        if (o[this[‘name‘]]) {

            o[this[‘name‘]] = o[this[‘name‘]] + "," + this[‘value‘];

        } else {

            o[this[‘name‘]] = this[‘value‘];

        }

    });

    return o;

};

4.解析doPagination

DoPagination 为easyui默认分页事件.调出可手动更改其方法.

5.excel报表导出实现

Js代码:

function dataExport() {

            var condition = $.serializeString(‘#searchForm‘);//把form表单数据转换成字符串,url样式

            var url=‘${contextPath}/settlementController/exportSettlementReport‘+condition;

            $(‘#exportForm‘).attr(‘action‘,url);//替换form表单的action属性值

            $(‘#exportForm‘).submit();

        }

 

$.serializeString = function(form) {

    var o=‘‘;

    var a = $(form).serializeArray();

    var index=0;

    $.each(a, function() {

        if ($.trim(this.value) != ‘‘) {

            if(index == 0){

                o=o+‘?‘+this.name+‘=‘+this.value

            }else{

                o=o+‘&&‘+this.name+‘=‘+this.value

            }

            index++;

        }

        else{

            if(index == 0){

                o=o+‘?‘+this.name+‘=‘+‘‘

            }else{

                o=o+‘&&‘+this.name+‘=‘+‘‘

            }

            index++;

        }

    });

    return o;

};

Java代码:

@ResponseBody

    @RequestMapping(value = "/exportSettlementReport", method = RequestMethod.POST)

    public ModelAndView exportSettlementReport(@RequestParam Map<String ,Object> conditionx) {

        List<Settlement> listResult=settlementService.selectDailySettlement(conditionx);

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

        model.put("data",listResult);

        String organName=organServiceI.selectOrganByCode(listResult.get(0).getSubCode());

        model.put("itemsName",organName);

 

       SettlementExcelView excelView = new SettlementExcelView();

        return new ModelAndView(excelView,model);

}

 

 

import bjnme.Lng.ibms.dto.Settlement;

import bjnme.Lng.ibms.utils.AbstractPOIExcelView;//引用类

import org.apache.poi.ss.usermodel.*;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.FileInputStream;

import java.util.List;

import java.util.Map;

 

public class SettlementExcelView extends AbstractPOIExcelView {

    @Override

    protected Workbook createWorkbook() throws Exception {

        String path = this.getClass().getClassLoader().getResource("/").getPath();

 

//        Biff8EncryptionKey.setCurrentUserPassword("123456");

        Workbook workbook = new XSSFWorkbook(new FileInputStream(path + "excels/settlement.xlsx"));

        return workbook;

    }

 

    @Override

    protected void buildExcelDocument(Map<String, Object> model,

                                      Workbook workbook, HttpServletRequest request, HttpServletResponse response)

            throws Exception {

 

 

        Sheet sheet = workbook.getSheet("总公司日结表");

 

        CellStyle style = workbook.createCellStyle();

        style.setBorderBottom(CellStyle.BORDER_THIN);

        style.setBottomBorderColor(IndexedColors.BLACK.getIndex());

        style.setBorderLeft(CellStyle.BORDER_THIN);

        style.setLeftBorderColor(IndexedColors.BLACK.getIndex());

        style.setBorderRight(CellStyle.BORDER_THIN);

        style.setRightBorderColor(IndexedColors.BLACK.getIndex());

        style.setBorderTop(CellStyle.BORDER_THIN);

        style.setTopBorderColor(IndexedColors.BLACK.getIndex());

        Font font = workbook.createFont();

        font.setFontName("宋体");

        font.setFontHeightInPoints((short) 9);

        style.setFont(font);

        style.setLocked(true);

 

        List<Settlement> listResult = (List<Settlement>) model.get("data");

        Row row = sheet.getRow(1);

        row.getCell(0).setCellValue("单位:"+(String) model.get("itemsName"));

        String time = String.format("时间:%1s-%2s",listResult.get(0).getStartTime(),listResult.get(0).getEndTime());

        row.getCell(8).setCellValue(time);

        int index = 5;//设置从第几行开始填充

 

        for (Settlement settlement : listResult) {

             row =  sheet.createRow(index);

//设置一共要填充多少列

            for (int i = 0; i < 19; i++) {

                row.createCell(i).setCellStyle(style);

            }

            //为每一列赋值

            row.getCell(0).setCellValue(settlement.getId());

            row.getCell(1).setCellValue(settlement.getSubCode());

            row.getCell(2).setCellValue(settlement.getCardTypeCode());

 

            row.getCell(3).setCellValue(settlement.getCardNo());

            row.getCell(4).setCellValue(settlement.getUnit());

            row.getCell(5).setCellValue(settlement.getLastBalance());

            row.getCell(6).setCellValue(settlement.getLocalTotal());

 

 

            row.getCell(7).setCellValue(settlement.getTotalRecharge());

            row.getCell(8).setCellValue(settlement.getTotalPromotion());

            row.getCell(9).setCellValue(settlement.getSumGasMakeUp());

            row.getCell(10).setCellValue(settlement.getTotalBackDiff());

 

 

            row.getCell(11).setCellValue(settlement.getRemoteRecharge());

            row.getCell(12).setCellValue(settlement.getTotal());

            row.getCell(13).setCellValue(settlement.getTotalTrade());

            row.getCell(14).setCellValue(settlement.getRemoteTrade());

 

            row.getCell(15).setCellValue(settlement.getRefund());

            row.getCell(16).setCellValue(settlement.getCalcBalance());

            row.getCell(17).setCellValue(settlement.getActualBalance());

            row.getCell(18).setCellValue(settlement.getDiffBalance());

 

            index++;

        }

        String filename = "总公司日结表.xlsx";//设置下载时客户端Excel的名称

        if (request.getHeader("user-agent").contains("MSIE")) {

            filename = java.net.URLEncoder.encode(filename, "utf-8");

        } else {

            filename = new String(filename.getBytes("utf-8"), "iso-8859-1");

        }

        response.setHeader("Content-disposition", "attachment;filename=" + filename);

 

    }

参数说明:

@RequestParam用来获得静态的URL请求入参     spring注解时action里用到。就是把这个url参数封装到map集合里面.

6. easyUI_动态改变datagrid的url值

$(‘#tt‘).datagrid({  

url:‘/demo/user/getUsers‘,  

queryParams:{  

id:‘001‘,  

state:‘ok‘  

}  

});

7. easyui dataGrid 动态添加列.

Js代码:

<script>
    $(function () {

$.getJSON(‘${pageContext.request.contextPath}/resources/json/datagrid_data.json‘,function(result){
            var
columns=new Array();
            $.each(result.headers[0],
function(i, field){
               
var column={};
               
column["title"]=i;
               
column["field"]=field;
               
column["width"]=50;
               
columns.push(column);//当需要formatter的时候自己添加就可以了,原理就是拼接字符串.
            });
           
$(‘#tt‘).datagrid({
               
title:‘ XXX公司价差补差分配表‘,
               
height:500,
               
singleSelect:true,
               
url:‘‘,
               
frozenColumns :[[
                   
{field:‘name‘,title:‘项目‘,width:80,sortable:true,align:‘center‘},
                   
{field:‘count‘,title:‘合计‘,width:150,sortable:true}
               
]],columns : [
                   
columns
               
],
               
rownumbers:true}).datagrid(‘loadData‘,result.bodys);
        });
    })
</script>
<div title="XXX公司价差补差分配表"
fit="true" border="false" style="height:
94%;">
<table id="tt"  ></table>
</div>

Json代码:

json 代码格式.我这不用分页 也就没有total

{"headers":[
    {"一月份":"Jan","二月份":"Feb"}
],"bodys":[
    {"name":"LNG","count":"50000","Jan":"20000","Feb":"30000"}
]
}

8.easyui子页面增加tab的实现方法

//dataGrid行双击时间,这个增加tab的例子是建立在行双击的基础上面的

onDblClickRow:function(rowIndex,
rowData){

addSubPage(“tab的名称”,‘${contextPath}/saleAnalysisController/showSaleAnalysis12‘,rowData.subCode)

            }

 

//增加tab所需的方法

function
addSubPage(title,url,subCode){

        var jq = top.jQuery; //取得整个父页面对象

 

        var content=‘<iframe
scrolling="auto" frameborder="0"  src="‘+url+‘?subCode=‘+subCode+‘"
style="width:100%;height:100%;"></iframe>‘;

       
jq("#index_tabs").tabs(‘add‘,{

            title:title,

            content:content,

            closable:true

        });

 

}

 

9.模块树形导航的制作

类似这样的

 

<script
type="text/javascript">

 

    function initMenus() {

        <c:forEach items="${l2Menus}" var="parentMenu">

 

        var tr = $("#tree" +
${parentMenu.resourceId});

        tr.tree({

            url:
‘${pageContext.request.contextPath}/resourceController/getResourceTree?l2Menu=‘
+ ${parentMenu.resourceId},

            idField: ‘id‘,

            parentField: ‘pid‘,

            textField: ‘text‘,

            onClick: function (node) {

 

                if (node.attributes &&
node.attributes.url) {

                    var url;

                    var iframe;

                    if (node.attributes.url.indexOf(‘/‘)
== 0) {

                        url =
‘${pageContext.request.contextPath}‘ + node.attributes.url;

                    } else {

                        url =
node.attributes.url;

                    }

                    //iframe = ‘<iframe
src="‘ + url + ‘" frameborder="0"
style="border:0;width:100%;height:98%;" sandbox></iframe>‘;

                    iframe = ‘<iframe
src="‘ + url + ‘" frameborder="0"
style="border:0;width:100%;height:98%;"></iframe>‘;

                    var t = $(‘#index_tabs‘);

                    var opts = {

                        title: node.text,

                        closable: true,

                        iconCls: node.iconCls,

                        content: iframe,

                        border: false

                    };

                    if (t.tabs(‘exists‘,
opts.title)) {

                        t.tabs(‘select‘,
opts.title);

                    } else {

                        t.tabs(‘add‘, opts);

                    }

                }

            }

 

        });

        </c:forEach>

 

    }

 

    $(function () {

        initMenus();

    });

 

</script>

<div
id="divMenus" class="easyui-accordion"
data-options="fit:true,border:false">

    <c:forEach items="${l2Menus}"
var="parentMenu">

        <div
title="${parentMenu.resourceName}" data-options="iconCls:‘icon
icon-table-m‘" class="nav_title">

            <ul
id="tree${parentMenu.resourceId}"></ul>

        </div>

    </c:forEach>

</div>

 

 

粉色部分其中${l2Menus}为在登录成功后查出来的综合管理系统下面的1级菜单.jstl标签遍历l2Menus这个集合,建立所有分类.每个分类里里面放一个ul,为了后面添加tree(树形菜单)

 

棕色即为tree的具体构建,此时的url查出来的是这个资源下面的资源.形成树.

10.datagrid合并单元格

Js代码:

$(function(){

         var
nullData=‘{"rows":[{"code":"
一班","name":"张三","age":"21"},{"code":"一班","name":"李四","age":"22"}]}‘;

          var json=eval(‘(‘ + nullData + ‘)‘);

         $(‘#hebing‘).datagrid({

                   height:300,

                   width:500,

                   singleSelect:true,

        fitColumns:true,

                   data:json,

                   columns:[[

                            {field:‘code‘,title:‘班级‘,width:100},

                            {field:‘name‘,title:‘姓名‘,width:100},

                            {title:‘年纪‘,field:‘age‘,width:100}

                   ]],

                   onLoadSuccess:function(data){

                            $(‘#hebing‘).datagrid(‘mergeCells‘,{

                                               index:0,

                                               field:‘code‘,

                                               rowspan:2

                                     })     

                   }

                   });

         });

标红部分为主要实现方法,调用其方法.index表示索引从第几行开始
field
找到索引行的列  ,rowspan表示跨2行合并,也可以用colspan实现跨两列实现.

 

11.datagrid扩展数据行鼠标悬停离开事件

可用于展示某列详情使用

打开jquery.easyui.min.js 文件,根据datagrid-row-over关键字找到关键行

此处扩展onMouseOutRow事件 ,红框内为要添加的代码.

 

其中_52c和_53d 根据easyui不同版本  参数会有不同. 根据红框上面数据改变.

 

代码为:     

  //此处为添加的鼠标悬停事件

var
row=opts.finder.getRow(_52c,_53d);

opts.onMouseOutRow.call(_52c,e,_53d,row);

  //此处结束

 

此处扩展onMouseOverRow事件 ,红框内为要添加的代码.

同上

 

 

12.mybatis里面如何用LIKE模糊查询

有两种方法,建议用第一种

一,

<if
test="param1.cardNo!=‘‘">

and CARD_NO LIKE CONCAT(CONCAT(‘%‘,
#{param1.cardNo, jdbcType=VARCHAR}),‘%‘)

</if>

二,

<if test="param1.userName!=‘‘">

USER_NAME like
‘%${param1.userName}%‘

</if>

下面我们看看# 和 $ 区别,为什么要用第一种

  1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
      
    2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id,  如果传入的值是id,则解析成的sql为order by id.
      
    3. #方式能够很大程度防止sql注入。
      
    4.$方式无法防止Sql注入。

    5.$方式一般用于传入数据库对象,例如传入表名.
      
    6.一般能用#的就别用$.

    MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

    字符串替换
    默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:
    ORDER BY ${columnName}
    这里MyBatis不会修改或转义字符串。
    重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

所以在注重安全的情况下 我们用第一种,防止sql注入.

时间: 2024-11-05 20:45:02

SpringMVC +mybatis+spring 结合easyui用法及常见问题总结的相关文章

springMVC+MyBatis+Spring 整合(3)

spring mvc 与mybatis 的整合. 加入配置文件: spring-mybaits.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xm

springMVC+MyBatis+Spring 整合(4) ---解决Spring MVC 对AOP不起作用的问题

解决Spring MVC 对AOP不起作用的问题 分类: SpringMVC3x+Spring3x+MyBatis3x myibaits spring J2EE2013-11-21 11:22 640人阅读 评论(1) 收藏 举报 用的是 SSM3的框架 Spring MVC 3.1 + Spring 3.1 + Mybatis3.1第一种情况:Spring MVC 和 Spring 整合的时候,SpringMVC的springmvc.xml文件中 配置扫描包,不要包含 service的注解,S

2015/5/3~springMVC+mybatis+spring整合

一.准备工作 1.概述 springMVC+mybatis+spring+MySQL+log4j+maven 2.新建maven项目,现在web-app模版 新建项目后,可能个别目录会丢失,需要手动添加,整体目录结构如下所示: 3.通过maven管理依赖,仓库地址如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instan

springmvc mybatis spring bootstrap html5

获取[下载地址]   QQ: 313596790   [免费支持更新]支持三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体[新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统]A 代码生成器(开发利器);      增删改查的处理类,service层,mybatis的xml,SQL( mysql   和oracle)脚本,   jsp页面 都生成   就不用写搬砖的代码了,生成的放到项目里,可以直接运行B 阿里巴巴数据库连接池druid

springmvc+mybatis+spring 整合源码项目

A集成代码生成器 [正反双向(单表.主表.明细表.树形表,开发利器)+快速构建表单; freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块B 集成阿里巴巴数据库连接池druid;  数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都有明显的优势C 集成安全权限框架shiro ;  Shiro 是一个用 Java 语言实现的框架,通过一个简单易用的 API 提供身份验证和授权,更安全,更可靠D

SSM springmvc+mybatis+spring 整合 bootstrap

获取[下载地址]   [免费支持更新]三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体[新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统] A集成代码生成器 [正反双向(单表.主表.明细表.树形表,开发利器)+快速构建表单;freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块B 集成阿里巴巴数据库连接池druid;  数据库连接池  阿里巴巴的 druid.Drui

springmvc+mybatis+spring 整合 bootstrap

获取[下载地址]   [免费支持更新]三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体[新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统] A集成代码生成器 [正反双向(单表.主表.明细表.树形表,开发利器)+快速构建表单;freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块B 集成阿里巴巴数据库连接池druid;  数据库连接池  阿里巴巴的 druid.Drui

springmvc+mybatis+spring 整合 bootstrap html5 mysql oracle SSM框架源码 SSH maven

获取[下载地址]   QQ: 313596790   [免费支持更新]支持三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体[新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统]A 代码生成器(开发利器);      增删改查的处理类,service层,mybatis的xml,SQL( mysql   和oracle)脚本,   jsp页面 都生成   就不用写搬砖的代码了,生成的放到项目里,可以直接运行B 阿里巴巴数据库连接池druid

springMVC+mybatis+spring整合案例

1.web.xml a:配置spring监听,使web容器在启动时加载spring的applicationContext.xml <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> b:配置contextConfigLocation指定applicationContext的位置,同时可以修改其