SpringBootWeb初见


目录

  • [怎么开发一个网站?]
  • [静态资源]
  • [找到静态资源的存放目录]
  • [扩展自定义路径]
  • [首页定制]
  • [模板引擎Thymeleaf]
  • [员工管理系统-初见]
  • [国际化]
    • [国际化实现]
    • [编写国际化配置类]
  • [登陆功能]
    • [编写index.html设置请求路径]
    • [编写LoginController]
    • [编写MVC自定义配置]
  • [拦截器]
    • [修改LoginController]
    • [编写拦截器]
    • [在MVC自定义配置类中设置]


怎么开发一个网站?

目前后端通过修改基本都是可以实现,主要是前端还存在不少问题,所以还是推荐使用

  • 模板,更改别人的,成为自己的
  • 使用框架,组件,自己手动拼接
  • 前端搞定:页面写出来
  • 设计数据库(难点)
  • 前端可以独立的自动运行,独立化工程
  • 数据接口怎么对接:json,对象all in one
  • 前后端联调测试

有一个熟悉的后台模板,前端页面自己可以组合出来一个网站的页面,让它独立运行。

静态资源

SpringMVC中所有静态资源或者页面应该放在web目录下,不能直接访问的会放在web/WEB-INF

找到静态资源的存放目录

SpringBoot项目的静态资源应该放在哪个目录下? WebMvcAutoConfiguration

//添加资源处理器
public void addResourceHandlers(ResourceHandlerRegistry registry) {
      //如果静态资源已经被自定义了 那么就自定义的生效
            if (!this.resourceProperties.isAddMappings()) {
                logger.debug("Default resource handling disabled");
                Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
                CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
                //获取静态资源方式一:找到webjars/路径下的静态资源 (此方式了解即可 一般不使用)
                if (!registry.hasMappingForPattern("/webjars/**")) {
                    this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{"/webjars/**"}).addResourceLocations(new String[]{"classpath:/META-INF/resources/webjars/"}).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
                }
                String staticPathPattern = this.mvcProperties.getStaticPathPattern();
                //获取静态资源方式二: 获取当前目录下的静态资源 staticPathPattern
                if (!registry.hasMappingForPattern(staticPathPattern)) {
                    this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{staticPathPattern})
                    .addResourceLocations(WebMvcAutoConfiguration.getResourceLocations(this.resourceProperties.getStaticLocations()))
                    .setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
                }
            }
        }

点进staticPathPattern继续查看源码,staticPathPattern代表/**

点进(this.resourceProperties.getStaticLocations())会发现以下路径定义

// 访问 /** 会去这几个目录下寻找静态资源
 private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]
 {"classpath:/META-INF/resources/", 
 "classpath:/resources/", 
 "classpath:/static/", 
 "classpath:/public/"};

优先级

目录优先级
resources
static
public
扩展自定义路径 
------------------

从源码的第一行们可以看出,如果静态资源路径被自定义了,那么就会生效自定义的

在application配置文件中 设置如下 覆盖默认路径 spring.mvc.static-path-pattern=/tutony

首页定制 
------------------------

在`WebMvcAutoConfiguration`有:
 //最后会被注入到bean
    @Bean //欢迎页的处理映射
    public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext, FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
        WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(new TemplateAvailabilityProviders(applicationContext), applicationContext, 
        this.getWelcomePage(), 
        //可以寻找自定义欢迎页
        this.mvcProperties.getStaticPathPattern());
        welcomePageHandlerMapping.setInterceptors(this.getInterceptors(mvcConversionService, mvcResourceUrlProvider));
        welcomePageHandlerMapping.setCorsConfigurations(this.getCorsConfigurations());
        return welcomePageHandlerMapping;
    }
   // 在静态目录下寻找
    private Optional<Resource> getWelcomePage() {
        String[] locations = WebMvcAutoConfiguration.getResourceLocations(this.resourceProperties.getStaticLocations());
        return Arrays.stream(locations).map(this::getIndexHtml).filter(this::isReadable).findFirst();
    }
    //返回静态资源目录下一个叫 index.html的文件
    private Resource getIndexHtml(String location) {
        return this.resourceLoader.getResource(location + "index.html");
    }
因此从源码可以看出们在静态资源目录下定义一个`index.html`文件
SpringBoot将自动识别为首页(欢迎页)

模板引擎Thymeleaf 
------------------------

前端交给们的页面,是html页面。

如果是们以前开发,们需要把他们转成jsp页面,
SpringBoot这个项目首先是以jar的方式,不是war,像第二,们用的还是嵌入式的Tomcat,所以呢,他现在默认是不支持jsp的。

那不支持jsp,如果们直接用纯静态页面的方式,那给们开发会带来非常大的麻烦,那怎么办呢,SpringBoot推荐你可以来使用模板引擎。

模板引擎有非常多,但再多的模板引擎,他们的思想都是一样的:

![](https://static.oomspot.com/image/cnbo/2020/2465789-20210823130653462-1449595908.png)
thymeleaf中文文档:<https://raledong.gitbooks.io/using-thymeleaf/content/Chapter1/>

员工管理系统-初见 
------------------------

员工管理系统-初见 地址:<https://gitee.com/zwtgit/spring-boot-web>

关于Thymeleaf相关的操作就不说了,本人不推荐使用。

下面主要说一下SpringBoot的特殊操作。

国际化 
----------
> 什么是页面国际化?


们在很多网站上看到的中英文切换,这个就叫做国际化
Spring Boot 和 Spring 一脉相承,对于国际化的支持,

默认是通过 **AcceptHeaderLocaleResolver** 解析器来完成的,

这个解析器,默认是通过请求头的 Accept-Language 字段来判断当前请求所属的环境的,进而给出合适的响应。
 国际化实现 
1.在`resource`目录下新建`i18n`(国际化单词的简写)文件夹

国际化,也叫 i18n,为啥叫这个名字呢?因为国际化英文是 internationalization ,

在 i 和 n 之间有 18 个字母,所以叫 i18n。

们的应用如果做了国际化就可以在不同的语言环境下,方便的进行切换,

最常见的就是中文和英文之间的切换,国际化这个功能也是相当的常见。

2.创建`Login.properties`三个配置文件

Login_en_US.properties(英语) Login.tip=Please sign in Login.password=Password Login.remenber=Remember me Login.username=Username Login.sign=Sign in Login_zh_CN.properties(中文) Login.tip=用户登录 Login.password=密码 Login.remenber=记住 Login.username=用户名 Login.sign=登录

4.在springboot配置文件`application.properties`中指定国际化配置文件路径
     配置国际化文件位置
    spring.messages.basename=i18n.Login
5.在Thymeleaf中国际化的配置需要使用``包裹
 编写国际化配置类 

/**

  • 国际化配置类
  • 需要实现LocaleResolver */ public class MyLocaleResolover implements LocaleResolver { //解析请求 @Override public Locale resolveLocale(HttpServletRequest httpServletRequest) {
    //获取请求中的语言参数
    String languge = httpServletRequest.getParameter("l");
    Locale locale = Locale.getDefault();//如果没有泽使用默认的
    //如果请求的链接携带了国际化参数
    if(!StringUtils.isEmpty(languge)){
        //zh_CN
        String[] s = languge.split("_");
        //国际 地区
        locale = new Locale(s[0], s[1]);
    }
    return locale;
    
    } @Override public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) { } }

将国际化配置类放入spring容器

/**
 * 扩展MVC
 */
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    /**
     * 视图跳转
     * 添加首页控制
     * url:localhost:8080/ 跳转到首页
     * url:localhost:8080/index.html 跳转到首页
     * @param registry
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
        registry.addViewController("/index.html").setViewName("index");
    }
    /**
     * 讲国际化配置放到spring容器管理
     * @return 自定义的国际化配置
     */
    @Bean
    public LocaleResolver localeResolver(){
        return new MyLocaleResolover();
    }
}

页面国际化∶

  1. 们需要配置i18n文件
  2. 们如果需要在项目中进行按钮自动切换,们需要自定义一个组件LocaleResolver
  3. 记得将自己写的组件配置到spring容器@Bean
  4. 国际化使用:

登陆功能

编写index.html设置请求路径

编写html 编写LoginController

/**
 * 登录功能实现
 */
@Controller
public class LoginController {
    //登录功能 伪造假数据
    @RequestMapping("/user/login")
    public String login(@RequestParam("username") String username, @RequestParam("password")String password, Model model){
        if (!StringUtils.isEmpty(username.trim()) && password.trim().equals("123456")){
            model.addAttribute("msg","登录成功");
            return "redirect: /main.html"; //重定向
        }
        model.addAttribute("msg","账号或密码错误");
        return "index";
    }
}

编写MVC自定义配置

   /**
     * 视图跳转
     * 添加首页控制
     * url:localhost:8080/ 跳转到首页
     * url:localhost:8080/index.html 跳转到首页
     * @param registry
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
        registry.addViewController("/index.html").setViewName("index");
        //登录重定向
        registry.addViewController("/main.html").setViewName("dashboard");
    }

拦截器

修改LoginController

修改LoginController代码,登录成功以后将用户信息放在session中:

   //登录功能 伪造假数据
    @RequestMapping("/user/login")
    public String login(@RequestParam("username") String username, @RequestParam("password")String password, Model model, HttpSession httpSession){
        if (!StringUtils.isEmpty(username.trim()) && password.trim().equals("123456")){
            model.addAttribute("msg","登录成功");
            httpSession.setAttribute("userLoginInfo",username);//登录成功以后将用户信息放置在Session中
            return "redirect:/main.html"; //重定向
        }
        model.addAttribute("msg","账号或密码错误");
        return "index";
    }

编写拦截器

/**
 * 自定义拦截器
 * 拦截未登录的用户
 */
public class MyInterceptor implements HandlerInterceptor {
    //判断用户是否登录 从session中判断
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取Session
        HttpSession session = request.getSession();
        //判断是否在登录页面
        if(request.getRequestURI().contains("index")){
            return true;
        }
        //判断是否登录过了
        if(session.getAttribute("userLogin")!=null){
            return true;
        }
        // 用户没有登陆跳转到登陆页面
        request.setAttribute("msg","没有登录请先登录!");
        request.getRequestDispatcher("/").forward(request, response);
        return false;
    }
}

在MVC自定义配置类中设置

 //配置拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                //拦截哪些请求
                .addPathPatterns("/**")
                //不拦截哪些请求 首页 登录请求 静态资源
                .excludePathPatterns("/","/index.html","/user/login","/css/**","/js/**","/img/**");
    }

原文创作:ML李嘉图

原文链接:https://www.cnblogs.com/zwtblog/p/15175435.html

文章列表

更多推荐

更多
  • Java开发常见错误100例-29数据和代码:数据就是数据,代码就是代码 29 数据和代码:数据就是数据,代码就是代码 今天,我来和你聊聊数据和代码的问题。 正如这一讲标题"数据就是数据方面的很多漏洞,都是源自把数据当成了代码来执行,也就是注入类问题,比如: 客户端提供给服务端的查询值,是一个数据,会
  • Java开发常见错误100例-33加餐3:定位应用问题,排错套路很重要 33 加餐3:定位应用问题,排错套路很重要 咱们这个课程已经更新 13 讲了,感谢各位同学一直在坚持学习,并在评论区留下了很多高质量,有的是分享自己曾经踩的坑,有的是对课后思考题的详细解答,还有的是提出了非常好的问题,进一步丰富了这
  • Java开发常见错误100例-36加餐6:这15年来,我是如何在工作中学习技术和英语的? 36 加餐6:这15年来,我是如何在工作中学习技术和英语的? 今天,我来和你聊聊如何在工作中,让自己成长得更快。 工作这些年来,经常会有同学来找我沟通学习和成长,他们的问题可以归结为沟通学习和成长,他们的问题可以归结为两个。 一
  • Java开发常见错误100例-16用好Java8的日期时间类,少踩一些“老三样”的坑 16 用好Java 8的日期时间类,少踩一些"老三样"的坑 今天,我来和你说说恼人的时间错乱问题。 在,使用 Date、Calender 和 SimpleDateFormat,来声明时间戳、使用日历处理日期和格式化解析日期时间。但
  • Java开发常见错误100例-答疑篇:代码篇思考题集锦(一) 答疑篇:代码篇思考题集锦(一)题的答案。因此呢,我特地将这个课程涉及的思考题进行了梳理,把其中的 67 个问题的答案或者说解题思路,详细地写了出来,并整理成了一个"答疑篇"模块。 我把这些问题拆分为了 6 篇分别更新,你可以根据自己的
  • Java开发常见错误100例-30如何正确保存和传输敏感数据? 30 如何正确保存和传输敏感数据? 今天,我们从安全角度来聊聊用户名、密码、身份证等敏的散列、对称加密和非对称加密算法,以及 HTTPS 等相关知识。 应该怎样保存用户密码? - 最敏感的数据恐怕就是用户的密
  • Java开发常见错误100例-15序列化:一来一回你还是原来的你吗? 15 序列化:一来一回你还是原来的你吗? 今天,我来和你聊聊序列化相关的坑和最佳实践。 序列化是把对象转换为字节流的过程,以方便传输或存储。反序列化,则是反过来把字节流转换为对象化,则是反过来把字节流转换为对象的过程。在介绍文件
  • Java开发常见错误100例-23缓存设计:缓存可以锦上添花也可以落井下石 23 缓存设计:缓存可以锦上添花也可以落井下石 今天,我从设计的角度,与你聊聊缓存。 通常我们会使用更快的介质(比如内存)作(比如磁盘)读取数据慢的问题,缓存是用空间换时间,来解决性能问题的一种架构设计模式。更重要的是,磁盘上存储
  • Java开发常见错误100例-17别以为“自动挡”就不可能出现OOM 17 别以为"自动挡"就不可能出现OOM 今天,我要和你分享的主题是,别以为"自动挡"就不可能出现 OOM。 这里的"自动挡",是我自动垃圾收集器的戏称。的确,经过这么多年的发展,Java 的垃圾收集器已经非常成熟了。有了自动垃圾
  • Java开发常见错误100例-结束语写代码时,如何才能尽量避免踩坑? 结束语 写代码时,如何才能尽量避免踩坑? -余时间都用了在这个课程的创作,以及回答你的问题上,很累很辛苦,但是看到你的认真学习和对课程内容的好评,看到你不仅收获了知识还燃起了钻研源码的热情,我也非常高兴,深觉一切的辛苦付出都是甜蜜的。
  • 近期文章

    更多
    文章目录

      推荐作者

      更多