SpringMVC(一)
文章目录
- SpringMVC简单介绍
- SpringMVC小案例
- SpringMVC执行流程
- SpringMVC注解
- 处理器方法的参数
- 请求参数中文乱码问题
- 处理器方法的返回值
SpringMVC简单介绍
SpringMVC是Spring框架的一部分
优点:
- 基于MVC架构,分工明确,解耦合。
- 上手快,使用简单,轻量级,jar包小,不依赖特定的类和接口
- 作 为 Spring 框 架 一 部 分 , 能 够 使 用 Spring 的 IoC 和 Aop,方 便 整 合。Strtus,MyBatis,Hiberate,JPA 等其他 框架。
- SpringMVC 强化注解的使用,在控制器,Service ,Dao 都可以使用注解 。方便灵活
SpringMVC小案例
- 新建maven web项目
- 配置依赖pom.xml
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
- 注册中央调度器DispatcherServlet
- )DispatcherServlet它是一个Servlet, 父类继承了HttpServlet
- )DispatcherServlet的作用
- )是接收请求,显示处理结果给用户。
- )把接收到的请求分派给处理器(控制器)对象。
- )DispatcherServlet也叫做前端控制器(front controller)
web.xml
<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></init-param><load-on-startup>1</load-on-startup>
<servlet>
<servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>*.do</url-pattern>
</servlet-mapping>
在Tomcat启动时,根据load-on-startup的值创建dispatcherservlet对象,这是一个Servlet,创建时执行init()方法,,这个方法执行时会创建WebApplicationContext,创建容器时会读取spring需要的配置文件,这个配置文件的默认存在路径是WEB-INF,默认名称是当前servlet的 <servlet-name> -servlet.xml
url-pattern:将请求传递给中央调度器。常用的方式:1. **.do **.action **.mvc等,使用 **.jsp容易分不清请求与页面,所以不用。2. “/"
4. 创建处理器@Controller
@Controller默认是单例模式,在处理器类上添加@Controller注册为处理器类,它不是servlet, 起到servlet的作用。
方法上面加入@RequestMapping(value=“请求的uri地址”)
@Controller
public class MyController {@RequestMapping(value = "/my.do")public ModelAndView doSome() {ModelAndView mv = new ModelAndView();//添加到model部分,数据放到request.setAttrubute(),放到request作用域中mv.addObject("msg", "第一个springmvc项目");mv.addObject("fun", "doSome");//指定视图,框架对视图执行的是forWord操作:req.getRequestDisaptcher("/show.jsp").forwoard(req,resp);mv.setViewName("show");return mv;}
}
- spring配置文件applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 声明组件扫描器--><context:component-scan base-package="com.ljf.controller" /><!--创建视图View对象, 指定视图的路径,和扩展名--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--前缀:指定视图文件的路径--><property name="prefix" value="/WEB-INF/view/" /><!--后缀:指定视图文件的扩展名--><property name="suffix" value=".jsp" /></bean>
</beans>
- 定义目标页面
webapp/index.jsp
用来发送请求my.do
<a href="my.do" >my.do</a>
webapp/WEB-INF/view/show.jsp
用于接收传回来的值
<!-- el表达式 -->
msg数据:${msg}
<hr>
fun数据:${fun}
SpringMVC执行流程
DispatcherServlet的初始化做了什么
在父类的init()initServletBean();
initServletBean(){
创建springmvc的容器的对象, 读取springmvc的配置文件
this.webApplicationContext = initWebApplicationContext();把springmvc的容器对象放入到ServletContext中
String attrName = getServletContextAttributeName();
getServletContext().setAttribute(attrName, wac);
}请求的处理
1)用户发起some.do
2)DispatcherServlet接收some.do, 把请求交给了处理器映射器
处理器映射器:springmvc中的对象, 需要实现HandlerMapping的接口。
在框架中映射器有很多。
映射器作用:根据请求some.do找到处理他的处理器对象(MyController)
然后把MyController对象放到“处理器执行链”的类中保存
3)DispatcherServlet把“处理器执行链”的控制器对象交给了处理器适配器
处理器适配器:springmvc的对象,需要实现HandlerAdapter接口(可以有多个)
适配器作用:执行控制器对象的方法(MyController中的doSome())
执行流程分析:
(1)浏览器提交请求到中央调度器
(2)中央调度器直接将请求转给处理器映射器。
(3)处理器映射器会根据请求,找到处理该请求的处理器,并将其封装为处理器执行链后返回给中央调度器。
(4)中央调度器根据处理器执行链中的处理器,找到能够执行该处理器的处理器适配器。
(5)处理器适配器调用执行处理器。
(6)处理器将处理结果及要跳转的视图封装到一个对象 ModelAndView 中,并将其返回给处理器适配器。
(7)处理器适配器直接将结果返回给中央调度器。
(8)中央调度器调用视图解析器,将 ModelAndView 中的视图名称封装为视图对象。
(9)视图解析器将封装了的视图对象返回给中央调度器
(10)中央调度器调用视图对象,让其自己进行渲染,即进行数据填充,形成响应对象。
(11)中央调度器响应浏览器。
SpringMVC注解
@Controller 注册创建控制器对象
@RequestMapping 表示接收请求
- 属性:value :接收的请求
method:请求的方式 - 可以用在方法名上面,表示这个请求需要执行的方法;用在类名上面,表示这个类是一个请求模块,其内部还有其他子请求
处理器方法的参数
- 可以在@RequestMapping修饰的方法添加形参:HttpServletRequest HttpServletResponse HttpSession 这三种类型的参数
- 可以形参可以与请求中携带的参数名一致,但是类型也必须一致。框架会自动进行赋值
- 形参与请求参数名不一致时,可以通过@RequestParam进行指定
@RequestParam(“请求参数名”) 形参类型 形参名 - 当传入的多个参数是某个实体类的属性时,且请求参数名与这个实体类的属性名一致,那么形参可以是这个实体类的类型(当然类型也要相同),实体类必须声明set方法。
传入name,age 。实体类Student属性:name,age
public void doSome(Student student){ … }
在接收请求时,doSome方法还没实行,先创建Student对象,将name、age通过set方法赋值Student的对象。 - 当上面3、4同时出现时
public void doSome(Student student,String name){ … }
name会传给student,也会传给形参name
请求参数中文乱码问题
对于前面所接收的请求参数,若含有中文,则会出现中文乱码问题
解决方案:过滤器
<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><init-param><param-name>forceRequestEncoding</param-name><param-value>true</param-value></init-param><init-param><param-name>forceResponseEncoding</param-name><param-value>true</param-value></init-param>
</filter>
<filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
处理器方法的返回值
- ModelAndView
- ModelAndView 表示请求处理结果的数据和视图
- Model:表示数据的,Model实际是Map结构
mv.addObject(“msg”, “第一个springmvc项目”);
mv.addObject(“fun”, “doSome”); - View:表示视图的,也就是jsp
mv.setViewName(“other”);
- String类型
return “逻辑视图名”
有视图解析器,可以将逻辑视图名配置成完整路径 - void
一般用来传递json数据 - Object
处理器方法返回 Object 对象。这个 Object 可以是 Integer,String,自定义对象,Map,List 等。但返回的对象不是作为逻辑视图出现的,而是作为直接在页面显示的数据出现的。
返回对象,一般使用JSON格式的数据,需要使用@ResponseBody 注解。
- 需要添加依赖
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.0</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version>
</dependency>
声明注解驱动
<mvc:annotation-driven />
将 Object 数据转化为 JSON 数据,需要由消息转换器 HttpMessageConverter 完成。而转换器的开启,需要由mvc:annotation-driven/来完成。
当 Spring 容器进行初始化过程中,在mvc:annotation-driven/处创建注解驱动时,默认创建了七个 HttpMessageConverter 对象。也就是说,我们注册mvc:annotation-driven/,就是为了让容器为我们创建 HttpMessageConverter 对象。
HttpMessageConverter 接口四个方法 :
boolean canRead(Class<?> clazz,MediaType mediaType)
: 指定转换器可以读取的对象类型,即转换器是否可将请求信息转换为 clazz 类型的对象,同时指定支持 MIME 类型(text/html,applaiction/json 等)
boolean canWrite(Class<?> clazz,MediaType mediaType)
:指定转换器是否可将 clazz 类型的对象写到响应流中,响应流支持的媒体类型在MediaType 中定义。LIst getSupportMediaTypes():该转换器支持的媒体类型。
T read(Class<? extends T> clazz,HttpInputMessage inputMessage)
:将请求信息流转换为 T 类型的对象。
void write(T t,MediaType contnetType,HttpOutputMessgae outputMessage)
:将 T 类型的对象写到响应流中,同时指定相应的媒体类型为 contentType返回自定义类型对象
返回自定义类型对象时,不能以对象的形式直接返回给客户端浏览器,而是将对象转换为 JSON 格式的数据发送给浏览器的。需要jackson的相关依赖,同时需要在处理方法上面使用@ResponseBody修饰。这表示返回的自定义类型对象是json格式的返回List集合
将返回的list集合转换成json格式进行返回,需要jackson的相关依赖,同时需要在处理方法上面使用@ResponseBody修饰。返回String类型
如果方法上不使用@ResponseBody修饰,则返回值表示返回一个页面。
使用@ResponseBody修饰,则表示返回值是一个字符串类型的数据。
SpringMVC(一)相关推荐
- 【SpringMVC】概述
概述: SpringMVC:是基于spring的一个框架, 实际上就是spring的一个模块, 专门是做web开发的. 理解是servlet的一个升级 Sp ...
- 【SpringMVC】基本概念
SpringMVC的基本概念 三层架构 我们的开发一般都是基于c/s或者b/s架构.在JavaEE开发中,几乎全都是基于B/S架构开发.在B/S架构中,系统标准的三层架构包括:表现层,业务层,持久层. ...
- SSM框架整合(Spring+SpringMVC+MyBatis)
输出结果 1.Maven Web项目创建 之前有写过Eclipse+Maven创建web项目的帖子,如果需要,请参考这里写链接内容 创建好项目之后因为入下图: 2.SSM整合 2.1 引入需要的JAR ...
- SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)
[SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...
- SpringMVC——通俗易懂讲讲Ajax~
聊聊Ajax 一.什么是Ajax 二.iframe标签简单伪造Ajax 三.Ajax的实现 1. 基本概念的了解 Ajax的核心是什么? XMLHttpRequest是什么? Ajax数据传输的数据格 ...
- Jackson、FastJson快速入门(整合SpringMVC)
目录 1. 什么是 JSON 2. JSON 语法规则 3. JSON 与 JS 对象的关系 4. JSON 和 JS 对象互转 5. Jackson-数据格式转换 1. 环境搭建 2. 对象转jso ...
- RESTful风格及其SpringMVC实现
目录 1.RESTful概念 2.RESTful功能 3.对比:传统方式操作资源 4.SpringMVC实现传统方式操作资源 5.使用RestFul操作资源 6.SpringMVC实现RESTful操 ...
- 使用注解开发SpringMVC详细配置教程
目录 1.使用注解开发SpringMVC 1.新建一个普通的maven项目,添加web支持 2.在pom.xml中导入相关依赖 3.配置web.xml 4.编写SpringMVC配置文件 1. 自动扫 ...
- SpringMVC的form:form表单的使用
为什么要使用SpringMVC的form:form表单,有两个原因:一是可以更加快捷的完成表单的开发,比如会替你做好数据类型装换等本来需要你自己动手的工作.其次就是能够更加方便的实现表单回显. 首先要 ...
- SpringMVC工作环境搭建 配置文件
web.xml配置 在服务器端容器启动之前加载配置文件的顺序:context-param>listener>filter>servlet //容器配置application上下文的时 ...
最新文章
- java易语言_java程序员,0基础学习开发易语言。
- 后年将有60亿部手机!
- matlab 直方图_MATLAB作图实例:19:用二元直方图分析图片颜色
- 【机器学习基础】数学推导+纯Python实现机器学习算法4:决策树之ID3算法
- 神奇的python(二)之python打包成应用程序
- Java基础---代码块和final关键字
- [转]由自助餐想到软件团队的管理
- 权限管理----用户与模块关系
- 用一个键盘和鼠标控制两台双显示器计算机的最佳方法是什么?
- SAP-ML物料账报错处理>ML4HMASTER113/ML4HRUN053>2021-01-09
- 怎样才能够修改PDF文件中的文字大小
- python 应用程序无法正常启动 000007b_为你解答应用程序无法正常启动00xc000007b怎么办...
- 由KKT互补松弛条件,支持向量的系数不一定为0,非支持向量的系数一定为0
- 质量流量计读数不准的其中三点原因
- mac brew 下载加速
- jvm工具系列之 -- jmap
- 个人总结了下自己在XP系统下键盘组合代码,顺便分享下,其实很实用,可是你用到了麽?
- 上海应用技术大学计算机类,2018年上海应用技术大学计算机学院计算机大类考研调剂信息公布...
- playfair 加密与解密
- LeetCode 牛客网 C++ 算法 刷题必备基础知识