1、springmvc框架的特点
是一个基于mvc设置模式的控制层框架
核心控制器(前端控制器)是一个Servlet类(DispatcherServlet)
控制器类单实例的(不要随便设置属性)
采用注解简化配置
请求参数、servlet api等数据 通过入参数的方式
支持拦截器
2、如何使用springmvc框架
Jar包 web.xml配置 spring-servlet配置 控制器类
3、spring-servlet中都配置了哪些信息
支持注解
配置控制器类所在的包(注解所在的包)
响应页面的路径前缀 后缀的拼接格式
支持上传配置
异常处理的配置
拦截器配置
静态资源处理
4、springmvc中的常用注解
@Controller 设置在类上 标识这个类是一个控制器类
@RequestMapping 设置在类、方法上 设置路径 注意以/开始
@RequestParam 设置方法的参数上 设置请求参数
@Autowired 设置在控制器类属性上 让springmvc框架完成对这个属性值的赋予
@ExceptionHandler 设置在方法上 设置异常处理
@PathVariable 设置在方法参数上 与rest风格传递参数一起使用
5、如何获取请求数据
- 表单
- 超链接
设置在控制器方法的参数中 1、参数名 2、对象(页面控件名或参数名 设置为对象属性名)
6、如何页面跳转
- 请求转发跳转页面
return "index"; /index.jsp
return "forward:/index.jsp";
- 重定向跳转页面
return "redirect:/index.jsp";
- 重定向跳转控制器方法
return "redirect:/test/test4.do";
7、如何获取作用范围
- 获取的是基于servlet api的作用范围
a、设置在控制器方法的参数上
public String test4 (HttpServletRequest request, HttpSession session, ServletContext application){}
b、设置在控制器类的属性上
public class TestCtrl {
@Autowired
private HttpServletRequest req;
@Autowired
private HttpSession session;
对比: 如果控制器类多个方法中都需要用到这个作用范围,这时设置在属性上
如果就一个方法中使用,这时设置在方法的参数中
- 获取springmvc封装好的作用范围----request范围 在方法参数中获取
a、Map类型
@RequestMapping("/test5.do")
public String test5(Map map){
map.put("info2", "helloMap");
return "index2";
}
b、Model类型
@RequestMapping("/test5.do")
public String test5(Model model){
model.addAttribute("info3", "helloModel");
return "index2";
}
c、ModelAndView类型
@RequestMapping("/test5.do")
public ModelAndView test5(){
ModelAndView view=new ModelAndView();
//存request范围值
view.addObject("info4", "helloModelAndView");
//设置跳转页面
view.setViewName("index2");
return view;
}
8、springmvc核心API 都有什么?各自作用?阐述一下springmvc处理流程
springmvc核心api
- DispatcherServlet 前端控制器(请求最先到达)
- HandlerMapping 映射 管理控制器路径映射
- HandlerAdapter 适配器 管理 调用Handler
- Handler--控制器的方法 执行功能
- ModelAndView 模型视图对象 存储视图、数据信息 用于响应
- ViewResolver 视图解析器 解析视图
- Model 模型 解析数据
springmvc处理流程
客户端发送请求匹配web.xml路径后到达DispatcherServlet前端控制器。参照web.xml路径,然后从HandlerMapping查找处理request的handler. 如果映射成功,查找到。DispatcherServlet前端控制器会产生HandlerAdapter适配器,管理,调用handler控制器方法,执行功能。当执行完后将返回一个ModelAndView模型视图对象给dispatcherServlet前端控制器,由viewResolver解析视图;model解析数据并返回对应的view给客户端。
9、拦截器 创建 三个方法调用时机 配置
1.创建类 继承HandlerInterceptorAdapter抽象类
2.重写方法
- preHandle方法
执行时机:请求到达控制器方法之前
具备返回值布尔类型 如果返回true 不拦截请求 如果返回false 拦截请求(请求不能到达控制器)
- postHandle方法
执行时机: 只有preHandle方法返回true时 postHandle这个方法才能执行
执行完控制器方法 生成ModelAndView对象后 响应给前端控制器之前
afterCompletion方法
执行时机: 只有preHandle方法返回true时 afterCompletion这个方法才能执行
视图渲染、数据处理结束后 页面响应给用户之前
3、spring-servlet.xml中配置
全局配置--所有控制器请求都先到达全局拦截器
<mvc:interceptors>
<bean class="包名.类名"></bean>
</mvc:interceptors>
局部配置--路径匹配的控制器请求 先到达拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="匹配路径"/>
<bean class="包名.类名" ></bean>
</mvc:interceptor>
</mvc:interceptors>
路径: *通配字符串 **通配子路径
10、异常处理(三种方式)
springmvc异常处理
1、@ExceptionHandler注解
在控制器类中设置处理异常的方法 使用@ExceptionHandler注解
@ExceptionHandler({ArithmeticException.class,NullPointerException.class})
@ExceptionHandler(Exception.class)
一旦当前控制器类中产生了异常 执行到@ExceptionHandler注解所在的控制器方法 匹配异常类型
如果异常类型匹配 执行这个方法 实现异常处理
使用@ExceptionHandler做全局异常处理 可以创建BaseCtrl 在这里实现异常处理 其他控制器类继承BaseCtrl
2、在spring-servlet.xml中全局异常处理配置
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.NullPointerException">redirect:/error.jsp</prop> 重定向跳转
<prop key="java.lang.ArithmeticException">error</prop> 请求转发页面跳转
<prop key="java.lang.Exception">redirect:/error.jsp</prop>
</props>
</property>
</bean>
3、创建自定义类 继承AbstractHandlerExceptionResolver 重写doResolveException的方法
在方法中实现异常处理
if(e instanceof NullPointerException){
ModelAndView view =new ModelAndView("index");
return view;
}
注意:一定要在spring-servlet.xml中 配置这个类
11、如何上传文件
1.先配置 MultipartFile对象
首先在spring-servlet.xml中进行配置--支持文件上传
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5000000"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
2、页面中 表单提交方式设置为post 设置enctype="multipart/form-data"
文件域控件设置name值----与控制器方法中参数名一致 参数类型MultipartFile
3、控制器中实现上传功能
获取服务器目录---获取上传的图片名及后缀--上传
获取服务器目录
String path=session.getServletContext().getRealPath("/upload");
获取上传的文件的名及后缀
String fname = MultipartFile对象.getOriginalFilename();
上传文件
MultipartFile对象.transferTo(new file(path,fname));
12、如何设置rest风格传递参数
rest风格传递参数 一般与web.xml中设置前端控制器路径 / 一起搭配使用 优化路径
页面传参
路径/参数值1/参数值2
控制器方法中
注意 路径相匹配 通过{参数名} 设置动态参数
方法参数中获取值 必须使用@PathVariable注解
@RequestMapping("/userSelectOne/{uid}/{biaoji}")
public String userSelectOne(@PathVariable("uid") String usid,@PathVariable("biaoji")int biaoji){
@PathVariable 解释的参数名 必须与路径中的参数名一致
@PathVariable("参数名") 这里的参数名必须与路径中的参数名一致
13、什么时候需要配置静态资源文件?如何配置?
在web.xml中配置DispatcherServlet前端控制器的通配的路径 “/”,表示通配所有的路径 --用的多,做优化
用户发送的html请求、后台请求 都匹配这个/路径
解决?--使用静态资源处理
spring-servlet.xml中进行配置
<mvc:resources location="/html/" mapping="/html/**" cache-period="31556926"/>
location 位置
mapping 路径 设置通配 /html/*.html
cache-period 有效时间 以秒为单位
14、简述拦截器与过滤器的区别
①拦截器只能对控制器请求起作用,而过滤器可以对所有请求起作用。
②拦截器是基于Java反射机制的,而过滤器是基于接口回调的。
③过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器。