码迷,mamicode.com
首页 > 编程语言 > 详细

SpringMVC2

时间:2020-04-14 00:53:58      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:词语   isp   表单   obj   方式   bytes   参数   oid   设置   

一.SpringMVC 作用域传值的几种方式

1. 使用原生 Servlet
  在 HanlderMethod 参数中添加作用域对象

@RequestMapping("demo1") 
public String demo1(HttpServletRequest abc,HttpSession sessionParam){
    //request 作用域 
    abc.setAttribute("req", "req 的值"); 
    //session 作用域 
    HttpSession session = abc.getSession();
    session.setAttribute("session", "session 的值"); 
    sessionParam.setAttribute("sessionParam","sessionParam 的值"); 
    //appliaction 作用域 
    ServletContext application = abc.getServletContext(); 
    application.setAttribute("application","application 的值"); 
    return "/index.jsp"; 
}

2. 使用 Map 集合
  1)把map中内容放在request作用域中
  2)spring会对map集合通过BindingAwareModelMap进行实例化

@RequestMapping("demo2") 
public String demo2(Map<String,Object> map){ 
    System.out.println(map.getClass());
    map.put("map","map 的值"); 
    return "/index.jsp";
}

3. 使用 SpringMVC 中 Model 接口
  把内容最终放入到 request 作用域中.

@RequestMapping("demo3") 
public String demo3(Model model){
    model.addAttribute("model", "model 的值"); 
    return "/index.jsp";
}

4.使用 SpringMVC 中 ModelAndView 类

@RequestMapping("demo4")
public ModelAndView demo4(){
    //参数,跳转视图 
    ModelAndView mav = new ModelAndView("/index.jsp");
    mav.addObject("mav", "mav 的值"); 
    return mav;
}

二.文件下载

1.访问资源时相应头如果没有设置 Content-Disposition,浏览器默认按照 inline 值进行处理
  inline :能显示就显示,不能显示就下载.
2.只需要修改相应头中 Context-Disposition=”attachment;filename=文件名”
  1)attachment 下载,以附件形式下载.
  2)filename=值就是下载时显示的下载文件名
3.实现步骤
  1)导入 apatch 的两个 jar

技术图片

 

 

  2)在 jsp 中添加超链接,设置要下载文件
    在 springmvc 中放行静态资源 files 文件夹

<a href="download?fileName=a.rar">下载</a>

  3)编写控制器方法

@RequestMapping("download") 
public void download(String fileName,HttpServletResponse res,HttpServletRequest req) throws IOException{
    //设置响应流中文件进行下载 
    res.setHeader("Content-Disposition", "attachment;filename="+fileName);
    //把二进制流放入到响应体中. 
    ServletOutputStream os = res.getOutputStream(); 
    String path = req.getServletContext().getRealPath("files"); 
    System.out.println(path); 
    File file = new File(path, fileName); 
    byte[] bytes = FileUtils.readFileToByteArray(file); 
    os.write(bytes); 
    os.flush(); 
    os.close(); 
}

三.文件上传

1. 基于 apache 的 commons-fileupload.jar 完成文件上传.
2. MultipartResovler 作用:
  1)把客户端上传的文件流转换成 MutipartFile 封装类.
  2)通过 MutipartFile 封装类获取到文件流
3. 表单数据类型分类
  1)在<form>的 enctype 属性控制表单类型
  2)默认值 application/x-www-form-urlencoded,普通表单数据.(少量文字信息)
  3)text/plain 大文字量时使用的类型.邮件,论文
  4)multipart/form-data 表单中包含二进制文件内容.
4. 实现步骤:
  1)导入 springmvc 包和 apache 文件上传 commons-fileupload 和commons-io 两个 jar
  2)编写 JSP 页面(method必须是post方式)

<body>
<form action="upload" enctype="multipart/form-data" method="post">
    姓名:<input type="text" name="name"/><br/>
    文件:<input type="file" name="file"/><br/>
    <input type="submit" value="提交"/>
</form>
</body>

  3)配置 springmvc.xml

<!-- MultipartResovler解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="50"></property>
</bean>
<!-- 异常解析器 -->
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
            <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">/error.jsp</prop>
        </props>
    </property>
</bean>

  4)编写控制器类
    MultipartFile 对象名必须和<input type=”file”/>的 name 属性值相同

@Controller
public class DemoController {
    @RequestMapping("upload")
    public String upload(MultipartFile file,String name) throws IOException{
        String fileName = file.getOriginalFilename();
        String suffix = fileName.substring(fileName.lastIndexOf("."));
        //判断上传文件类型
        if(suffix.equalsIgnoreCase(".png")){
            String uuid = UUID.randomUUID().toString();
            FileUtils.copyInputStreamToFile(file.getInputStream(), new File("E:/"+uuid+suffix));
            return "/index.jsp";
        }else{
            return "error.jsp";
        }
    }
}

四.自定义拦截器

1.跟过滤器比较像的技术.
2.发送请求时被拦截器拦截,在控制器的前后添加额外功能.
  1)跟 AOP 区分开.AOP 在特定方法前后扩充(对 ServiceImpl)
  2)拦截器,请求的拦截.针对的是控制器方法.(对 Controller)
3.SpringMVC 拦截器和 Filter 的区别
  1)拦截器只能拦截器 Controller
  2)Filter 可以拦截任何请求.
4.实现自定义拦截器的步骤:
  1)新建类实现 HandlerInterceptor

public class DemoInterceptor implements HandlerInterceptor {
    //在进入控制器之前执行
    //如果返回值为false,阻止进入控制器
    //控制代码
    @Override
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        System.out.println("arg2:"+arg2);
        System.out.println("preHandle");
        return true;
    }
    //控制器执行完成,进入到jsp之前执行.
    //日志记录.
    //敏感词语过滤
    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        
        System.out.println("往"+arg3.getViewName()+"跳转");
        System.out.println("model的值"+arg3.getModel().get("model"));
        String word = arg3.getModel().get("model").toString();
        String newWord = word.replace("祖国", "**");
        arg3.getModel().put("model", newWord);
//      arg3.getModel().put("model", "修改后的内容");
        System.out.println("postHandle");
    }
    //jsp执行完成后执行
    //记录执行过程中出现的异常.
    //可以把异常记录到日志中
    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        System.out.println("arg3:"+arg3);
        System.out.println("afterCompletion"+arg3.getMessage());
    }
}

  2)在 springmvc.xml 配置拦截器需要拦截哪些控制器
    拦截所有控制器

<mvc:interceptors> 
    <bean class="com.bjsxt.interceptor.DemoInterceptor"></bean>
</mvc:interceptors>

    拦截特定的的 url

<mvc:interceptors> 
    <mvc:interceptor> 
        <mvc:mapping path="/demo"/> 
        <mvc:mapping path="/demo1"/> 
        <mvc:mapping path="/demo2"/> 
        <bean class="com.bjsxt.interceptor.DemoInterceptor"></bean> 
    </mvc:interceptor>
</mvc:interceptors>

五.拦截器栈

1. 多个拦截器同时生效时,组成了拦截器栈
2. 顺序:先进后出.
3. 执行顺序和在 springmvc.xml 中配置顺序有关
4. 设置先配置拦截器 A 在配置拦截器 B 执行顺序为
  preHandle(A)--> preHandle(B)--> 控制器方法 -->postHandle(B)-->postHanle(A)-->JSP-->afterCompletion(B)-->afterCompletion(A)

 

SpringMVC2

标签:词语   isp   表单   obj   方式   bytes   参数   oid   设置   

原文地址:https://www.cnblogs.com/sunny-sml/p/12695192.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!