SpringBoot简单Web项目开发

springBoot基础Web项目开发

要解决的问题:

  • 导入静态资源
  • 首页
  • jsp,模板引擎Thymeleaf
  • 装配扩展SpringMVC
  • crud
  • 拦截器
  • 扩展:国际化

1 静态资源

protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    super.addResourceHandlers(registry);
    if (!this.resourceProperties.isAddMappings()) {
        logger.debug("Default resource handling disabled");
    } else {
        ServletContext servletContext = this.getServletContext();
        this.addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
        this.addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
            registration.addResourceLocations(this.resourceProperties.getStaticLocations());
            if (servletContext != null) {
                registration.addResourceLocations(new Resource[]{
                    new ServletContextResource(servletContext, "/")
                });
            }

        });
    }
}

方式1:locallhoust:8080/webjars/…

需要导入jqery,基本上很少使用这种方法导入静态资源

addResourceHandler方法映射了资源目录,可以将导入的jar包路径缩写,就形成了上面的url。

"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"

根据源码可以知道在以上这些目录都能放静态资源,优先级依次递减

另外也有一个/** 被定义了,这是默认的资源目录,也就是说标准目录resources下的所有静态资源文件也都能找到

this.mvcProperties.getStaticPathPattern()

另外也可以通过配置文件加入spring.mvc.static-path-pattern=…来自定义配置,但用这种方法的话其他所有静态资源目录都会失效。

2 Thymeleaf的基本使用

首页index.html,放在标准目录下的public下。也可以自己定制首页路径,使用controller或者配置类来配置首页。

thymeleaf:

导入thymeleaf头文件:

<html lang="en" xmlns:th="http://www.thymeleaf.org">

常用标签

<!--忽视html标签-->
<div th:text="${msg}"></div>
<!--识别字符串中的html标签-->
<div th:utext="${msg}"></div>

遍历:

<!--th:each遍历-->
<h3 th:each="user:${users}" th:text="${user}"></h3>
<!--第二种写法-->
<h3 th:each="user:${users}">[[${user}]]</h3>

注意:url使用@{}来引用

3 装配扩展SpringMVC

如何自定义添加自己的MVC视图解析器

//如果 想diy一些定制化的功能,只要写这个组件,然后把他交给springboot,springboot会帮我们自动装配
//扩展springMVC  DispatcherServlet
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    //ViewResolver 实现了视图解析器的类,我们就可以把它看成视图解析器

    @Bean
    public ViewResolver myViewResolver(){
        return new MyViewResolver();
    }


    //自定义了一个视图解析器MyViewResolver
    public static class MyViewResolver implements ViewResolver {
        @Override
        public View resolveViewName(String s, Locale locale) throws Exception {
            return null;
        }
    }
}

SpringBoot简单Web项目开发

//如果要扩展springMVC,官方建议我们这样做
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    //视图跳转
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/qtds").setViewName("test");

    }
}

4 拦截器

1、 编写拦截器类

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;
        }
        return true;
    }

}

2、在自定义的mvc配置文件中配置拦截器:

//重写添加拦截器方法addInterceptors
@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new LoginHandlerInterceptor())
        		//表示拦截所有请求
                .addPathPatterns("/**")	
        		//放行的请求
                .excludePathPatterns("/index.html","/","/user/login","/css/*","/js/**","/img/**","/emp/**");
}

5 抽取公共界面

先提取公共部分,标签内加上:th:fragment="Sidebar"

之后在需要使用的地方添加:

<div th:insert="~{dashboard::Sidebar}"></div>

如果要传递参数,thymeleaf可以直接使用()传参,不再需要用?。

6 crud

没什么好写的,都是基础

注意日期格式,spring默认日期格式为:2020/1/1,以/连接,如果需要更改,在配置文件里修改:

spring.mvc.format.date=dd-MM-yyyy

thymeleaf循环遍历,使用th:each

<option th:each="dept:${departments}"
      th:text="${dept.getDepartmentName()}"
      th:value="${dept.getId()}">
</option>
<tr th:each="emp:${emps}">
   <td th:text="${emp.getId()}"></td>
   <td th:text="${emp.getLastName()}"></td>
   <td th:text="${emp.getEmail()}"></td>
   <td th:text="${emp.getGender()==0?'女':'男'}"></td>
   <td th:text="${emp.getDepartment().getDepartmentName()}"></td>
   <td th:text="${#dates.format(emp.getBirth(),'yyyy-MM-dd HH:mm:ss')}"></td>
   <td>
      <button class="btn btn-sm btn-primary">编辑</button>
      <button class="btn btn-sm btn-danger">删除</button>
   </td>
</tr>

thymeleaf restful风格:

<a th:href="@{/emp/{id}(id=${emp.getId()})}">编辑</a>

扩展:国际化

1 配置i18n文件

2 我们如果需要在项目中进行按钮切换,我们需要自定义一个组件,实现LocaleResolver接口

public class MyLocaleResolver implements LocaleResolver {

    //解析请求
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        //获取请求中的语言参数
        String language = request.getParameter("language");

        Locale locale = Locale.getDefault();    //如果没有就用默认的

        //如果有参数
        if(!StringUtils.isEmpty(language)){
            //zh_CN
            final String[] splict = language.split("_");
            //语言,国家
            locale = new Locale(splict[0], splict[1]);
        }

        return locale;
    }

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

    }
}

3 记得将自己写的组件配置到spring容器中@Bean

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

4 Thymeleaf使用#{}取值

上一篇:C语言标准库(1)


下一篇:在Android中使用自定义语言环境扩展视图