1.创建
- 1.1 新建springboot项目,如图。
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020061121161377.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODU1MjQ1Ng==,size_16,color_FFFFFF,t_70)
- 1.2 选择Spring Initializr。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200611211818385.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODU1MjQ1Ng==,size_16,color_FFFFFF,t_70)
- 1.3 填写Group(企业名)、Artifact(项目名)和Name,这里选择默认,后点击next,如下图所示。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200611212039399.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODU1MjQ1Ng==,size_16,color_FFFFFF,t_70)
- 1.4选择需要的组件:基本组件有web模块中的web和web server、SQL模块中的MySQL、JDBC和Mybatis,项目版本号可以选择默认。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200611212534764.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODU1MjQ1Ng==,size_16,color_FFFFFF,t_70)
- 1.5.最后确定一下项目名以及选择一下项目的存储路径,点击finish。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200611212726363.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODU1MjQ1Ng==,size_16,color_FFFFFF,t_70)
- 1.6 创建完成后整个项目架构如下图所示。其中
DemoApplication.java
为sprinboot核心类,整个项目的main方法在该类中,application.properties为项目的配置文件。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200611213214253.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODU1MjQ1Ng==,size_16,color_FFFFFF,t_70)
2.配置项目来完善整个框架
- 2.1 首先配置.properties文件来连接数据库
.yml
和.properties
的配置格式是不一样的,我把application.properties改为application.yml,因为在实际开发中个人喜欢用.yml格式。
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020061121400832.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODU1MjQ1Ng==,size_16,color_FFFFFF,t_70)
- 点击refactor,修改完成。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200611214254619.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODU1MjQ1Ng==,size_16,color_FFFFFF,t_70)
- 刚开始打开application.yml是空的,可以添加如下内容:(
username
和password
填写自己数据库的用户名和密码,driver-class-name
是数据库连接驱动,url
是数据库的连接地址,我的是阿里云的数据库,port为项目开的访问端口号,context-path
是项目上下文路径配置,加上的话访问要带上该路径,mapper-location
指定扫描mapperXml
中的所有以xml为后缀名的文件)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020061121502721.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODU1MjQ1Ng==,size_16,color_FFFFFF,t_70)
- 2.2. 在
demo\src\main\java\com.example.demo
中,创建SpringMVC模式对应的package,如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020061122364262.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODU1MjQ1Ng==,size_16,color_FFFFFF,t_70)
domain
包主要用来集中管理相应的实体类,controller
为控制层,service
和serviceImpl
分别为服务层和服务实现层,mapper
用来管理的是与mybatis
结合后存储的接口类。- 2.3.在resources中,创建mapperXml,存放mapper对应的mapper.xml文件。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200611224026763.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODU1MjQ1Ng==,size_16,color_FFFFFF,t_70)
- 2.4 在utils包中,写入项目所需要的SessionId工具类,具体操作如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200611231233554.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODU1MjQ1Ng==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200611231308259.png)
- 代码如下:
package com.example.demo.utils;
import com.google.gson.Gson;
import javax.servlet.http.HttpSession;
public class SessionUtil {
/**
* 权限控制
* @param sessionId sessionId
* @return
*/
public static boolean checkSession(String sessionId) {
HttpSession httpSession = MySessionContext.getSession(sessionId);
Gson gson = new Gson();
//Integer.valueOf(httpSession.getAttribute("userNo")).intValue()
if (httpSession == null ) {
return false;
}
return true;
}
public static boolean checkSessionOnly(String sessionId,String userNo) {
//!!!仅验证session!!!
System.out.println("前端传过来的SessionID:"+sessionId);
HttpSession httpSession = MySessionContext.getSession(sessionId);
Gson gson = new Gson();
System.out.println(httpSession);
System.out.println(httpSession.getAttribute("userNo"));
System.out.println(userNo);
if (httpSession == null) {
System.out.println("@@@@@@@@");
return false;
}
return true;
}
public static boolean checkSessionOnly(String sessionId) {
//!!!仅验证session!!!
HttpSession httpSession = MySessionContext.getSession(sessionId);
Gson gson = new Gson();
if (httpSession == null) {
return false;
}
return true;
}
}
3.编写测试类以及实现接口
- 3.1.在domain包中创建实体类User.class,编写类属性,生成属性的getter和setter方法(如果idea装了lombok插件,只需要在文件上方引入
@Data
)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200611224831661.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODU1MjQ1Ng==,size_16,color_FFFFFF,t_70)
- 3.2.在controller包中创建UserController类
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020061200083588.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODU1MjQ1Ng==,size_16,color_FFFFFF,t_70)
- 编写一个登录接口,在UserController中编写如图代码,注解@RequestMapping中的value值可以自定义,其为请求该接口的一个url。第一个@RequestMapping为类级别,第二个@RequestMapping为方法级别。如我们需请求该接口,具体如下即可调用该方法:
localhost:18115/cypd/user/login
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/login", method = RequestMethod.POST)
@ResponseBody
public void login(HttpServletRequest request, HttpServletResponse response) throws IOException {
JSONObject jsonObject = JsonParseUtil.requestToJSONObject(request);
User user = JSON.parseObject(jsonObject.toString(), User.class);
response.setContentType("text/html;charset=UTF-8");
if (userService.checkUserMessage(user)) {
HttpSession session = request.getSession();
MySessionContext.AddSession(request.getSession());
response.getWriter().print(CommonLogic.jsonAssembly(Constant.SUCCESS_CODE, "登录成功", session.getId()));
} else {
response.getWriter().print(CommonLogic.jsonAssembly(Constant.ERROR_CODE, "账号或密码错误", null));
}
}
}
- 3.3.在service包中创建UserService接口。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200611225938716.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODU1MjQ1Ng==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200611230059465.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODU1MjQ1Ng==,size_16,color_FFFFFF,t_70)
- 接口代码具体如下:
package com.example.demo.service;
import com.example.demo.domain.User;
/**
* @Description TODO
* @Author xpf
* @Date 2020/5/26
*/
public interface UserService {
boolean checkUserMessage(User user);
}
- 3.4 在serviceImpl包中创建UserServiceImpl实现类,实现UserService。加入注解
@Service
并implements UserService
。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200611232153759.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODU1MjQ1Ng==,size_16,color_FFFFFF,t_70)
- 具体代码如下:
package com.example.demo.serviceImpl;
import com.example.demo.domain.User;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @Description TODO
* @Author xpf
* @Date 2020/5/26
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public boolean checkUserMessage(User user) {
User use1= userMapper.checkUserMessage(user);
if (use1 != null) {
return true;
}else {
return false;
}
}
}
- 3.5.在mapper中创建UserMapper接口,创建方法与第3步一致。并加入注解@Repository。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200611232453949.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODU1MjQ1Ng==,size_16,color_FFFFFF,t_70)
- 具体代码如下:
package com.example.demo.mapper;
import com.example.demo.domain.User;
import org.springframework.stereotype.Repository;
/**
* @Description TODO
* @Author xpf
* @Date 2020/5/26
*/
@Repository
public interface UserMapper {
User checkUserMessage(User user);
}
- 3.6 在resource下的mapperXml中创建UserMapper.xml文件,集体过程如下图,图中显示的是FXML File,创建的时候直接修改后缀名为
.xml
即可
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200611232845123.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODU1MjQ1Ng==,size_16,color_FFFFFF,t_70)
- 具体代码如下(namespace中的
com.example.demo.mapper.UserMapper
需要关联的Mapper的具体路径和名字,改配置表示该xml关联的是UserMapper)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.demo.mapper.UserMapper">
<select id="checkUserMessage" resultType="com.example.demo.domain.User" parameterType="com.example.demo.domain.User">
select * from t_user where user_no =
</select>
</mapper>
- 3.7 在核心类中(DemoApplication)中,添加扫描mapper包和工具包,对应上mapper的路径和工具包的路径
package com.example.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
/**
* @author xpf
*/
@MapperScan(basePackages = "com.example.demo.mapper")
@ServletComponentScan(basePackages = "com.example.demo.utils")
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
- 3.8 启动项目,点击
DemoApplication
中的启动按钮,如果启动成功,会出现如下界面:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200611234429800.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODU1MjQ1Ng==,size_16,color_FFFFFF,t_70)
3.9 使用测试工具测试,这里选用postman
测试,方法选择post
方法,url中输入:localhost18099/cypd/user/login
。点击send按钮,出现返回值,响应状态码200
,表示测试成功。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200611235648212.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODU1MjQ1Ng==,size_16,color_FFFFFF,t_70)