Spring Boot系列入门(2)——实现简单登录

本来想早点完成这篇文章的,奈何一方面使用spring boot建立的项目要么是访问不到静态资源,要么就访问不到html页面,完不成demo,另一方面就是这段时间工作比较忙,来不及继续探究资源访问不到的问题。终于实在今晚闲下来了,完成这边文章。最初的立意是为了通过实现简单的登录功能展示如何使用springboot来开发web项目的,但是最后不得不变为重点放在解决如何访问静态资源的问题。

项目文件结构

在这里插入图片描述

数据库准备

简单地在MySQL上建立了一个h_user的表,用于存储用户账号和密码
在这里插入图片描述

SET FOREIGN_KEY_CHECKS=0;
CREATE TABLE `h_user` (
`pk_id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(50) NOT NULL,
`login_name` varchar(50) NOT NULL,
`password` varchar(50) NOT NULL,
PRIMARY KEY (`pk_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
INSERT INTO `h_user` VALUES ('1', '张三', 'zhangsan', '123');
INSERT INTO `h_user` VALUES ('2', '李四', 'lisi', '123');

Java实现代码

1、controller层代码

package com.dulucy.springboot.login.controller;

import com.dulucy.springboot.login.service.ILoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

@Controller
@RequestMapping("/Login")
public class LoginController {

    @Autowired
    private ILoginService loginService;
    @RequestMapping("/seletePasswordByName.do")
    @ResponseBody
    public Map<String,Object> seletePasswordByName(HttpServletRequest request, HttpServletResponse response) {
        Map<String,Object> map=loginService.seletePasswordByName(request);
        return map;

    }
}

2、service层代码

package com.dulucy.springboot.login.service;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

public interface ILoginService {

    Map<String,Object> seletePasswordByName(HttpServletRequest request);
}

3、serviceimpl层代码

package com.dulucy.springboot.login.serviceimpl;

import com.dulucy.springboot.login.dao.ILoginDao;
import com.dulucy.springboot.login.service.ILoginService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

@Service
public class LoginServiceImpl implements ILoginService {

    @Autowired
    private ILoginDao loginDao;

    @Override
    public Map<String,Object> seletePasswordByName(HttpServletRequest request) {
        String login_name=request.getParameter("login_name");
        String pwd =request.getParameter("password");

        String password=loginDao.seletePasswordByName(login_name);
        Map<String,Object> map=new HashMap<String,Object>(); //用于包装返回结果
        if (pwd.equals(password)){
            map.put("code",1);
            map.put("msg","账号/密码正确,登录成功");
            map.put("data","");
        }else{
            map.put("code",0);
            map.put("msg","账号/密码错误");
            map.put("data","");
        }
        return map;
    }
}

4、dao层代码(使用注解开发)

package com.dulucy.springboot.login.dao;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Component;

@Component(value = "apiCategoryMapper")
public interface ILoginDao {

    @Select("select password from h_user where login_name=#{login_name}")
    String seletePasswordByName(@Param("login_name") String login_name);
}

配置文件

1、application.yml文件配置项。这里我是采用的yml文件作为配置文件,结构比properties文件更加清晰。配置了端口和项目名‘/dulucy’,需要注意的是mvc和resources的配置,不然可能会出现无法访问静态资源的问题。

#服务器端口和项目名称配置
server:
  port: 8080
  servlet:
    context-path: /dulucy
#数据库配置
spring:
  datasource:
    name: springboot
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test
    username: dulucy
    password: 123456

  mvc:
    view:
      suffix: .html
    static-path-pattern: /**
  resources:
    static-locations: classpath:/templates/,classpath:/static/

  devtools:
    restart:
      enabled: true  #设置开启热部署
      additional-paths: src/main/java #重启目录
      exclude: static/**
    freemarker:
      cache: false    #页面不加载缓存,修改即时生效

2、配置daoceng扫描

这个是在启动类上使用注解配置的。

package com.dulucy.springboot;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@SpringBootApplication(scanBasePackages = "com.dulucy.springboot")
@EnableTransactionManagement
@MapperScan("com.dulucy.springboot.login.dao")
public class SpringbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication.class, args);
    }

}

在这里插入图片描述

3、pom.xml配置

虽然使用了springboot来使得jar包导入更加简便,我这里还是手动添加了几个jar包。

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.dulucy</groupId>
    <artifactId>springboot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </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>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
            <scope>true</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!--thymeleaf 模板依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

在这里插入图片描述

编写html页面

1、登录页面

前台是基于layui做的,切换成其他框架是一样的。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta http-equiv="Access-Control-Allow-Origin" content="*">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="format-detection" content="telephone=no">
    <link rel="stylesheet" href="../layui/css/layui.css" media="all">
    <!--[if lt IE 9]>
    <script src="https://cdn.staticfile.org/html5shiv/r29/html5.min.js"></script>
    <script src="https://cdn.staticfile.org/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->
</head>
<body>

<div class="layui-container">
    <div class="admin-login-background">
        <div class="layui-form login-form">
            <form class="layui-form" action="">
                <div class="layui-form-item logo-title">
                    <h1>欢迎登陆</h1>
                </div>
                <div class="layui-form-item">
                    <label class="layui-icon layui-icon-username" >username</label>
                    <input type="text" name="login_name" lay-verify="required|account" placeholder="用户名或者邮箱"
                           autocomplete="off" class="layui-input" >
                </div>
                <div class="layui-form-item">
                    <label class="layui-icon layui-icon-password" >password</label>
                    <input type="password" name="password" lay-verify="required|password" placeholder="密码"
                           autocomplete="off" class="layui-input" >
                </div>

                <div class="layui-form-item">
                    <input type="checkbox" name="rememberMe" value="true" lay-skin="primary" title="记住密码">
                </div>
                <div class="layui-form-item">
                    <button class="layui-btn layui-btn-fluid" lay-submit="" lay-filter="login">登 入</button>
                </div>
            </form>
        </div>
    </div>
</div>

<script src="../layui/layui.all.js" charset="utf-8"></script>
<script>
    layui.use(['form'], function () {
        var form = layui.form,$=layui.jquery,
            layer = layui.layer;
        // 进行登录操作
        form.on('submit(login)', function (data) {
            data = data.field;
            if (data.login_name == '') {
                layer.msg('用户名不能为空');
                return false;
            }
            if (data.password == '') {
                layer.msg('密码不能为空');
                return false;
            }
          $.ajax({
              url:"/dulucy/Login/seletePasswordByName.do",
              type:"POST",
              data:{
                  'login_name':data.login_name,
                  'password':data.password
              },success:function (result) {
                  if (result.code==1){
                      layer.msg('登录成功', function () {
                          window.location = '/dulucy/html/success.html';
                      });
                  } else{
                      layer.alert(result.msg);
                  }
              },error:function () {
              }
          })
            return false;
        });
    });
</script>

</body>
</html>

2、登录成功页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登陆成功页面</title>
</head>
<body>
登陆成功
</body>
</html>

遇到的问题及解决方案

1、无法访问静态资源问题

这篇文章最主要卡的地方就是这里,从开发来说,这其实就是一个很小的问题,但是就是没弄明白怎么回事。刚入门学习springboot,和之前的配置相比简化了很多,遇到相同的问题,反而不知道怎么处理。最开始参考了很多博客主的教程,都说添加

  mvc:
    view:
      suffix: .html
    static-path-pattern: /**
  resources:
    static-locations: classpath:/templates/,classpath:/static/

就可以访问,实际上可以分开访问到html或者静态图片,但是在html中引用静态资源就报404。

本想着直接用html开发,不使用springboot官方推荐的thymeleaf模板开发,实在进行不下去了,在pom.xml引入thymeleaf后,居然能够访问html和静态资源了。具体的底层的不是很懂,但就是这样解决问题了。

推荐3篇相关的文章:

1、Spring Boot系列入门——IDEA搭建简易Spring Boot项目

2、Java 非对称加密算法实现登陆账号密码加密传输功能

3、mybatis使用注解编写动态sql注意事项

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值