springMVC

Springmvc

springmvc是spring框架的一个子项目,用来实现web层功能,它可以用来替换servlet,既然它是spring的一部分,他就可以跟spring框架无缝连接。开发效率很高,更优于struts2。

springmvc使用

  1. 导入相关jar包(依赖)
  2. 在web.xml中配置springmvc的核心(Dispatcherservlet)
  3. 配置springmvc的配置文件
  4. 编写控制层代码(controller)
  5. 完善前端视图和controller之间的对应

相关配置文件

web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

  <!--  springmvc的编码过滤器-->
  <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>
  </filter>

  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

<!--  配置springmvc的核心servlet
            1. 起到了请求接收和返回的作用
            2. 负责读取springmvc核心配置文件
                默认读取web-inf包下servlet名称-servlet.xml
            -->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--  指定springmvc自定义的位置,默认在WEB/INF下找,但是可以自定义。-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath*:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
<!--    表示所有请求都会进入springmvc   -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

其中编码过滤器主要用于处理post请求提交的数据。

/ 和 /* 的区别: < url-pattern > / 不会匹配到.jsp, 只针对我们编写的请求;即:.jsp 不会进入spring的 DispatcherServlet类 。 < url-pattern > /* 会匹配*.jsp, 会出现返回 jsp视图 时再次进入spring的DispatcherServlet 类,导致找不到对应的controller所以报404错。

springmvc配置文件:

<?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">

<!--    扫描ioc注解  提供包的地址-->
    <context:component-scan base-package="com.seecen.sc201101.controller"></context:component-scan>
<!--    启动注解驱动  -->
    <mvc:annotation-driven>
        <!--   处理json乱码问题  -->
         <mvc:message-converters register-defaults="true">
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <constructor-arg value="UTF-8"/>
        </bean>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper">
                <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                    <property name="failOnEmptyBeans" value="false"/>
                </bean>
            </property>
        </bean>
    </mvc:message-converters>
    </mvc:annotation-driven>
    
    <!--    配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          id="internalResourceViewResolver">
            <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp"></property>
            <!--后缀-->
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

springmvc向页面传值的三种方式

在控制层方法中添加model、modelMap、map都可以向request作用域存值

spring接收前台数据

接收数组,只需要在对应请求的方法参数中声明一个相应类型的同名数组(与前端页面元素同名,比如checkbox的name=“hobby”,value=1 … 后台参数声明Integer[] hobby)

springmvc视图解析器

项目设计时,我们一般将页面放到WEB-INF里面,这是因为WEB-INF里面的资源不能直接从服务器外部访问,相对安全一些,所以对于地址栏访问,会报错404。

为了访问页面,我们可以通过控制器来进行访问,但是跳转地址非常长,而且很多都是一样的地址,这时就可以通过视图解析器帮我们添加公共前缀和后缀,添加成功后,所有跳转地址就不需要写公共前缀和后缀了

如果不需要视图解析器进行解析,可以使用forward或者redirect,这样就不会使用视图解析器了

配置视图解析器:

<!--    配置视图解析器(只支持jsp页面) -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          id="internalResourceViewResolver">
            <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp"></property>
            <!--后缀-->
        <property name="suffix" value=".jsp"></property>
    </bean>

文件上传和下载

准备工作

  • 后端:需要通过配置文件,添加一个对象实现上传功能(前提是导入了依赖commons-fileupload这个jar包)

    依赖:

    <!--文件上传-->
    <dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
    </dependency>
    
    <!--    配置文件上传-->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!--        设置文件编码方式-->
            <property name="defaultEncoding" value="utf-8"></property>
    <!--        设置文件大小限制 单位是字节  10M = 10485760字节-->
            <property name="maxUploadSize" value="10485760"></property>
        </bean>
    
  • 前端:请求方式post enctype=“multiparty/form-data”

Controller:

String realPath=req.getServletContext().getRealPath("/upload");
        File f=new File(realPath);
        if(!f.exists()) f.mkdirs();
        String fileName=myFile.getOriginalFilename();  //获取上传文件名
        String newFileName= UUID.randomUUID()
                +fileName.substring(fileName.lastIndexOf("."));
        File newFile=new File(realPath+File.separator+newFileName);
        //上传一句话
        myFile.transferTo(newFile);  //上传结束
        return "地址";

拦截器

拦截器实现步骤:

  1. 实现一个接口HandleInterceptor
  2. 重写三个默认方法
  3. preHandle():在控制层方法执行之前调用
  4. postHandle():在控制层方法调用之后,视图解析器执行之前调用
  5. afterCompletion():在控制层方法执行之后返回,并且也完成视图解析器后执行
  6. 通过springmvc配置文件,配置拦截器和拦截规则

Interceptor和filter的区别?(面试题)

  1. Filter是基于函数回调(doFilter()方法)的,而Interceptor则是基于Java反射的(AOP思想)。

  2. Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器,依赖于web框架(Springmvc、struts2)。

  3. Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。

  4. Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。

  5. 在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。

  6. Filter在过滤是只能对request和response进行操作,而interceptor可以对request、response、handler、modelAndView、exception进行操作。

Ajax

Ajax:Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)

Ajax是一种页面无刷新技术,即不会刷新整个浏览器,只会刷新浏览器一部分,也叫局部刷新技术

应用场景:当需要跟服务器交互,但是又不想刷新浏览器的时候。eg:搜索引擎、评论、点赞、分页、商品详情

优点:提高页面加载速度,节省带宽,提高了很好的用户体验

异步请求编写方式:针对于前端,无论使用什么框架或者Servlet,前端是固定的代码,类似于上传,针对于后端有一些差异。

$("#d1").blur(function () {
        //获取文本框数据
        var name = $(this).val();
        //    发送异步请求
        $.ajax({
            async: true,//是否异步  默认为true
            type: "post",
            url: "/checkUser",
            data: "name="+name,//请求传递的数据
            dataType: "text",//指定返回的数据类型
            success: function (result) {//回调函数 请求执行结束所执行的函数
                //result  最终服务器返回的数据
                console.log(result)//在浏览器控制台打印日志信息  一般测试会使用
            },
            error: function (XMLHttpRequest, textStatus, error) {//回调函数  请求执行失败之后执行的函数
                alert("请求失败"+error);
            }
        })
        //    当async属性设置为false表示同步,ajax请求会将整个浏览器锁死
        //    只有当ajax请求返回结果后,才会执行后面的代码
        //    当async设置为true时,表示异步,则不会等待ajax请求执行结束,就会执行后面的代码
    })

JSON

json是一种轻量级数据交互格式,其本质就是一个字符串,其可以表示任意数据,具有良好的扩展性,体积小,易与解析,传输效率高,目前被广泛应用在系统之间的数据交互。

语法:本质基于键值对形式组装成的数据

{}表示一个对象

[]表示一个数组

[{},{}]表示数组里面有两个对象

格式:

{key:value,

key2:value2,

key3:{key22:value22}

}

{”id“:10,

”name“:admin,

”UserInfo“:{

​ ”sex“:男,

​ ”age“:100

}

}

通过AJAX异步请求传递数据时,要加上@ResponseBody这个注解,同时后台返回给前台的数据,如果是数组,集合和对象,前台会自动转化成json对象数据。

springmvc的执行流程(面试题)

首先,springmvc有一个最重要的,最核心的组件,叫前端控制器,也是我们常说的DispatherServlet,我们可以通过在web.xml配置让所有请求都经过这个前端控制器。

当用户发送一个请求时,这个请求首先经过前端控制器,然后前端控制器将这个请求在分发给处理器映射器(HandleMapper),处理器映射器通过对这个请求的信息进行解析,找到与之匹配的Handle,并返回一个执行链,之后前端控制器再请求处理器适配器(HandleAdapter),去动态调用对应Controller的method,并且返回ModelAndView给前端控制器,最后,前端控制器,将ModelAndView进行解析,返回具体的视图view,然后DispatcherServlet将视图进行渲染,可以理解为模型数据的填充,然后响应给客户端。

谈谈对springmvc的理解

首先在理解一门技术之前,我们肯定要先知道他是什么?干什么的?有什么用,

根据官方文档解释来说Spring MVC是基于Servlet API构建的原始Web框架,也就是说springmvc底层其实也是通过Servlet搭建起来的,那么为什么要使用它?而不直接使用servlet呢?

经过对Servlet和springmvc的使用对比来说,我的理解是,使用springmvc之后,整个项目的层次变得更加清晰了,松散了项目的耦合性,同时spring还支持使用各种视图而不仅仅是jsp,再者就是因为是spring下的子产品,所以能跟spring做到无缝集成。至于为什么要使用这个框架,我想其实就是为了简化开发,就是让使用者只关心核心业务的开发,而框架帮我们屏蔽了原有技术和业务无关的各类技术问题。

为什么要使用框架?

就是让使用者只关心核心业务的开发,框架帮你屏蔽原有技术跟业务开发无关的各类技术问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值