美文网首页
一起来学习SpringMVC:文件上传,ajax&jso

一起来学习SpringMVC:文件上传,ajax&jso

作者: __y | 来源:发表于2018-06-09 11:24 被阅读35次

前言:
继续学习SpringMVC的内容,本次的内容如下:

  • 文件上传
  • Ajax,json
  • 拦截器
    废话不多说,进入正题

1.文件上传

导入相关jar包

image.png

配置springmvc的配置解析器

<!-- 文件上传配置 -->
    <bean id="multipartResolver"  
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 设置编码格式 -->  
        <property name="defaultEncoding" value="utf-8"></property> 
        <!-- 设置文件大小 -->  
        <property name="maxUploadSize" value="10485760000"></property>
        <!-- 设置缓冲区大小 -->  
        <property name="maxInMemorySize" value="40960"></property>  
    </bean> 

JSP页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action = "upload.action" method="post", enctype="multipart/form-data">
        文件:<input type="file" name = "file"/><input type="submit" value="上传"/>
    </form>
</body>
</html>

Controller

@Controller
public class FileUploadController {
    @RequestMapping(value = "/upload")
    public String fileUpload(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) {
        //获取上传位置
        String  path = request.getRealPath("/fileupload");
        //获取文件名
        String fileName = file.getOriginalFilename();
        try {
            InputStream is = file.getInputStream();
            OutputStream os = new FileOutputStream(new File(path,fileName));
            int len = 0;
            byte[] buffer = new byte[400];
            while((len = is.read(buffer)) != -1) {
                os.write(buffer,0,len);
            }
            os.close();
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "redirect:index.jsp";

    }
}

2.Ajax,json

导入jar包

image.png

配置json转换器

     <!--  json配置 -->
     <!-- 用于将对象转换为 JSON  -->  
    <bean id="stringConverter"  
        class="org.springframework.http.converter.StringHttpMessageConverter">  
        <property name="supportedMediaTypes">  
            <list>  
                <value>text/plain;charset=UTF-8</value>  
            </list>  
        </property>  
    </bean>  
    <bean id="jsonConverter"  
        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>  
   
    <bean  
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  
        <property name="messageConverters">  
            <list>  
                <ref bean="stringConverter" />  
                <ref bean="jsonConverter" />  
            </list>  
        </property>  
    </bean>  

Controller

public class JsonController {
    @RequestMapping("/json")
    @ResponseBody
    public List<User> json() {
        List<User> list = new ArrayList<User>();
        list.add(new User(1,"json"));
        list.add(new User(2,"ajax"));
        list.add(new User(3,"cookie"));
        return list;
    }
}

3.拦截器

SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。

实现HandlerInterceptor接口

public class MyInterceptor implements HandlerInterceptor {
    //在请求方法处理前执行
    //用于用户认证校验、用户权限校验
    //如果返回false表示拦截不继续执行请求的方法,如果返回true表示放行
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.println("处理前");
        return true;
    }
    //在请求方法处理前执行
    //如果需要向页面提供一些公用 的数据或配置一些视图信息,使用此方法实现 从modelAndView入手
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("处理后");
    }
    //在dispatherServlet处理后执行
    //作系统 统一异常处理,进行方法执行性能监控,在preHandle中设置一个时间点,在afterCompletion设置一个时间,两个时间点的差就是执行时长
    //实现 系统 统一日志记录
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

    }
}

配置拦截器

  <mvc:interceptors>
        <mvc:interceptor>
           <!-- 指明哪些请求需要被拦截
                /login.do 表示login.do需要被拦截
                /user/add.do 表示/user/add.do请求要被拦截
                /* 表示项目路径下的所有请求被拦截
                    可以拦截: /login.do  /add.do  /user.do /sys.do等
                /**表示项目路径及其子路径下的所有请求被拦截=所有请求被拦截
                    可以拦截: /login.do  /add.do  /user.do /sys.do
                    /user/add.do
             -->
            <mvc:mapping path="/**"/>
            
            <bean class="cn.springmvc.interceptor.MyInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

指明哪些请求需要被拦截

  • /login.do 表示login.do需要被拦截
  • /user/add.do 表示/user/add.do请求要被拦截
  • /* 表示项目路径下的所有请求被拦截
    可以拦截: /login.do /add.do /user.do /sys.do等
  • /**表示项目路径及其子路径下的所有请求被拦截=所有请求被拦截
    可以拦截: /login.do, /add.do , /user.do ,/sys.do ,/user/add.do
    这里用的是拦截全部请求
    效果:
    image.png

4.拦截器的举例应用(登录拦截)

Cotroller

@Controller
public class LoginController {
    @RequestMapping(value = "/login")
    public String login(String name, String password, HttpSession session) {
        System.out.println(name + password);
        if("zhangsan".equals(name) && "123".equals(password)) {
            session.setAttribute("name","zhangsan");
            return "redirect:/index.jsp";
        }
        return "redirect:/login.jsp";
    }
    @RequestMapping(value = "/add")
    public String add() {
        System.out.println("add");
        return "redirect:/index.jsp";
    }
}

拦截器:

public class LoginInterceptor implements HandlerInterceptor {
    private List<String > allowedPass;
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        //获得请求的路径
        String path = httpServletRequest.getRequestURL().toString();
        HttpSession session = httpServletRequest.getSession();
        String name = (String)session.getAttribute("name");
        //如果session里面已经有值了直接放行
        if(name != null) {
            return true;
        }
        for (String str:
             allowedPass) {
            if(path.endsWith(str))
                return true;
        }
        httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/login.jsp");
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

    }

    public void setAllowedPass(List<String> allowedPass) {
        this.allowedPass = allowedPass;
    }
}

配置拦截器

 <mvc:interceptors>
        <mvc:interceptor>
            <!-- 指明哪些请求需要被拦截
                /login.do 表示login.do需要被拦截
                /user/add.do 表示/user/add.do请求要被拦截
                /* 表示项目路径下的所有请求被拦截
                    可以拦截: /login.do  /add.do  /user.do /sys.do等
                /**表示项目路径及其子路径下的所有请求被拦截=所有请求被拦截
                    可以拦截: /login.do  /add.do  /user.do /sys.do
                    /user/add.do
             -->
            <mvc:mapping path="/**"/>
            <bean class="cn.springmvc.interceptor.LoginInterceptor">
                <property name="allowedPass">
                    <value>login.action</value>
                </property>

            </bean>
        </mvc:interceptor>
    </mvc:interceptors>

效果图:
hello.action请求被拦截跳转到登录界面

image.png
image.png
提交错误的账号密码,依然是登录界面
image.png

提交正确的账号密码


image.png

相关文章

网友评论

      本文标题:一起来学习SpringMVC:文件上传,ajax&jso

      本文链接:https://www.haomeiwen.com/subject/gxxzsftx.html