Springmvc
springmvc是spring框架的一个子项目,用来实现web层功能,它可以用来替换servlet,既然它是spring的一部分,他就可以跟spring框架无缝连接。开发效率很高,更优于struts2。
springmvc使用
- 导入相关jar包(依赖)
- 在web.xml中配置springmvc的核心(Dispatcherservlet)
- 配置springmvc的配置文件
- 编写控制层代码(controller)
- 完善前端视图和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 "地址";
拦截器
拦截器实现步骤:
- 实现一个接口HandleInterceptor
- 重写三个默认方法
- preHandle():在控制层方法执行之前调用
- postHandle():在控制层方法调用之后,视图解析器执行之前调用
- afterCompletion():在控制层方法执行之后返回,并且也完成视图解析器后执行
- 通过springmvc配置文件,配置拦截器和拦截规则
Interceptor和filter的区别?(面试题)
-
Filter是基于函数回调(doFilter()方法)的,而Interceptor则是基于Java反射的(AOP思想)。
-
Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器,依赖于web框架(Springmvc、struts2)。
-
Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
-
Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
-
在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
-
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做到无缝集成。至于为什么要使用这个框架,我想其实就是为了简化开发,就是让使用者只关心核心业务的开发,而框架帮我们屏蔽了原有技术和业务无关的各类技术问题。
为什么要使用框架?
就是让使用者只关心核心业务的开发,框架帮你屏蔽原有技术跟业务开发无关的各类技术问题