栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

用SpringBoot编写第一个web网站实现CRUD

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用SpringBoot编写第一个web网站实现CRUD

用SpringBoot编写第一个web网站实现CRUD 前言

环境:IDEA、Tomcat9、springboot、Map模拟数据库

项目结构:

实现的功能:

CRUD、国际化、拦截器、订制网页图标、Thymeleaf、注销等

运行示例:

前期工作准备:

用IDEA创建一个springBoot项目

项目需要用到的依赖

pom.xml



    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        2.5.6
         
    
    com.zkb
    SpringBoot-03-web
    0.0.1-SNAPSHOT
    SpringBoot-03-web
    Demo project for Spring Boot
    
        11
    
    
        
            org.springframework.boot
            spring-boot-starter-web
        
        
        
            org.thymeleaf
            thymeleaf-spring5
        
        
        
            org.projectlombok
            lombok
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

application.properties

#设置日期格式
spring.mvc.format.date=yyyy-MM-dd
#关闭模板引擎的缓存
spring.thymeleaf.cache=false
#国际化 我们的配置文件真实的存放位置
spring.messages.basename=i18n.login

搭建好项目骨架:

一般用到config、controller、pojo、dao、service

resources下的

i18n : 国际化

public : 实现网页的图标订制

static : 放置静态资源 如css,js,img的样式等

template:模板 放置你编写的html网页

一、写POJO层,两个实体类

写一个部门表和一个员工表,员工有所属的部门

Department

用了lombok注解

package com.zkb.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

//部门表
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Department {

    private Integer id;
    private String departmentName;
}

Employee

package com.zkb.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

//员工表
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
    private Integer id;
    private String lastName;
    private String email;
    private Integer gender;//0:女 1:男
    private Department department;
    private Date birth;
}
二、写Dao层,用Map模拟数据库

DepartmentDao

package com.zkb.dao;

import com.zkb.pojo.Department;
import org.springframework.stereotype.Repository;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

//部门dao
@Repository //对应dao层,将类标识为bean,交给spring托管
public class DepartmentDao {

    //模拟数据库中的数据
    private static Map departments=null;
    static {//当一个类初始化的时候,首先加载static
        departments=new HashMap();//创建了一个部门表
        departments.put(101,new Department(101,"教学部"));
        departments.put(102,new Department(102,"市场部"));
        departments.put(103,new Department(103,"教研部"));
        departments.put(104,new Department(104,"运营部"));
        departments.put(105,new Department(105,"后勤部"));
    }
    //获得所有部门信息
    public Collection getDepartments(){//Collection容器
        return departments.values();
    }
    //通过id得到部门
    public  Department getDepartmentById(Integer id){
        return departments.get(id);
    }
}

EmployeeDao

package com.zkb.dao;

import com.zkb.pojo.Department;
import com.zkb.pojo.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

//员工Dao
@Repository
public class EmployeeDao {

    //模拟数据库中的数据
    private static Map employees=null;
    //员工有所属的部门
    @Autowired //@Autowired注释的作用是让spring完成bean自动装配的工作
    private DepartmentDao departmentDao;

    static {
        employees = new HashMap();
        employees.put(1001,new Employee(1001,"AA","7399186S4@qq.com",0,new Department(101,"教学部"),new Date()));
        employees.put(1002,new Employee(1002,"BB","739918DA4@qq.com",1,new Department(102,"市场部"),new Date()));
        employees.put(1003,new Employee(1003,"CC","73991WDS4@qq.com",0,new Department(103,"教研部"),new Date()));
        employees.put(1004,new Employee(1004,"DD","7399WRFD4@qq.com",1,new Department(104,"运营部"),new Date()));
        employees.put(1005,new Employee(1005,"EE","739ADWSV4@qq.com",0,new Department(105,"后勤部"),new Date()));
    }
    //主键自增
    private static Integer initId=1006;
    //增加一个员工
    public void save(Employee employee){
        if (employee.getId()==null){
            employee.setId(initId++);
        }
        employee.setDepartment(departmentDao.getDepartmentById(employee.getDepartment().getId()));
        employees.put(employee.getId(),employee);
    }
    //查询全部员工
    public Collection getAll(){
        return employees.values();
    }
    //通过Id查询员工
    public Employee getEmployeeById(Integer id){
        return employees.get(id);
    }
    //通过ID删除员工
    public void delete(Integer id){
        employees.remove(id);
    }
}
三、添加视图控制,写Config层

MyMvcConfig 作用是登录之后跳转到首页

import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.Locale;
//如果你想diy一些定制化的功能,只需要写这个组件  然后将它交给springboot,springboot就会帮我们自动装配
//用这个类全面扩展spingmvc
//如果我们要扩展springmvc  官方建议我们这样做
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
        registry.addViewController("/index.html").setViewName("index");
        registry.addViewController("/main.html").setViewName("dashboard");
    }
}

index.html thymeleaf模板的应用



    
        
        
        
        
        Signin Template for Bootstrap
        
        
        
        
    

    
        
    

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZgPw3Ga8-1637485250683)(C:Users86186AppDataRoamingTyporatypora-user-imagesimage-20211121163005471.png)]

一些静态资源,此处不再编写,有需要可以私信我

四、国际化(中英文切换)

在resources 下 创建i18n文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LA3MnNxP-1637485250684)(C:Users86186AppDataRoamingTyporatypora-user-imagesimage-20211121163328136.png)]

login.properties

login.btn=登录
login.password=密码
login.remember=记住我
login.tip=请登录
login.username=用户名

login_zh_CN.properties

login.btn=登录
login.password=密码
login.remember=记住我
login.tip=请登录
login.username=用户名

login_en_US.properties

login.btn=Sign in
login.password=Password
login.remember=Remember me
login.tip=Please sign in
login.username=Username

在Config层编写

MyLocaleResolver 语言解析

package com.zkb.config;


import org.springframework.web.servlet.LocaleResolver;
import org.thymeleaf.util.StringUtils;

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


public class MyLocaleResolver implements LocaleResolver {
    //解析请求
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        //获取请求中的语言参数
        String language = request.getParameter("l");
        Locale locale = Locale.getDefault();//如果没有就使用默认的
        //如果请求的链接携带了国际化的参数
        if (!StringUtils.isEmpty(language)){
            String[] split = language.split("_");
            //国家  地区
            locale= new Locale(split[0], split[1]);
        }
        return locale;
    }

    @Override
    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {

    }
}
中文
English
五、首页图标订制

非常简单 只需要找一张自己的图标然后把名字改为favicon.ico 然后拷贝到resources下的public(没有就创建一个)下即可

实现结果就是这样纸~

六、登录功能实现

LoginController

package com.zkb.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.thymeleaf.util.StringUtils;

import javax.servlet.http.HttpSession;

@Controller //控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。
public class LoginController {
    @RequestMapping("/user/login")
    public String login(@RequestParam("username") String username, @RequestParam("password")String password,
                        Model model, HttpSession session){
        //具体的业务
        if (!StringUtils.isEmpty(username) && "123456".equals(password)){//一个简单实现,登录的时候账号不空,密码为123456即可登录成功!
            session.setAttribute("loginUser",username);
            return "redirect:/main.html"; //注意,这个重定向到main.html是我在Config层定义好的,会自动跳转到dashbord.html
        }else{
            //登录失败
            model.addAttribute("msg","用户名或者密码错误!");
            return "index";
        }
    }
    //注销功能
    @RequestMapping("/user/logout")
    public String logout(HttpSession session){
        session.invalidate();
        return "redirect:/index.html";
    }
}
七、拦截器

显然,我们不需要登录直接访问localhost:8080/main.html也可以访问,这当然不可以,因此我们编写一个LoginHandlerInterceptor登录拦截器卸载config层即

登录成功存入session中

LoginHandlerInterceptor

package com.zkb.config;

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginHandlerInterceptor implements HandlerInterceptor {


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //登录成功之后要有用户的Session
        Object loginUser = request.getSession().getAttribute("loginUser");
        if (loginUser==null){
            request.setAttribute("msg","没有权限,请先登录!");
            request.getRequestDispatcher("/index.html").forward(request,response);
            return  false;
        }else {
            return true;
        }
    }
}

完善MyMvcConfig

MyMvcConfig

package com.zkb.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.Locale;
//如果你想diy一些定制化的功能,只需要写这个组件  然后将它交给springboot,springboot就会帮我们自动装配
//用这个类全面扩展spingmvc
//如果我们要扩展springmvc  官方建议我们这样做
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
        registry.addViewController("/index.html").setViewName("index");
        registry.addViewController("/main.html").setViewName("dashboard");
    }

    //自定义的国际化组件就生效了!
    @Bean
    public LocaleResolver localeResolver(){
        return new MyLocaleResolver();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns("/index.html","/","/user/login","/css/**","/js/**","/img/**");//作用是拦截所有的 除了 exckudePathPatterns下的不拦截

    }
}

八、实现CRUD

list.html

  
        

添加员工

id lastName email gender department birth 操作
编辑 删除

add.html





	


		Dashboard Template for Bootstrap
		
		
		
		
	

	
		
LastName
Email
Gender

update.html






    Dashboard Template for Bootstrap
    
    

    
    



LastName
Email
Gender

EmployeeController

package com.zkb.controller;


import com.zkb.dao.DepartmentDao;
import com.zkb.dao.EmployeeDao;
import com.zkb.pojo.Department;
import com.zkb.pojo.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Collection;

@Controller
public class EmployeeController {
    @Autowired
    EmployeeDao employeeDao;
    @Autowired
    DepartmentDao departmentDao;
    @RequestMapping("/employee")
    public String list(Model model){
        Collection employees = employeeDao.getAll();
        model.addAttribute("emps",employees);
        return "emp/list";
    }
    @GetMapping ("/emp")
    public String toAddpage(Model model){
        //查出所有部门的信息
        Collection departments = departmentDao.getDepartments();
        model.addAttribute("departments",departments);
        return "emp/add";
    }
    @PostMapping("/emp")
    public String addEmp(Employee employee){
        System.out.println("save=>"+employee);
        employeeDao.save(employee);//保存员工信息
        return "redirect:/employee";
    }
    //跳转到员工的修改页面
    @GetMapping("/emp/{id}")
    public String toUpdateEmp(@PathVariable("id") Integer id,Model model){
        //首先查出原来的数据
        Employee employeeById = employeeDao.getEmployeeById(id);
        //查出所有部门的信息
        Collection departments = departmentDao.getDepartments();
        model.addAttribute("departments",departments);
        model.addAttribute("emp",employeeById);
        return "emp/update";
    }
    @PostMapping("/updateEmp")
    public String updateEmp(Employee employee){
        employeeDao.save(employee);
        return "redirect:/employee";
    }
    //删除员工
    @GetMapping("/delemp/{id}")
    public String deleteEmp(@PathVariable("id") Integer id){
        employeeDao.delete(id);
        return "redirect:/employee";
    }

}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/582056.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号