• Spring MVC 基础笔记


    spring mvc功能:

      以Controller为中心完成对系统流程的控制管理
      从请求中搜集数据
      对传入的参数进行验证
      将结果返回给视图
      针对不同的视图提供不同的解决方案
      针对jsp视图技术提供标签库
      拦截器
      上传文件

    spring-mvc结构

      1.DispatcherServlet:(需要自己配置)
      中央控制器,把请求给转发到具体的控制类
      2.Controller:(需要自己创建)
      具体处理请求的控制器
      3.handlerMapping:(需要自己配置)
      映射处理器,负责映射中央处理器转发给controller时的映射策略
      4.ModelAndView:(需要自己创建)
      服务层返回的数据和视图层的封装类
      5.ViewResolver & View:(需要自己配置)
      视图解析器,解析具体的视图
      6.Interceptors :(需要自己创建)
      拦截器,负责拦截我们定义的请求然后做处理工作


      具体执行流程图参见 url(spring-mvc流程图.png)


    SpringMVC相关类库(导包)
      com.springsource.javax.servlet.jsp.jstl-1.1.2.jar
      com.springsource.org.aopalliance-1.0.0.jar
      com.springsource.org.apache.commons.logging-1.1.1.jar
      com.springsource.org.apache.taglibs.standard-1.1.2.jar
      org.springframework.aop-3.0.0.RELEASE.jar
      org.springframework.asm-3.0.0.RELEASE.jar
      org.springframework.beans-3.0.0.RELEASE.jar
      org.springframework.context.support-3.0.0.RELEASE.jar
      org.springframework.context-3.0.0.RELEASE.jar
      org.springframework.core-3.0.0.RELEASE.jar
      org.springframework.expression-3.0.0.RELEASE.jar
      org.springframework.web.servlet-3.0.0.RELEASE.jar
      org.springframework.web-3.0.0.RELEASE.jar


    配置 web.xml
      在web-app标签内配置:
        <!-- 中央转发(控制)器 -->
        <servlet>
          <servlet-name>springmvc</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        </servlet>  
     
        <servlet-mapping>
          <servlet-name>springmvc</servlet-name>

          <!-- 不要配置/*,否则404,但是可以配置 / -->
          <url-pattern>*.do</url-pattern>
        </servlet-mapping>


      创建springmvc的核心配置文件(springmvc-servlet.xml) (非注解模式未详细说明)
      文件的命名规则:中央控制器(servlet的名称)的名称+“-servlet.xml”
      默认位置:WEB-INF下


      配置:controller和视图解析器
      controller控制器
      也可以直接在配置文件中配置(但此方式不常使用,不再介绍,通常都使用注解开发,直接开启注解即可)


      <!-- 指定使用注解的包,该包及其以下的所有内容均会被扫描 -->
      <context:component-scan base-package="com.rl.controller"/>

      <!-- mvc注解的驱动但是如果context:component-scan存在mvc:annotation就没有必要配 -->
      <!-- <mvc:annotation-driven/> -->


    视图解析器:
      <!-- 视图解析器 -->
      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 配置从项目根目录到指定目录一端路径 ,建议指定浅一点的目录 -->
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <!-- 文件的后缀名 -->
        <property name="suffix" value=".jsp"></property>
      </bean>


    controller
      controller的配置
      @controller:标识当前类是控制层的一个具体的实现
      @requestMapping:放在方法上面用来指定某个方法的路径,当它放在类上的时候相当于命名空间需要组合方法上的requestmapping来访问
      该内容可以指定,但是默认为value的值,通常value的值与方法名称保持一致
      返回字符串的含义,指的是ModelAndView中viewName,也就是要跳转的页面


    数据交互
      (本处解释不详细,可直接参见代码 url(Myeclipse源码:springmvc_2))

      在方法中可以自己随意去定义方法的参数,如果方法的参数的名称与传入参数的name匹配就会自动接收,并且转换我们所定义的数据类型。
      如果参数列表里定义了自定义的类springmvc会给我们把匹配的参数组合起来并且组装成对象。

      requestMapping里面的method的类型必须要与前台form的类型一致
      @RequestMapping 中可以定义请求方式,如果指定某种请求方式那就必须要以这种请求方式来访问
      要配置别的属性时,value就不能省略了

      通过request直接获取传递过来的参数
      零散的接受单个数据:在参数列表中直接定义要接收的参数和参数的类型
      Date数据的传递时需要,绑定时间类型的属性编辑器,然后可以自定义时间的格式
      接收多选框中的数据
      通过request直接获取传递过来的参数
      直接在参数列表中定义数组
      实体类的接收:
      在参数列表中直接定义要接收的实体类,请求中传递的参数名要和实体类中的set方法后的字符串匹配,否则无法注入
      只要有请求到达就会按着参数列表中的实体类来创建对象
      因为所有的参数的接收都是在参数列表中,并不是成员变量,每次请求,传递的参数都是一个新的实例,不会产生并发问题
      往页面回写数据
      设置方法返回值类型是ModelAndView
      返回值类型是String,在参数列表中直接来定义一个Map,这个map不是用来接收参数的,而是用来把参数写到页面上去的
      返回值类型是String代表viewName,参数列表使用Model用来把数据写到页面上(此方法较为常用,建议使用此方法)
      通过ajax访问springmvc
      (toAjax.jsp),引入jquery,添加
      $(function(){
        $("#mybutton").click(function(){
          var mytext = $("#mytext").val();
          $.ajax({
            url:"test/ajax1.do",
            type:"post",
            data:{
              name:mytext
            },
            success:function(responseText){
              alert(responseText);
            },
            error:function(){
              alert("system error");
            }
          });
        });
      });
      在控制器中,通过ajax访问springmvc,返回值的类型为void,有两种方式
      使用HttpServletResponse往页面写数据
      在参数列表中直接定义PrintWriter为我们往页面上写数据
      重定向:
      直接在返回值中添加"redirect:",如果"redirect:"后面不加"/"代表在当前的controller里面来执行方法,如果加上"/"代表退到根目录下去访问方法""


    文件上传
      引入jar包
      com.springsource.org.apache.commons.fileupload-1.2.0.jar
      com.springsource.org.apache.commons.io-1.4.0.jar
      配置相应的视图解析器(springmvc-servlet.xml)
      <!-- 上传文件复杂表单中文件解析视图 -->
      <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
      <!-- 以字节为单位 -->
      <property name="maxUploadSize" value="1024000"></property>
      </bean>
      form表单(fileform.jsp):
      <form action="upload/upload.do" method="post" enctype="multipart/form-data">
       头像:<input type="file" name="pic"> 
       <input type="submit" value="提交"><br>
        </form>


        enctype="multipart/form-data"用于POST方式的文件上传,这个属性管理的是表单的MIME编码。
     
      文件上传中的controller的配置(TestUploadController.java)
      @RequestMapping("/upload.do")
      public String upload(HttpServletRequest request) throws Exception{

        //强制转换request
        MultipartHttpServletRequest mr = (MultipartHttpServletRequest) request;
        //获得到文件
        CommonsMultipartFile cmf = (CommonsMultipartFile) mr.getFile("pic");
        //获得文件的字节数组
        byte[] fbyte = cmf.getBytes();
        String fileName = "";
        //设置时间戳格式
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        //获得时间戳的字符串
        fileName = format.format(new Date());
        //加三位随机数
        Random random = new Random();
        for(int i = 0; i < 3; i++){
          fileName = fileName + random.nextInt(10);
        }
        //获得原始文件名
        String oriFileName = cmf.getOriginalFilename();
        //获得文件的后缀名
        String suffix = oriFileName.substring(oriFileName.lastIndexOf("."));
        //获得发布后的根路径
        String realPath = request.getSession().getServletContext().getRealPath("/");
        OutputStream out = new FileOutputStream(new File(realPath+"/upload/"+fileName+suffix));

        out.write(fbyte);
        out.flush();
        out.close();

        return "success";
      }
      @RequestMapping("/toFileForm.do")
      public String toFileForm(){
        return "fileform";
      }


    拦截器
      最终拦截
      后置拦截
      前置拦截

  • 相关阅读:
    python学习之路基础篇(第八篇)
    python学习之路基础篇(第七篇)
    python学习之路基础篇(第六篇)
    python学习之路基础篇(第五篇)
    python学习之路基础篇(第四篇)
    目标检测——IoU 计算
    MXNet 中的 hybird_forward 的一个使用技巧
    Anchor 的两种编程实现
    我的目标检测笔记
    动手创建 SSD 目标检测框架
  • 原文地址:https://www.cnblogs.com/lbd_smile/p/8409424.html
Copyright © 2020-2023  润新知