1、什么是SpringMvc?
SpringMvc是spring的一个模块,基于MVC的一个框架,无需中间整合层来整合。
2、SpringMVC的优点
- 它是基于组件技术的,全部的应用对象,无论控制器还是视图,还是业务对象之类的都是Java组件。并且和Spring提供的其他基础结构紧密集成;
- 可以任意使用各种视图技术,而不仅限于JSP;
- 支持各种请求资源的映射策略;
- 易于扩展。
3、SpringMVC的工作原理
- 客户端发送请求到DispatcherServlet;
- DispatcherServlet收到请求后调用HandlerMapping处理器映射器;
- 处理器映射器找到具体的处理器(可以根据xm配置、注解进行查找),生成处理器对象以及处理器拦截器(有则生成),然后一并返回给DispatcherServlet。
- DispatcherServlet调用HandlerAdapter处理器适配器;
- HandlerAdapter经过适配调用具体的处理器(controller,也叫后端处理器);
- controller执行完成后返回ModelAndView;
- HandlerAdapter将controller执行结果ModelAndView返回给DispaterServlet;
- DispatcherServlet将ModelAndView传给ViewReslover视图解析器;
- ViewReslover解析后返回具体View;
- DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中);
- DispactcherServlet响应用户。
4、SpringMVC的控制器是不是单例模式,如果是,有什么问题,怎么解决?
是单例模式,在多线程访问的时候有线程安全问题,解决方案是在控制器里面不能写可变状态量,如果需要使用这些可变状态,可以使用ThreadLocal机制解决,为每个线程单独生成一份变量副本,独立操作,互不影响。
5、SpringMVC和Struts2的区别?
- SpringMVC的入口是一个servlet(前端控制器),而struts2入口是一个gilter过滤器;
- SpringMVC是基于方法开发,即一个url对应一个方法,请求参数传递到方法的形参,可以设计为单例或者多例(建议单例)。而struts2是基于类开发,传递参数是通过类的属性,只能设计为多例;
- sturts2采用值栈存储请求和响应的数据,通过OGNL存取数据,springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过request域传输至页面。Jsp视图解析器默认使用jstl
6、SpringMVC中的控制器的注解一般用哪个,有什么可以代替的
一般用@Controller注解,也可以使用@RestController,@RestController注解相当于@ResponseBody + @Controller,表示是表现层,除此之外,一般不用别的注解代替
7、@RequestMapping注解用在类上有什么作用?
是一个用来处理处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
8、怎么样把某个特定的请求映射到特定的方法上?
直接在方法上加注解@RequestMapping,并在这个注解里面写上要拦截的路径。
9、在拦截请求时,想拦截get方式提交的方法,怎么配置?
在@RequestMapping注解里面加上method=RequestMethod.GET
10、怎么在方法里得到Request或者Session?
直接在方法的形参中声明request,SpringMVC就自动把request对象传入。
11、在拦截的方法里得到前台传入的参数
直接在方法的形参里声明这个参数就可以,但必须明和传过来的一样。
12、如果前台传入的很多参数都是同一个对象的,怎么快速得到这个对象?
直接在方法中声明这个对象,SpringMVC就会自动把属性赋值到这个对象里。
13、@RequestBody、@RequestParam和@PathVariable的作用
-
@RequestBody:当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无需使用POJO进行包装;
<script src="${pageContext.request.contextPath}/js/jquery-3.3.1.js"></script> <script> var userList = new Array(); userList.push({username:"zhangsan",age:18}); userList.push({username:"lisi",age:28}); $.ajax({ type:"POST", url:"${pageContext.request.contextPath}/user/quick15", data:JSON.stringify(userList), contentType:"application/json;charset=utf-8" }); </script>
@RequestMapping(value="/quick15") @ResponseBody public void save15(@RequestBody List<User> userList) throws IOException { System.out.println(userList); }
-
@RequestParam:当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定
<form action="${pageContext.request.contextPath}/quick16" method="post"> <input type="text" name="name"><br> <input type="submit" value="提交"><br> </form>
@RequestMapping(value="/quick16") @ResponseBody public void save16(@RequestParam(value="name",required = false,defaultValue = "itcast") String username) throws IOException { System.out.println(username); }
-
@PathVariable:在SpringMVC中可以使用占位符进行参数绑定。地址/user/1可以写成/user/{id},占位符{id}对应的就是1的值。在业务方法中我们可以使用@PathVariable注解进行占位符的匹配获取工作。
@RequestMapping(value="/quick17/{name}") @ResponseBody public void save17(@PathVariable(value="name") String username) throws IOException { System.out.println(username); }
14、SpringMVC中函数的返回值是什么?
返回值可以有很多类型,String、ModelAndView,一般用Stirng比较好。
15、SpringMVC怎么样设定重定向和转发的
- 在返回值前加“forward”就可以让结果转发;
- 在返回值前加“redirect”就可以让返回值重定向。
16、SpringMVC用什么对象从后台向前台传递的?
通过ModelMap对象,可以在这个对象里面用put方法,把对象加到里面,前台就可以通过el表达式拿到。
17、SpringMVC中有个类把视图和数据合并在一起的叫什么?
ModelAndView
18、怎么把ModleMap里面的数据放到Session?
可以在类上加@SessionAttributes注解,里边包含的字符串就是要放入session里边的key。
19、SpringMVC怎么和AJAX相互调用
通过jackson框架就可以把Java里面的对象直接转化成Js可以识别的json对象。
具体如下:
- 加入Jackson.jar;
- 在配置文件中配置json的映射;
- 在接收Ajax方法里边直接返回Object、List等,但方法前要加@ResponseBody;
20、SpringMVC的拦截器怎么写
两种写法:一种是实现HandlerInterceptor接口,另一种是继承适配器类,然后再SpringMVC的配置文件中配置拦截器即可。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AE8P48HP-1618106585499)(C:\Users\11065\AppData\Roaming\Typora\typora-user-images\image-20210410171504098.png)]
21、SpringMVC的执行流程
系统启动的时候分局配置文件创建spring的容器,首先是发送http请求到核心控制器DispatherServlet,Spring容器通过映射器去寻找业务控制器,使用适配器找到响应的业务类,再进行业务类时进行数据封装,在封装前可能会涉及到类型转换,执行完业务类后使用ModelAndView进行视图转发,数据放在model中,用map传递数据进行页面显示。
22、如何解决POST请求中文乱码问题,GET的又如何处理呢?
- 解决post请求乱码问题:在web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf-8;
<filter>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- get请求中文参数出现乱码解决方法有两个:
①修改tomcat配置文件添加编码与工程编码一致,如下:
<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
②另外一种方法对参数进行重新编码:
String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")
23、注解原理
注解本质是一个继承了Annotation的特殊接口,其具体实现类是JDK动态代理生成的代理类。我们通过反射获取注解时,返回的也是Java运行时生成的动态代理对象。通过代理对象调用自定义注解的方法,会最终调用AnnotationInvocationHandler的invoke方法,该方法会从memberValues这个Map中查询出对应的值,而memberValues的来源是Java常量池。
24、SpringMVC的异常处理
可以将异常抛给Spring框架,由Spring框架来处理;我们只需要配置简单的异常处理器,在异常处理器中添视图页面即可。