@RequestMapping详解及解决中文乱码???

乱码解决

最近接口对接,ajax请求rest接口,发现返回的中文数据全是???,如下图所示:

enter description here

后台控制台打印出来的数据却没有问题,那就有可能是传输过程中编码的问题
@RequestMapping添加produces="application/json;charset=utf-8"解决

@RequestMapping(value = "/queryAll", method = { RequestMethod.POST }, produces="application/json;charset=utf-8")

@RequestMapping参数

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

RequestMapping注解有六个属性,下面我们把她分成三类进行说明(下面有相应示例)。

  1. value, method;
    value: 指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);
    method: 指定请求的method类型, GET、POST、PUT、DELETE等;

  2. consumes,produces
    consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
    produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

  3. params,headers
    params: 指定request中必须包含某些参数值是,才让该方法处理。
    headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。

ecplise导出maven工程依赖的jar包

ecplise导出maven工程依赖的jar包

最近SpringMVC项目中想要集成Swagger2插件,网上一搜资料大部分都是maven工程,直接配置POM.xml,添加如下配置

<dependency> 
    <groupid>io.springfox</groupid> 
    springfox-swagger2</artifactid> 
    <version>2.4.0</version> 
    </dependency> 
    <dependency> 
    <groupid>io.springfox</groupid> 
    springfox-swagger-ui</artifactid> 
    <version>2.4.0</version> 
</dependency>

无法知道都依赖哪些jar包,所以就尝试通过建立一个maven工程把需要的jar包下载下来后引入SpringMVC项目中,具体操作如下:
项目名称上右键点击,run as->Maven build...

enter description here

在打开的页面中,如图输入“dependency:copy-dependencies”,后点击“Run”即可

enter description here

在当前项目的目录的“targed/dependency”下就可以看见。

enter description here

vue中v-for与v-if的结合使用

项目中需要封装一个steps步骤条,使用v-for与v-if结合来动态控制应该显示的阶段,mark一下便于以后查找记忆

<template>
  <el-steps :active="activeValue" align-center>
    <el-step  v-for="item in caseProcess" v-if="item.key < activeValue"  :key="item.key" :title="stepsName+item.key" :description="item.value"></el-step>
  </el-steps>
</template>  

export default {
    name: "buildTable",
    directives: {
    waves
    },
    data() {
        return {
          activeValue: undefined,
          stepsName: '阶段',
        }
    }
}

值得注意的是v-for使用的时候一定要添加:key='item.key',否则会报异常warning,component lists rendered with v-for should have explicit keys.

vue中图片的引入

最近项目转vue的怀抱,踩各种坑,连一个小小的图片引入功能都得重新学习探索了,不过好在越来越顺利,mark一下吧,与vue友们共勉。。。

css中引入 background: url("~@/assets/cloud.png");

<template>
  <div>
    <div class="imageBottom"></div>
    <div class="imageTop"></div>
    <div class="title"><h2>管理系统</h2></div>
  </div>
</template>

<script>
export default {
  name: "Banner",
  }
};
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.imageTop {
  position: absolute;
  top: 0em;
  left: 0em;
  width: 100%;
  height: 70px;
  z-index: 9;
  background: url("~@/assets/cloud.png");
}
.imageBottom {
  position: absolute;
  top: 0em;
  left: 0em;
  width: 100%;
  height: 70px;
  background: url("~@/assets/background.png");
}
.title{
  z-index: 999;
  color: #fff;
}
</style>

<img :src='imageURL'/>中通过参数引入

<template>
  <div>
    <div class="title"><h2>管理系统</h2></div>
     <img :src="backgroud" alt="" width="100%" height="70" class="imageBottom">
    <img :src="cloud" alt="" width="100%" height="70" class="imageTop"> 
  </div>
</template>

<script>
import backgroud from "@/assets/background.png";
import cloud from "@/assets/cloud.png";

export default {
  name: "Banner",
  data() {
    return {
      backgroud,
      cloud
    };
  }
};
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.imageTop {
  position: absolute;
  top: 0em;
  left: 0em;
  width: 100%;
  height: 70px;
  z-index: 9;
.imageBottom {
  position: absolute;
  top: 0em;
  left: 0em;
  width: 100%;
  height: 70px;
}
.title{
  z-index: 999;
  color: #fff;
}
</style>

初学者难免会对@产生疑惑,其实就是系统中设置的路径别名而已,在webpack.base.conf.js中设置

resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': resolve('src'),
    }
},

SpringBoot集成MyBatis Generator代码生成器

在原有SpringBoot+gradle构建的项目上(项目地址chen1218chen/Springboot-Mybatis-Gradle)继续集成MyBatis Generator来自动生成model层、dao层代码,以实现快速开发。

修改build.gradle文件

首先,在gradle的配置文件中添加依赖:

compile group: 'org.mybatis.generator', name: 'mybatis-generator-core', version:'1.3.2'

generator.xml

在src/main/resource下添加generator.xml配置文件,根据此文件中的配置生成对应需要的代码,如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>

    <context id="DB2Tables" targetRuntime="MyBatis3">

        <!--自动实现Serializable接口-->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>

        <!-- 去除自动生成的注释 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>

        <!--数据库基本信息-->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://127.0.0.1:3306/boot?characterEncoding=UTF-8"
                        userId="myuser"
                        password="123456">
        </jdbcConnection>

        <!--生成实体类的位置以及包的名字-->
        <javaModelGenerator targetPackage="com.cc.entity"
                            targetProject="src\main\java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

         <!--生成映射文件存放位置-->
        <sqlMapGenerator targetPackage="com.cc.dao" targetProject="src\main\java">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!--生成Dao类存放位置,mapper接口生成的位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.cc.dao" targetProject="src\main\java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <!--生成对应表及类名-->
        <table tableName="item"  domainObjectName="Item"></table>
         <table tableName="image"  domainObjectName="Image"></table>

        <!--对应的表名,以及实体名-->
        <!-- <table tableName="t_emp" domainObjectName="EMP" ></table> -->

    </context>

</generatorConfiguration>

需要注意的是,需提前在数据库中建好对应的表,否则会报错Table configuration with catalog null, schema null

执行类

最后,在写一个main函数来启动运行。

package com.cc.main;

import org.mybatis.generator.api.ShellRunner;

/**
 * 执行类
 */
public class MybatisGeneratorApp
{
    public static void main( String[] args )
    {
        args = new String[] { "-configfile", "src\\main\\resources\\generator.xml", "-overwrite" };
        ShellRunner.main(args);
    }
}

这样刷新一下工程即可看到新生成的java文件,如下图所示:

enter description here

hibernate中Criteria实现复合条件查询

分页查询+多条件查询

分页查询+多条件查询,使用Criteria查询,逻辑清楚而且方便,避免了过多的if else 语句。以下代码中因为查询结果要进行分页,多以将每页数据和查询总数封装到map中传到前台,以供前台bootstrap-table插件使用

public Map<String, List> dataByPageItem(int pageNow, int pageSize, String searchText, String flag,String jurisdiction, String severity) {
        // TODO Auto-generated method stub
        Map myMap = new HashMap<String, List>();
        Integer total;
        // 所有item数据分页
        Session session = this.getSessionSelf();
        Criteria crit = session.createCriteria(Item.class);
        crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);//解决查询处理的数据重复的问题
        Conjunction conjunction = Restrictions.conjunction(); //and关系
        Disjunction disjunction = Restrictions.disjunction(); //or关系

        if(!"9".equals(flag) && flag != ""){            
            int flagInt = Integer.parseInt(flag);
            Criterion flagCriterion = Restrictions.eq("flag",flagInt);
            conjunction.add(flagCriterion);
        }
        if(jurisdiction!=""){
            Criterion jurisdictionCrt = Restrictions.like("jurisdiction", jurisdiction);
            conjunction.add(jurisdictionCrt);
        }
        if(severity!=""){
            Criterion severityCrt = Restrictions.like("severity", severity);
            conjunction.add(severityCrt);
        }
        if(searchText != ""){
            Criterion address = Restrictions.like("address", searchText);
            Criterion description = Restrictions.like("description", searchText);
            Criterion dealName = Restrictions.like("dealName", searchText);
            Criterion dataTime = Restrictions.like("dataTime", searchText);
            disjunction.add(address);
            disjunction.add(description);
            disjunction.add(dealName);
            disjunction.add(dataTime);
            conjunction.add(disjunction);
        }

        //排序
        crit.add(conjunction).addOrder(Order.desc("dataTime"));  
        // 增加查询条件 
        Criteria critCount = crit;
        total = critCount.list().size();
        //分页
        crit.setFirstResult((pageNow - 1) * pageSize);
        crit.setMaxResults(pageSize);
        List<Item> list = crit.list(); 
        List<Integer> listTotal = new ArrayList<Integer>();
        listTotal.add(total);
        myMap.put("total", listTotal);//总数
        myMap.put("rows", list);//每页数据
        return myMap;
    }

@Resource与@Autowired的区别

@Resource与@Autowired都是用来注入Bean的,区别在于@Resource默认按照ByName自动注入,由J2EE提供支持;@Autowired默认按照ByType注入,由spring提供支持。
具体用法如下:

public class BaseServiceImpl implements IBaseService {

    @Autowired
    @Qualifier("IbaseDao")
    private IBaseDao baseDao;
    ...
}

也可以用@Resource方式注入,写法如下

public class BaseServiceImpl implements IBaseService {

    @Resource(name="IbaseDao")
    private IBaseDao baseDao;
    ...
}

两种方法效果一样,可以看出@Autowired加上@Qualifier(“IbaseDao”)标签相当于@Resource按照ByName注入。
推荐使用@Resource

SpringMVC中rest请求返回前台数据中含null报错

最近SpringMVC框架的项目中频繁使用hibernate级联关系,如@OneToOne,@ManyToOne等,每次前台ajax发送rest请求总是后台报错,后台打印错误信息如下:

org.springframework.http.converter.HttpMessageNotWritableException Could not write JSON: Object is null (through reference chain: net.sf.json.JSONObject["rows"]->net.sf.json.JSONArray[1]->net.sf.json.JSONObject["taskId"]->net.sf.json.JSONNull["empty"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Object is null (through reference chain: net.sf.json.JSONObject["rows"]->net.sf.json.JSONArray[1]->net.sf.json.JSONObject["taskId"]->net.sf.json.JSONNull["empty"])] with root cause net.sf.json.JSONException: Object is null

应该是在Hibernate查询出数据实体类使用jackson序列化为json时报的错,因为实体数据的外键taskID为空

@JsonInclude(Include.NON_NULL)

  1. 在实体上设置 @JsonInclude(Include.NON_NULL)

将该标记放在属性上,如果该属性为NULL则不参与序列化
如果放在类上边,那对这个类的全部属性起作用

Include.Include.ALWAYS 默认 
Include.NON_DEFAULT 属性为默认值不序列化 
Include.NON_EMPTY 属性为 空(“”) 或者为 NULL 都不序列化 
Include.NON_NULL 属性为NULL 不序列化 
  1. 代码上
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON_NULL);  

通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化

User user = new User(1,"",null); 
String outJson = mapper.writeValueAsString(user); 
System.out.println(outJson);

注意:只对实体VO起作用,Map List不起作用

参考:
jackson 实体转json 为NULL或者为空不参加序列化

arcgis3标记标绘

arcgis3.22算时当前最新的3版本的API了,项目需要,整理一下简单的标记标绘功能,以后就直接crtl+C,ctrl+V了。

代码符合AMD规范,方便模块化开发调用。

polygon多边形

back.drawPolygon = function(){
      toolbar = new Draw(ArcGIS.mainMap);
      toolbar.on("draw-end", addPolygon);
      toolbar.activate("polygon");
}

function addPolygon(evt){
     toolbar.deactivate();
     var symbol = new SimpleFillSymbol(  
                SimpleFillSymbol.STYLE_SOLID,  
                new SimpleLineSymbol(  
                  SimpleLineSymbol.STYLE_SOLID,  
                  new Color([255,0,0,0.65]), 2  
                ),  
                new Color([0,0,0,0.35])  
              ); 
     ArcGIS.mainMap.graphics.add(new Graphic(evt.geometry, symbol));
}

polygon图片填充

var fillSymbol = new PictureFillSymbol(
      "images/mangrove.png", new SimpleLineSymbol(
        SimpleLineSymbol.STYLE_SOLID,
        new Color('#000'), 1), 42,42);

polygon半透明,简单颜色填充

var symbol = new SimpleFillSymbol(  
       SimpleFillSymbol.STYLE_SOLID,  
       new SimpleLineSymbol(  
         SimpleLineSymbol.STYLE_SOLID,  
         new Color([255,0,0,0.65]), 2  
       ),  
       new Color([0,0,0,0.35])  
     );

Circle

back.drawArea = function() {
      toolbar = new Draw(ArcGIS.mainMap);
      toolbar.on("draw-end", addCircle);
      toolbar.activate("circle");
}

function addCircle(evt){
  toolbar.deactivate();
 var symbol = new SimpleFillSymbol(  
        SimpleFillSymbol.STYLE_SOLID,  
        new SimpleLineSymbol(  
          SimpleLineSymbol.STYLE_SOLID,  
          new Color([255,0,0,0.65]), 2  
        ),  
        new Color([0,0,0,0.35])  
      );
  ArcGIS.mainMap.graphics.add(new Graphic(evt.geometry, symbol));
}

polyline折线

back.drawDistance = function() {
    tb = new Draw(ArcGIS.mainMap);
    tb.on("draw-end", addPolyline);
    ArcGIS.mainMap.disableMapNavigation();
    tb.activate("polyline");
}

function addPolyline(evt) {
    tb.deactivate();
    ArcGIS.mainMap.enableMapNavigation();
    var lineSymbol = new CartographicLineSymbol(
            CartographicLineSymbol.STYLE_SOLID, new Color([ 255, 0, 0 ]),
            3, CartographicLineSymbol.CAP_ROUND,
            CartographicLineSymbol.JOIN_MITER, 2);
    ArcGIS.mainMap.graphics.add(new Graphic(evt.geometry, lineSymbol));
}

point点

back.drawPoint = function(url) {
    var events = ArcGIS.mainMap.on("click", function(e) {
        var pt = new esri.geometry.Point(e.mapPoint.x, e.mapPoint.y,
                ArcGIS.mainMap.spatialReference);
        var pictureMarkerSymbol = new PictureMarkerSymbol(url, 31, 31);
        var attr = {
            "name" : "1",
            "remark" : "1"
        };
        graphic = new esri.Graphic(pt, pictureMarkerSymbol, attr, null);
        ArcGIS.mainMap.graphics.add(graphic);
        events.remove();
    });
}

ajax表单提交

方法一

$.ajax({
    url : "rest/lost/saveLost",
    type : "post",
    cache : false,
    dataType : 'json',
    data : $(form).serializeArray(),
    success : function(result) {
        if (result)
            alertConfirm("添加成功");
        else
            alertView("添加失败");
    },
});

后台java代码

@RequestMapping(value="/saveLost",method = RequestMethod.POST)
@ResponseBody
public boolean saveLost(@RequestParam("goodName") String goodName,
        @RequestParam("lostTime") String lostTime,
        @RequestParam(value = "place", required = false) String place,
        @RequestParam("descption") String descption,
        @RequestParam(value = "telephone", required = true) String telephone) throws ParseException{

    Lost lost = new Lost();
    lost.setDescption(descption);
    lost.setGoodName(goodName);
    Date time = (Date) Common.toDateStandard(lostTime);
    lost.setLostTime(time);
    lost.setTelephone(telephone);
    lost.setPeople(telephone);
    lost.setPlace(place);
    lost.setStates("0");
    try {
        lostServiceImpl.insert(lost);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return false;
    }
    return true;
}

方法二

function edit(oldValue){
    $.ajax({
        url:"rest/depart/edit",
        type:"post",
        cache:false,
        dataType:"json",
        contentType:"application/json; charset=utf-8",
        data:JSON.stringify(oldValue),
        success:function(result){
            if (result){
                alertView("修改成功");
                query(oldValue.descption);
            }            
            else
                alertView("修改失败");
        }
    })
}

@RequestMapping(value = "/edit",method=RequestMethod.POST)
@ResponseBody
public boolean edit(@RequestBody Object value) {

    JSONObject jsonObj = JSONObject.fromObject(value);//将json字符串转换为json对象
    Department depart = (Department) JSONObject.toBean(jsonObj,Department.class);//将建json对象转换为PublicGarden对象
    departServiceImpl.update(depart);
    return true;
}

直接上代码简单明了得意enter description here

|