前期准备
1. 构建项目
2. 添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.1</version>
</dependency>
</dependencies>
3. 项目结构
启动类:
@SpringBootApplication
@MapperScan("com.example.demo.mapper") //扫描此路径下的mapper
public class Ch05Application {
public static void main(String[] args) {
SpringApplication.run(Ch05Application.class, args);
}
}
User:
@Data
@TableName("user")
public class User implements Serializable {
@TableId(type = IdType.AUTO)
@TableField("user_id")
private Long userId;
@TableField("user_name")
private String userName;
@TableField("user_password")
private String userPassword;
@TableField("user_role_id")
private Long userRoleId;
@TableField("user_flag")
private Integer userFlag;
}
UserMapper:
public interface UserMapper extends BaseMapper<User> {
}
UserService:
public interface UserService {
public User login(String userName, String userPassword);
public int addUser(User user);
public int updateUser(User user);
public int deleteUser(Long UserId);
public User getUser(Long UserId);
public List<User> findAllUser();
}
UserServiceImpl:
@Service("userService")
public class UserSerivceImpl implements UserService {
@Resource
private UserMapper userMapper;
@Override
public User login(String userName, String userPassword) {//登录验证
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("user_name", userName);
wrapper.eq("user_password", userPassword);
return userMapper.selectOne(wrapper);
}
@Override
public int addUser(User user) {//添加
return userMapper.insert(user);
}
@Override
public int updateUser(User user) {//修改
return userMapper.updateById(user);
}
@Override
public int deleteUser(Long userId) {//删除
return userMapper.deleteById(userId);
}
@Override
public User getUser(Long userId) {//根据ID查询
return userMapper.selectById(userId);
}
@Override
public List<User> findAllUser() {//查询全部
return userMapper.selectList(null);
}
}
控制器开发
JSON的支持
@RestController
public class UserController {
@Resource
private UserService userService;
@RequestMapping(value = "/user", method = RequestMethod.GET)
public User getUser(Long userId){
User user = userService.getUser(userId);
return user;
}
@ RestController 注解相当于 @ResponseBody + @Controller 合在起的作用, 如果 Web 层的类上使用了@RestController 注解,就代表这个类中所有的方法都会以 JSON 的形式返回结果,也相当于JSON 的一种快捷使用方式;当然,如果想返回页面继续使用 @Controller 注解也是可以的。
@RequestMapping(value = “/user”, method = RequestMethod.GET),以 /user 的方式去请求,method= RequestMethod.GET 是指只可以使用GET的方式去请求,如果使用 POST 的方式去请求的话,则会报 405 不允许访问的错误。
访问结果:
RESTful 的支持
RESTful是一种架构的规范与约束、原则,符合这种规范的架构就是RESTful架构。
Spring Boot全面支持开发RESTful 程序,通过不同的注解来支持前端的请求,除了经常使用的注解外,Spring Boot 还提了一些组合注解。这些注解来帮助简化常用的HTTP方法的映射,并更好地表达被注解方法的语义。
● @GetMapping. 处理Get请求
● @PostMapping,处理Post 请求
● @PutMapping, 用于更新资源
● @DeleteMapping, 处理删除请求
● @PatchMapping, 用于更新部分资源
其实这些组合注解就是我们使用的 @RequestMapping 的简写版本,RESTful在请求的类型中就指定了对资源的操控。@GetMaping(value="/xxx") 等价于 @RequestMapping(value="/xxx",method = RequestMethod.GET).
修改UserController.java:
@RestController
public class UserController {
@Resource
private UserService userService;
@GetMapping(value = "/user/{id}")
public User getUser(@PathVariable("id") Long userId){
User user = userService.getUser(userId);
return user;
}
@GetMapping(value = "/users")
public List<User> findAllUser(){
List<User> list = userService.findAllUser();
return list;
}
@PostMapping(value = "/user")
public void addUser(User user){
userService.addUser(user);
}
@PutMapping(value = "/user")
public void updateUser(User user){
userService.updateUser(user);
}
@DeleteMapping(value = "/user/{id}")
public void deleteUser(@PathVariable("id") Long userId){
userService.deleteUser(userId);
}
}
访问结果:
Web 测试的支持
以往我们在测试 Web 请求的时候,我们常常会在浏览器中访问一些特定的地址来进行测试,但如果涉及到一些非 get 请求就会变的稍微麻烦一些。有的会使用 PostMan 工具或者自己写一些 Http Post 请求来进行测试。Spring Boot 中有对Web测试的解决方案: MockMvc。
MockMvc 实现了对 Http 请求的模拟,能够直接使用网络的形式,转换到Controller 的调用,这样可以使得测试速度更快、不依赖网络环境,而且提供了一套验证的工具,可以使得请求的验证统一而且更方便。
下面是MockMvc测试类的基本结构:
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserControllerTesrer {
@Resource
private WebApplicationContext wac;
private MockMvc mockMvc;
@Before //@Before代表在测试启动时需要提前加载的内容, 这里是提前加载 MVC 环境
public void setup(){
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
}
@Test
public void testGetUser() throws Exception {//根据ID查询
String mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/user/1")).andReturn().getResponse().getContentAsString();
System.out.println("Result==="+mvcResult);
}
@Test
public void testAddUser() throws Exception {//添加
final MultiValueMap<String,String> params = new LinkedMultiValueMap<>();
params.add("userName","xiaomin");
params.add("userPassword","111111");
params.add("userRoleId","1");
params.add("userFlag","1");
mockMvc.perform(MockMvcRequestBuilders.post("/user").params(params)).andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print());
}
}
执行测试, 控制台输出如下:
根据ID查询:
添加:
- perform(…) 构建一个请求,并且返回 ResultActions 示例,该实例则可以获取到请求的返回内容等。
- MockMvcRequestBuilders.xxx(“url”) 以某种请求方法发出对某url的请求
- params 构建请求时候的参数,也支持 param(key,value) 的方式连续添加。
- andExpect(…) 预期结果判断,可以多次调用。
- andReturn() 返回 MvcResult 对象,该对象可以获取到返回的视图名称、返回的 Response 状态、获取拦截请求的拦截器集合。
- andDo(…) 继续一些操作, 例如 MockMvcResultHandlers print() 打印响应信息。
视图(JSP)开发
- 项目结构
statics 静态文件
webapp 目录为我们手动创建,所以需要在 IDEA 中进行配置,指定 webapp 目录为项目的 Web资源目录。
File > Project Structure > Modules,选择项目的 Web,在 Web 资源目录处单击+,调出配置界面,选择 webapp 目录,OK确定并应用。
- 配置文件:
<!--添加jstl标签库依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!--添加jsp引擎, String Boot内置Tomcat没有此依赖-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
- 编写 Controller:
@Controller
public class LoginController {
@Resource
private UserService userService;
@RequestMapping(value = "/login",method = RequestMethod.GET)
public String logins(){
return "devlogin";
}
@RequestMapping(value = "/login",method = RequestMethod.POST)
public String login(String userName, String userPassword, Model model, HttpSession session){
User user = userService.login(userName,userPassword);
if (user!=null){
session.setAttribute("loginUser",user);
return "main";
}else{
model.addAttribute("error","用户名或密码错误!");
return "devlogin";
}
}
}
- 额外配置:
- 运行