zoukankan      html  css  js  c++  java
  • springMVC

    springMVC和MVC

    MVC是一种框架模式、一种复合模式;采用模型、视图、控制器,把数据的输入、处理、输出分离。

    MVC通过将M(Model)V(View)的代码分离,实现了前后端的代码分离,使项目开发的分工更加明确,程序的测试更加简便,提高了开发效率。

    springMVC属于MVC框架模式中的一种,以前端控制器DispatcherServlet为中心。

    springMVC执行流程

    1. 前端控制器接受到用户发出的请求
    2. 前端控制器去请求处理器映射器,处理器映射器根据url找到对应的处理器,返回一个处理器对象
    3. 前端控制器拿到处理器对象,去找处理器适配器适配对应的处理器
    4. 处理器处理完业务后返回一个modelandview
    5. 前端控制器拿到modelandview后,去找视图解析器解析,把逻辑视图解析为物理视图后返回给前端控制器
    6. 前端控制器找到对应的视图,渲染视图(把模型中的数据填充到视图里),得到响应结果
    7. 前端控制器把结果响应给用户

    配置文件

    1.配置web.xml

    <?xml version="1.0" encoding="UTF-8"?>
            <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
           http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
      <display-name>Archetype Created Web Application</display-name>
    
      <!--编码过滤器-解决提交数据的中文乱码问题-->
      <filter>
        <filter-name>encodingFilter</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>
        <init-param>
          <param-name>forceEncoding</param-name>
          <param-value>true</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    
    <!--配置前端控制器(DispatcherServlet)-->
    
    <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--绑定springMVC的配置文件-->
    	<init-parma>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>classpath:springMVC.xml</param-value>
    	</init-parma>
    <!--启动级别:1。和服务器一起启动-->
    	<load-on-startup>1</load-on-startup>
    </servlet>
    <servler-mapping>
    	<servlet-name>dispatcherServlet</servlet-name>
    	<urlpattern>/</urlpattern>
    </servler-mapping>
    
    说明:/ 只会匹配所有请求,不会匹配jsp页面;/* 匹配所有请求和jsp页面
    
      <!-- spring监听器-->
      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
      <listener>
        <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
      </listener>
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
      </context-param>
    
    </web-app>
    

    2.配置springMVC.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--开启注解驱动-->
        <mvc:annotation-driven/>
    <!--静态资源过滤-->
        <mvc:default-servlet-handler/>
    <!--开启组件扫描.扫描包-->
        <context:component-scan base-package="com.kk.controller"/>
    <!--    视图解析器-->
        <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/pages/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    </beans>
    

    @RequestMapping

    • 把url请求映射到控制器类,或者映射到处理方法
    • 可用于类或方法上面,用于类上表示所有响应请求的方法都是以该地址作为父路径

    RestFul风格

    概述

    RestFul是一个资源定位和资源操作的风格。不是标准也不是协议,只是一种风格。可以让设计的软件更简洁、更有层次、易于实现缓存等机制。

    功能

    • 互联网的所有事物都可以被抽象为资源
    • 资源操作:使用get、post、put、delete对资源进行操作
    • 分别对应: 查询、 添加、修改、删除

    传统方式操作资源:通过不同的参数来实现不同的效果,方法单一,get 和 post

    使用RestFul操作资源:通过不同的请求来实现不同的效果,请求地址一样但是可以实现不同的功能(url可以复用)

    @PathVariable

    • 把方法参数的值绑定到url模板变量

    转发和重定向

    实现页面跳转到两种方式

    forward:

    • 只有一次请求,由服务器进行的页面跳转
    • 地址栏不发生改变

    redirect:

    • 有两次请求,由浏览器进行的页面跳转
    • 地址栏发生改变

    访问数据库,增删改用重定向,查询用转发。

    拦截器与过滤器

    拦截器是springMVC的,类似于servlet开发中的Filter,用于对处理器进行预处理和后处理,开发者可以自定义拦截器来实现一些功能。

    过滤器:

    • servlet规范中的一部分,任何java web工程都可以使用
    • 在url-pattern中配置了/*后,会拦截所有访问的资源

    拦截器:

    • springmvc独有的,只有springmvc工程能使用
    • 拦截器只会拦截访问的控制器方法,不会拦截jsp/ html/ css/ image/ js/

    自定义拦截器:必须实现HandlerInterceptor接口

        <!--编写一个拦截器类-->
        clss DIYInterceptor{
    					//return true 执行下一个拦截器
    					//return false 不执行下一个拦截器
    		preHandler();  //请求方法之前执行
    		postHandler();  //请求方法之后执行
    		afterHandler();  //
    }
    <mvc:interceptors>
        <mvc:mapping path="/**"/>   //拦截包括这个请求下的所有方法
            <!-- 多个拦截器会按照顺序执行 -->
            <bean class="com.test.interceptor.DIYInterceptor"/>
    </mvc:interceptors>
    

    文件上传

    前端

    <form action="${pageContext.request.contextPath}/fileupload/upload" enctype="multipart/form-data" method="post">
             <input type="file" name="file"><br>
             <input type="submit" value="上传">
    </form>
    

    后台

    @Controller
    @RequestMapping(value = "/fileupload")
    public class FileUploadController {
        // 上传页面
        @RequestMapping(value = "/upload", method = RequestMethod.POST)
        public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws Exception {
            // 判断文件是否为空
            if (file.isEmpty()) {
                return "failed";
            }
            // 获取文件存储路径(绝对路径)
            String path = request.getServletContext().getRealPath("/WEB-INF/file");
            System.out.println(path);
            // 获取文件名称
            String fileName = file.getOriginalFilename();
            // 创建文件实例
            File f = new File(path, fileName);
            // 判断文件目录是否存在
            if (!f.getParentFile().exists()) {
                // 创建目录
                f.getParentFile().mkdirs();
                System.out.println("文件已创建");
            }
            // 写入文件
            file.transferTo(f);
            return "filesuccess";
        }
    
        @RequestMapping(value = "/uploadPage")
        public String upload() {
            return "fileupload";
        }
    

    springMVC.xml

    <bean id="multipartResolver"
            class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <!--上传文件的最大大小,单位为字节 -->
            <property name="maxUploadSize" value="17367648787"></property>
            <!-- 上传文件的编码 -->
            <property name="defaultEncoding" value="UTF-8"></property>
        </bean>
    
  • 相关阅读:
    生产者消费者代码
    C++内存深入理解
    树、森林与二叉树的相互转换
    待卿长发及腰,我必凯旋回朝
    同一进程下的线程可以共享
    操作系统知识
    进程间通信方式
    从一个微型例子看“C/C++的内存分配机制”和“数组变量名与指针变量名”(转)

    AVL Tree 操作
  • 原文地址:https://www.cnblogs.com/qqkkOvO/p/13943010.html
Copyright © 2011-2022 走看看