SpringMvc(个人笔记)

服务端分层:
    表现层              业务层             持久层
SpringMvc/Struts        Spring        Mybatis/Hibernate

SpringMvc采用MVC的设计模式:
    model       实体       JavaBean
    view        视图       Jsp
    controller  控制器     Servlet
Struts2的核心是一个过滤器,而SpringMvc的核心是一个Servlet
----------------------------------------------------------------
(乱总结:spring mvc的运行流程,spring是基于组建来运行的,其中的核心组件是
DispatcherServlet,它作为调度中心来协调各个组件的工作。spring mvc包括前端控制器
处理器映射器、处理器适配器、Controller、视图解析器)
    执行流程:前端发来请求到前端控制器,将请求递交到处理器映射器,返回执行链,递交到
    处理器适配器,处理器适配器去执行Handler即Controller,Controller返回ModelAndView
    然后由视图解析器解析返回视图,数据填充返回响应。

SpringMvc的注解和配置:
    1.<!--开启SpringMvc注解的支持-->
    <mvc:annotation-driven/>在springMvc的各个组件中,处理器映射器、处理器适配器
    视图解析器称为SpringMvc的三大组件。使用这个配置标签后会自动加载这些组件

    2.@RequestMapping(path = "/hello")用于建立请求url和处理请求方法之间的对应关系
            属性:
    3.请求参数的绑定:
        a.有一些机制,如果方法的参数名和请求数据名字相同会自动绑定
        https://www.kali.com/sss?username=we&password=231
        public String query(String username,String password){}

        b.对请求的封装
        public String query(Account account){}
            如果account中包含引用类型要指定account中的属性.属性

        c.解决post请求中文乱码问题,使用spring提过的过滤器CharacterEncodingFilter
        拦截/*,其中要配置init-param > encoding UTF-8即可

        d.集合参数的封装

    4.配置解决中文乱码的过滤器
        <filter>
          <filter-name>characterEncodingFilter</filter-name>
          <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
          <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
          </init-param>
        </filter>
        <filter-mapping>
          <filter-name>characterEncodingFilter</filter-name>
          <url-pattern>/*</url-pattern>
        </filter-mapping>
    5.自定义数据类型转换器
        解决日期格式错误导致封装出错的问题
            1.定义一个类实现Converter接口,泛型代表接收类型和转换类型
            2.配置自定义类型转换器
                <!--配置自定义类型转换器-->
                <!--配组件-->
                <bean id="conversionServiceFactory" class="org.springframework.context.support.ConversionServiceFactoryBean">
                    <property name="converters">
                        <set>
                            <bean class="com.kali.utils.StringToDateConverter"/>
                        </set>
                    </property>
                </bean>

                <!--开启SpringMvc注解的支持 默认会将映射器适配器视图解析器加载,
                但类型转换需要配置生效-->
                <mvc:annotation-driven conversion-service="conversionServiceFactory"/>

获取原生的ServletAPI,在控制器中
    testServletAPI(HttpServletRequest request, HttpServletResponse response)

常用注解:
    @RequestParam解决url中属性与方法接收参数名不符的情况,加在方法参数前
        @RequestParam(name = "name",required = false)
    @RequestBody针对post请求使用
    @PathVariable用于绑定url中的占位符,如:/delete/{id}这个{id}就是url的占位符
    @RequestHeader
    @CookieValue获取指定cookie的键值

    @ModelAttribute可以作用于参数和方法上:出现在方法上,表示当前方法在控制器方法
        执行之前,限制性。出现在参数上,将获取的指定的数据给参数赋值
            @ModelAttribute注解在方法上,方法的返回值就是它的值:
                @ModelAttribute(value = "name")那么方法的返回值就是name的值
            @ModelAttribute注解在方法参数上
            method(@ModelAttribute(value = "name") String name){
                //I should do something!
            }就会把name的值传递给这个String类型的name。
            @ModelAttribute注解的方法分为两种情况:
                1.有返回值的,也会将返回值填充到request域中
                    @ModelAttribute("u")
                    public User model(@RequestParam("uname") String name,@RequestParam("uage") int age){
                        User user = new User();
                        user.setName(name);
                        user.setAge(age);
                        user.setDate(new Date());
                        System.out.println("有返回值model方法中的" + user);
                        return user;
                    }
                2.无返回值,不会填充到request域中
                    @ModelAttribute("xx")
                    public void model(@RequestParam("uname") String name, @RequestParam("uage") int age, Map<String,User> map){
                        User user = new User();
                        user.setName(name);
                        user.setAge(age);
                        user.setDate(new Date());
                        System.out.println("无返回值model方法中的" + user);
                        map.put("xx",user);
                    }
                    @ModelAttribute作用类似Spring的Bean注解
        【注】被@ModelAttribute注解的方法会在Controller的每个方法前执行,如果Controller映射到
        多个url时,要谨慎使用。而且@ModelAtrribute仅支持一个属性value。他注解的方法返回值会绑定
        在request域中。
    @SessionAttribute允许我们有选择地指定Model中哪些属性需要存入HttpSession对象中
    @SessionAttributes临时性的存储,上面的是永久的存储
        @SessionAttributes使用在类上,将model中属性名为"user"的属性放入HttpSession中
        方法中需要model.addAttribute("user",user)
        存入时需要Model作为方法的参数之一传入,默认填充到request域中
    删除:将设置入域中的值删除,方法参数中传入SessionStatus调用setComplete()方法即可清除。
    【注】用于多次执行控制器方法之间的参数共享。如果在类上不使用@SessionAttributes注解
    将把数据存入到requestScope中,如果使用也将存入到sessionScope中

--------------------------------------------
配置了类型转换器为什么原生支持的类型解析不了了?
--------------------------------------------

WEB-INF目录下的文件访问权限
        对于Tomcat服务器而言,WEB-INF是个特殊的目录。这个目录并不属于Web应用程序可以
    访问的上下文路径的一部分,对于客户端来说,这个目录是不可见的,不能通过在浏览器
    中直接输入地址的方式来访问。但该目录下的内容对于Servlet代码是可见的,
    这意味着:要访问WEB-INF目录下的页面,必须通过servlet进入页面,而不能直接访问该页面。

    WEB-INF目录下的jsp"不能通过在浏览器中直接输入地址的方式来访问"

当Handler映射的方法是void类型时如何响应呢?
    【请求转发方法不会调用视图解析器,需要自己提供转发路径】
    1.request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
    2.response.sendRedirect(request.getContextPath() + "/response.jsp");
    3.使用输出流响应
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter writer = response.getWriter();
        writer.print("你好");
    4.使用关键字实现重定向或者转发forward,redirect,使用关键字不能调用视图解析器
        return "forward:/WEB-INF/pages/success.jsp";
        重定向需要加项目名称的,但这里没写,说明底层做了处理
        return "redirect:/response.jsp";
        【controller提供的String类型返回值之后,默认就是请求转发】
    5.使用ModelAndView作为方法返回值来响应客户端
    6.使用ajax发送请求,返回数据。配合@RequestBody拿到数据@ResponseBody来返回响应,
    格式为Json数据
        需要的jar包
              jackson-core.jar
              jackson-databind.jar
              jackson-annotations.jar

    $(function () {
        $("#btn").click(function () {
            /*contentType的MIME类型*/
            //alert("hello!")
            $.ajax({
                url:"user/testAjax",
                contentType:"application/json;charset=UTF-8",
                data:'{"name":"haha","age":"15","money":"400"}',
                dataType:"json",
                type:"post",
                success:function (data) {
                    //data是服务端相应的数据,然后解析
                    console.log(data.name + " " + data.age + " " + data.money);
                }
            })
        })
    });

    总结:发送请求到服务端,可以通过返回类型为string的方法返回相应的页面,如果需要返回值
    可以绑定在Model对象中,在请求域中获取;也可通过request转发或者response重定向一个返回
    页面。对于request和response的使用还可以通过返回一个特定格式的字符串如:
        return "forward:/WEB-INF/pages/success.jsp"
        return "redirect:/index.jsp"
    这两者是不能使用视图解析器的,需要指明路径。
    可以使用ModelAndView作为返回值,在model中设置视图和模型。
    可以使用ajax发送异步请求,映射方法参数中使用@RequestBody接收,方法返回值为返回类型
    在前面加@ResponseBody,对于ajax发送的json格式数据的解析需要jackson相应的jar包。配置
    这两个注解后便会自动封装数据到方法参数中,返回也会自动封装为json对象返回。
        /*模拟异步请求和响应*/
        @RequestMapping(path = "/testAjax")
        public @ResponseBody User testAjax(@RequestBody User user){
            System.out.println("ajax执行了");
            //导入相关jar包,已经将数据封装到对象中
            System.out.println(user);
            user.setName("we");
            System.out.println(user);
            return user;
        }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值