SpringMVC框架(四)

版权声明:@Wrial https://blog.csdn.net/qq_42605968/article/details/87552916

这一篇就来结合SpringMVC框架来写一些常用的工具类

工具

异常处理器

在我们日常开发种必定会有写时候代码出现问题访问不到,或者维护时代码不能被访问等等。
那我们就要针对这些异常并处理它给用户传过去一些用户提示信息
先自己定义一个异常类MyException

package com.Exception;

public class MyException extends Exception {

    MyException() {
        super();
    }

    MyException(String msg) {
        super();
        this.msg = msg;
    }

    private String msg;


    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

然后处理异常并实现异常处理器的接口,发送给前端异常的信息,前端接受后打印在页面。

package com.Exception;

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

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

public class handleException implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        String result = "页面出现异常";
        if (ex instanceof MyException) {
            result = ((MyException) ex).getMsg();
        }
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("msg", result);
        return modelAndView;
}

在SpringMVC配置

 <!--配置全局异常处理-->
    <bean class="com.Exception.handleException"/>

文件上传

文件上传是在日常开发中必不可少的,文件上传就以一个demo来讲讲吧。
准备工作:创建一个新的文件并修改tomcat的虚拟路径
因为在后期存取图片都存在这个虚拟路径中:e:/photo

1.文件上传需要用到两个jar包

 <!--文件上传-->
    <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.4</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.6</version>
    </dependency>

2.写相对应的jsp页面
Upload.jsp(必须注意的是提交时一定要是post方式,并且enctype=“multipart/form-data”, input type=“file” name=“pictureFile” name属性要和控制器对应)

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2019/2/17
  Time: 14:43
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<%--必须改enctype--%>
<form enctype="multipart/form-data"action="" method="post">
    <input type="file" name="pictureFile">
    <input type="submit" name="submit">
</form>

</body>
</html>

success.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2019/2/17
  Time: 17:00
  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>
success
</body>
</html>

3.写controller层
注:写下边这个while循环是这个进入处理方法需要有一个提交数据,为了简化流程就用while防止报空指针异常
这里采用UUID来防止重名,也可以根据时间来防止重名。

   @RequestMapping("upload")
    public String upload(Model model, MultipartFile pictureFile) throws IOException {
//      防止上传的文件重名而导致混乱,另外起一个名字
        UUID newName = UUID.randomUUID();
     while (pictureFile!= null) {
         //获取原来名字
         String oldName = pictureFile.getOriginalFilename();
         // 后缀
         String sux = oldName.substring(oldName.lastIndexOf("."));
         // 新建本地文件流
         File file = new File("E:\\photo\\" + newName + sux);
         pictureFile.transferTo(file);
         // 保存图片到数据库
         System.out.println(newName + sux);
//        user.setAddress(newName+sux);
         model.addAttribute("msg", "Update Success!");
//        model.addAttribute("user", user);
         return "success";
     }
     return "Upload";
    }

4.测试
在这里插入图片描述
在这里插入图片描述
选择后出现成功,在控制器复制路径
在这里插入图片描述
在这里插入图片描述
ef720f82-0b3e-40ee-9873-f20163c25118.jpg
在服务器上访问这个图片
在这里插入图片描述
这就是文件上传的简单实现,在开发中就会将此路径存入到数据库。

json数据交互

json现在已经是前后端交互的重要途径了,这是前后端交互的重要途径了。json的简洁已经获取到人们的倾心了。在前边相信大家也是经常用到吧。
1.导入jar包
(1)导入以下三个包(因为Spring版本兼容问题,版本要在2.7.5之后)

  <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.7.5</version>
        </dependency>
        
       <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.8</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.7.5</version>
        </dependency>

(2)或者导入下边这一个包

   <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
        </dependency>

2.在控制器使用json
编写json测试类,必须再加上@ResponseBody然后返回的就是json格式了

  @RequestMapping("jsonTest")
    @ResponseBody
    public List<User> List(Model model, @RequestParam(value = "s", required = true, defaultValue = "李") String s) {
        List<User> list = userService.SelectUserByLikeIt(s);
        System.out.println("123");
        return list;
    }

测试结果:
在这里插入图片描述
3.接受外边传进来的json(了解)再参数上加RequestBody
在这里插入图片描述
这样就可以接受外边的json,已测试过。

拦截器

和在学web基础的时候的过滤器差不多,可以对我们的一些方法进行拦截,比如我们当时在前面用Filter实现的自动登陆也可以用拦截器来实现。下边通过实例来使用拦截器。
1.先写两个页面
login.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2019/2/18
  Time: 1:24
  To change this template use File | Settings | File Templates.
--%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>用户登录</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/user/toLogin">
    用户名:<input type="text" name="username" /><br>
    密码:<input type="password" name="password" /><br>
    <input type="submit">
</form>
</body>
</html>

success.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2019/2/17
  Time: 17:00
  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>
success
</body>
</html>

2.编写controller

package com.controller;

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

import javax.servlet.http.HttpSession;

@Controller
@RequestMapping("/user")
public class UserController1 {

    @RequestMapping("/toLogin")
    public String toLogin() {
        return "login";
    }

    @RequestMapping("/login")
    public String login(String username,String password,HttpSession session) {
        if (session != null&&username!= null) {
            if (username.equals("admin")&&password.equals("admin")) {
                session.setAttribute("username", username);
                return "/success";
            }
        }
        return "login";
    }

    @RequestMapping("/success")
    public String success() {
        return "success";
    }
}

3.编写拦截器

package com.Interceptor;


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

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

/**
 * 登录拦截器
 * @author Steven
 *
 */
public class AutoLogin implements HandlerInterceptor {

    //方法执行后被执行
    //处理异常,清资源,记录日志等等
    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
    }

    //方法执行之后,返回ModelAndView之前被执行
    //设置页面的共用参数等等
    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
    }

    //进入方法前被执行
    //登录拦截,权限验证等等
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
        //判断用户有没有登录
        Object object = request.getSession().getAttribute("username");
        if(object == null){
            response.sendRedirect(request.getContextPath() + "/user/toLogin");
        }
        //true放行,false拦截
        return true;
    }

}

4.配置拦截器,在有了两级目录的mvc配置文件中要在视图解析器的WEB-INF前加/。

 <!--配置视图解释器,省去写路径的步骤直接写jsp的视图名-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>

    </bean>
 <mvc:interceptors>
        <mvc:interceptor>
            <!-- 必须以 <mvc:mapping path=""/> 开始 -->
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/user/**"/>
            <bean class="com.Interceptor.AutoLogin"/>
        </mvc:interceptor>
    </mvc:interceptors>

5.运行项目
在这里插入图片描述
在这里插入图片描述
这就是拦截器的使用和配置!


到这里SpringMVC就基本完了,ssm也都写完了,在写最后这几篇的时候,消耗了很多时间,并不是有多么的难,就是在配置和编写的时候要注意的细节很多,往往这其中一个细节就可以让你调试一下午或者一整天,不过这都还算是有收获,毕竟现在出现的错误越多以后就出现的越少,后边还得找个小的项目写写,不然学的这些全是空壳!从放假到现在也有很多天没有学习,落后我计划很多,但是也不能一味的追求速度而放下了质量!!!

猜你喜欢

转载自blog.csdn.net/qq_42605968/article/details/87552916