第二阶段:代码片段

MyErrorAttributes.java

package com.mengxuegu.springboot.component;

import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.WebRequest;

import java.util.Map;

public class MyErrorAttributes extends DefaultErrorAttributes {

    /**
     * 自定义数据进行响应
     * @param webRequest
     * @param includeStackTrace
     * @return
     */
    @Override
    public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
        Map<String, Object> map = super.getErrorAttributes(webRequest, includeStackTrace);
        map.put("company", "mengxuegu.com");
        return map;
    }

}
MyLocaleResolver.java
package com.mengxuegu.springboot.component;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;

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

public class MyLocaleResolver implements LocaleResolver {
    Logger logger = LoggerFactory.getLogger(getClass());

    //解析区域信息
    @Override
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
        //获取自定义请求头信息
        String l = httpServletRequest.getParameter("l");
        logger.info("解析区域信息:" + l);
        //获取浏览器上的区域信息
        Locale locale = httpServletRequest.getLocale();
        //获取当前操作系统 默认的区域信息
//        Locale locale = Locale.getDefault();

        if(!StringUtils.isEmpty(l)) {
            String[] split = l.split("_");
            //接收第1个参数为:语言代码, 国家代码
            locale = new Locale(split[0], split[1]);
        }
        logger.info("最终采用的区域信息:" + locale.getLanguage() + "_" + locale.getCountry());
        return locale;
    }

    @Override
    public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {

    }
}
DruidConfig.java
package com.mengxuegu.springboot.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;
import javax.sql.DataSource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
* 绑定Druid相关信息
*/
@Configuration
public class DruidConfig {


    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource druid() {
        return new DruidDataSource();
    }

    /**
     * 配置一个druid的监控
     * 1. 配置一个druid的后台 管理servlet
     * 2. 配置一个druid的filter
     *
     */
    // 1. 配置一个druid的后台管理servlet
    @Bean
    public ServletRegistrationBean statViewServlet() {
        //注意:请求是 /druid/*
        ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");

        //设置初始化参数值
        Map<String, String> initParam = new HashMap<>();

        initParam.put(StatViewServlet.PARAM_NAME_USERNAME, "root");
        initParam.put(StatViewServlet.PARAM_NAME_PASSWORD, "123");
        //如果不写,则默认所有ip都可以访问
        initParam.put(StatViewServlet.PARAM_NAME_ALLOW, "");
        initParam.put(StatViewServlet.PARAM_NAME_DENY, "192.168.10.1");

        bean.setInitParameters(initParam);

        return bean;
    }

    //2. 配置一个druid的filter
    @Bean
    public FilterRegistrationBean webStatFilter() {
        FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
        bean.setFilter(new WebStatFilter());

        Map<String, String> initPrams = new HashMap<>();
        initPrams.put(WebStatFilter.PARAM_NAME_EXCLUSIONS, "*.js,*.css,/druid/*");
        bean.setInitParameters(initPrams);

        //设置拦截请求
        bean.setUrlPatterns(Arrays.asList("/*"));
        return bean;
    }

}
MySpringMvcConfigurer.java
package com.mengxuegu.springboot.config;

import com.mengxuegu.springboot.component.MyLocaleResolver;
import com.mengxuegu.springboot.interceptor.LoginHandlerInterceptor;
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;

/**
*/
@Configuration
public class MySpringMvcConfigurer {


    @Bean
    public WebMvcConfigurer webMvcConfigurer() {
        return new WebMvcConfigurer(){
            //添加视图控制
            @Override
            public void addViewControllers(ViewControllerRegistry registry) {
                registry.addViewController("/").setViewName("main/login");
                registry.addViewController("/index.html").setViewName("main/login");
                registry.addViewController("/main.html").setViewName("main/index");
            }

            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                registry.addInterceptor(new LoginHandlerInterceptor())
                        //指定要拦截的请求 /** 表示拦截所有请求
                        .addPathPatterns("/**")
                        //排除不需要拦截的请求路径
                        .excludePathPatterns("/", "/index.html", "/login")
                        //springboot2+之后需要将静态资源文件的访问路径 也排除
                        .excludePathPatterns("/css/*", "/img/*","/js/*");
            }
        };
    }

    //区域解析器
    @Bean
    public LocaleResolver localeResolver() {
        return new MyLocaleResolver();
    }


}
BillController.java
 
package com.mengxuegu.springboot.controller;

import com.mengxuegu.springboot.dao.ProviderDao;
import com.mengxuegu.springboot.entities.Bill;
import com.mengxuegu.springboot.entities.BillProvider;
import com.mengxuegu.springboot.entities.Provider;
import com.mengxuegu.springboot.mapper.BillMapper;
import com.mengxuegu.springboot.mapper.ProviderMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
*/
@Controller
public class BillController {
    Logger logger = LoggerFactory.getLogger(getClass());


    @Autowired
    ProviderMapper providerMapper;

    @Autowired
    BillMapper billMapper;
   
    @GetMapping("/bills")
    public String list(Map<String, Object> map, Bill bill) {
        logger.info("帐单列表查询。。。" + bill);

        List<BillProvider> billProviders = billMapper.getBills(bill);

        //获取所有的供应商
        List<Provider> providers = providerMapper.getProviders(null);

        map.put("billProviders", billProviders);
        map.put("providers", providers);

        //用于搜索处回显数据
        map.put("billName", bill.getBillName());
        map.put("pid", bill.getPid());
        map.put("pay", bill.getPay());

        return "bill/list";
    }

    /**
     * type = null 进入查看详情页面view.html,
     * type=update 则是进入update.html
     * @return
     */
    @GetMapping("/bill/{bid}")
    public String view(@PathVariable("bid") Integer bid,
                       @RequestParam(value="type", defaultValue = "view") String type,
                       Map<String, Object> map) {
        logger.info("查询" + bid + "的详细信息");

        BillProvider billProvider = billMapper.getBillByBid(bid);

        if( "update".equals(type)) {
            List<Provider> providers = providerMapper.getProviders(null);
            map.put("providers", providers);
        }

        map.put("billProvider", billProvider);

        // type = null 则进入view.html, type=update 则是进入update.html
        return "bill/" + type;
    }

    //修改信息
    @PutMapping("/bill")
    public String update(Bill bill) {
        logger.info("更改信息。。。");
        //更新操作
        billMapper.updateBill(bill);

        return "redirect:bills";
    }

    //前往添加 页面
    @GetMapping("/bill")
    public String toAddPage(Map<String, Object> map) {
        //查询所有供应端
//        List<Provider> providers = providerMapper.getProviders(null);
        map.put("providers", providerMapper.getProviders(null) );
        return "bill/add";
    }


    //添加数据
    @PostMapping("/bill")
    public String add(Bill bill) {
        logger.info("添加数据" + bill);
        //保存数据操作
        billMapper.addBill(bill);

        return "redirect:/bills";
    }

    //删除
    @DeleteMapping("/bill/{bid}")
    public String delete(@PathVariable("bid") Integer bid) {
        logger.info("删除操作, bid=" + bid);
        billMapper.deteleBillByBid(bid);
        return "redirect:/bills";
    }

}
LoginController.java
package com.mengxuegu.springboot.controller;

import com.mengxuegu.springboot.entities.User;
import com.mengxuegu.springboot.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

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

/**
*/
@Controller
public class LoginController {

    @Autowired
    UserMapper userMapper;

    @PostMapping("/login")
    public String login (HttpSession session, String username, String password, Map<String, Object> map) {


        if(!StringUtils.isEmpty(username)
                && !StringUtils.isEmpty(password)) {
            User user = userMapper.getUserByUsername(username);
            if(user != null && user.getPassword().equals(password)) {
                //登录成功
                session.setAttribute("loginUser", user);
                //重定向 redirect:可以重定向到任意一个请求中(包括其他项目),地址栏改变
                return "redirect:/main.html";
            }

        }
        //登录失败
        map.put("msg", "用户名或密码错误");

        return "main/login";

    }

    /**
     * 退出登录
     * @return
     */
    @GetMapping("/logout")
    public String logout(HttpSession session) {
        //1. 清空session中的用户信息
        session.removeAttribute("loginUser");
        //2. 再将session进行注销
        session.invalidate();
        //3. 返回登录页面
        return "redirect:/index.html";
    }

}
ProviderController.java
package com.mengxuegu.springboot.controller;

import com.mengxuegu.springboot.dao.ProviderDao;
import com.mengxuegu.springboot.entities.Provider;
import com.mengxuegu.springboot.mapper.ProviderMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
* 供应商的控制层
*/
@Controller
public class ProviderController {
    Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    ProviderDao providerDao;
   
    @Autowired
    ProviderMapper providerMapper;
   

    @GetMapping("/providers")
    public String list(Map<String, Object> map, Provider provider) {
        logger.info("供应商列表查询。。。" + provider);

        List<Provider> providers = providerMapper.getProviders(provider);

        map.put("providers", providers);
        map.put("providerName", provider.getProviderName());

        return "provider/list";
    }

    /**
     * type = null 进入查看详情页面view.html,
     * type=update 则是进入update.html
     * @param pid 供应商id
     * @param type
     * @param map
     * @return
     */
    @GetMapping("/provider/{pid}")
    public String view(@PathVariable("pid") Integer pid,
                       @RequestParam(value="type", defaultValue = "view") String type,
                       Map<String, Object> map) {
        logger.info("查询" + pid + "的供应商详细信息");

        Provider provider = providerMapper.getProviderByPid(pid);

        map.put("provider", provider);

        // type = null 则进入view.html, type=update 则是进入update.html
        return "provider/" + type;
    }

    //修改供应商信息
    @PutMapping("/provider")
    public String update(Provider provider) {
        logger.info("更改供应商信息。。。");
        //更新操作
        providerMapper.updateProvider(provider);

        return "redirect:providers";
    }

    //前往添加 页面
    @GetMapping("/provider")
    public String toAddPage() {
        return "provider/add";
    }


    //添加数据
    @PostMapping("/provider")
    public String add(Provider provider) {
        logger.info("添加供应商数据" + provider);
        //保存数据操作
        providerMapper.addProvider(provider);

        return "redirect:/providers";
    }

    //删除供应商
    @DeleteMapping("/provider/{pid}")
    public String delete(@PathVariable("pid") Integer pid) {
        logger.info("删除操作, pid=" + pid);
        providerMapper.deleteProviderByPid(pid);
        return "redirect:/providers";
    }
}
UserController.java
package com.mengxuegu.springboot.controller;

import com.mengxuegu.springboot.dao.ProviderDao;
import com.mengxuegu.springboot.entities.Provider;
import com.mengxuegu.springboot.entities.User;
import com.mengxuegu.springboot.mapper.ProviderMapper;
import com.mengxuegu.springboot.mapper.UserMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.Map;

/**
* 供应商的控制层
*/
@Controller
public class UserController {
    Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    UserMapper userMapper;
   

    @GetMapping("/users")
    public String list(Map<String, Object> map, User user) {
        logger.info("用户列表查询。。。" + user);

        List<User> users = userMapper.getUsers(user);

        map.put("users", users);
        map.put("username", user.getUsername());

        return "user/list";
    }

    /**
     * type = null 进入查看详情页面view.html,
     * type=update 则是进入update.html
     */
    @GetMapping("/user/{id}")
    public String view(@PathVariable("id") Integer id,
                       @RequestParam(value="type", defaultValue = "view") String type,
                       Map<String, Object> map) {
        logger.info("查询" + id + "的详细信息");

        User user = userMapper.getUserById(id);

        map.put("user", user);

        // type = null 则进入view.html, type=update 则是进入update.html
        return "user/" + type;
    }

    //修改供应商信息
    @PutMapping("/user")
    public String update(User user) {
        logger.info("更改信息。。。");
        //更新操作
        userMapper.updateUser(user);

        return "redirect:users";
    }

    //前往添加 页面
    @GetMapping("/user")
    public String toAddPage() {
        return "user/add";
    }


    //添加数据
    @PostMapping("/user")
    public String add(User user) {
        logger.info("添加数据" + user);
        //保存数据操作
        userMapper.addUser(user);

        return "redirect:/users";
    }

    //删除
    @DeleteMapping("/user/{id}")
    public String delete(@PathVariable("id") Integer id) {
        logger.info("删除操作, id=" + id);
        userMapper.deleteUserById(id);

        return "redirect:/users";
    }

    @GetMapping("/user/pwd")
    public String toUpdatePwdPage() {
        return "main/password";
    }

    @ResponseBody
    @GetMapping("/user/pwd/{oldPwd}")
    public Boolean checkPwd(HttpSession session, @PathVariable("oldPwd") String oldPwd) {
        logger.info("旧密码:" + oldPwd);
        //1.从Session中获取当前登录用户的User对象
        User user = (User) session.getAttribute("loginUser");
        if(user.getPassword().equals(oldPwd)) {
            //输入的旧密码正确
            return true;
        }
        return false;
    }

    @PostMapping("/user/pwd")
    public String updatePwd(HttpSession session, String password) {
        //1.从Session中获取当前登录用户信息
        User user = (User) session.getAttribute("loginUser");
        //2. 更新密码
        user.setPassword(password);
        //3. 提交到数据库
        userMapper.updateUser(user);
        //4. 注销重新登录
        return "redirect:/logout";
    }


}
BillDao.java
package com.mengxuegu.springboot.dao;


import com.mengxuegu.springboot.entities.Bill;
import com.mengxuegu.springboot.entities.Provider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.util.StringUtils;

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

@Repository
public class BillDao {

    private static Map<Integer, Bill> billMap = null;
    private static Integer initId = 3006;

    @Autowired
    private ProviderDao providerDao;

    static {
        billMap = new HashMap<Integer, Bill>();
        billMap.put(3001, new Bill(3001, "Bi-AA11", "粮油aaa", "斤", 80,480.8, new Provider(2002, "PR-BB", "梦学谷供应商222", "小李", "18888666982", "深圳软件园", "0911-0123453", "品质B"), 1));
        billMap.put(3002, new Bill(3002, "Bi-BB11", "粮油bbb", "斤", 90,390.9,new Provider(2001, "PR-AA", "梦学谷供应商111", "小张", "18888666981", "深圳软件园", "0911-0123456", "品质A"), 2));
        billMap.put(3003, new Bill(3003, "Bi-CC11", "鲜花", "朵", 99,199.9, new Provider(2003, "PR-CC", "梦学谷供应商333", "小白", "18888666983", "深圳软件园", "0911-0123454", "品质C"), 1));
        billMap.put(3004, new Bill(3004, "Bi-DD11", "电脑", "台", 10,100000.1, new Provider(2004, "PR-DD", "梦学谷供应商444", "小梦", "18888666984", "深圳软件园", "0911-0123451", "品质D"), 1));
        billMap.put(3005, new Bill(3005, "Bi-EE11", "手机", "部", 8,50000.6, new Provider(2005, "PR-EE", "梦学谷供应商555", "小谷", "18888666985", "深圳软件园", "0911-0123452", "品质E"), 2));

    }


    public void save(Bill bill){
        if(bill.getBid() == null){
            bill.setBid(initId++);
        }
        //添加供应商
        bill.setProvider( providerDao.getProvider( bill.getProvider().getPid() ));

        billMap.put(bill.getBid(), bill);
    }

    public Collection<Bill> getAll(){
        return billMap.values();
    }

    /**
     * 搜索查询
     * @param bill
     * @return
     */
    public Collection<Bill> getAll(Bill bill){
        Collection<Bill> bills = getAll();

        if (!StringUtils.isEmpty(bill.getBillName())) {
            //
        }
        if (bill.getProvider().getPid() != null) {
            //
        }
        if (bill.getPay() != null) {
            //
        }
        return bills;
    }

    public Bill get(Integer id){
        return billMap.get(id);
    }

    public void delete(Integer id){
        billMap.remove(id);
    }
}
LoginHandlerInterceptor.java
package com.mengxuegu.springboot.interceptor;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 {
        Object loginUser = request.getSession().getAttribute("loginUser");
        if( loginUser != null) {
            //已经登录过,放行
            return true;
        }
        //没有登录过
        request.setAttribute("msg", "没有权限,请先登录!");
        request.getRequestDispatcher("/index.html").forward(request, response);
        return false;
    }
}
原文地址:https://www.cnblogs.com/carpe/p/11049374.html