前言:内容基本是视频笔记,偶尔会加些个人补充,仅作为复习巩固用途。如有错误,请指出,谢谢。
提示:后续更深理解在补充
前序、使用过程出现的问题
注意:发现问题解决问题比学习新知识更重要
1、jackson使用问题:mapper.readValue()将JSON字符串转反序列化为对象失败或异常
参考博客:jackson使用问题
问题根源:
1、转化目标实体类的属性要与被转JSON字符串总的字段 一 一对应!字符串里可以少字段,但绝对不能多字段。
2、出现未匹配上的原因可能是属性名写错了
3、问题代码,mapper.readValue(shopStr, Shop.class)忘了返回对象了,卧槽卧槽
String shopStr = HttpServletRequestUtil.getString(request, "shopStr");
ObjectMapper mapper = new ObjectMapper();
// 拿到shop
Shop shop = null;
try {
mapper.readValue(shopStr, Shop.class);// 问题地方
//shop = mapper.readValue(shopStr, Shop.class);
} catch (Exception e) {
modelMap.put("success", false);
modelMap.put("errMsg", e.getMessage());
}
一、Thumbnailator简单使用
Thumbnailator在github上面的地址
参考博客:
1、Thumbnailator使用简介
2、Java使用google开源工具Thumbnailator实现图片压缩
1、pom.xml导入依赖
<!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
2、利用工具类使用Thumbnailator
//待补充
二、penggle之kaptcha验证码简单使用
1、pom.xml导入依赖
<!-- https://mvnrepository.com/artifact/com.github.penggle/kaptcha -->
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
2、web.xml配置servlet生成验证码
<!--利用servlet生成验证码-->
<servlet>
<servlet-name>Kaptcha</servlet-name>
<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
<!-- 是否有边框 -->
<init-param>
<param-name>kaptcha.border</param-name>
<param-value>no</param-value>
</init-param>
<!-- 字体颜色 -->
<init-param>
<param-name>kaptcha.textproducer.font.color</param-name>
<param-value>red</param-value>
</init-param>
<!-- 图片宽度 -->
<init-param>
<param-name>kaptcha.image.width</param-name>
<param-value>135</param-value>
</init-param>
<!-- 使用哪些字符生成验证码 -->
<init-param>
<param-name>kaptcha.textproducer.char.string</param-name>
<param-value>ACDEFHKPRSTWX345679</param-value>
</init-param>
<!-- 图片高度 -->
<init-param>
<param-name>kaptcha.image.height</param-name>
<param-value>50</param-value>
</init-param>
<!-- 字体大小 -->
<init-param>
<param-name>kaptcha.textproducer.font.size</param-name>
<param-value>43</param-value>
</init-param>
<!-- 干扰线的颜色 -->
<init-param>
<param-name>kaptcha.noise.color</param-name>
<param-value>black</param-value>
</init-param>
<!-- 字符个数 -->
<init-param>
<param-name>kaptcha.textproducer.char.length</param-name>
<param-value>4</param-value>
</init-param>
<!-- 字体 -->
<init-param>
<param-name>kaptcha.textproducer.font.names</param-name>
<param-value>Arial</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Kaptcha</servlet-name>
<url-pattern>/Kaptcha</url-pattern>
</servlet-mapping>
3、前端的验证码部分,使用了jQuery WeUI前端框架,但不影响理解
html代码:
<!--验证码-->
<div class="weui-cell weui-cell_vcode">
<div class="weui-cell__hd">
<label class="weui-label">验证码</label>
</div>
<div class="weui-cell__bd">
<input class="weui-input" type="text" id="j-kaptcha" placeholder="请输入验证码">
</div>
<div class="weui-cell__bd" >
<img class="weui-vcode-img" id="kaptcha" onclick="changeVerifyCode()" src="/Kaptcha">
</div>
<div class="weui-cell__ft" >
<button class="weui-vcode-btn" onclick="changeVerifyCode()">点击更换验证码</button>
</div>
</div>
js代码:
function changeVerifyCode() {
// 随机数目的是重新请求验证码,因为浏览器一般会缓存图片
var kaptcha_url ="/Kaptcha?"+ Math.floor(Math.random()*1000);
$("#kaptcha").attr("src", kaptcha_url);
};
4、后端的一个验证过程
注意:
1、关键在从session中取出保存的验证码,从提交的表单中取出输入的验证码,然后对比
2、Constants.KAPTCHA_SESSION_KEY这是一个类,保存了一些验证码信息
3、com.google.code.kaptcha.Constants 类源码
package com.google.code.kaptcha;
public class Constants {
public static final String KAPTCHA_SESSION_KEY = "KAPTCHA_SESSION_KEY";
public static final String KAPTCHA_SESSION_DATE = "KAPTCHA_SESSION_DATE";
public static final String KAPTCHA_SESSION_CONFIG_KEY = "kaptcha.session.key";
public static final String KAPTCHA_SESSION_CONFIG_DATE = "kaptcha.session.date";
public static final String KAPTCHA_BORDER = "kaptcha.border";
public static final String KAPTCHA_BORDER_COLOR = "kaptcha.border.color";
public static final String KAPTCHA_BORDER_THICKNESS = "kaptcha.border.thickness";
public static final String KAPTCHA_NOISE_COLOR = "kaptcha.noise.color";
public static final String KAPTCHA_NOISE_IMPL = "kaptcha.noise.impl";
public static final String KAPTCHA_OBSCURIFICATOR_IMPL = "kaptcha.obscurificator.impl";
public static final String KAPTCHA_PRODUCER_IMPL = "kaptcha.producer.impl";
public static final String KAPTCHA_TEXTPRODUCER_IMPL = "kaptcha.textproducer.impl";
public static final String KAPTCHA_TEXTPRODUCER_CHAR_STRING = "kaptcha.textproducer.char.string";
public static final String KAPTCHA_TEXTPRODUCER_CHAR_LENGTH = "kaptcha.textproducer.char.length";
public static final String KAPTCHA_TEXTPRODUCER_FONT_NAMES = "kaptcha.textproducer.font.names";
public static final String KAPTCHA_TEXTPRODUCER_FONT_COLOR = "kaptcha.textproducer.font.color";
public static final String KAPTCHA_TEXTPRODUCER_FONT_SIZE = "kaptcha.textproducer.font.size";
public static final String KAPTCHA_TEXTPRODUCER_CHAR_SPACE = "kaptcha.textproducer.char.space";
public static final String KAPTCHA_WORDRENDERER_IMPL = "kaptcha.word.impl";
public static final String KAPTCHA_BACKGROUND_IMPL = "kaptcha.background.impl";
public static final String KAPTCHA_BACKGROUND_CLR_FROM = "kaptcha.background.clear.from";
public static final String KAPTCHA_BACKGROUND_CLR_TO = "kaptcha.background.clear.to";
public static final String KAPTCHA_IMAGE_WIDTH = "kaptcha.image.width";
public static final String KAPTCHA_IMAGE_HEIGHT = "kaptcha.image.height";
public Constants() {
}
}
辅助验证工具类,verifyCodeActual 是从提交的到后台的表单中取到的
public class CodeUtil {
public static boolean checkVerifyCode(HttpServletRequest request){
String verifyCodeExpected = (String) request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
String verifyCodeActual = HttpServletRequestUtil.getString(request, "verifyCodeActual");
if(verifyCodeActual == null || verifyCodeActual.equals(verifyCodeExpected)){
return false;
}
return true;
}
}
/**
* 工具类,从HttpServletRequest中根据key取出值
*/
public class HttpServletRequestUtil {
public static String getString(HttpServletRequest request, String key){
try{
String result = request.getParameter(key);
if(result != null){
// 这个是去除字符串前后的空格
result.trim();
}
if("".equals(result)){
result = null;
}
return result;
}catch (Exception e){
return null;
}
}
// 其他取整数,长整型,double可以自己定义
}
三、multipart file upload简单使用
注意:
这个就是为了解析前端上传formData格式,否则后端request里面拿不到表单文件,出现null
1、pom.xml导入依赖
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
2、spring-web.xml配置文件上传解析器
<!-- 文件上传解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"></property>
<!-- 1024 * 1024 * 20 = 20M -->
<property name="maxUploadSize" value="20971520"></property>
<property name="maxInMemorySize" value="20971520"></property>
</bean>
controller中java部分代码,用到了commonsMultipartResolver
注意:这里commonsMultipartResolver 不仅仅是用到了上传文件,而且最重要是解析整个formData表单
// shopImg 表示上传的图片
CommonsMultipartFile shopImg = null;
CommonsMultipartResolver commonsMultipartResolver =
new CommonsMultipartResolver(request.getSession().getServletContext());
if(commonsMultipartResolver.isMultipart(request)){
MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
shopImg = (CommonsMultipartFile) multipartHttpServletRequest.getFile("shopImg");
}