Spring Boot学习笔记-5
一、Restful-CRUD
普通CRUD(uri来区分操作) | RestfulCRUD | |
---|---|---|
查询 | getEmp | emp—GET |
添加 | addEmp?xxx | emp—POST |
修改 | updateEmp?id=xxx&xxx=xx | emp/{id}—PUT |
删除 | deleteEmp?id=1 | emp/{id}—DELETE |
功能 | 请求URI | 请求方式 |
---|---|---|
查询所有员工 | emps | GET |
查询某个员工(来到修改页面) | emp/1 | GET |
来到添加页面 | emp | GET |
添加员工 | emp | POST |
修改员工 | emp | PUT |
删除员工 | emp/1 | DELETE |
(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中给容器添加了以下组件:
- DefaultErrorAttributes
- BasicErrorController
- ErrorPageCustomizer
- PreserveErrorControllerTargetClassPostProcessor
- DefaultErrorViewResolver
- View
- BeanNameViewResolver