页面跳转控制器
Spring Boot 中使用页面视图,比如 Thymeleaf。要跳转显示某个页面,必须通过 Controller 对象。也就是我们需要创建一个 Controller,转发到一个视图才行。如果我们现在需要显示页面,可以无需这个 ControlleraddViewControllers0完成从请求到视图跳转。需求:访问/welcome跳转到项目首页indexhtml(Thyemeleaf 创建的对象)
//springmvc的配置:使用JavaConfig的方式配置SpringMVC,代替原来的xml配置文件* SpringMVC
@Configuration
public class MvcSettings implements WebMvcConfiqurer {
//页面跳转控制器, 从请求直达视图页面 (无需controtTer)@Override
public void addViewControllers(ViewControllerRegistry registry) {
//配置页面控制:addviewController("请求uri"), 指定他的视图setviewName(目标视图)
registry.addViewController( uriPathorPattern:"/welcome").setViewName("index");
}
}
数据格式化
Formatter是数据转换接口,将一种数据类型转换为另一种数据类型。与 Formatter功能类型的还有Converter<S,T>。
Spring中内置了一下Formatter:
DateFormatter: String和Date之间的解析与格式化
InetAddressFormatter :String和InetAddress 之间的解析与格式化
PercentStyleFormatter : String 和Number 之间的解析与格式化带货币符合
NumberFormat:String和Number 之间的解析与格式化
@Data
public class DeviceInfo {
private String item1;
private String item2;
private String item3;
private String item4;
private String item5;
}
public class DeviceFormatter implements Formatter<DeviceInfo> {
@Override
public DeviceInfo parse(String text, Locale locale) throws ParseException {
DeviceInfo info = null;
if(StringUtils.hasLength(text)){
String[] item = text.split(";");
info = new DeviceInfo();
info.setItem1(item[0]);
info.setItem2(item[1]);
info.setItem3(item[2]);
info.setItem4(item[3]);
info.setItem5(item[4]);
}
return info;
}
@Override
public String print(DeviceInfo object, Locale locale) {
StringJoiner stringJoiner = new StringJoiner("#");
stringJoiner.add(object.getItem1()).add(object.getItem2()).add(object.getItem3())
.add(object.getItem4()).add(object.getItem5());
return stringJoiner.toString();
}
}
格式化的数据
###
POST http://localhost:8080/device/add
Content-Type: application/x-www-form-urlencoded
device=1111; 2222; 333,NF; 4; 561
接收的信息:DeviceInfo(item1=1111, item2= 2222, item3= 333,NF, item4= 4, item5= 561)
拦截器
HandlerInterceptor 接口和它的实现类称为拦截器,是 SpringMVC 的一种对象。拦截器是 Spring MVC 框架的对象与 Servlet 无关。拦截器能够预先处理发给 Controller 的请求。可以决定请求是否被 Controller 处理。用户请求是先由 DispatcherServlet 接收后,在 Controller 之前执行的拦截器对象。
一个项目中有众多的拦截器:框架中预定义的拦截器, 自定义拦截器。下面我说说自定义拦截器的应用。根据拦截器的特点,类似权限验证,记录日志,过滤字符,登录 token 处理都可以使用拦截器
拦截器定义步骤:
1声明类实现HandlerInterceptor 接口,重写三个方法(需要那个重写那个)
2登记拦截器
public class ArticleInterceptor implements HandlerInterceptor {
public static final String COMMON_USER = "zhangsan";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("======拦截器======");
//用户
String loginUser = request.getParameter("loginUser");
//uri
String uri = request.getRequestURI();
//拦截请求
if(loginUser.equals(COMMON_USER) &&(
uri.startsWith("/article/delete")||
uri.startsWith("/article/add")||
uri.startsWith("/article/edit"))){
return false;
}
return true;
}
}
public class LoginInterceptor implements HandlerInterceptor {
private List<String> permitUser = new ArrayList();
public.LoginInterceptor(){
this.permitUser = Arrays.asList("zhangsan"," isi","admin");
}
@Override
public boolean preHandle(HttpServletReguest request,HttpServletResponse response, Object handler)
throws Exception {
System.out.println("====================");
String loginUser = request.getParameter( name: " oqinUser");
if(StringUtils.hasText(loginUser) && permitUser.contains(loqinUser)){
return true:
}
return false;
}
}
@Configuration
public class MvcSettings implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//权限拦截器
AuthInterceptor authInterceptor = new AuthInterceptor();
registry.addInterceptor(authInterceptor)
.order(2)addPathPatterns("/article/**") //拦截以article开头的所有请求
.excLudePathPatterns("/article/query"); //不拦截的地址
// 登录拦截器
LoginInterceptor loginInterceptor = new LoginInterceptor();
reqistry.addInterceptor(loginInterceptor)
.order(1) //顺序,整数值,越小先执行
.addPathPatterns("/**") //拦截所有对controller的请求excludePathPatterns("/article/query"); //排除
}
}