好友
阅读权限10
听众
最后登录1970-1-1
|
# 1. SpringMVC工作机制?
(1)用户发送请求至前端控制器DispatcherServlet;
(2) DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;
(3)处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;
(4)DispatcherServlet 调用 HandlerAdapter处理器适配器;
(5)HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器);
(6)Handler执行完成返回ModelAndView;
(7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
(8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
(9)ViewResolver解析后返回具体View;
(10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
(11)DispatcherServlet响应用户。
# 2. SpringMVC 常用注解都有哪些?
@requestMapping 用于请求 url 映射。
@RequestBody 注解实现接收 http 请求的 json 数据,将 json 数据转换为 java 对象。
@ResponseBody 注解实现将controller 方法返回对象转化为 json 响应给客户
# 3. 如何开启注解处理器和适配器?
我们在项目中一般会在 springmvc.xml 中通过开启 `<mvc:annotation-driven>`来实现注解处理器和适配器的开启。
# 5. Springmvc的优点:
(1)可以支持各种视图技术,而不仅仅局限于JSP;
(2)与Spring框架集成(如IoC容器、AOP等);
(3)清晰的角色分配:前端控制器(dispatcherServlet) , 请求到处理器映射(handlerMapping), 处理器适配器(HandlerAdapter), 视图解析器(ViewResolver)。
(4) 支持各种请求资源的映射策略。
# 6. Spring MVC的主要组件?
(1)前端控制器 DispatcherServlet(不需要程序员开发)
作用:接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
(2)处理器映射器HandlerMapping(不需要程序员开发)
作用:根据请求的URL来查找Handler
(3)处理器适配器HandlerAdapter
注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。
(4)处理器Handler(需要程序员开发)
(5)视图解析器 ViewResolver(不需要程序员开发)
作用:进行视图的解析,根据视图逻辑名解析成真正的视图(view)
(6)视图View(需要程序员开发jsp)
View是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf等等)
# 7. SpringMVC怎么样设定重定向和转发的?
(1)转发:在返回值前面加"forward:",譬如"forward:user.do?name=method4"
(2)重定向:在返回值前面加"redirect:",譬如"redirect:http://www.baidu.com"
# 8、SpringMvc怎么和AJAX相互调用的?
通过fastjson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象。具体步骤如下 :
(1)加入fastjson的pom
(2)在<mvc:annotation-driven >中配置fastsjon的转换
(3) 直接返回Java对象会自动解析对象的JSON字符串,方法注解必须加上@ResponseBody
```xml
<!-- 处理映射器和适配器-->
<mvc:annotation-driven >
<mvc:message-converters>
<ref bean="fastjsonBean"/>
</mvc:message-converters>
</mvc:annotation-driven>
<!--使用fastjson-->
<bean id="fastjsonBean" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
<property name="fastJsonConfig">
<bean class="com.alibaba.fastjson.support.config.FastJsonConfig">
<property name="features">
<list>
<value>AllowArbitraryCommas</value>
<value>AllowUnQuotedFieldNames</value>
<value>DisableCircularReferenceDetect</value>
</list>
</property>
<property name="dateFormat" value="yyyy-MM-dd HH:mm:sss"/>
</bean>
</property>
</bean>
```
# 9. SpringMvc的控制器是不是单例模式,如果是,有什么问题,怎么解决?
答:是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写字段。
# 10. springmvc 全局异常处理
# 11. springmvc 全局异常处理的二种方法
- 有三种实现方式
- 直接在配置中,配置SimpleMappingExceptionResolve
- 通过@ExceptionHandler
## 11.1. 第一种 通过SimpleMappingExceptionResolver类来定义,springmvc.xml内容
```html
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 遇到异常时默认跳转的视图 error其实是error.jsp是视图-->
<property name="defaultErrorView" value="error"/>
<!-- 抛出异常后在页面可用 ${errMsg.message} 读出异常信息 -->
<property name="exceptionAttribute" value="errMsg"/>
<!-- 自定义的异常转向页面可自定义多个而实现不同异常转向不同页面 -->
<property name="exceptionMappings">
<props>
<prop key="com.samrtian.exception.CustomException">error1</prop>
</props>
</property>
</bean>
```
## 11.3. 第二种使用@ExceptionHandler 注解定义
这个更简单了直接在控制器里加入方法,但是必须跟抛异常的方法在同一个控制器里
```java
@ControllerAdvice
public class LoginAction {
@ExceptionHandler(CustomException.class)
public String catchException(CustomException e, HttpServletRequest request) {
System.out.println("进来了");
request.setAttribute("errMsg", "注解的异常");
return "error";
}
}
```
# 12 如果在拦截请求中,我想拦截get方式提交的方法,怎么配置?
可以在@RequestMapping注解里面加上method=RequestMethod.GET或者@GetMapping的 注解
# 13. 如果想在拦截的方法里面得到从前台传入的参数,怎么得到?
分为三种情况
- 普通值(基本数据类型和字符串)
- 参数设置成普通值对应类型
- 参数前可以加上@RequestParam(请求名与参数名不一致),也可以不加上@RequestPram(请求名与参数名一致)
- 可以有多个普通参数
- 一组值
- 参数设置成数组类型或集合类型
- 参数前必须加上@RequestParam
- 可以有多个普通参数
- 对象中的属性
- 参数设置成类的类型
- 参数前不能加上@RequestParam
- 一般只有一个
# 14. **SpringMvc中函数的返回值是什么?**
返回值可以有很多类型,有String, ModelAndView。ModelAndView类把视图和数据都合并的一起的,但一般用String比较好。
# 15. SpringMvc用什么对象从后台向前台传递数据的?
- ModelAndView
- HttpServletRequest
- Map
```java
@RequestMapping("/hello")
protected ModelAndView handleRequestInternal() {
ModelAndView mv = new ModelAndView();
System.out.println("hello world");
mv.addObject("currentUser","admin");
mv.setViewName("hello");
return mv;
}
@RequestMapping("/hello2")
protected String hello2(HttpServletRequest request) {
request.setAttribute("currentUser","admin");
return "hello";
}
@RequestMapping("/hello3")
protected String hello3(Map<String,String> map) {
map.put("currentUser","admin");
//重定向需要在返回值前在redirect:后面跟是控制器路径(因为jsp在WEB-INF下),不是视图名
return "redirect:hello";
}
```
# 16. 注解原理:
- 注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代{过}{滤}理类。我们通过反射获取注解时,返回的是Java运行时生成的动态代{过}{滤}理对象。通过代{过}{滤}理对象调用自定义注解的方法,会最终调用AnnotationInvocationHandler的invoke方法。该方法会从memberValues这个Map中索引出对应的值。而memberValues的来源是Java常量池。
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|