SpringMVC学习[03]:【文件下载、异常处理器、拦截器、标签库以及自动验证】

内容:

1.文件下载
2.异常处理器
3.拦截器
4.SpringMVC中的标签库以及自动验证
5.SSM

文件下载:

步骤:

1.Jsp页面配置:html

<a href="dlfile/?fileName=a.doc">下载</a>

2.后台:java

@RequestMapping("dlfile")
public ResponseEntity<byte[]> dlfile(String fileName) throws IOException {
    //文件路径
    String path="E:\\第三阶段\\day08";
    //定义要下载的文件
    File file=new File(path,"day08.doc");
    HttpHeaders headers=new HttpHeaders();
    //headers指定文件下载的方式以及在浏览器显示的名称
    headers.setContentDispositionFormData("attachment",fileName);
    //将文件以流的方式响应到页面。
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    //参数一:文件对应的二进制字节数组
        (FileUtils.readFileToByteArray(file),文件转二进制数组)
    //参数二:设置响应头
        (headers)
    //参数三:设置响应状态
        (HttpStatus.OK,状态正常(200)))
    return new ResponseEntity<>(FileUtils.readFileToByteArray(file), headers, HttpStatus.OK);
}
复制代码


异常处理器

解释:在系统遇到异常时自动捕获相应异常,根据不一样的异常跳转到不一样错误页面

步骤:

1.自定义异常处理器类:
在util包新建一个MyHandlerExpResolver.java 并实现HandlerExceptionResolver接口,实现以下方法:
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response,
                                     Object o, Exception e) {
    ModelAndView mv = new ModelAndView();
    if(e instanceof NullPointerException){
        mv.setViewName("error");
        mv.addObject("msg","空指针异常");
        return mv;
    }
    mv.setViewName("error");
    mv.addObject("msg","其余异常");
    return mv;
}
复制代码


2.新建一个错误页面error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${msg}
</body>
</html>
复制代码


3.在springMVC的配置文件实例化自定义的异常处理器:MyHandlerExpResolver
<bean class="com.springmvc.utils.MyHandlerExpResolver"/>

拦截器

步骤

1.自定义拦截器(以拦截用户是否登录为例)
1.在util包新建一个LoginIter.java实现HandlerInterceptor接口,实现三个方法:
public class LoginIter implements HandlerInterceptor {

    /*
    在执行handler以前来执行的,
    用途:用于用户认证校验、用户权限校验
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
        HttpSession session = request.getSession();
        User user= (User) session.getAttribute("user");
        System.out.println("第一个拦截器,在处理器执行前的方法");
        //判断用户是否登录
        if(user!=null){
            System.out.println("true");
            //登录成功
            return true;
        }
        System.out.println("false");
        request.getRequestDispatcher("/login.jsp").forward(request,response);
        return false;
    }

    /*
    在执行handler返回modelAndView以前来执行
    用途:若是须要向页面提供一些公用 的数据或配置一些视图信息,
       使用此方法实现 从modelAndView入手
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("第一个拦截器,在执行handler返回modelAndView以前来执行");
    }

    /*
    执行handler以后执行此方法
    用途:1.做为系通通一异常处理,进行方法执行性能监控,
           在preHandle中设置一个时间点,在afterCompletion设置一个时间,
           两个时间点的差就是执行时长。
        2.实现系统 统一日志记录
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) throws Exception {
        System.out.println("第一个拦截器,执行handler以后执行此方法");
    }
复制代码


2.新建login.jsp页面
${loginError}//显示登录失败的信息 
<form action="${pageContext.request.contextPath}/login" method="get">
    输入帐户:<input type="text" name="uname"><br>
    <input type="submit" value="登录">
</form>
复制代码


3.建立登陆验证的处理器方法
@RequestMapping("login")
public String login(Model m,User user, HttpSession session){
    if(user.getUname().equals("admin")){
        session.setAttribute("user",user);
        return "index";
    }
    m.addAttribute("loginError","从新登录");
    return "login";
}
复制代码


4.在springMVC的配置文件中配置登录拦截器(能够被拦截以及不被拦截的请求)
<!--配置拦截器 -->
<mvc:interceptors>
    <mvc:interceptor>
    <!-- "/**"能够拦截路径无论多少层 -->
        <mvc:mapping path="/**"/>
        <!--选择不拦截登录方法-->
        <mvc:exclude-mapping path="/login"/>
        <!--实例化LoginIter类-->
        <bean class="com.springmvc.utils.LoginIter"/>
    </mvc:interceptor>
</mvc:interceptors>
复制代码

SpringMVC中的标签库以及自动验证JSR303

SpringMVC标签库:

含义:由Spring提供的一组表单标签,经过绑定后台处理器返回的对象从而自动获取对象中的值。
modelAttritube:绑定后台处理器返回的对象
path:解析为id,name,value
注意:使用form标签库,必须保证modelAttritube中的是有数据的对象,不然直接进入form.jsp界面会报错,因此适合使用在添加,修改的操做。

使用(添加用户为例):

1.新建一个form.jsp,引入标签库
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
2.Jsp页面表单书写:
1.index.jsp
<a href="/addUser">添加用户</a>
2.form.jsp
<form:form action="saveUsers" method="post" modelAttribute="user">

    <form:label path="uname">名字:</form:label> <br>
    <form:input path="uname"/><br>

    <form:label path="uid">ID:</form:label><br>
    <form:input path="uid"/><br>

    <form:label path="birthday">生日:</form:label><br>
    <form:input path="birthday"/><br>
    爱好: <br>
    <form:checkbox path="hobbies" value="1"/>聊天1<br>
    <form:checkbox path="hobbies" value="2"/>聊天2<br>
    <form:checkbox path="hobbies" value="3"/>聊天3<br>
    <hr>
    <form:checkboxes path="jobs" items="${jlist}" itemValue="jid" itemLabel="jname" />
    <form:button>保存</form:button>
</form:form>
复制代码
3.后台addUser处理方法
@RequestMapping("addUser")
public String addUser(Model m){
    User user = new User();
    user.setUname("李四");
    List<Job> list=new ArrayList<>();
    list.add(new Job("1","高级工程师"));
    list.add(new Job("2","项目经理"));
    list.add(new Job("3","人事总监"));
    m.addAttribute("user",user);
    m.addAttribute("jlist",list);
    return "form";
}
复制代码
4.后台saveUser处理方法
@RequestMapping("saveUsers")
@ResponseBody
public User saveUser(User user){
    System.out.println(user);
    return user;
}复制代码

自动验证JSR303

1.引入验证依赖包:
classmate-1.3.3.jar
hibernate-validator-5.4.0.Final.jar
jboss-logging-3.3.0.Final.jar
validation-api-1.1.0.Final.jar
2.验证
2.1.在处理器方法"saveUser"的参数上实体类上添加@Valid 注解:
@Valid User user
@Valid:用于验证注解是否符合要求,直接加在变量user以前,在变量中添加验证信息的要求,当不符合要求时就会在方法中返回message 的错误提示信息。
2.2.在实体User的属性上添加注解:
public class User {
    @NotEmpty(message = "用户名不能为空")
    private String uname;

    private Integer uid;
    @Length(min = 3,max = 6,message = "密码介于3-6位之间")
    private String password;

    //@DateTimeFormat(pattern = "yyyy-MM-dd")//日期格式化注解
    private Date birthday;
    private String hobbies;

    @NotEmpty(message = "职位不能为空")
    private List<Integer> jobs;
    }
复制代码


2.3.在处理器方法"saveUser"参数上添加 BindingResult 参数,用于接收验证后的错误信息,再经过@ModelAttritube注解将实体类和错误信息返回到form.jsp页面。
public String saveUser(Model m, @ModelAttribute("user") @Valid User user, BindingResult br)
2.4.在处理器方法"saveUser"中进行逻辑判断,验证没有错误就跳转到其余页面,有错误信息就转发到当前form.jsp页面。
@RequestMapping("saveUsers")
public String saveUser(Model m, @ModelAttribute("user") @Valid User user, BindingResult br){
//@ModelAttribute至关于:m.addAttribute("user"),
//@Valid:用于验证注解是否符合要求,直接加在变量user以前,在变量中添加验证信息的要求,当不符合要求时就会在方法中返回message 的错误提示信息。
    if(br.hasErrors()){//若是有错误信息
        List<Job> list=new ArrayList<>();
        list.add(new Job("1","高级工程师"));
        list.add(new Job("2","项目经理"));
        list.add(new Job("3","人事总监"));
        m.addAttribute("jlist",list);
        return "form";
    }
    System.out.println(user);
    return "main";
}
复制代码


2.5.在form.jsp页面中经过 <form:errors path="对象的属性名"/>显示错误信息
注意:<form:errors>中path的名字必须保证与要验证的表单中path的名字同样
form.jsp代码:
<form:form action="saveUsers" method="post" modelAttribute="user">

    <form:label path="uname">名字:</form:label> <br>
    <form:input path="uname"/><br>
    <form:errors path="uname"/><!--验证名字-->

    <form:label path="password">密码:</form:label><br>
    <form:password path="password"/><br>
    <form:errors path="password"/><!--验证密码-->

    <form:label path="birthday">生日:</form:label><br>
    <form:input path="birthday"/><br>
    爱好: <br>
    <form:checkbox path="hobbies" value="1"/>聊天1<br>
    <form:checkbox path="hobbies" value="2"/>聊天2<br>
    <form:checkbox path="hobbies" value="3"/>聊天3<br>
    <hr>

    <form:checkboxes path="jobs" items="${jlist}" itemValue="jid" itemLabel="jname" />
    <form:errors path="jobs"/><!--验证职位-->
    <form:button>保存</form:button>
</form:form>
复制代码

第一次写文章,有错误还请你们帮忙指出,万分感谢
spring

相关文章
相关标签/搜索