Java知识总结--SpringMVC篇
SpringMVC
部门内容来自csdn博客:
https://blog.csdn.net/a745233700/article/details/80963758
https://blog.csdn.net/zyx1260168395/article/details/105088359
目录
1.1.11-如何解决POST请求中文乱码问题,GET的又如何处理
1.1.13-SpringMvc的控制器是不是单例模式,如果是,有什么问题,怎么解决
1.1.15- SpingMvc中的控制器的注解一般用那个,有没有别的注解可以替代
1.1.16- 如果在拦截请求中,我想拦截get方式提交的方法,怎么配置?
1.1.17- 怎样在方法里面得到Request,或者Session
1.1.18- @ResponseBody和@RequestBody
1.1.19- @RequestParam和@PathVariable
1.1.1-MVC模式
Model VIew Controller:模型视图控制器
最简单的最经典的MVC是jsp+Servlet(Controller)+javaBean(model)
描述:(控制器是核心)
-
当控制器Servlet收到用户的请求
-
控制器调用JavaBean完成业务
-
完成业务后通过控制器跳转jsp页面的方式给用户反馈信息
-
jsp给用户做出响应
1.1.2-MVC框架的出现
是为了解决传统mvc模式问题而出现的框架
传统mvc的模式问题:
- 所有的servlet和servlet映射都要配置到web.xml中,如果项目比较大的话,web.xml的数据会过于庞大,不利于实现模块化管理。
- Servlet的主要功能就是接收参数,调用逻辑,跳转页面,比如其他字符编码,文件上传的功能也要写在servlet中,不能让servlet住哟啊功能而需要做处理一下特例
- 接收参数比较麻烦(request.getParameter),不能通过model接收,只能单个接收,接收完成后转换封装model
- 跳转页面方式比较单一(只有forward,redirect),并且当我的页面名称发生改变时需要修改servlet源代码
1.1.3-什么是SpringMVC
Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。
1.1.4-SpringMVC的优点
- 可以支持多样视图技术
- 由于同属Spring,有着更好的整合
- 角色分配清晰:前端控制器(dispatcherServlet) , 请求到处理器映射(handlerMapping), 处理器适配器(HandlerAdapter), 视图解析器(ViewResolver)。
- 支持各种请求资源的映射策略
1.1.5-Spring MVC的主要组件
前端控制器 DispatcherServlet
处理器映射器HandlerMapping
处理器适配器HandlerAdapter
处理器Handler(需要自己开发)
视图解析器 ViewResolver
视图View(需要自己开发)
1.1.6-SpringMVC框架的核心
DispatcherServlet,可以用于接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
1.1.7-SpringMVC框架执行流程
步骤:
- 通过服务器发送请求。请求会被Spring的前端控制器DispatcherServlet拦截
-
DispatcherServlet对请求的URL进行解析,得到请求资源标识符(url)
-
然后通过该url调用HandlerMapping获取该Handler配置的所有相关对象(Hanlder对象以及Hanlder对象内部的拦截器),最后以HandlerExecutionChain对象的形式返回
-
DispatcherServlet根据获取handler,选择一个合适的HandlerAdapter,提取Request中的数据模型,填充Handler入参,开始执行Handler(Controller)
- Handler执行完毕后,向DispatcherServlet返回一个ModelAndView对象
- DispatcherServlet根据返回的ModelAndView,选择一个适合的ViewResolver(前提是已经注册到Spring容器中的ViewResolver)
-
通过ViewResolver结合Model和View,来渲染视图,DispatcherServlet将渲染结果返回给客户端
简单说:请求被DispatcherServlet拦截,核心控制器分析请求得到url,调用HandlerMapping获取Hanlder,选择一个合适的HandlerAdapter,提取Request中的数据模型,填充Handler入参,执行Handler,执行后向核心控制器返回一个ModelAndView对象,然后选择合适的ViewResolver来渲染视图并返回
1.1.8-SpringMVC的转发和重定向
- 转发:"forward:"
- 重定向:"redirect:"
1.1.9-SpringMvc和AJAX五种交互方式
- 通过URL传参
- 单值传参
- 对象传参
- 对象序列化传参
- List传参
1.1.10-SpringMvc怎么和AJAX相互调用的
通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象。具体步骤如下 :
- 加入Jackson.jar
- 在配置文件中配置json的映射
- 在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解。
1.1.11-如何解决POST请求中文乱码问题,GET的又如何处理
1:解决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>
2: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")
- ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码。
1.1.12- SpringMVC异常处理
可以将异常抛给Spring框架,由Spring框架来处理;我们只需要配置简单的异常处理器,在异常处理器中添视图页面即可。
1.1.13-SpringMvc的控制器是不是单例模式,如果是,有什么问题,怎么解决
是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写字段。
1.1.14-SpringMVC常用的注解
- @RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。
- @RequestBody:注解实现接收http请求的json数据,将json转换为java对象。
- @ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。
1.1.15- SpingMvc中的控制器的注解一般用那个,有没有别的注解可以替代
一般用@Controller注解,也可以使用@RestController,@RestController注解相当于@ResponseBody + @Controller,表示是表现层,除此之外,一般不用别的注解代替。
1.1.16- 如果在拦截请求中,我想拦截get方式提交的方法,怎么配置?
可以在@RequestMapping注解里面加上method=RequestMethod.GET。
1.1.17- 怎样在方法里面得到Request,或者Session
直接在方法的形参中声明request,SpringMVC就自动把request对象传入。
1.1.18- @ResponseBody和@RequestBody
-
@ResponseBody:作用在方法上,表示该方法的返回结果直接写入响应体中,如果不使用@ResponseBody,则返回值会解析为跳转路径。
-
@RequestBody:作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。
1.1.19- @RequestParam和@PathVariable
-
@
RequesParam
:将请求参数绑定到控制器的方法参数上,同时可以给参数一些限定,比如说指定参数的默认值,是否允许参数为空等等。 -
@
PathVariable
:是将Rest
风格的请求中{}
中的值取出来
1.1.20-拦截请求
-
使用过滤器方式拦截请求(实现
javax.servlet.Filter
接口) -
使用SpringMVC提供的拦截器(实现
HandlerInterceptor
接口) -
利用Spring的切面(AOP)实现拦截器。
1.1.21-Struts2和SpringMVC的区别
SpringMVC的核心控制器是Servlet,而Struts2是Filter
控制器实例:SpringMVC会比Struts2快一些,SpringMVC是基于方法设计的,而Struts2是基于对象,每次发一次请求都会实例一个action,每个action都会被注入属性,而Spring更加像Servlet,只有一个实例,每次请求执行对应的方法即可
管理方式:springmvc是Spring中的模块,管理起来会更加的简单方便一些,而且提供了比较全面的注解方式进行管理,各种功能也比较全面,使用简单,而Struts需要采用xml很多的配置参数来管理
参数传递:Struts2自身提供多种参数接收,其实都使用过(ValueStack)进行传递和赋值,而SpringMVC是通过方法的参数进行接收的
学习难度:Struts学习成本高,SpringMVC比较简单
intercepter的实现机制:struts有以自己的interceptor机制,springmvc用的是独立的aop,这样导致struts的配置文件还是比springmvc大,虽然struts的配置能继承,但是个人认为,springmvc会更加的简介,开发效率更高一些。
springmvc处理ajax请求,直接通过返回数据,方法中使用注解@ResponseBody,Springmvc自动帮我们对象转换为JSON数据,而struts是用国插件的方式进行处理
//持续更新中。。。。。。
上一篇: PTA(java,C++)查找电话号码
下一篇: 求解一个整数数组划分成两个子数组问题