Spring整理四

    技术2026-06-15  8

    回顾Spring

    1、IOC2、bean3、AOP4、jdbc5、事务6、注解

    一、Spring Web MVC 框架

    1、前言

    Spring MVC是一个基于MVC架构的用来简化web应用程序开发的应用开发框架,它是Spring的一个模块,无需中间整合层来整合 ,它和Struts2一样都属于表现层的框架。

    在web模型中,MVC是一种很流行的框架,通过把Model,View,Controller分离,把较为复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。

    SpringMVC框架是以请求为驱动,围绕Servlet设计。其核心类是DispatcherServlet(前端控制器),它是一个Servlet,顶层是实现的Servlet接口。

    2、SpringMVC流程

    借来的图,工作流程:

    1、用户发送请求到前端控制器DispatcherServlet;2、DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handler;3、处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;4、DispatcherServlet 调用 HandlerAdapter处理器适配器;5、HandlerAdapter 经过适配执行具体的处理器(Handler,也叫后端控制器(controller));6、Handler执行完成返回ModelAndView;7、HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;8、DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;9、ViewResolver解析后返回具体View;10、DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)11、DispatcherServlet响应用户。

    3、SpringMVC主要组件

    其实从上边就能看出来了:

    前端控制器 DispatcherServlet 不需要程序员开发接收请求、响应结果,相当于转发器、中央处理器。有了DispatcherServlet 减少了其它组件之间的耦合度。Spring MVC 的入口函数。 处理器映射器HandlerMapping 不需要程序员开发根据请求的URL来查找Handler即处理器(Controller)SpringMVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。 处理器适配器HandlerAdapter 不需要程序员开发按照特定规则(HandlerAdapter要求的规则)去执行Handler,通过扩展适配器可以对更多类型的处理器进行执行。 处理器Handler 需要程序员开发在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。 视图解析器 ViewResolver 不需要程序员开发进行视图的解析,根据视图逻辑名解析成真正的视图(view)View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由工程师根据业务需求开发具体的页面。 视图View 需要程序员开发View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)

    4、SpringMVC和Struts2

    1、SpringMVC的入口是一个servlet即前端控制器(DispatchServlet)。而Struts2入口是一个filter过虑器(StrutsPrepareAndExecuteFilter)。2、SpringMVC是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例)。Struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。 从架构本身上SpringMVC就容易实现restful url;SpringMVC的方法独享request response数据;Struts2需要针对每个request进行封装;SpringMVC用的是独立的AOP方式拦截器;Struts2是自己的interceptor机制。SpringMVC集成了Ajax ,使用非常方便。 3、Struts2采用值栈存储请求和响应的数据,通过OGNL存取数据。SpringMVC通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。

    5、SpringMVC实例

    先来个基本的例子在往下讲。

    这次需要创建web项目,把之前Spring的jar包都导入,然后在配置SpringMVC: 在浏览器里输入:http://localhost:8080/SpringMVC/login即可成功访问login.jsp页面

    简单的说明下上边的配置:

    applicationContext.xml文件其实是spring和springMVC融合在一起了。context:component-scan标签开启注解。InternalResourceViewResolver 将使用定义的规则来解决视图名称。按照上述定义的规则,一个名称为 login 的逻辑视图将发送给位于 /WEB-INF/login/login.jsp 中实现的视图。@Controller 注释表明类是一个控制器。@RequestMapping 注释用于映射 URL 到整个类或一个特定的处理方法。像上边也可以写到类上。

    6、SpringMVC重定向和转发

    重定向:return “redirect:redPage”; 浏览器地址会发生变化 转发:return “forward:redPage”; 浏览器地址不会变化只能在同一个容器内完成转发

    7、SpringMVC和AJAX

    通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象:

    加入Jackson.jar在配置文件中配置json的映射在接受Ajax方法里面可以直接返回Object、List等,,方法前面要加上 @ResponseBody 注解。

    8、SpringMVC拦截器

    都说有两种写法,一种是实现HandlerInterceptor接口,另外一种是继承适配器类。

    今天就只说实现HandlerInterceptor接口,在接口方法当中,实现处理逻辑;然后在SpringMvc的配置文件中配置拦截器即可。基于上边修改实现:

    9、异常处理

    单独处理异常比较麻烦,Spring MVC提供3中可以集中处理异常的方式:

    使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;

    优点:集成简单、有良好的扩展性、对已有代码没有入侵性等缺点:仅能获取到异常信息,若在出现异常时,对需要获取除异常以外的数据的情况不适用。在上边基础上添加xml配置,然后加个异常: 访问这个方法时会跳转到异常页面,异常页面根据上边的视图配置要放在/WebRoot/WEB-INF/login/error.jsp

    实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器;

    具有集成简单、有良好的扩展性、对已有代码没有入侵性等优点。同时,在异常处理时能获取导致出现异常的对象,有利于提供更详细的异常处理信息。自定义异常处理器,然后在xml里加载就可以:

    使用@ExceptionHandler注解实现异常处理;

    具有集成简单、扩展性好、不需要附加Spring配置等优点;对已有代码存在入侵性,在异常处理时不能获取除异常以外的数据。自定义异常处理,然后需要的继承即可:

    其他:对于Unchecked Exception而言,由于代码不强制捕获,往往被忽略,如果运行期产生了Unchecked Exception,而代码中又没有进行相应的捕获和处理,则我们可能不得不面对尴尬的404、500……等服务器内部错误提示页面。 目前大多数服务器也都支持在Web.xml中通过(Websphere/Weblogic)或者(Tomcat)节点配置特定异常情况的显示页面。修改web.xml文件,增加以下内容:

    其他:ajax调用或restful接口异常处理 在HandlerExceptionResolver 的实现类中实现普通异常和ajax异常的处理或在SimpleMappingExceptionResolver类中复写其doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)方法,通过修改该方法实现普通异常和ajax异常的处理。

    参考地址 更多看这个

    10、日志

    有两种方式可以生成日志:Log4J和commons-logging 在web-xml中配置:

    11、其他相关

    SpringMVC的控制器是不是单例模式: 是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能,解决方案是在控制器里面不能写字段。

    SpingMvc中的控制器的注解一般用那个,有没有别的注解可以替代: 一般用@Controller注解,也可以使用@RestController,@RestController注解相当于@ResponseBody + @Controller,表示是表现层,除此之外,一般不用别的注解代替。

    如何解决POST请求中文乱码问题,GET的又如何处理呢:

    过滤器的编码设置应该与jsp页面保存一致post:在web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf-8; get请求中文参数出现乱码解决方法有两个: 修改tomcat配置文件添加编码与工程编码一致:ConnectorURIEncoding=“utf-8”对参数进行重新编码:String userName = new String(request.getParamter(“userName”).getBytes(“ISO8859-1”),“utf-8”)

    Spring MVC的异常处理: 可以将异常抛给Spring框架,由Spring框架来处理;我们只需要配置简单的异常处理器,在异常处理器中添视图页面即可。

    SpringMVC常用的注解有哪些:

    @RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。@RequestBody:注解实现接收http请求的json数据,将json转换为java对象。@ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。

    怎样在方法里面得到Request,或者Session: 直接在方法的形参中声明request,SpringMvc就自动把request对象传入。

    SpringMvc中函数的返回值是什么: 返回值可以有很多类型,有String, ModelAndView。ModelAndView类把视图和数据都合并的一起的,但一般用String比较好。

    怎么样把ModelMap里面的数据放入Session里面: 可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key。

    注解原理: 注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类。我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象。通过代理对象调用自定义注解的方法,会最终调用AnnotationInvocationHandler的invoke方法。该方法会从memberValues这个Map中索引出对应的值。而memberValues的来源是Java常量池。

    SpringMVC如何读取请求参数值: 方式1:通过request 方式2:通过@RequestParam 方式3:通过Javabean

    Spring MVC如何向页面传值: 方式1: 绑定数据到request 方式2: 返回ModelandView 方式3:绑定数据到ModelMap 方式4:绑定数据到Session

    二、过滤器>拦截器>AOP

    在实现一些公共逻辑的时候,很多功能通过过滤器,拦截器,AOP都能实现,但是不同的方式有不同的效率。

    从过滤器–》拦截器–》切面,拦截规则越来越细致,执行顺序依次是过滤器、拦截器、切面。一般情况下数据被过滤的时机越早对服务的性能影响越小,因此我们在编写相对比较公用的代码时,优先考虑过滤器,然后是拦截器,最后是aop。

    过滤器:

    过滤器拦截的是URL

    Spring中自定义过滤器(Filter)一般只有一个方法,返回值是void,当请求到达web容器时,会探测当前请求地址是否配置有过滤器,有则调用该过滤器的方法(可能会有多个过滤器),然后才调用真实的业务逻辑,至此过滤器任务完成。

    过滤器并没有定义业务逻辑执行前、后等,仅仅是请求到达就执行。

    特别注意:过滤器方法的入参有request,response,FilterChain,其中FilterChain是过滤器链,使用比较简单,而request,response则关联到请求流程,因此可以对请求参数做过滤和修改,同时FilterChain过滤链执行完,并且完成业务流程后,会返回到过滤器,此时也可以对请求的返回数据做处理。

    拦截器:

    拦截器拦截的是URL

    拦截器有三个方法,相对于过滤器更加细致,有被拦截逻辑执行前、后等。Spring中拦截器有三个方法:preHandle,postHandle,afterCompletion。具体上述已经讲过。

    AOP(面向切面):

    面向切面拦截的是类的元数据(包、类、方法名、参数等)

    相对于拦截器更加细致,而且非常灵活,拦截器只能针对URL做拦截,而AOP针对具体的代码,能够实现更加复杂的业务逻辑。

    Processed: 0.009, SQL: 9