Spring Boot学习笔记-5

Spring Boot学习笔记-5

一、Restful-CRUD

普通CRUD(uri来区分操作)RestfulCRUD
查询getEmpemp—GET
添加addEmp?xxxemp—POST
修改updateEmp?id=xxx&xxx=xxemp/{id}—PUT
删除deleteEmp?id=1emp/{id}—DELETE
功能请求URI请求方式
查询所有员工empsGET
查询某个员工(来到修改页面)emp/1GET
来到添加页面empGET
添加员工empPOST
修改员工empPUT
删除员工emp/1DELETE

(1)将请求映射到页面

1.方法有返回值,会得到Thymeleaf模板引擎解析,在templates包下找返回页面

//HelloController
//"/"和"index.html"都会返回index界面
@RequestMapping({"/","index.html"})
public String login()
{
    return "login";
}

2.重写addViewControllers,通过视图解析器将请求映射到相应页面

//MyMvcConfig implements WebMvcConfigurer
 //将组件注册在容器中
@Bean
public WebMvcConfigurer WebMvcConfigurer()
{
    WebMvcConfigurer configurer = new WebMvcConfigurer() {
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/").setViewName("login");
            registry.addViewController("/index.html").setViewName("login");
        }
    };
    return configurer;
}

(2)pom文件中的Thymeleaf应用

<!-- @{}引入URL,好处是需要修改时可直接在配置文件中修改(server.servlet.context-path=XXX) -->
<link href="asserts/css/bootstrap.min.css" th:href="@{/webjars/bootstrap/4.5.3/css/bootstrap.css}" rel="stylesheet">
<!-- Custom styles for this template -->
<link href="asserts/css/signin.css" th:href="@{asserts/css/signin.css}" rel="stylesheet">

(3)国际化

1)SpringMVC进行国际化配置步骤

1.编写国际化配置文件
2.使用ResourceBundleMessageSource管理国际化资源文件
3.在页面使用fmt:message取出国际化内容

2)Spring Boot进行国际化配置步骤

1.编写国际化配置文件,抽取要显示的国际化消息
IDEA可自动识别显示国际化视图,在该界面可快捷添加配置(Resource Bundle)
在这里插入图片描述

2.Spring Boot已自动配置了管理国际化资源文件的组件

//MessageSourceAutoConfiguration
@Bean
public MessageSource messageSource(MessageSourceProperties properties) {
	ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
	if (StringUtils.hasText(properties.getBasename())) {
        //设置国际化资源文件基础名(去掉语言&国家代码,如_zh_CN)
		messageSource.setBasenames(StringUtils
				.commaDelimitedListToStringArray(StringUtils.trimAllWhitespace(properties.getBasename())));
	}
	if (properties.getEncoding() != null) {
		messageSource.setDefaultEncoding(properties.getEncoding().name());
	}
	messageSource.setFallbackToSystemLocale(properties.isFallbackToSystemLocale());
	Duration cacheDuration = properties.getCacheDuration();
	if (cacheDuration != null) {
		messageSource.setCacheMillis(cacheDuration.toMillis());
	}
	messageSource.setAlwaysUseMessageFormat(properties.isAlwaysUseMessageFormat());
	messageSource.setUseCodeAsDefaultMessage(properties.isUseCodeAsDefaultMessage());
	return messageSource;
}
//MessageSourceProperties
//默认基础名为messages,即messages.properties不需配置
private String basename = "messages";
//指定基础名
spring.messages.basename=包名.XXX

3.获取国际化值

//Thymeleaf采用#{}获取国际化值
//placeholder也要用Thymeleaf内置属性换掉
<label class="sr-only" th:text="#{login.username}">Username</label>
<input type="text" class="form-control" placeholder="Username" th:placeholder="#{login.username}" required="" autofocus="">

注意th:text只能用在标签体中,不能用在input中,应采用行内表达式

在这里插入图片描述

<input type="checkbox" value="remember-me"> [[#{login.remember}]]

避免中文出现乱码应采用UTF-8,在设置中修改
在这里插入图片描述

4.Locale区域信息对象

SpringMVC中通过LocaleResolver组件获取区域信息对象,Spring Boot中做了相应配置

//WebMvcAutoConfiguration
//无自定义LocaleResolver时使用默认组件
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "spring.mvc", name = "locale")
public LocaleResolver localeResolver() {
	if (this.mvcProperties.getLocaleResolver() == WebMvcProperties.LocaleResolver.FIXED) {
		return new FixedLocaleResolver(this.mvcProperties.getLocale());
	}
	AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
	localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
	return localeResolver;
}
//AcceptHeaderLocaleResolver
@Override
public Locale resolveLocale(HttpServletRequest request) {
	Locale defaultLocale = getDefaultLocale();
	if (defaultLocale != null && request.getHeader("Accept-Language") == null) {
		return defaultLocale;
	}
	Locale requestLocale = request.getLocale();
	List<Locale> supportedLocales = getSupportedLocales();
	if (supportedLocales.isEmpty() || supportedLocales.contains(requestLocale)) {
		return requestLocale;
	}
	Locale supportedLocale = findSupportedLocale(request, supportedLocales);
	if (supportedLocale != null) {
		return supportedLocale;
	}
	return (defaultLocale != null ? defaultLocale : requestLocale);
}

在链接请求中附加国际化值

<a class="btn btn-sm" th:href="@{/login.html(l='zh_CN')}">中文</a>
<a class="btn btn-sm" th:href="@{/login.html(l='en_US')}">English</a>

自定义LocaleResolver

//MyLocaleResolver
public class MyLocaleResolver implements LocaleResolver 
{
@Override
public Locale resolveLocale(HttpServletRequest request) 
{
    String l = request.getParameter("l");
    Locale locale = Locale.getDefault();
    if(!StringUtils.isEmpty(l))
    {
        String[] split = l.split("_");
        locale = new Locale(split[0], split[1]);
    }
    return locale;
}
}
//添加到容器(在配置类中)
@Bean
public LocaleResolver localeResolver()
{
    return new MyLocaleResolver();
}

(4)登录

1.禁用模板引擎缓存(保证实时修改)
spring.thymeleaf.cache=false
2.判断返回错误信息
@Controller
public class LoginController {

    @PostMapping(value = "/user/login")
    //@RequestParam标记的属性未提交时报错
    public String login(@RequestParam("username") String username,
                        @RequestParam("password") String password,
                        Map<String,Object> map, HttpSession session)
    {
        if(!StringUtils.isEmpty("username") && "123456".equals(password))
        {
            session.setAttribute("loginUser",username);
            //防止表单重复提交,不直接返回页面而是使用视图映射重定向
            return "redirect:/main.html";
        }
        else
        {
            map.put("msg","用户名密码错误!");
            return "login";
        }
    }
}
<p style="color: red" th:text="${msg}" th:if="${not #strings.isEmpty(msg)}"></p>
3.拦截器进行登录检查
public class LoginHandlerInterceptor implements HandlerInterceptor {

@Override
//目标方法执行前
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    Object user = request.getSession().getAttribute("loginUser");
    if(user == null)
    {
        //拦截
        request.setAttribute("msg","没有权限访问!");
        request.getRequestDispatcher("/index.html").forward(request,response);
        return false;
    }
    else
    {
        return true;
    }
}
//配置类
@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**").
            excludePathPatterns("/index.html","/","/user/login");
    }
4.将用户名写到页面上
<a class="navbar-brand col-sm-3 col-md-2 mr-0" href="http://getbootstrap.com/docs/4.0/examples/dashboard/#">[[${session.loginUser}]]</a>

二、错误处理机制

(1)默认错误处理

浏览器:
在这里插入图片描述

其它客户端:
在这里插入图片描述

ErrorMvcAutoConfiguration中给容器添加了以下组件:

  1. DefaultErrorAttributes
  2. BasicErrorController
  3. ErrorPageCustomizer
  4. PreserveErrorControllerTargetClassPostProcessor
  5. DefaultErrorViewResolver
  6. View
  7. BeanNameViewResolver

(2)定制错误响应

1.定制错误页面(浏览器)
2.定制错误json数据(其它客户端)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值