SpringMVC中的RedirectAttribute类[表单验证]

RedirectAttributes是Spring mvc 3.1版本之后出来的一个功能,专门用于重定向之后还能带参数跳转的。
<mark>可以用来制作表单验证:</mark>
<1>用户检查接口:

public interface UserService { 

    User checkUser(String username, String password);
}

<2>用户JPA接口:用户与数据库建立连接并可以对数据库进行操作DML操作

//<User,Long> 操作对象和主键类型
@Component
public interface UserRepository extends JpaRepository<User,Long> { 
     User findByUsernameAndPassword( String username, String password);
}

<3>用户服务的实现类(用于返回对数据库操作的结果):

@Service
public class UserServiceImpl implements UserService { 

    @Autowired  //接口注入
    public UserRepository userRepository;

    //检查用户密码是否正确,findByUsernameAndPassword是规定这样写的
    @Override
    public User checkUser(String username, String password) { 
        User user = userRepository.findByUsernameAndPassword(username, password);
        return user;
    }
}

一旦使用关于Spring的注解出现在类里,例如我在实现类中用到了@Autowired注解,被注解的这个类是从Spring容器中取出来的,那调用的实现类也需要被Spring容器管理,加上@Component
作者:转角遇到抢劫的_0c47
链接:https://www.jianshu.com/p/8d3f5cede6bf
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

例如上述的UserRepository 属性注入。
扩展:

@controller 控制器(注入服务)
用于标注控制层,相当于struts中的action层

@service 服务(注入dao)
用于标注服务层,主要用来进行业务的逻辑处理

@repository(实现dao访问)
用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件

@component (把普通pojo实例化到spring容器中,相当于配置文件中的(相当于配置文件中的<bean id="" class=""/>)
泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller@Services等的时候),我们就可以使用@Component来标注这个类。

<4>后台控制器:

// @RequestParam:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)
    @PostMapping("/login")  //Post提交参数后@RequestParam绑定到控制器上
    public String login(@RequestParam  String username,
                        @RequestParam  String password,
                        HttpSession session,
                        RedirectAttributes attributes){ 
        User user = userService.checkUser(username,password);  //检查用户名密码的正确性
        if(user != null){   //查询成功
            user.setPassword(null);   //密码为了安全起见不要返回到session中
            session.setAttribute("user",user);  //存入session
            return "admin/index";   //返回首页
        }else{ 
// 重定向之后在URL后面拼接参数并返回给前端界面
            attributes.addFlashAttribute("message","用户名和密码错误!");
            return "redirect:/admin";   //返回adminA
        }
    }

重定向到前端有两种带参的方式:RedirectAttributes redirectAttributes

1.redirectAttributes.addAttribute(“param”, value);

这种方法是在重定向之后在URL后面拼接参数value

2.redirectAttributes.addFlashAttribute(“param”, value);

这种方法可以在URL后面隐藏参数,原理是将参数放到Session中,在Session跳转到页面后就会马上被移除,所以刷新页面后值会丢失,进而保证了数据的安全性。

这个方法只能在重定向的页面上使用EL表达式取值,如果是重定向到Controller中是无法获取param中的value,需要在重定向的目标方法上添加对应的形参@RequestPrama(value = “prama”)String prama才能获取参数。
通过上下文的message取值:

<div class="ui negative mini message" th:text="${message}" th:unless="${#strings.isEmpty(message)}" >
  用户名和密码错误!
</div>

通过th:text=”${message}”得到后台返回的数据,使用的Thymeleaf模板的if和unless进行逻辑判断然后渲染界面。

参考:https://www.cnblogs.com/RoddeHope/p/7439643.html