SpringMVC_2

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/guanhang89/article/details/78570997

SpringMVC_2

参数绑定:(从请求中接收参数)

1)默认支持的类型:Request,Response,Session,Model
2)基本数据类型(包含String)
3)Pojo类型(里面是一些简单类型)
    spirngMvc可以直接接收pojo类型:要求页面上input框的name属性名称必须等于pojo的属性名称
4)Vo类型(里面是一些复杂类型) 
    如果Controller中接收的是Vo,那么页面上input框的name属性值要等于vo的属性.属性.属性
5)Converter自定义转换器
6)数组
7)List
/**
     * springMvc中默认支持的参数类型:也就是说在controller方法中可以加入这些也可以不加,  加不加看自己需不需要,都行.
     *HttpServletRequest
     *HttpServletResponse
     *HttpSession
     *Model
     *
     *通过@PathVariable可以接收url中传入的参数
     *@RequestMapping("/itemEdit/{id}")中接收参数使用大括号中加上变量名称, @PathVariable中的变量名称要和RequestMapping
     *中的变量名称相同
     */
    @RequestMapping("/itemEdit/{id}")
    public String itemEdit(@PathVariable("id") Integer id, HttpServletRequest reuqest, 
             Model model) throws Exception{

        //String idStr = reuqest.getParameter("id");
        Items items = itmesService.findItemsById(id);

        //Model模型:模型中放入了返回给页面的数据
        //model底层其实就是用的request域来传递数据,但是对request域进行了扩展.
        model.addAttribute("item", items);

        //如果springMvc方法返回一个简单的string字符串,那么springMvc就会认为这个字符串就是页面的名称
        return "editItem";
    }

controller方法返回值(指定返回到哪个页面, 指定返回到页面的数据)

1)ModelAndView 
    modelAndView.addObject("itemList", list); 指定返回页面的数据
    modelAndView.setViewName("itemList");     指定返回的页面
2)String(推荐使用)
    返回普通字符串,就是页面去掉扩展名的名称, 返回给页面数据通过Model来完成
    返回的字符串以forward:开头为请求转发
    返回的字符串以redirect:开头为重定向
3)返回void(使用它破坏了springMvc的结构,所以不建议使用)
    可以使用request.setAttribut 来给页面返回数据
    可以使用request.getRquestDispatcher().forward()来指定返回的页面
    如果controller返回值为void则不走springMvc的组件,所以要写页面的完整路径名称

相对路径:相对于当前目录,也就是在当前类的目录下,这时候可以使用相对路径跳转
绝对路径:从项目名后开始.
在springMvc中不管是forward还是redirect后面凡是以/开头的为绝对路径,不以/开头的为相对路径
例如:forward:/items/itemEdit.action 为绝对路径
    forward:itemEdit.action为相对路径

架构级别异常处理:

主要为了防止项目上线后给用户抛500等异常信息,所以需要在架构级别上整体处理.hold住异常
首先自定义全局异常处理器实现HandlerExceptionResolver接口
在spirngMvc.xml中配置生效
    <!-- 配置全局异常处理器 -->
    <bean class="cn.itheima.exception.CustomGlobalExceptionResolver"></bean>
//自定义异常类,用来处理自定义异常
public class CustomException extends Exception{
    //保存异常信息
    private String  message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }   
}

//自定义全局异常处理
public class CustomGlobalExceptionResolver implements HandlerExceptionResolver{

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, 
            Object arg2, Exception exc) {
        //保存异常信息
        String msg = "";

        //判断异常类型
        if(exc instanceof CustomException){
            //处理业务级别异常
            msg = ((CustomException)exc).getMessage();
        } else {
            //处理运行时异常
            msg = "系统异常, 亲,对不起, 请及时联系管理员哦!";
        }

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("msg", msg);
        modelAndView.setViewName("error");
        return modelAndView;
    }
}

上传图片:

1)在tomcat中配置虚拟图片服务器
2)导入fileupload的jar包
3)在springMvc.xml中配置上传组件
4)在页面上编写上传域,更改form标签的类型
5)在controller方法中可以使用MultiPartFile接口接收上传的图片
6)将文件名保存到数据库,将图片保存到磁盘中
<!-- 文件上传 -->
<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 设置上传文件的最大尺寸为5MB -->
    <property name="maxUploadSize">
        <value>5242880</value>
    </property>
</bean>
@RequestMapping("/updateitem")
//public String update(Integer id, String name, Float price, String detail) throws Exception{
public String update(MultipartFile pictureFile,Items items, Model model, HttpServletRequest request) throws Exception{
    //1. 获取图片完整名称
    String fileStr = pictureFile.getOriginalFilename();
    //2. 使用随机生成的字符串+源图片扩展名组成新的图片名称,防止图片重名
    String newfileName = UUID.randomUUID().toString() + fileStr.substring(fileStr.lastIndexOf("."));
    //3. 将图片保存到硬盘
    pictureFile.transferTo(new File("E:\\image\\" + newfileName));
    //4.将图片名称保存到数据库
    items.setPic(newfileName);
    itmesService.updateItems(items);
    //返回数据
    //request.setAttribute("", arg1);
    //指定返回的页面(如果controller方法返回值为void,则不走springMvc组件,所以要写页面的完整路径名称)
    //request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request, response);

    //重定向:浏览器中url发生改变,request域中的数据不可以带到重定向后的方法中
    //model.addAttribute("id", items.getId());
    //在springMvc中凡是以redirect:字符串开头的都为重定向
    return "redirect:itemEdit/"+items.getId();

    //请求转发:浏览器中url不发生改变,request域中的数据可以带到转发后的方法中
    //model.addAttribute("id", items.getId());
    //spirngMvc中请求转发:返回的字符串以forward:开头的都是请求转发, 
    //后面forward:itemEdit.action表示相对路径,相对路径就是相对于当前目录,当前为类上面指定的items目录.在当前目录下可以使用相对路径随意跳转到某个方法中
    //后面forward:/itemEdit.action路径中以斜杠开头的为绝对路径,绝对路径从项目名后面开始算
    //return "forward:/items/itemEdit.action";
}

Json数据交互:

需要加入jackson的jar包
@Requestbody:将页面传到controller中的json格式字符串自动转换成java的pojo对象
@ResponseBody:将java中pojo对象自动转换成json格式字符串返回给页面

RestFul支持:

就是对url的命名标准,要求url中只有能名词,没有动词(不严格要求),但是要求url中不能用问号?传参
传参数:
    页面:${pageContext.request.contextPath }/items/itemEdit/${item.id}
    方法: @RquestMapping("/itemEdit/{id}")
    方法: @PathVariable("id") Integer idd

拦截器:

作用:拦截请求,一般做登录权限验证时用的比较多
1)需要编写自定义拦截器类,实现HandlerInterceptor接口
2)在spirngMvc.xml中配置拦截器生效
public class Interceptor1 implements HandlerInterceptor {

    //执行时机:controller已经执行,modelAndview已经返回
    //使用场景: 记录操作日志,记录登录用户的ip,时间等.
    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        System.out.println("======Interceptor1=======afterCompletion========");
    }

    //执行时机:Controller方法已经执行,ModelAndView没有返回
    //使用场景: 可以在此方法中设置全局的数据处理业务
    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        System.out.println("======Interceptor1=======postHandle========");

    }

    //返回布尔值:如果返回true放行,返回false则被拦截住
    //执行时机:controller方法没有被执行,ModelAndView没有被返回
    //使用场景: 权限验证
    @Override
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        System.out.println("======Interceptor1=======preHandle========");
        return true;
    }
}

拦截器的顺序:

    <!-- 配置拦截器 -->
    <mvc:interceptors>
        <!-- 多个拦截器的执行顺序等于springMvc.xml中的配置顺序 -->
<!--        <mvc:interceptor> -->
            <!-- 拦截请求的路径    要拦截所有必需配置成/** -->
<!--            <mvc:mapping path="/**"/> -->
            <!-- 指定拦截器的位置 -->
<!--            <bean class="cn.itheima.interceptor.Interceptor1"></bean> -->
<!--        </mvc:interceptor> -->

        <mvc:interceptor>
            <!-- 拦截请求的路径    要拦截所有必需配置成/** -->
            <mvc:mapping path="/**"/>
            <!-- 指定拦截器的位置 -->
            <bean class="cn.itheima.interceptor.LoginInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

登录权限验证:

1)编写登录的controller, 编写跳转到登录页面的方法,  编写登录验证方法
2)编写登录页面
3)编写拦截器

运行过程:
1)访问随意一个页面,拦截器会拦截请求,会验证session中是否有登录信息
如果已登录,放行
如果未登录,跳转到登录页面
2)在登录页面中输入用户名,密码,点击登录按钮,拦截器会拦截请求,如果是登录路径放行
在controller方法中判断用户名密码是否正确,如果正确则将登录信息放入session
登录验证:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
    //判断当前访问路径是否为登录的路径,如果是则放行
    if(request.getRequestURI().indexOf("/login") > 0){
        return true;
    }

    //判断session中是否有登录信息,如果没有则跳转到登录页面,如果有则放行
    HttpSession session = request.getSession();
    if(session.getAttribute("username") != null){
        return true;
    }

    request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
    return false;
}

猜你喜欢

转载自blog.csdn.net/guanhang89/article/details/78570997