分类 Java 下的文章

接口md5签名注意事项

自己构造json对象,一定要先把字符串变为对象,再把json对象toString拼接,要注意这两个字符串的区别:
appid81DBCD4FCxxWD8E8AD7101A155D4BDD7create_user1345form{"标题":"上线单19","num":"1"}order_id1
appid81DBCD4FCxxWD8E8AD7101A155D4BDD7create_user1345form{\"标题\":\"上线单19\",\"num\":\"1\"}order_id1
JSONObject jo = JSONObject.fromObject("{\"标题\":\"上线单19\",\"num\":\"1\"}");
		System.out.println("appid81DBCD4FCxxWD8E8AD7101A155D4BDD7create_user1345form"+jo.toString()+"order_id1");
//md5方法,一定要用apache提供的公共开发类,千万不要自己随便从网上瞎找!!!
System.out.println(DigestUtils.md5Hex("appid81DBCD4FCxxWD8E8AD7101A155D4BDD7create_user1345form"+jo.toString()+"order_id1"));
//下边就是从网上瞎找的,没有用的
	System.out.println(MD5Util.md5("appid81DBCD4FCxxWD8E8AD7101A155D4BDD7create_user1345form"+jo.toString()+"order_id1"));

回车换行符

\n是换行,英文是New line,表示使光标到行首
\r是回车,英文是Carriage return,表示使光标下移一格
\r\n表示回车换行
linux,unix: \r\n
windows : \n
Mac OS : \r

crontab命令格式

基本格式 :
*  *  *  *  *  command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

mybatis 查询结果直接返回map

xml代码:

<select id="findMenuListByRole" resultType="java.util.Map" parameterType="java.util.List">
        select r.`name` as roleName,GROUP_CONCAT(distinct(m.`name`) SEPARATOR ' | ') as menuList
        from sys_role_menu as rm LEFT JOIN sys_role as r on rm.role_id=r.id LEFT JOIN sys_menu as m on rm.menu_id=m.id
        where m.name not like '功能菜单' and r.id in
        <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
		  #{item}
	</foreach>
        GROUP BY r.`name`
    </select>

java代码:

public List<Map<String, String>> findMenuListByRole(List roleIDList);

需要注意的点:
1、resultType=”java.util.Map” 返回值类型
2、parameterType=”java.util.List” 输入的参数
3、将group的值拼接起来 GROUP_CONCAT(distinct(m.`name`) SEPARATOR ‘ | ‘) ;GROUP_CONCAT 有长度限制,group_concat_max_len
4、in的用法

<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
		  #{item}
</foreach>

5、java代码是要注意

 List<Map<String, String>> 

而不单单是map
6、#相当于对数据 加上 双引号,$相当于直接显示数据

maven shade解决storm Elasticsearch log4j jar包版本冲突

新建一个maven简单工程即可,该工程的目的是将es、log4j等jar包里的class文件重新打包,全部放入到一个jar包里,再放入的过程中将所有“org.apache.logging.log4j”开头的报名改为“my.elasticsearch.log4j”,也就相当于将import log4j的地方统统改了,这样就相当于第三方编写的log4j,pom.xml如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>my.elasticsearch.test</groupId>
	<artifactId>es-shaded</artifactId>
	<version>1.0-SNAPSHOT</version>
	<properties>
		<elasticsearch.version>5.2.2</elasticsearch.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.elasticsearch</groupId>
			<artifactId>elasticsearch</artifactId>
			<version>${elasticsearch.version}</version>
		</dependency>
		<dependency>
			<groupId>org.elasticsearch.client</groupId>
			<artifactId>transport</artifactId>
			<version>${elasticsearch.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
			<version>2.7</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>log4j-over-slf4j</artifactId>
			<version>1.7.7</version>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-shade-plugin</artifactId>
				<version>2.4.1</version>
				<executions>
					<execution>
						<phase>package</phase>
						<goals>
							<goal>shade</goal>
						</goals>
						<configuration>
							<relocations>
								<relocation>
									<pattern>org.apache.logging.log4j</pattern>
									<shadedPattern>my.elasticsearch.log4j</shadedPattern>
								</relocation>
							</relocations>
							<transformers>
								<transformer
									implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer" />
							</transformers>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>

运行mvn clean install
将打包好的jar包安装到本地,验证效果如下图:

jar包版本冲突解决

jar包版本冲突解决


jar包版本冲突

jar包版本冲突


最后在自己的工程里,引入新的jar包即可,不需要额外引入es和log4j的jar包了。

mybatis #和$的区别

#相当于对数据 加上 双引号,$相当于直接显示数据
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注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

卫语句

大量的嵌套条件分支是很容易让人望而却步的代码,我们应该极力避免这种代码的出现。尽管结构化原则一直在说一个函数只能有一个出口,但是在大量的嵌套条件分支下,让我们忘了这所谓的规则吧。 有一个专业名词叫卫语句,可以治疗这种恐怖的嵌套条件语句。它的核心思想是,将不满足某些条件的情况放在方法前面,并及时跳出方法,以免对后面的判断造成影响,经过这项手术的代码看起来会非常的清晰。
1.使用卫语句取代嵌套表达式
2.卫语句就是把复杂的条件表达式拆分成多个条件表达式,比如一个很复杂的表达式,嵌套了好几层的if – then-else语句,转换为多个if语句,实现它的逻辑,这多条的if语句就是卫语句.
3有时候条件式可能出现在嵌套n次才能真正执行,其他分支只是简单报错返回的情况,对于这种情况,应该单独检查报错返回的分支,当条件为真时立即返回,这样的单独检查就是卫语句(guard clauses).卫语句可以把我们的视线从异常处理中解放出来,集中精力到正常处理的代码中。

java代码获取完整的Exception异常信息

下面的java代码可以获取完整的Exception异常信息:

import java.io.PrintWriter;
import java.io.StringWriter;
public class ExceptionTest {
	public static void main(String[] args) {
		try {
			String aa = "";
			System.out.println(aa.substring(3));
		} catch (Exception e) {
			e.printStackTrace();
			StringWriter sw = new StringWriter();
			e.printStackTrace(new PrintWriter(sw, true));
			String str = sw.toString();
			System.out.println("==========");
			System.out.println(str);
		}
	}
}

控制台打印的信息:

java.lang.StringIndexOutOfBoundsException: String index out of range: -3
	at java.lang.String.substring(String.java:1875)
	at ExceptionTest.main(ExceptionTest.java:8)
==========
java.lang.StringIndexOutOfBoundsException: String index out of range: -3
	at java.lang.String.substring(String.java:1875)
	at ExceptionTest.main(ExceptionTest.java:8)
e.getmessage < e.tostring < e.getStackTrace +e.tostring = e.printStackTrace

layer捕获页如何实现

layer捕获页代码如下:

//捕获页
layer.open({
  type: 1,
  shade: false,
  title: false, //不显示标题
  content: $('.layer_notice'), //捕获的元素,注意:最好该指定的元素要存放在body最外层,否则可能被其它的相对元素所影响
  cancel: function(){
    layer.msg('捕获就是从页面已经存在的元素上,包裹layer的结构', {time: 5000, icon:6});
  }
});

但是如果按照官网说的 把要指定的元素放在body外层,则根本找不到该元素。
变通的办法:在body内写一个空白的div,当触发的时候就在空白div内添加html,如果关闭掉弹出层,则把这个div的html代码全部清空。代码如下:

	function parvalueFocus(n){
		 var $ob = $(n);
		 //alert($ob.val());
		  layer.open({
		  type: 1,
		  area: ['600px', '360px'],
		  shadeClose: true, //点击遮罩关闭
		  content: $('#layer_notice'),
		  offset: '100px',
		  cancel: function(){
			  var par = "";
			  //遍历字典名称和字典值放入输入框里
			  //alert($(".newpar_sub").html());
			  //将数据回填
			  $.each( $(".newpar_sub"), function(i, x){
				  //alert(90);
				//获取子元素
				var $x = $(x);
				par = par + $x.children(".parname_sub").val()+":"+$x.children(".parvalue_sub").val()+",";
			});
			 par = par.substring(0,par.length-1);
			 $ob.val(par);
			 $('#layer_notice').html("");
		  }
		});
	 $('#layer_notice').html('<div><a href="#" onclick="appendInputSub();"><i class="icon-plus"></i></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#" onclick="removeInputSub();"><i class="icon-minus"></i></a></div>'+
			 "<div class='newpar_sub'>字典名称:<input class='parname_sub' type='text' value=''/>字典值:<input class='parvalue_sub' type='text' value=''/></div>");
	}

利用PostMan开发调试Restful API

利用PostMan开发调试Restful API
下边的图片是postman发送不同类型的请求,注意url和参数的变化:

get

get


delete

delete


post

post


put

put


利用spring mvc实现restful api ,需要修改的部分:

@RestController
还有就是要注意参数获取的方式,

参考后端代码:

/**
 * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
 */
package com.jeeplus.modules.sys.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.jeeplus.common.web.BaseController;
import com.jeeplus.modules.sys.entity.User;
import com.jeeplus.modules.sys.service.SystemService;
/**
 * 用户Controller
 * @author jeeplus
 * @version 2013-8-29
 */
@RestController
@RequestMapping(value = "/user")
public class UserController2 extends BaseController {
	@Autowired
	private SystemService systemService;
	@RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public User viewGET(@PathVariable("id") String id) {
        User user = new User();
        user = systemService.getUser(id);
        System.out.println("get method");
        return user;
    }
	@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
    public User viewDELETE(@PathVariable("id") String id) {
        User user = new User();
        user = systemService.getUser(id);
        System.out.println("delete method");
        return user;
    }
	@RequestMapping(value = "", method = RequestMethod.POST)
    public User viewPOST(@ModelAttribute("user")User users) {
        User user = new User();
        user = systemService.getUser(users.getId());
        System.out.println("post method");
        return user;
    }
	@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
    public User viewPUT(@ModelAttribute("user")User users) {
        User user = new User();
        user = systemService.getUser(users.getId());
        System.out.println("put method");
        return user;
    }
}