JSR303和拦截器

目录

1、JSR303

1.1、pom一栏

1.2、后端

1.2.1、实体类

1.2.2、lazzController.java

1.3、前端

2、拦截器

2.1、认识拦截器

2.1.1、OneHandlerInterceptor

2.1.2、HelloController

2.1.3、springmvc-servlet的配置

2.2、拦截器链

2.2.1、TwoHandlerInterceptor

2.2.2、springmvc-servlet的配置

2.3、登陆权限控制

2.3.1、前端

2.3.2、后端

2.3.3、运行效果


1、JSR303

1.1、pom一栏

<dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>6.0.7.Final</version>
    </dependency>

1.2、后端

1.2.1、实体类

package com.ssr.ssm.model;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;

/**
 * NotNull:针对的是基本数据类型
 * NotEmpty:作用于集合
 * NotBlank:作用于字符串
 */
public class Clazz {
    @NotNull(message = "cid不能为空")
    protected Integer cid;

    @NotBlank(message = "班级名称不能为空")
    protected String cname;

    @NotBlank(message = "教员老师不能为空")
    protected String cteacher;

    protected String pic;

    public Clazz(Integer cid, String cname, String cteacher, String pic) {
        this.cid = cid;
        this.cname = cname;
        this.cteacher = cteacher;
        this.pic = pic;
    }

    public Clazz() {
        super();
    }

    public Integer getCid() {
        return cid;
    }

    public void setCid(Integer cid) {
        this.cid = cid;
    }

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    public String getCteacher() {
        return cteacher;
    }

    public void setCteacher(String cteacher) {
        this.cteacher = cteacher;
    }

    public String getPic() {
        return pic;
    }

    public void setPic(String pic) {
        this.pic = pic;
    }
}

1.2.2、lazzController.java

package com.ssr.ssm.web;

import com.ssr.ssm.biz.ClazzBiz;
import com.ssr.ssm.model.Clazz;
import com.ssr.ssm.model.dto.ClazzDto;
import com.ssr.ssm.util.PageBean;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/clz")
public class ClazzController {
    @Autowired
    private ClazzBiz clazzBiz;
//    list->clzlist
//    toList->重定向list->"redirect:/clz/list"
//    toEdit->跳转到编辑界面->clzEdit
//    Clazz:以前是通过模型驱动接口封装,现在是直接在方法中接收参数即可

    @RequestMapping("/list")
    public String list(Clazz clazz, HttpServletRequest request){
        PageBean pageBean=new PageBean();
        pageBean.setRequest(request);
        List<Clazz> lst = this.clazzBiz.listPager(clazz, pageBean);
        request.setAttribute("lst",lst);
        request.setAttribute("pageBean",pageBean);
        return "clzList";
    }

    @RequestMapping("/toEdit")
    public String toEdit(Clazz clazz, HttpServletRequest request){
        Integer cid = clazz.getCid();
//        传递的id代表了修改,没传代表新增
        if(cid != null){
            List<Clazz> lst = this.clazzBiz.listPager(clazz, null);
            request.setAttribute("b",lst.get(0));
        }
        return "clzEdit";
    }

    @RequestMapping("/add")
    public String add(Clazz clazz){
        this.clazzBiz.insertSelective(clazz);
        return "redirect:/clz/list";
    }

    /**
     * @Valid 是与实体类中的服务端校验 注解配合使用的
     * BindingResult存放了所有违背校验的错误信息
     * @param clazz
     * @param bindingResult
     * @return
     */
    @RequestMapping("/valiAdd")
    public String valiAdd(@Valid Clazz clazz, BindingResult bindingResult,HttpServletRequest request){
        if(bindingResult.hasErrors()){
            Map msg=new HashMap();
//            违背规则
            List<FieldError> fieldErrors = bindingResult.getFieldErrors();
            for (FieldError fieldError : fieldErrors) {
//                cid : cid不能为空
                System.out.println(fieldError.getField() + ":" + fieldError.getDefaultMessage());
//                msg.put(cid,cid不能为空)
                msg.put(fieldError.getField(),fieldError.getDefaultMessage());

            }
            request.setAttribute("msg",msg);
//            如果出现了错误,一个将提示语显示在表单提交元素后方
            return "clzEdit";
        }else{
            this.clazzBiz.insertSelective(clazz);
        }
        return "redirect:/clz/list";
    }

    @RequestMapping("/edit")
    public String edit(Clazz clazz){
        this.clazzBiz.updateByPrimaryKeySelective(clazz);
        return "redirect:/clz/list";
    }

    @RequestMapping("/del")
    public String del(Clazz clazz){
        this.clazzBiz.deleteByPrimaryKey(clazz.getCid());
        return "redirect:/clz/list";
    }

//    文件上传
    @RequestMapping("/upload")
    public String upload(ClazzDto clazzDto){
        try{
//          前台上传的文件
            MultipartFile picFile = clazzDto.getPicFile();
//            InputStream inputStream = picFile.getInputStream();
            /*FileOutputStream fout = new FileOutputStream(new File("D/temp/1.png"));
            byte[] bbuf=new byte[1024];
            int len = 0;
            while(true){
                len=inputStream.read(bbuf,0,len);
                fout.write(bbuf,0,len);
                if(len<0){
                    break;
                }
            }*/
//            实际应该配置到resource.properties中
            String dispath="E:/temp/images";//图片的存放地址
//            http://localhost:8080/upload/mvc/**.png
            String requestPath="/upload/mvc";//数据库保存的地址,也是访问地址
//            拿到上传文件的名字
            String fileName = picFile.getOriginalFilename();//**.png

            FileUtils.copyInputStreamToFile(picFile.getInputStream(),new File(dispath+fileName));
//           将图片上传之后,并且将图片地址更新到数据库中
            Clazz clazz=new Clazz();
            clazz.setCid(clazzDto.getCid());
            clazz.setPic(requestPath+fileName);
            this.clazzBiz.updateByPrimaryKeySelective(clazz);
        }catch (Exception e){
            e.printStackTrace();
        }
        return "redirect:/clz/list";
    }

    //    文件下载
    @RequestMapping("/download")
    public ResponseEntity download(ClazzDto clazzDto){
        try{
//            1.点击下载传递文件的ID,通过文件的ID查询出文件的路径
            Clazz clazz = this.clazzBiz.selectByPrimaryKey(clazzDto.getCid());
            String pic=clazz.getPic();// /upload/mvc/**.png
//              实际应该配置到resource.properties中
            String diskPath="E:/temp/images/";//图片的存放地址
//            http://localhost:8080/upload/mvc/图片.png
            String requestPath="/upload/mvc/";//数据库保存的地址,也是访问地址
            
//            2.通过文件的请求地址,转换成文件存放的硬盘地
            String realPath=pic.replace(requestPath,diskPath);// E:/temp/images
            String fileName=realPath.substring(realPath.lastIndexOf("/")+1);
//            3.将硬盘中文件下载下来->固定代码
            File file=new File(realPath);
            HttpHeaders headers = new HttpHeaders();//http头信息
            String downloadFileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");//设置编码
            headers.setContentDispositionFormData("attachment", downloadFileName);
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            //MediaType:互联网媒介类型  contentType:具体请求中的媒体类型信息
            return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
}

1.3、前端

clzEdit.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>编辑界面</title>
</head>
<body>
<%--
<form action="${pageContext.request.contextPath }/clz/${empty b ? 'add' : 'edit'}" method="post">
--%>
<form action="${pageContext.request.contextPath }/clz/${empty b ? 'valiAdd' : 'edit'}" method="post">
    cid:<input type="text" name="cid" value="${b.cid }"><span style="color: red">${msg.cid}</span><br>
    cname:<input type="text" name="cname" value="${b.cname }"><span style="color: red">${msg.cname}</span><br>
    cteacher:<input type="text" name="cteacher" value="${b.cteacher }"><span style="color: red">${msg.cteacher}</span><br>
    <input type="submit">
</form>
</body>
</html>

2、拦截器

2.1、认识拦截器

2.1.1、OneHandlerInterceptor

package com.ssr.ssm.intercept;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author ssr
 * @create 2022-08-19 18:32
 */
public class OneHandlerInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        预处理
        System.out.println("[OneHandlerInterceptor] . preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//       后处理
        System.out.println("[OneHandlerInterceptor] . postHandle...");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//        完成后执行
        System.out.println("[OneHandlerInterceptor] . afterCompletion...");
    }
}

2.1.2、HelloController

package com.ssr.ssm.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author ssr
 * @create 2022-08-19 19:21
 */
@Controller
public class HelloController {

    @RequestMapping("hello")
    public String hello(){
        System.out.println("进入业务方法...");
        return "index";
    }
}

2.1.3、springmvc-servlet的配置

<!--配置拦截器-->
    <mvc:interceptors>
        <!--针对于所有的请求进行拦截-->
        <bean class="com.ssr.ssm.intercept.OneHandlerInterceptor"></bean>
    </mvc:interceptors>

运行效果:

 

2.2、拦截器链

2.2.1、TwoHandlerInterceptor

package com.ssr.ssm.intercept;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author ssr
 * @create 2022-08-19 18:32
 */
public class TwoHandlerInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        预处理
        System.out.println("[TwoHandlerInterceptor] . preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//       后处理
        System.out.println("[TwoHandlerInterceptor] . postHandle...");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//        完成后执行
        System.out.println("[TwoHandlerInterceptor] . afterCompletion...");
    }
}

2.2.2、springmvc-servlet的配置

<!--配置拦截器链-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.ssr.ssm.intercept.OneHandlerInterceptor"></bean>
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/clz/**"/>
            <bean class="com.ssr.ssm.intercept.TwoHandlerInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

2.3、登陆权限控制

2.3.1、前端

login.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022/8/19
  Time: 19:55
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
登录界面
</body>
</html>

2.3.2、后端

LoginController

package com.ssr.ssm.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;

/**
 * @author ssr
 * @create 2022-08-19 19:52
 */
@Controller
public class LoginController {

    @RequestMapping("/login")
    public String login(HttpServletRequest request){
//        登录成功需要保存用户信息
        String uname = request.getParameter("uname");
        if("zhangsan".equals(uname)){
            request.getSession().setAttribute("uname",uname);
        }
        return "index";
    }

    @RequestMapping("/loginout")
    public String loginout(HttpServletRequest request){
        request.getSession().invalidate();
        return "index";
    }

}

2.3.3、运行效果

http://localhost:8080/clz/list 不能访问,因为session被过滤掉
http://localhost:8080/login 不能访问,因为用户未成功登录被过滤掉
http://localhost:8080/login?uname=zs 可以访问
http://localhost:8080/loginout 清除掉session

http://localhost:8080/clz/list

 

http://localhost:8080/login

 

http://localhost:8080/login?uname=zs

 

http://localhost:8080/loginout

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Boot使用JSR 303(Bean Validation)规范来实现数据校验。下面是Spring Boot中JSR 303的实现原理: 1. 配置依赖:在Spring Boot项目的pom.xml文件中,添加依赖项,通常是`spring-boot-starter-validation`。这将导入Hibernate Validator作为默认的JSR 303实现。 2. 引入注解:在需要校验数据的类的字段上使用JSR 303相关的注解,例如`@NotNull`、`@Size`、`@Min`、`@Max`等。 3. 校验过程:当Spring Boot接收到请求并绑定请求参数到相应的对象时,会自动触发数据校验。校验过程由Spring MVC框架负责,它会根据注解的配置信息对字段进行校验。 4. 错误处理:如果校验失败,Spring Boot会将错误信息封装到`BindingResult`对象中,并将其添加到方法参数中。开发者可以根据需要处理错误信息,例如返回自定义的错误响应。 5. 配置全局校验:可以通过配置类或属性文件来自定义全局的校验设置,例如指定校验消息的国际化资源文件、设置校验模式等。 6. 自定义校验注解:除了使用JSR 303提供的注解外,开发者还可以自定义校验注解。需要创建一个自定义注解,并编写对应的校验类来实现具体的校验逻辑。 总的来说,Spring Boot通过使用JSR 303规范和Hibernate Validator来实现数据校验功能。开发者只需要添加相关的注解和依赖,就能轻松地实现数据校验,并在校验失败时进行相应的处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荣荣荣荣.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值