二:SpringMVC知识整理

springmvc复习:
1.SpringMVC介绍
2.SpringMVC入门程序

    1)创建web工程
    2)导入jar包
    3)在web.xml中配置前端控制器(指定上下文件的路径 classpath:springmvc.xml)
        *.do(*.action)拦截以do结尾的  /拦截所有(不包含jsp)  /*拦截所有
    4)springmvc.xml配置扫描@controller注解
    5)Action Controller Handler处理器 程序员书写的 类上@Controller
        方法上@RequestMapping(value=请求的路径) .action可省略
        public ModelAndView itemList(){
            new ModelAndView
            设置数据
            设置jsp页面的路径 /WEB-INF/demo.jsp
        }           

3.SpringMVC架构分析 (一个中心,三个基本点,两个开发)

    前端控制器  (由springmvc提供)
    处理器映射器  处理器适配器  视图解析器  (由springmvc提供)
    Handler处理器  jsp视图  (由程序员书写)     

4.springmvc原理

    1)用户请求到前端控制器
    2)前端控制器让处理器映射器根据rul去找具体的处理器中请求映射的路径,对应的方法,
        返回找到的方法(包名+类名+方法名)
    3)前端控制器通过处理器适配器调用处理器去执行此方法(执行前绑定参数),返回ModelAndView
    4)前端控制器让视图解析器去解析ModelAndView,返回具体View
    5)前端控制器对View进行渲染视图(即将模型数据填充至视图中)
    6)前端控制器渲好的html响应给用户 

5.默认的三大组件(前两个废弃了,采用下面的这两个)

    RequestMappingHandlerMapping
    RequestMappingHandlerAdapter
    <mvc:anonation-driver/>注解驱动--可替代上面两大组件
    InternalResourceViewResolver视图解析器:优化前缀及后缀       

6.整合MyBatis
整合思想:

        1)SqlMapConfig.xml  mybatis配置文件
            别名
        2)applicationContext.xml  spring配置文件
            数据源(c3p0,dbcp,druid):读取db.properties(创建db.properties文件)
            mybatis的会话工厂(SqlSessionFactory)
            mybatis的mapper 动态代理开发扫描-基本包
            [开启事务,扫描@service]
        3)创建springmvc.xml文件
            扫描基本包(com.spring)  此包下controller,service全扫描
            手动配置三大组件
        4)web.xml文件
            配置监听器读取applicationContext.xml上下文
            配置前端控制器读取springmvc.xml
            配置post提交乱码(Filter过滤器)               

6.参数绑定
1)默认参数绑定

        Request  Response  Session  Model(接口)->ModelMap(实现类)

2)简单类型参数绑定

        方法的形参上(@RequestParam("name")Integer/String/Double/Boolean...)
        表单参数与形参一致(不一致可以用@RequestParam注解)

3)pojo类型

        方法的形参上(@ModelAttribute("user")User user)
        表单参数与实体属性一致
        可以使用@ModelAttribute注解:将请求参数封装到对象user中,并以key=user存储到request作用域中

4)QueryVo包装类(里面item)

        表单参数与包装类中item对象的属性一致
        QueryVo vo.item(实体属性)  --  item.name(表单参数)

5)自定义参数类型 转换日期 2018:12_16 15:00_12

        ①.springmvc.xml里配置转换器的工厂
        ②.converters -> list/set/array -> <bean class="自定义转换器类"/>
            <bean id="conversionServiceFactoryBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
                <!-- 配置多个转换器-->
                <property name="converters">
                    <list>
                        <bean class="com.springmvc.conversion.DateConveter"/>
                    </list>
                </property>
            </bean>
        ③.创建自定义转换器类
            实现Converter<S,T> S:页面传递过来的类型 T:转换后的类型               

7.SpringMVC中控制层类

    1)入口是一个servlet,即前端控制器
    2)单例模式(基于方法开发,请求参数传递到方法的形参)
    3)请求参数是形参(不能是成员变量)
    4)mav.addObject()只能存到request作用域中        

8.参数绑定高级参数:

    数组:页面选中多个checkbox向controller方法传递
        Controller方法中可以用Integer[]/String[]接收,或者pojo的Integer[]/String[]属性接收
    集合:List中存放对象,并将定义的List放在包装类QueryVo中
        private List<Item> itemList;
        表单name属性必须是list属性名+下标+元素属性
        ${status.index} 输出行号,从0开始。
        ${status.count} 输出行号,从1开始
        begin、end、step分别表示:起始序号,结束序号,跳跃步伐       

[email protected]注解
1.url路径映射

        value值是数组,可以将多个url映射到同一个方法
        @RequestMapping(value = { "itemList", "itemListAll" })

2.窄化路径

        在class上添加@RequestMapping(url)指定通用请求前缀

3.请求方法限定

        限定GET方法
        @RequestMapping(method = RequestMethod.GET)
        限定POST方法
        @RequestMapping(method = RequestMethod.POST)
        GET和POST都可以
        @RequestMapping(method = {RequestMethod.GET,RequestMethod.POST})

10.Controller方法返回值
1.返回ModelAndView

        controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view

2.返回void

        在Controller方法形参上可以定义request和response,使用request或response指定响应结果
        1)request.getRequestDispatcher("页面路径").forward(request, response);
        2)response.sendRedirect("url")
        3)response.getWriter().print("{\"abc\":123}");

3.返回字符串

        1)逻辑视图名
            指定逻辑视图名,经过视图解析器解析为jsp物理路径
            return "itemList";
        2)Redirect重定向
            return "redirect:/itemEdit.action?itemId=" + item.getId();
        3)forward转发
            return "forward: /itemEdit.action";

    1.ModelAndView  无敌的   带着数据  返回视图路径  (不建议使用)
    2.String   返回视图路径  model带数据  (官方推荐此种方式 解耦 数据 视图 分离 MVC)  建议使用
    3.void   ajax  请求 合适 json格式数据 (response 异步请求使用)
            

重定向后浏览器地址栏变更为重定向的地址,
重定向相当于执行了新的request和response,所以之前的请求参数都会丢失
如果要指定请求参数,需要在重定向的url后面添加 ?itemId=1 这样的请求参数

使用转发的方式实现。转发后浏览器地址栏还是原来的请求地址,
转发并没有执行新的request和response,所以之前的请求参数都存在

11.异常处理器
1)系统中异常包括两类:预期异常和运行时异常RuntimeException。
2)系统的dao、service、controller出现都通过throws Exception向上抛出,
最后由springmvc前端控制器交由异常处理器进行异常处理
3)步骤:

        a.自定义异常类(MyException)
        b.自定义异常处理器(CustomHandlerException)(实现异常处理器HandlerExceptionResolver)
        c.异常处理器配置(将自定义异常处理器注入到spring容器)
        d.编写错误页面(error.jsp)         

12.上传图片
1)配置虚拟目录

        在tomcat上配置图片虚拟目录,在tomcat下conf/server.xml中添加:
        <Context docBase="E:\mysource\upload\temp" path="/pic" reloadable="false"/>

2)加入jar包

        commons-fileupload-1.2.2.jar
        commons-io-2.4.jar

3)配置上传解析器(springmvc.xml)

        <!-- 文件上传,id必须设置为multipartResolver -->
        <bean id="multipartResolver"
            class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <!-- 设置文件上传大小 -->
            <property name="maxUploadSize" value="5000000" />
        </bean>

4)设置表单可以进行文件上传

        enctype="multipart/form-data"

5)图片上传(形参:MultipartFile pictureFile)

        // 设置图片名称,不能重复,可以使用uuid
        String picName = UUID.randomUUID().toString();
        // 获取文件名
        String oriName = pictureFile.getOriginalFilename();
        // 获取图片后缀
        String extName = oriName.substring(oriName.lastIndexOf("."));
        // 开始上传
        pictureFile.transferTo(new File("C:/upload/image/" + picName + extName));
        // 设置图片名到商品中
        item.setPic(picName + extName);
        // 更新商品
        this.itemService.updateItemById(item);      

13.json数据交互
1)@RequestBody

        @RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口
            将读到的内容(json数据)转换为java对象并绑定到Controller方法的参数上

2)@ResponseBody

        @ResponseBody注解用于将Controller的方法返回的对象,通过springmvc提供的HttpMessageConverter接口
            转换为指定格式的数据如:json,xml等,通过Response响应给客户端

3)springmvc支持json包

        jackson-annotations-2.4.0.jar
        jackson-core-2.4.2.jar
        jackson-databind-2.4.2.jar

4)发送json字符串

        $(function(){
            var params = '{"id": 1,"name": "测试商品","price": 99.9,"detail": "测试商品描述","pic": "123456.jpg"}';
            $.ajax({
                type : "post",
                url : "${pageContext.request.contextPath }/json.action",
                data : params,
                contentType : "application/json;charset=UTF-8",//发送数据的格式
                success : function(data){
                    alert(data.name);
                }
                dataType : "json",//回调
            });
        });

5)json测试

        @RequestMapping("testJson")
        public @ResponseBody Item testJson(@RequestBody Item item) {
            return item;
        }           

14.RESTful支持
1.Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格.
2.从url上获取商品id,步骤如下:

        1)使用注解@RequestMapping("item/{id}")声明请求的url
          {xxx}叫做占位符,请求的URL可以是“item /1”或“item/2”
        2)使用(@PathVariable() Integer id)获取url上的数据
            @RequestMapping("item/{id}")
            @ResponseBody
            public Item queryItemById(@PathVariable() Integer id) {
                Item item = this.itemService.queryItemById(id);
                return item;
            }
        注:如果@RequestMapping中表示为"item/{id}",id和形参名称一致,@PathVariable不用指定名称。
            如果不一致,例如"item/{ItemId}"则需要指定名称@PathVariable("itemId")

3.注意两个区别:

        1)[email protected]是获取url上数据的。@RequestParam获取请求参数的(包括post表单提交)
        2).如果加上@ResponseBody注解,就不会走视图解析器,不会返回页面,返回目前的json数据。
            如果不加,就走视图解析器,返回页面       

15.拦截器
1)定义拦截器(实现HandlerInterceptor接口)

        public class MyHandlerInterceptor implements HandlerInterceptor{
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
                // 从request中获取session
                HttpSession session = request.getSession();
                // 从session中获取username
                Object username = session.getAttribute("username");
                // 判断username是否为null
                if (username != null) {
                    // 如果不为空则放行
                    return true;
                } else {
                    // 如果为空则跳转到登录页面
                    response.sendRedirect(request.getContextPath() + "/user/toLogin.action");
                    return false;
                }
            }
        }

2)在springmvc.xml中配置拦截器

        <!-- 配置拦截器 -->
        <mvc:interceptors>
            <mvc:interceptor>
                <!-- 配置商品被拦截器拦截 -->
                <mvc:mapping path="/item/**" />
                <!-- 所有的请求都进入拦截器 -->
                <!-- <mvc:mapping path="/**" /> -->
                <!-- 配置具体的拦截器 -->
                <bean class="com.springmvc.interceptor.MyHandlerInterceptor" />
            </mvc:interceptor>
        </mvc:interceptors>
    

拦截器总结:

        preHandle按拦截器定义顺序调用
        postHandler按拦截器定义逆序调用
        afterCompletion按拦截器定义逆序调用

        postHandler在拦截器链内所有拦截器返成功调用
        afterCompletion只有preHandle返回true才调用(当第一个拦截器为不为true时都不会调用)

原文地址:https://www.cnblogs.com/itzlg/p/10699276.html

时间: 2024-11-09 05:01:24

二:SpringMVC知识整理的相关文章

SpringMVC 知识整理

SpringMVC架构设计 MVC是一种架构模式,它把业务的实现和展示相分离. SpringMVC与struts2的区别 Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上SpringMVC就容易实现restful url,而struts2的架构实现起来要费劲,因为Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无

Web网站服务及知识整理(二)

Web网站服务及知识整理(二)

SpringMVC框架整理(二)

SpringMVC框架整理第二发,数据绑定流程,数据校验(错误信息国际化),拦截器,异常处理. 数据绑定流程(数据转换,数据格式化,数据校验) 1. Spring MVC 主框架将 ServletRequest  对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 DataBinder 实例对象 2. DataBinder 调用装配在 Spring MVC 上下文中的 ConversionService 组件进行数据类型转换.数据格式化工作.将 Servlet

J2EE知识整理(二)

就在前不久,一个资深JAVA经理兼HR跟我说,做Java web的,一定要会Spring,不止是会用,还要深入进去,看看它的实现原理,以及是怎么编写的,对此我表示鸭梨很大,内部结构,原理啥都只能先放着一遍,先来看看Spring是怎么做的. IOC?DI?这是个咩啊! 关于控制反转或者说依赖注入到底是个什么意思,这里就不多加说明了,Spring in Action专业度爆脖主的距离怕有该书作者到脖主的地理位置那么远,还是直接来看看是怎么做的吧 public class DbInfoServlet

Kali Linux渗透基础知识整理(二)漏洞扫描

Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网络上传输的数据量. TCP协议 TCP是因特网中的传输层协议,使用三次握手协议建立连接.当主动方发出SYN连接请求后,等待对方回答SYN+ACK ,并最终对对方的 SYN 执行 ACK 确认.这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议. 连接建立 TC

DIV+CSS网页布局常用的一些基础知识整理

CSS命名规范一.文件命名规范 全局样式:global.css:框架布局:layout.css:字体样式:font.css:链接样式:link.css:打印样式:print.css: 二.常用类/ID命名规范页 眉:header内 容:content容 器:container页 脚:footer 版 权:copyright 导 航:menu主导航:mainMenu子导航:subMenu 标 志:logo标 语:banner标 题:title侧边栏:sidebar 图 标:Icon注 释:note

WIFI基本知识整理

WIFI基本知识整理 这里对wifi的802.11协议中比较常见的知识做一个基本的总结和整理,便于后续的学习.因为无线网络中涉及术语很多,并且许多协议都是用英文描述,所以有些地方翻译出来会有歧义,这种情况就直接英文来描述了. 主要内容: 一.基本概述 二.实践基础 三.一些原理 四.补充 五.其它 一.基本概述 ============================ 1.有线和无线网络 目前有线网络中最著名的是以太网(Ethenet),但是无线网络WLAN是一个很有前景的发展领域,虽然可能不会

JAVA基础知识整理

一.首先先明白get与post的基本定义和区别: 这是两种在客户端和服务器端进行请求-响应的方法. 1get:从指定的资源请求数据. 2post:向指定的资源提交要处理的数据. get基本上用于从服务器取回数据,注意:get方法可能返回缓存数据. post可以从服务器上获取数据,不过,post方法不会缓存数据,并且常用语连同请求一起发送数据. 二. Jquery $.get()方法. $.get()方法通过Http Get发起请求,从服务器上请求数据. 语法:&.get(URL,callback

2.4G无线收发模块/射频RFM75调试总结/RF知识整理

射频RFM75通信是收发双方都需要编程的器件,收发双方的通道频率,空中传输速率设置一致,调试时必须先调通一块再调另一块,否则出现问题了就不知道是发送端有问题还是接收端有问题.调试必须理清思路.正确的方法是先调试发送端,能保证发送正确,再去调试接收端. 首先了解RFM75发射端的工作流程图: 图1 上图1由数据手册中得到,由此可得到其工作流程: 发射数据: 1,上电配置芯片RFM75之前必须先延时超50us后芯片稳定工作. 2,配置寄存器使芯片工作于发送模式后必须使CE引脚置1至少15us. 3,