springMVC学习笔记(二)

1:复杂对象的形参绑定的定义:

 

2: 数组的形参绑定方式的定义:

3:  List的形参绑定方式:

页面

包装类对list进行封装

 

Handler中的包装类的装载。

 

4:  Map的参数包装

        同样也是通过包装类型来封装

 

Springmvc的校验框架:

         Springmvc使用的是hibernate校验框架,添加hibernate校验框架的jar包,但是跟hibernate没有任何关系的。

配置校验器:

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">

<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>

       <!--不设置则默认为classpath下的 ValidationMessages.properties -->

       <property name="validationMessageSource" ref="validatemessageSource"/>

</bean>

 

<bean id="validatemessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">  
        <property name="basename" value="classpath:validatemessages"/>  
        <property name="fileEncodings" value="utf-8"/>  
        <property name="cacheSeconds" value="120"/>  
    </bean>

把校验器注册到适配器中:

<mvc:annotation-drivenvalidator="validator"> </mvc:annotation-driven>

 

在pojo中添加校验规则:

在controller中添加校验:

添加错误的提示信息:

@RequestMapping("/add.action")

public String toIndex( HttpServletRequest request ,@Validated(value={ValidateGroup1.class}) String name, BindingResult bindingResult, Model model){

                   if(bindingResult.hasErrors()){

                            List<ObjectError>errors=bindingResult.getAllErrors();

                            model.addAttribute("error", errors);

                   }

页面显示校验错误信息

分组校验:

         在pojo中定义校验的规则,而pojo是被多个controller所共用的,当不同的controller方法对同一个pojo进行校验,但是每个controller方法需要不同的校验规则的时候。

        

解决方法:

        定义多个校验分组(其实是一个java接口),分组中定义有哪些规则,每个controller方法使用不同的校验分组。

在校验规则中定义分组:

 // 图书名称

      @Size(min=1,max=30,message="{items.length.error}",groups={ValidateGroup1.class} )

private String name;

在controller中使用指定分组的校验:

@RequestMapping("/add.action")

Public String toIndex(HttpServletRequestrequest ,@Validated(value={ValidateGroup1.class}) String name,BindingResult bindingResult, Model model){

数据的回显:

         提交后,如果出现错误,将刚才提交的数据会显到刚才的提交页面。

对象回显方法:

1.      springmvc默认对对象数据进行回显。

对象数据传入controller方法后,Springmvc自动将对象数据放到request域,key等于对象类型

2.使用@ModelAttrubute指定对象回显到页面在request中的key。还可以将方法的返回值传到页面。

            Itemtypes表示最终要将方法的返回值,放到request返回值的key中。这样的话在页面中就得到了itemtypes中的数据回显。

       

3.使用最简单的方法

 

异常处理

系统中异常包括两类:预期异常和运行时异常,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发,测试通过手段减少运行时异常的发生

在Springmvc中系统的dao,service,controller出现都是通过throwsException向上抛出,最后由springmvc前端控制器,交由异常处理器进行异常处理的

Springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一得异常处理。

自定义异常类

         public class MyException extends Exception {

    private String Message;

    public MyException(String message) {

        super(message);

        this.Message = message;

    }

    public String getMessage() {

        return Message;

    }

    public void setMessage(String message) {

        Message = message;

    }

}

全局异常处理器

思路:

         系统遇到异常,从程序中手动抛出,dao抛给service,service给controller,controller抛给前端控制器,前端控制器调用全局异常处理器

全局异常处理器:

         解析异常类型

         如果该异常类型是系统自定义的异常,直接取出异常信息,在错误页面展示

         如果该异常类型不是系统自定义的异常,构造一个自定义的异常类型

/**

 * 自定义的异常处理器(自定义的异常解析器)

 *

 * @author Administrator

 */

public classMyExceptionResover implements HandlerExceptionResolver {

    @Override

    public ModelAndViewresolveException(HttpServletRequest request,

            HttpServletResponseresponse, Object arg2, Exception exception) {

        /*

         *

    *1 解析异常类型 2 如果该异常类型是系统自定义的异常,直接取出异常信息,在错误页面展示 3

         * 如果该异常类型不是系统自定义的异常,构造一个自定义的异常类型

         */

        MyExceptionmyException = null;

        Stringmessage= "";

        if (exception instanceof MyException) {

            myException = (MyException) exception;

        }else{

            myException = new MyException("unkonw exception");

        }

        ModelAndViewmodelAndView = new ModelAndView();

        modelAndView.addObject("exceptionMessage",myException.getMessage());

        modelAndView.setViewName("error");

        return modelAndView;

    }

}

配置全局异常处理器

<!-- 配置全局异常处理器 -->

    <bean class="com.cn.hnust.exception.MyExceptionResover"></bean>

上传图片:

Springmvc对多部件类型的解析:

在页面form中提交entype=”multipart/form-data”的数据时,需要springmvc对multipart类型的数据进行解析,在springmvc.xml中配置mutipart类型解析器。

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

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

         <property name="defaultEncoding"><value>UTF-8</value></property>

  </bean>

创建图片的虚拟目录来存储图片

配置tomcat下面conf目录下的server.xml文件的虚拟文件目录用来上传图片

注意:在图片虚拟目录中,一定将图片目录分级创建(提高i/o 性能)

编写上传图片的代码

@RequestMapping("/add.action")

public String toIndex( HttpServletRequest request ,@Validated(value={ValidateGroup1.class}) String name, BindingResult bindingResult, Model model,MultipartFile file){

页面图片文件名要与multipart的文件名一致。

 

Json数据交互:

Json数据格式在接口调用中,html页面中较常用用。Json格式比较简单,解析还是比较方便。

1.请求json.输出json.要求请求的是json串,所以在前端页面中需要将请求的内容转换成json,不太方便。

2.请求的是key/value,输出的是json。

环境装备(导入json数据支持的包)

Springmvc中使用jackson的包进行json转换(@requestBody和@responseBody)使用下边的包进行json转换。

 

配置json转换器:

1.使用适配器配置方式

2.使用适配器注解方式

<mvc:annotation-driven validator="validator"> </mvc:annotation-driven>

 如果使用了注解的配置方式的话就不用再配置了。

编码

1输入json,输出 json:

 

2:输入key/value,输出json:

 

Restful:

它是一个开发理念,对http进行了很好的解释。

定义restful风格的url

Restful前端控制器的配置:

利用restful请求静态资源

拦截器

定义拦截器,HandlerInterceptor实现HandlerInterceptor方法,

public classHandlerInterceptor implements org.springframework.web.servlet.HandlerInterceptor{

    @Override

    //handler执行完执行此方法

    //可以用来统一异常处理,统一日志处理

    public voidafterCompletion(HttpServletRequest arg0,

            HttpServletResponsearg1, Object arg2, Exception arg3)

            throws Exception {

        // TODO Auto-generated method stub

    }

    @Override

    //进入handler之后,返回ModelAndView之前,将公用的模型数据传到视图

    public voidpostHandle(HttpServletRequest arg0, HttpServletResponse arg1,

            Objectarg2, ModelAndView arg3) throws Exception {

        // TODO Auto-generated method stub     

    }

    @Override

    //进入handler方法之前,用于身份验证与授权

    public booleanpreHandle(HttpServletRequest arg0, HttpServletResponse arg1,

            Objectarg2) throws Exception {

        // TODO Auto-generated method stub

        return false;

    }

}

如上所以定义拦截器。

配置拦截器:

    Springmvc拦截器针对HandlerMapping进行拦截设置,如果在某个HandlerMapping中配置拦截,经过该HandlerMapping映射成功的handler最终使用该拦截器。

类似全局的拦截器配置

Springmvc配置类似全局的拦截器,springmvc框架将配置的类似全局的拦截器注入到每个HandlerMapping中。

<mvc:interceptors>  

    <!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->  

    <bean class="com.host.app.web.interceptor.AllInterceptor"/>  

    <mvc:interceptor>  

        <mvc:mapping path="/test/number.do"/>  

        <!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->  

        <bean class="com.host.app.web.interceptor.LoginInterceptor"/>  

    </mvc:interceptor>  

</mvc:interceptors>  

拦截器位置放置:

         统一日志处理拦截器,需要该拦截器prehandle一定要放行,且将它放在拦截器连接中第一个位置,而登陆校验拦截器与权限校验拦截器依次进行放置。

实现登陆认证的拦截器:

1写handler

             /**

     * 测试登陆拦截器

     * @param session

     * @param username

     * @param pass

     * @return

     */

    @RequestMapping("/login")

    public Stringlogin(HttpSession session,Stringusername,String pass){    

        session.setAttribute("username",username);

        return "redirect:success";

     }

   

    @RequestMapping("/logout")

    public Stringlogout(HttpSession session,Stringusername,String pass){

        //清除session

        session.invalidate();

        return "redirect:login";

    }

2写拦截器

         public class LoginInterceptor implements HandlerInterceptor{

    @Override

    //handler执行完执行此方法

    //可以用来统一异常处理,统一日志处理

    public voidafterCompletion(HttpServletRequest arg0,

            HttpServletResponsearg1, Object arg2, Exception arg3)

            throws Exception {

        // TODO Auto-generated method stub

    }

    @Override

    //进入handler之后,返回ModelAndView之前,将公用的模型数据传到视图

    public voidpostHandle(HttpServletRequest arg0, HttpServletResponse arg1,

            Objectarg2, ModelAndView arg3) throws Exception {

        // TODO Auto-generated method stub     

    }

    @Override

    //进入handler方法之前,用于身份验证与授权

    public booleanpreHandle(HttpServletRequest request, HttpServletResponse response,

            Objectarg2) throws Exception {

        Stringurl=request.getRequestURI();

        /**

         * 首次登陆放行

         */

        if(url.indexOf("login.action")!=-1){

            return true;

        }

        Stringusername=request.getParameter("username");

        if(request.getSession().getAttribute(username)!=null){

            return true;

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

        return false;

    }

}

3配置拦截器

    <!-- 配置拦截器 -->

    <mvc:interceptors>

        <!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->

        <bean />

        <mvc:interceptor>

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

            <!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->

            <bean class="com.cn.hnust.interceptor.LoginInterceptor"/>

        </mvc:interceptor>

    </mvc:interceptors>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值