第二阶段springmvc框架熟悉

来源:互联网 发布:高考语文 知乎 编辑:程序博客网 时间:2024/05/21 05:36
任务产出:学习笔记
1:spring mvc
    
干什么事情?
    Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是
    帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。Spring Web MVC也是服务到工作者模式的实现,但进行可优化。前端控制器是DispatcherServlet;应用控制器其实拆为处理器映射器
    (Handler Mapping)进行处理器管理和视图解析器(View Resolver)进行视图管理;页面控制器/动作/处理器为Controller接口(仅包含ModelAndView handleRequest(request, response) 方法)的实现
   (也可以是任何的POJO类);支持本地化(Locale)解析、主题(Theme)解析及文件上传等;提供了非常灵活的数据验证、格式化和数据绑定机制;
    提供了强大的约定大于配置(惯例优先原则)的契约式编程支持。
    
怎么干?
    1、首先用户发送请求————>前端控制器,前端控制器根据请求信息(如URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控制器的控制逻辑部分;
    2、页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在Spring Web MVC中叫命令对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一
       个ModelAndView(模型数据和逻辑视图名);
    3、前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;
    4、前端控制器再次收回控制权,将响应返回给用户,至此整个结束。
    
重要组件:
    1.前端控制器:DispatcherServlet(不需要程序员开发)
    作用:接受请求,响应结果,相当于转发器,中央处理器。
    有了DispatcherServlet,减少了其他组件之间的耦合度。
    2.处理器映射器:HandlerMapping(不需要程序员开发)
    作用:根据请求的url查找Handler。
    3.处理适配器HandlerAdapter。
    作用:按照特定规则(HandlerAdapter要求的规则)去执行HandlerAdapter
    注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以正常去执行Handler.
    4.处理器Handler(需要程序员开发)
    注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以正确执行Handler
    5.视图解析器View resolver(不需要程序员开发)
    作用:进行视图解析,根据逻辑视图名解析真正的试图(view)。
    6.试图:View(需要程序员开发jsp)
    View 是一个接口,实现类支持不同的View类型(jsp,freemarker,pdf....)
    
基础知识:
    @Controller:负责注册一个bean到spring上下文中。
    @RequestMapping:为控制器制定可以处理那些URL请求。属性讲解:value即可以处理的URL请求,
    URL属性可以具体为三类属性值1:具体指定为普通的值。2:指定为含有某变量的一类值。@RequestMapping(value="/owners/{ownerId}", method=RequestMethod.GET)  3:可以制定含正则表达式的一类值如
    @RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\d\.\d\.\d}.{extension:\.[a-z]}")  
    method制定请求的method类型:get post put delete等。
    post 与 get区别:
    get方式是将请求携带的参数放在URL的后面,用于信息获取,提交的数据最多只能是1024字节。
    post方式是将携带的数据放置在包体中,理论上对数据没有限制,post安全性要比get高。
    consumes:处理请求提交的内容类型如:application/json,text/html  @RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json")  
    produces:制定返回的内容类型  @RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json")  
    params:request中必须包含某些参数,才让该方法处理请求。 @RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, params="myParam=myValue")  仅处理请求中名为myParam值为myValue
    的请求。
    headers:request中的header必须包含某些数据,才让该方法处理请求。 @RequestMapping(value = "/pets", method = RequestMethod.GET, headers="Referer=http://www.ifeng.com/")  仅处理请求头中包含
    名为Referer值为http://www.ifeng.com/的请求。
    @RequestBody:该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,把数据绑定到controller方法的参数上。
    @ResponseBody:通过将controller方法返回的对象,通过适当的HttpMessageConverter进行解析,写到responsebody的body数据区。
    @ModelAttribute  
    在方法定义上使用 @ModelAttribute 注解:Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法。
    在方法的入参前使用 @ModelAttribute 注解:可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数–绑定到对象中,再传入入参将方法入参对象添加到模型中。
    @RequestParam 
    在处理方法入参处使用 @RequestParam 可以把请求参 数传递给请求方法。
    @PathVariable
    绑定 URL 占位符到入参。
    @ExceptionHandler
    注解到方法上,出现异常时会执行该方法。
    @ControllerAdvice
    使一个Contoller成为全局的异常处理类,类中用@ExceptionHandler方法注解的方法可以处理所有Controller发生的异常
自动匹配参数:
    @RequestMapping("/person") 
    public String toPerson(String name,double age){ 
        System.out.println(name+" "+age); 
        return "hello"; 
    }
自动装箱机制:
    @RequestMapping("/person1") public String toPerson(Person p){ 
        System.out.println(p.getName()+" "+p.getAge()); 
        return "hello"; 
    }
使用InitBinder来处理Date类型的参数
    @RequestMapping("/date") public String date(Date date){ 
        System.out.println(date); 
        return "hello"; 
    } 
    //At the time of initialization,convert the type "String" to type "date" 
    @InitBinder 
    public void initBinder(ServletRequestDataBinder binder){ 
        binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true)); 
    }
向前台传递参数,前台可在request作用域中取到p 返回前台页面show.jsp
    @RequestMapping("/show") 
    public String showPerson(Map<String,Object> map){ 
        Person p =new Person(); 
        map.put("p", p); 
        p.setAge(20); 
        p.setName("jayjay"); 
        return "show"; 
    }
使用Ajax调用
    @RequestMapping("/getPerson") 
    public void getPerson(String name,PrintWriter pw){ 
        pw.write("hello,"+name); 
    } 
    @RequestMapping("/name") 
    public String sayHello(){ 
        return "name"; 
    }
    $(function(){ 
        $("#btn").click(function(){ 
            $.post("mvc/getPerson",{name:$("#name").val()},function(data){ 
                alert(data); 
            }); 
        }); 
    });


在Controller中使用redirect方式处理请求
    @RequestMapping("/redirect") 
    public String redirect(){ 
        return "redirect:hello"; 
    }
文件上传
    1:导入相应jar包
    2:在spring mvc配置文件中加入
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="102400000"></property> </bean>
    3:方法代码
        @RequestMapping(value="/upload",method=RequestMethod.POST) 
        public String upload(HttpServletRequest req) throws Exception{ 
            MultipartHttpServletRequest mreq = (MultipartHttpServletRequest)req; 
            MultipartFile file = mreq.getFile("file"); 
            String fileName = file.getOriginalFilename(); 
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); 
            FileOutputStream fos = new FileOutputStream(req.getSession().getServletContext().getRealPath("/")+ "upload/"+sdf.format(new Date())+fileName.substring(fileName.lastIndexOf('.'))); 
            fos.write(file.getBytes()); 
            fos.flush(); 
            fos.close(); 
            return "hello"; 
        }
    4:表单
        <form action="mvc/upload" method="post" enctype="multipart/form-data"> 
            <input type="file" name="file"><br> <input type="submit" value="submit"> 
        </form>


使用@RequestParam注解指定参数的name
    @Controller 
    @RequestMapping("/test") 
    public class mvcController1 { 
        @RequestMapping(value="/param") 
        public String testRequestParam(@RequestParam(value="id") Integer id, @RequestParam(value="name")String name){ 
            System.out.println(id+" "+name); 
            return "/hello"; 
            } 
        }
    }


RESTFul风格的SringMVC
    @Controller @RequestMapping("/rest") 
    public class RestController { 
        @RequestMapping(value="/user/{id}",method=RequestMethod.GET) 
        public String get(@PathVariable("id") Integer id){ 
            System.out.println("get"+id); return "/hello"; 
    } 
    @RequestMapping(value="/user/{id}",method=RequestMethod.POST) 
    public String post(@PathVariable("id") Integer id){ 
        System.out.println("post"+id); return "/hello"; 
    } 
    @RequestMapping(value="/user/{id}",method=RequestMethod.PUT) 
    public String put(@PathVariable("id") Integer id){ 
        System.out.println("put"+id); return "/hello"; 
    } 
    @RequestMapping(value="/user/{id}",method=RequestMethod.DELETE) 
    public String delete(@PathVariable("id") Integer id){ 
        System.out.println("delete"+id); 
        return "/hello"; 
        } 
    }
前台产生请求:
    <form action="rest/user/1" method="post"> 
        <input type="submit" value="post"> 
    </form>
返回json格式的字符串
    @Controller @RequestMapping("/json") 
    public class jsonController { 
        @ResponseBody 
        @RequestMapping("/user") 
        public User get(){ 
            User u = new User(); 
            u.setId(1); 
            u.setName("jayjay"); 
            u.setBirth(new Date()); 
            return u; 
        } 
    }


异常的处理
    处理局部异常(Controller内)
        @ExceptionHandler 
        public ModelAndView exceptionHandler(Exception ex){ 
            ModelAndView mv = new ModelAndView("error"); 
            mv.addObject("exception", ex); 
            System.out.println("in testExceptionHandler"); 
            return mv; 
        } 
        @RequestMapping("/error") 
        public String error(){ 
            int i = 5/0; 
        return "hello"; 
        }
    处理全局异常(所有Controller)
        @ControllerAdvice 
        public class testControllerAdvice { 
            @ExceptionHandler 
            public ModelAndView exceptionHandler(Exception ex){ 
                ModelAndView mv = new ModelAndView("error"); 
                mv.addObject("exception", ex); 
                System.out.println("in testControllerAdvice"); 
                return mv; 
            } 
        }
    另一种处理全局异常的方法 在SpringMVC配置文件中配置
        <!-- configure SimpleMappingExceptionResolver --> 
        <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 
            <property name="exceptionMappings"> 
                <props> 
                    <prop key="java.lang.ArithmeticException">
                        error
                    </prop> 
                </props> 
            </property> 
        </bean>


设置一个自定义拦截器
    创建一个MyInterceptor类,并实现HandlerInterceptor接口
        public class MyInterceptor implements HandlerInterceptor { 
            @Override 
            public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { 
                System.out.println("afterCompletion"); 
            } 
            @Override 
            public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { 
                System.out.println("postHandle"); 
            } 
            @Override 
            public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { 
                System.out.println("preHandle"); 
                return true; 
            } 
        }
    在SpringMVC的配置文件中配置
        <!-- interceptor setting --> 
        <mvc:interceptors> 
            <mvc:interceptor> 
                <mvc:mapping path="/mvc/**"/> 
                <bean class="test.SpringMVC.Interceptor.MyInterceptor">
                </bean> 
            </mvc:interceptor> 
        </mvc:interceptors>


表单的验证(使用Hibernate-validate)及国际化
    编写实体类User并加上验证注解  @Past表示时间必须是一个过去值
        public class User { 
            public int getId() { 
                return id; 
            } 
            public void setId(int id) { 
                this.id = id; 
            } 
            public String getName() { 
                return name; 
            } 
            public void setName(String name) { 
                this.name = name; 
            } 
            public Date getBirth() { 
                return birth; 
            } 
            public void setBirth(Date birth) { 
                this.birth = birth; 
            } 
            @Override 
            public String toString() { 
                return "User [id=" + id + ", name=" + name + ", birth=" + birth + "]"; 
            } 
            private int id; 
            @NotEmpty 
            private String name; 
            @Past 
            @DateTimeFormat(pattern="yyyy-MM-dd") 
            private Date birth; 
        }
    在jsp中使用SpringMVC的form表单 path对应name
        <form:form action="form/add" method="post" modelAttribute="user"> 
            id:<form:input path="id"/><form:errors path="id"/><br> 
            name:<form:input path="name"/><form:errors path="name"/><br> 
            birth:<form:input path="birth"/><form:errors path="birth"/> 
            <input type="submit" value="submit"> 
        </form:form>


    Controller中代码
        @Controller 
        @RequestMapping("/form") 
        public class formController { 
            @RequestMapping(value="/add",method=RequestMethod.POST) 
            public String add(@Valid User u,BindingResult br){ 
                if(br.getErrorCount()>0){ 
                    return "addUser"; 
                } 
                return "showUser"; 
            } 
            @RequestMapping(value="/add",method=RequestMethod.GET) 
            public String add(Map<String,Object> map){ 
                map.put("user",new User()); 
                return "addUser"; 
            } 
        }


    1.因为jsp中使用了modelAttribute属性,所以必须在request域中有一个"user".
  2.@Valid 表示按照在实体上标记的注解验证参数
  3.返回到原页面错误信息回回显,表单也会回显
错误信息自定义
    在src目录下添加locale.properties
        NotEmpty.user.name=name can't not be empty 
        Past.user.birth=birth should be a past value 
        DateTimeFormat.user.birth=the format of input is wrong 
        typeMismatch.user.birth=the format of input is wrong 
        typeMismatch.user.id=the format of input is wrong
    在SpringMVC配置文件中配置
        <!-- configure the locale resource --> 
        <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
            <property name="basename" value="locale">
            </property> 
        </bean>
国际化显示
    在src下添加locale_zh_CN.properties
        username=账号 
        password=密码
    locale.properties中添加
        username=user name 
        password=password
    创建一个locale.jsp
        <body> 
            <fmt:message key="username">
            </fmt:message> 
            <fmt:message key="password">
            </fmt:message> 
        </body>
    在SpringMVC中配置
        <!-- make the jsp page can be visited --> 
        <mvc:view-controller path="/locale" view-name="locale"/>
    让locale.jsp在WEB-INF下也能直接访问
    最后,访问locale.jsp,切换浏览器语言,能看到账号和密码的语言也切换了。
































    
原创粉丝点击