public static void main(String[] args) {
SpringApplication.run(EmsApplication.class, args);
}
}
============================================================================
MVC 的模式开发项目,包的结构如下:
先在 com.yusael.entity
包下创建与数据库表对应的实体类 User.java
:
package com.yusael.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {
private String id;
private String username;
private String realname;
private String password;
private String sex;
}
在 com.yusael.dao
包下创建 UserDAO.java
:
package com.yusael.dao;
import com.yusael.entity.User;
import org.apache.ibatis.annotations.Param;
public interface UserDAO {
void save(User user);
User login(@Param(“username”) String name, @Param(“password”) String password);
}
在 resources/com/yusael/mapper
下创建 UserDAOMapper.xml
,这里的路径要与 application.properties
中配置的一致。
insert into t_user values (#{id}, #{username}, #{realname}, #{password}, #{sex})
select id, username, realname, password, sex from t_user
where username=#{username} and password=#{password}
在 com.yusael.service
包下创建 UserService.java
接口:
package com.yusael.service;
import com.yusael.entity.User;
public interface UserService {
void register(User user);
User login(String username, String password);
}
在 com.yusael.service
包下创建 UserServiceImpl.java
:
package com.yusael.service;
import com.yusael.dao.UserDAO;
import com.yusael.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.UUID;
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserDAO userDAO;
@Override
public void register(User user) {
user.setId(UUID.randomUUID().toString());
userDAO.save(user);
}
@Override
public User login(String username, String password) {
return userDAO.login(username, password);
}
}
在开发 com.yusael.controller
包的内容前,我们需要引入一个验证码功能的代码,将它放到 com.yusael.utils
下作为一个工具类:这个不需要我们自己写,直接拿过来用就可以了。
package com.yusael.utils;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Random;
public class ValidateImageCodeUtils {
/**
- 验证码难度级别 Simple-数字 Medium-数字和小写字母 Hard-数字和大小写字母
*/
public enum SecurityCodeLevel {
Simple, Medium, Hard
};
/**
-
产生默认验证码,4位中等难度
-
@return
*/
public static String getSecurityCode() {
return getSecurityCode(4, SecurityCodeLevel.Medium, false);
}
/**
-
产生长度和难度任意的验证码
-
@param length
-
@param level
-
@param isCanRepeat
-
@return
*/
public static String getSecurityCode(int length, SecurityCodeLevel level, boolean isCanRepeat) {
// 随机抽取len个字符
int len = length;
// 字符集合(–除去易混淆的数字0,1,字母l,o,O)
char[] codes = {
‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’,
‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’, ‘j’, ‘k’, ‘l’, ‘m’, ‘n’, ‘o’, ‘p’, ‘q’, ‘r’, ‘s’, ‘t’, ‘u’, ‘v’, ‘w’, ‘x’, ‘y’, ‘z’,
‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘I’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘O’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’, ‘X’, ‘Y’, ‘Z’
};
// 根据不同难度截取字符串
if (level == SecurityCodeLevel.Simple) {
codes = Arrays.copyOfRange(codes, 0, 10);
} else if (level == SecurityCodeLevel.Medium) {
codes = Arrays.copyOfRange(codes, 0, 36);
}
// 字符集和长度
int n = codes.length;
// 抛出运行时异常
if (len > n && isCanRepeat == false) {
throw new RuntimeException(String.format(“调用SecurityCode.getSecurityCode(%1 s , s,%2 s,s,%3 s ) 出现异常, " + " 当 i s C a n R e p e a t 为 s)出现异常," + "当isCanRepeat为%3 s)出现异常,"+"当isCanRepeat为s时,传入参数%1 s 不能大于 s不能大于%4 s不能大于s”, len, level, isCanRepeat, n));
}
// 存放抽取出来的字符
char[] result = new char[len];
// 判断能否出现重复字符
if (isCanRepeat) {
for (int i = 0; i < result.length; i++) {
// 索引0 and n-1
int r = (int) (Math.random() * n);
// 将result中的第i个元素设置为code[r]存放的数值
result[i] = codes[r];
}
} else {
for (int i = 0; i < result.length; i++) {
// 索引0 and n-1
int r = (int) (Math.random() * n);
// 将result中的第i个元素设置为code[r]存放的数值
result[i] = codes[r];
// 必须确保不会再次抽取到那个字符,这里用数组中最后一个字符改写code[r],并将n-1
codes[r] = codes[n - 1];
n–;
}
}
return String.valueOf(result);
}
/**
-
生成验证码图片
-
@param securityCode
-
@return
*/
public static BufferedImage createImage(String securityCode){
int codeLength = securityCode.length();//验证码长度
int fontSize = 18;//字体大小
int fontWidth = fontSize+1;
//图片宽高
int width = codeLength*fontWidth+6;
int height = fontSize*2+1;
//图片
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
g.setColor(Color.WHITE);//设置背景色
g.fillRect(0, 0, width, height);//填充背景
g.setColor(Color.LIGHT_GRAY);//设置边框颜色
g.setFont(new Font(“Arial”, Font.BOLD, height-2));//边框字体样式
g.drawRect(0, 0, width-1, height-1);//绘制边框
//绘制噪点
Random rand = new Random();
g.setColor(Color.LIGHT_GRAY);
for (int i = 0; i < codeLength*6; i++) {
int x = rand.nextInt(width);
int y = rand.nextInt(height);
g.drawRect(x, y, 1, 1);//绘制1*1大小的矩形
}
//绘制验证码
int codeY = height-10;
g.setColor(new Color(19,148,246));
g.setFont(new Font(“Georgia”, Font.BOLD, fontSize));
for(int i=0;i<codeLength;i++){
double deg=new Random().nextDouble()*20;
g.rotate(Math.toRadians(deg), i*16+13,codeY-7.5);
g.drawString(String.valueOf(securityCode.charAt(i)), i*16+5, codeY);
g.rotate(Math.toRadians(-deg), i*16+13,codeY-7.5);
}
g.dispose();//关闭资源
return image;
}
public static void main(String[] args) throws IOException {
String securityCode = ValidateImageCodeUtils.getSecurityCode();
System.out.println(securityCode);
BufferedImage image = ValidateImageCodeUtils.createImage(securityCode);
ImageIO.write(image,“png”,new FileOutputStream(“aa.png”));
}
}
IndexController
我们知道,resources/templates
下面放的是我们的页面文件(html),如果我们直接访问 templates 下的静态页面是无法获取 static 中的样式的。
我们需要用控制器进行去访问,该控制器没有其他作用,只是为了访问界面而已。
在 com.yusael.controller
下创建一个 IndexController.java
:
package com.yusael.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
// 直接访问templates下的静态页面是无法获取static中的样式的
// 用该控制器进行去访问, 该控制器没有其他作用, 只是为了访问界面而已
@Controller
public class IndexController {
@GetMapping(“/index”)
public String toIndex() {
return “ems/login”;
}
@GetMapping(“/toRegister”)
public String toRgsiter() {
return “ems/regist”;
}
@GetMapping(“/toSave”)
public String toSaave() {
return “ems/addEmp”;
}
}
UserController
在 com.yusael.controller
下开发 UserController.java
:
package com.yusael.controller;
import com.yusael.entity.User;
import com.yusael.service.UserService;
import com.yusael.utils.ValidateImageCodeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.image.BufferedImage;
import java.io.IOException;
@Controller
@RequestMapping(“/user”)
public class UserController {
@Autowired
private UserService userService;
// 登录方法
@PostMapping(“/login”)
public String login(String username, String password, HttpSession session) {
User login = userService.login(username, password);
if (login != null) {
session.setAttribute(“user”, login);
System.out.println(“登录成功”);
return “redirect:/emp/findAll”; // 跳转到查询所有
} else {
return “redirect:/index”; // 跳转回到登录
}
}
// 注册方法
@PostMapping(“/register”)
public String register(User user, String code, HttpSession session) {
String sessionCode = (String)session.getAttribute(“code”); // 生成的验证码
// 忽略大小写, 比较用户输入的验证码与生成的验证码
if (sessionCode.equalsIgnoreCase(code)) { // 输入正确
userService.register(user); // 注册
System.out.println(“注册成功”);
return “redirect:/index”; // 注册成功跳转到登录界面
} else { // 输入错误
return “redirect:/toRegister”; // 注册失败跳转到注册界面
}
}
// 生成验证码
@GetMapping(“/code”)
public void getImage(HttpSession session, HttpServletResponse response) throws IOException {
// 生成验证码
String securityCode = ValidateImageCodeUtils.getSecurityCode();
BufferedImage image = ValidateImageCodeUtils.createImage(securityCode);
// 存入session作用域中
session.setAttribute(“code”, securityCode);
// 响应图片
ServletOutputStream os = response.getOutputStream();
ImageIO.write(image, “png”, os);
}
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
总结
虽然我个人也经常自嘲,十年之后要去成为外卖专员,但实际上依靠自身的努力,是能够减少三十五岁之后的焦虑的,毕竟好的架构师并不多。
架构师,是我们大部分技术人的职业目标,一名好的架构师来源于机遇(公司)、个人努力(吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。
如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
[外链图片转存中…(img-6aRKwwCj-1711831867956)]
[外链图片转存中…(img-8U22JlGZ-1711831867957)]
[外链图片转存中…(img-AU7oiBc4-1711831867957)]
[外链图片转存中…(img-NDQawOcY-1711831867957)]
[外链图片转存中…(img-KS9eEpZ1-1711831867958)]
[外链图片转存中…(img-lYcohKbo-1711831867958)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-rLzN7khS-1711831867959)]
总结
虽然我个人也经常自嘲,十年之后要去成为外卖专员,但实际上依靠自身的努力,是能够减少三十五岁之后的焦虑的,毕竟好的架构师并不多。
架构师,是我们大部分技术人的职业目标,一名好的架构师来源于机遇(公司)、个人努力(吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。
如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
[外链图片转存中…(img-KdQ7b0Aa-1711831867959)]