Spring MVC 是spring框架的一部分(子框架), 是实现对Servlet技术进行封装。
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器 (controller)的缩写,它是一种软件设计典范,是一种软件架构设计分层模式。
**Model(模型)**是应用程序中用于处理应用程序数据逻辑的部分。
**View(视图)**是应用程序中处理数据显示的部分。
**Controller(控制器)**是应用程序中处理用户交互的部分。
最典型的MVC就是JSP + servlet + javabean的模式。
对SpringMVC的理解?
Spring MVC是一个基于MVC架构的用来简化web应用程序开发的应用开发框架,它是Spring的一个模块,无需中间整合层来整合 ,它和Struts2一样都属于表现层的框架。在web模型中,MVC是一种很流行的框架,通过把Model,View,Controller分离,把较为复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。
作用:接收请求、响应结果 相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
作用:根据请求的URL来查找Handler
注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。
作用:进行视图的解析 根据视图逻辑名解析成真正的视图(view)
View是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf等等)
通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象。具体步骤如下 :
@requestMapping:用于请求 url 映射。
@RequestBody: 注解实现接收 http 请求的 json 数据,将 json 数据转换为 java 对象。
@ResponseBody :注解实现将 controller 方法返回对象转化为 json 响应给客户。
@Conntroller:控制器的注解,表示是表现层,不能用用别的注解代替
@Autowire 和 @Resource 的区别?
@Autowire是Spring开发的,而@Resource是jdk开发的
@Autowire是按照类型type来注解的,而@Resource是按照名称来的,如果名称找不到,那么就按照类型type
注意:@Resource 是先按照name来注入的,如果找不到就按照类型注入,不过如果在controller使用的时候,指定了name的值,那么只能按照name来注入,如果找不到name就会报错,如果想要实现先按照name,找不到再按照type,就不要指定name的值。
解决 post 请求乱码:在 web.xml 里边配置一个 CharacterEncodingFilter 过滤器并设置编码为 utf-8即可。
1、解决 post 请求乱码:
在 web.xml 里边配置一个 CharacterEncodingFilter 过滤器并设置 编码为 utf-8即可。
2、解决 get 请求乱码:
修改 tomcat 配置文件添加编码与工程编码一致。
对参数进行重新编码
String userName = New String(Request.getParameter(“userName”).getBytes(“ISO8859-1”), “utf-8”);
–ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码。
使用Map、Model 和 ModelMap 的方式,这种方式存储的数据是在request域中
@RequestMapping(“/getUser”)
public String getUser(Map
//1.放在map里
map.put(“name”, “xq”);
//2.放在model里,一般是使用这个
model.addAttribute(“habbit”, “Play”);
//3.放在modelMap中
modelMap.addAttribute(“city”, “gd”);
modelMap.put(“gender”, “male”);
return “userDetail”;
}
使用request的方式
@RequestMapping(“/getUser”)
public String getUser(Map
ModelMap modelMap,HttpServletRequest request){
//放在request里
request.setAttribute(“user”, userService.getUser());
return “userDetail”;
}
使用ModelAndView
@RequestMapping(“/getUser”)
public ModelAndView getUser(ModelAndView modelAndView) {
mav.addObject(“user”, userService.getUser());
mav.setViewName(“userDetail”);
return modelAndView;
}
在类上添加@SessionAttributes
注解将指定的Model数据存储到session中。
@SessionAttributes
@SessionAttributes参数
names:这是一个字符串数组。里面应写需要存储到session中数据的名称。
types:根据指定参数的类型,将模型中对应类型的参数存储到session中。
value:其实和上面的names是一样的。
@SessionAttributes(value={“names”},types={Integer.class})
@Controller
public class session{
@RequestMapping("/session")
public String session(Model model){
model.addAttributes("names", Arrays.asList("caoyc","zhh","cjx"));
model.addAttributes("age", 22);
return "/session";
}
}
在上面代码中,在类上添加@SessionAttributes注解,并指定将names名称的Model数据存储到session域中,以及将Integer类型的Model数据存储到session域中。
拦截器的配置一般在的 SpringMVC 配置文件中,使用Interceptors标签,具体配置如下:
拦截器(Interceptor):它依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上,基于Java的反射机制,属于面向切面编程(AOP)的一种运用,就是在service或者一个方法前,调用一个方法,或者在方法后,调用一个方法,比如动态代理就是拦截器的简单实现,在调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在调用方法后打印出字符串,甚至在抛出异常的时候做业务逻辑的操作。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。拦截器可以对静态资源的请求进行拦截处理。
过滤器(Filter):它依赖于servlet容器。它可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的,是用来做一些过滤操作,获取我们想要获取的数据,比如:在Javaweb中,对传入的request、response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者Controller进行业务逻辑操作。通常用的场景是:在过滤器中修改字符编码(CharacterEncodingFilter)、在过滤器中修改HttpServletRequest的一些参数(XSSFilter(自定义过滤器)),如:过滤低俗文字、危险字符等。
JDK动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
CGlib动态代理:利用ASM(开源的Java字节码编辑库,操作字节码)开源包,将代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
区别:JDK代理只能对实现接口的类生成代理;CGlib是针对类实现代理,对指定的类生成一个子类,并覆盖其中的方法,这种通过继承类的实现方式,不能代理final修饰的类。