SpringMVC第二天

1      SpringMVC第二天笔记

2      高级参数绑定

 

2.1    数组类型的参数绑定

基于批量删除商品操作完成参数传递。

 

Jsp修改

 

 

控制器修改

/**

     * 包装pojo传递演示

     * 第二天,演示数组参数的传递与List的传递

     * @param vo

     * @return

     */

    @RequestMapping("queryItem")

    public String queryItem(QueryVo vo, Integer[] ids) {

       System.out.println(vo);

       //输出传入的数组

       if (ids != null && ids.length > 0) {

           for (Integer id : ids) {

              System.out.println("传入的商品列表分别为:" + id);

           }

       }

 

       return "itemList";

    }

 

2.2    List类型的绑定

基于批量修改商品操作完成参数传递。

 

Jsp修改

 

 

 

控制器修改

 

 

POJO修改

 

 

 

3      @RequestMapping注解的使用

3.1    路径映射可以是数组

 

 

 

3.2    @RequestMapping可以加在类头部,用于目录分级管理

 

 

 

3.3    限定请求方法

 

 

 

 

4      Controller方法返回值

4.1    返回ModelAndView

参考第一天内容。

 

4.2    返回void

4.2.1  request

 

 

 

新建msg.jsp

 

 

4.2.2  response

 

 

 

4.3    返回String

4.3.1  返回视图名字,参考第一天内容

 

4.3.2  redirect与forward

 

 

 

 

 

5      Springmvc中异常处理

思想:做一个全局异常处理器,处理所有没有处理过的运行时异常用于更友好地提示用户。

 

5.1    步骤

5.1.1  创建全局异常处理器

/**

 * 全局异常处理器

 * @author Steven

 *

 */

public class CustomerException implements HandlerExceptionResolver {

 

    @Override

    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object hanlder,

           Exception e) {

       //记录日志

       e.printStackTrace();

       //错误消息

       String msg = "很抱歉,系统发生异常了,请联系管理员";

      

       //响应用户错误提示

       ModelAndView mav = new ModelAndView();

       //返回错误消息

       mav.addObject("msg", msg);

       //响应错误提示页面

       mav.setViewName("msg");

       return mav;

    }

}

 

 

 

5.1.2  配置异常处理器

 

 

 

5.1.3  测试访问queryVoid.action

 

 

 

5.1.4  更智能、更友好的提示,解决方案

5.1.4.1新建自定义异常类

/**

 * 自定义异常

 * @author Steven

 *

 */

public class MyException extends Exception {

   

    //错误消息

    private String msg;

 

    public MyException() {

       super();

    }

    public MyException(String msg) {

       super();

       this.msg = msg;

    }

    public String getMsg() {

       return msg;

    }

    public void setMsg(String msg) {

       this.msg = msg;

    }

}

 

 

5.1.4.2修改异常处理器,加上异常判断

 

 

5.1.4.3测试访问queryVoid.action

 

 

6      图片上传处理

6.1    配置虚拟目录

 

 

6.2    加入上传功能需要的jar包

 

 

6.3    配置多媒体解析器

<!-- 配置多媒体处理器 -->

    <!-- 注意:这里id必须填写:multipartResolver -->

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

       <!-- 最大上传文件大小 -->

       <property name="maxUploadSize" value="8388608" />

    </bean>

 

6.4    jsp修改

 

 

6.5    编写图片上传处理代码

//图片上传用MultipartFile接收文件

    @RequestMapping(value = "updateItem", method = { RequestMethod.POST, RequestMethod.GET })

    public String updateItem(Item item, Model model, MultipartFile picFile) throws Exception {

 

       // 图片新名字

       String name = UUID.randomUUID().toString();

       // 图片原名字

       String oldName = picFile.getOriginalFilename();

       // 后缀名

       String exeName = oldName.substring(oldName.lastIndexOf("."));

 

       File pic = new File("D:\\WebWork\\" + name + exeName);

       // 保存图片到本地磁盘

       picFile.transferTo(pic);

       // 更新商品图片信息

       item.setPic(name + exeName);

 

       itemServices.update(item);

       model.addAttribute("item", item);

       model.addAttribute("msg", "修改商品成功");

       return "itemEdit";

    }

 

7      json数据交互

7.1    加入jar包

 

 

 

 

7.2    编码

/**

     * json数据交互演示

     *

     * @param item2

     * @return

     */

    @RequestMapping("getItem")

    //@ResponseBody把pojo转成json串响应用户

    @ResponseBody

    //@RequestBody用于接收用户传入json串转成pojo

    public Item getItem(@RequestBody Item item2) {

 

       System.out.println("接收到的json商品数据为:" + item2);

 

       Item item = itemServices.getItemById(3);

       return item;

    }

 

 

7.3    测试,安装google浏览器测试工具

 

 

8      Springmvc实现Restful

8.1    编码

/**

     * RESTful风格演示

     *

     * @param ids

     * @param model

     * @return

     */

    //RESTful风格url上的参数通过{}点位符绑定

    //点位符参数名与方法参数名不一致时,通过@PathVariable绑定

    @RequestMapping("/item/{id}")

    public String testRest(@PathVariable("id") Integer ids, Model model) {

       Item item = itemServices.getItemById(ids);

       model.addAttribute("item", item);

       return "itemEdit";

    }

 

8.2    测试

测试直接访问url{http://localhost:8080/项目名/item/1.action}即可。

 

9      拦截器

9.1    拦截器开发流程

9.1.1  创建拦截器

9.1.1.1一号拦截器

/**

 * 自定义拦截器

 * @author Steven

 *

 */

public class MyInterceptor1 implements HandlerInterceptor {

 

    //在Controller方法执行后被执行

    //处理异常、记录日志

    @Override

    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)

           throws Exception {

       System.out.println("MyInterceptor1.afterCompletion.....");

    }

 

    //在Controller方法执行后,返回ModelAndView之前被执行

    //设置或者清理页面共用参数等等

    @Override

    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)

           throws Exception {

       System.out.println("MyInterceptor1.postHandle.....");

    }

 

    //在Controller方法执行前被执行

    //登录拦截、权限认证等等

    @Override

    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {

      

       System.out.println("MyInterceptor1.preHandle.....");

      

       //返回true放行,false拦截

       return true;

    }

 

}

 

 

9.1.1.2二号拦截器,复制一号,修改一下系统输出消息

 

9.1.2  配置拦截器

<!-- 拦截器定义 -->

    <mvc:interceptors>

       <!-- 定义一个拦截器 -->

       <mvc:interceptor>

           <!-- path配置</**>拦截所有请求,包括二级以上目录,</*>拦截所有请求,不包括二级以上目录 -->

           <mvc:mapping path="/**"/>

           <bean class="com.itheima.springmvc.interceptor.MyInterceptor1" />

       </mvc:interceptor>

      

       <!-- 定义一个拦截器 -->

       <mvc:interceptor>

           <!-- path配置</**>拦截所有请求,包括二级以上目录,</*>拦截所有请求,不包括二级以上目录 -->

           <mvc:mapping path="/**"/>

           <bean class="com.itheima.springmvc.interceptor.MyInterceptor2" />

       </mvc:interceptor>

    </mvc:interceptors>

 

 

 

9.2    拦截器案例应用,登录拦截器

9.2.1  思路

1、有一个登录页面,需要写一个controller访问页面

2、登录页面有一提交表单的动作。需要在controller中处理。

a)       判断用户名密码是否正确

b)       如果正确 想session中写入用户信息

c)        返回登录成功,或者跳转到商品列表

3、拦截器。

a)       拦截用户请求,判断用户是否登录

b)       如果用户已经登录。放行

c)        如果用户未登录,跳转到登录页面。

 

9.2.2  login.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 }/user/login.action">

用户名:<input type="text" name="username" /><br>

密码:<input type="password" name="password" /><br>

<input type="submit">

</form>

</body>

</html>

 

9.2.3  UserController

/**

 * 登录拦截器

 * @author Steven

 *

 */

@Controller

@RequestMapping("user")

public class UserController {

   

    /**

     * 跳转登录页面

     * @return

     */

    @RequestMapping("toLogin")

    public String toLogin(){

       return "login";

    }

   

    /**

     * 用户登录

     * @return

     */

    @RequestMapping("login")

    public String login(String username,String password,HttpSession session){

      

       String result = "login";

      

       //断定用户是否允许登录

       if(username != null){

           session.setAttribute("username", username);

           //登录成功,跳转商品列表

           result = "redirect:/itemList.action";

       }

       return result;

    }

}

 

 

9.2.4  LoginInterceptor拦截器编码

这里省略类声名和其它两个方法。

 

//处理执行前被执行

    //登录拦截、权限验证

   @Override

   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {

     

      Object attribute = request.getSession().getAttribute("username");

       if(attribute != null){

         //放行,执行处理器

         return true;

       }else{

           response.sendRedirect(request.getContextPath() + "/user/tologin.action");

         //放行,执行处理器

         return false;

       }

   }

 

9.2.5  拦截器配置

<!-- 登录拦截器 -->

       <mvc:interceptor>

           <!-- path配置</**>拦截所有请求,包括二级以上目录,</*>拦截所有请求,不包括二级以上目录 -->

           <mvc:mapping path="/**"/>

           <!-- 配置不拦截请求的地址 -->

           <!-- <mvc:exclude-mapping path="/user/toLogin.action"/>

           <mvc:exclude-mapping path="/user/login.action"/> -->

           <mvc:exclude-mapping path="/user/*"/>

           <bean class="com.itheima.springmvc.interceptor.LoginInterceptor" />

       </mvc:interceptor>

 

 

 

posted @ 2019-01-21 19:00  人心冇变  阅读(129)  评论(0编辑  收藏  举报