JAVAEE框架之Spring

九.SpringMVC基础

​ 概念:SpringMVC 是类似于 Struts2 的一个 MVC 框架,在实际开发中,接收浏览器的请求响应,对数据进行处理,然后返回页面进行显示,但是上手难度却比 Struts2 简单多了。而且由于 Struts2 所暴露出来的安全问题,SpringMVC 已经成为了大多数企业优先选择的框架。

在Spring框架体系中的位置

特点:
结构松散,几乎可以在 Spring MVC 中使用各类视图
松耦合,各个模块分离
与 Spring 无缝集成

9.1HelloSpringMVC的步骤

9.1.1 jar包准备

在pom.xml文件增加

<!--springmvc,webmvc间接依赖于web包,使用这个即可-->
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.5.RELEASE</version>
</dependency>

9.1.2 web.xml增加配置

<web-app><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:spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

9.1.3 spring-mvc.xml

这个文件和之前的beans.xml都在resources下

<?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"xmlns:mvc="http://www.springframework.org/schema/mvc"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 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--扫描控制器包--><context:component-scan base-package="com.aaa.controller"></context:component-scan><mvc:annotation-driven/><!--配置spring mvc默认的jsp视图解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--配置返回视图的前缀--><property name="prefix" value="/WEB-INF/view/"></property><!--配置返回视图的后缀--><property name="suffix" value=".jsp"></property></bean>
</beans>

mvc:annotation-driven会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean

9.1.4 HelloController

java代码在src下建立。

@Controller
public class HelloController{@RequestMapping("/hello")public String hello(){System.out.println("----");return "hello";}
}

9.1.5测试

url地址栏输入:http://localhost:8080/hello

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MVsjTitM-1595717345637)(E:\政通路\课堂笔记\S2\Spring\assets\image-20200723155930671.png)]

注意,我们这里报错了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MquZIemm-1595717345639)(E:\政通路\课堂笔记\S2\Spring\assets\image-20200724153647426.png)]

原因在于,需要在WEB-INF下,建立一个目录view,在view目录下建立一个hello.jsp文件。

9.2 SpringMVC流程

9.2.1 原理图

9.2.2 步骤

工作流程概述:

1、客户端向web服务器(如tomcat)发送一个http请求,web服务器对http请求进行解析,解析后的URL地址如果匹配了DispatcherServlet的映射路径(通过web.xml中的servlet-mapping配置),web容器就将请求交给DispatcherServlet处理。

2、DispatcherServlet接收到这个请求后,再对URL进行解析,得到请求资源标识符(URI)。然后调用相应方法得到的HandlerMapping对象,再根据URI,调用这个对象的相应方法获得Handler对象以及它对应的拦截器。(在这里只是获得了Handler对象,并不会操作它,在SpringMVC中,是通过HandlerAdapter对Handler进行调用、控制的)

3、DispatcherServlet根据得到的Handler对象,选择一个合适的HandlerAdapter,创建其实例对象,执行拦截器中的preHandler()方法。

4、在拦截器方法中,提取请求中的数据模型,填充Handler入参,所以所有准备工作都已做好,开始执行Handler(我们写的controller代码并不是能被直接执行,需要有刚才那些操作,才能转变为Handler被执行)。

5、Handler执行完毕后返回一个ModelAndView对象给DispatcherServlet。

6、这个ModleAndView只是一个逻辑视图,并不是真正的视图,DispatcherServlet通过ViewResolver视图解析器将逻辑视图转化为真正的视图(通俗理解为将视图名称补全,如加上路径前缀,加上.jsp后缀,能指向实际的视图)。

7、DispatcherServlet通过Model将ModelAndView中得到的处数据解析后用于渲染视图。将得到的最终视图通过http响应返回客户端。

9.2.3 连接画图

十. 注解和参数绑定

10.1@RequestMapping 注解

@RequestMapping 注解 配置请求的路径,这个注解可以加到控制器的方法上,也可以加到类上,加到类上相当

于命名空间。

用户保存的请求:

http://localhost:8080/spring_mvc/user/save.do

保存部门的请求:

http://localhost:8080/spring_mvc/dept/save.do

比较常用的有:

value(path)

指定请求的实际地址,指定的地址可以是 URI Template 模式

method

指定请求的 method 类型。例如 GET、POST、PUT、DELETE 等

10.2 @RequestParam

当请求参数和控制器参数不一致的情况

表单代码

<form action="/login" method="post">账户:<input name="uname" id="username" ><br/>密码:<input name="pwd" id="password"><br/><button type="submit">登录</button>
</form>

Controller代码

@RequestMapping("/login")
public String login(@RequestParam("uname") String uu,@RequestParam("pwd") String password){System.out.println(""+uu+"");System.out.println(password);return "hello";
}

10.3 请求参数

10.3.1 基本数据传参

表单

<form action="/login" method="get">账户:<input name="username" id="username" ><br/>密码:<input name="password" id="password"><br/><button type="submit">登录</button>
</form>

控制器

@RequestMapping("/login")
public String login(String username,String password){System.out.println(username);System.out.println(password);return "hello";
}

​ 表单中input的name值和Controller的参数变量名保持一致,就能完成数据绑定,如果不一致可以使用@RequestParam注解。需要注意的是,如果Controller方法参数中定义的是基本数据类型,但是从页面提交过来的数据为null或者”“的话,会出现数据转换的异常。也就是必须保证表单传递过来的数据不能为null或””,所以,在开发过程中,对可能为空的数据,最好将参数数据类型定义成包装类型,具体参见下面的例子。

10.3.2 模型封装传参

声明实体类

public class Users {private Long id;
private String username;
private String password;
public Long getId() { return id;
}
public void setId(Long id) { this.id = id;
}
public String getUsername() {第二步,在控制器中通过模型的方式传递参数
使用HttpServletRequest对象
在servlet时代,我们可以使用HttpServletRequest对象的getParameter方法获取参数,在spring mvc中也可以获
取到HttpServletRequest对象,获取该对象后,就可以使用之前的方式接收参数了
return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password;
}
public void setPassword(String password) { this.password = password;
} }

在控制器中使用封装类模型来传递参数,注意表单name和实体类属性一致。


10.3.3 使用原生API

pom.xml引入原生jar

<!--引入原生javax.-->
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version>
</dependency>

控制器代码


10.3.4 后台向前台传递数据

1.使用Model


2.使用原生HttpServletRequest


3.使用Map


Servlet根据得到的Handler对象,选择一个合适的HandlerAdapter,创建其实例对象,执行拦截器中的preHandler()方法。4、在拦截器方法中,提取请求中的数据模型,填充Handler入参,所以所有准备工作都已做好,开始执行Handler(我们写的controller代码并不是能被直接执行,需要有刚才那些操作,才能转变为Handler被执行)。5、Handler执行完毕后返回一个ModelAndView对象给DispatcherServlet。6、这个ModleAndView只是一个逻辑视图,并不是真正的视图,DispatcherServlet通过ViewResolver视图解析器将逻辑视图转化为真正的视图(通俗理解为将视图名称补全,如加上路径前缀,加上.jsp后缀,能指向实际的视图)。7、DispatcherServlet通过Model将ModelAndView中得到的处数据解析后用于渲染视图。将得到的最终视图通过http响应返回客户端。### 9.2.3 连接画图# 十. 注解和参数绑定## **10.1@RequestMapping** **注解**@RequestMapping 注解 配置请求的路径,这个注解可以加到控制器的方法上,也可以加到类上,加到类上相当于命名空间。用户保存的请求:http://localhost:8080/spring_mvc/user/save.do保存部门的请求:http://localhost:8080/spring_mvc/dept/save.do比较常用的有:#### value(path)指定请求的实际地址,指定的地址可以是 URI Template 模式#### method指定请求的 method 类型。例如 GET、POST、PUT、DELETE 等## 10.2 @RequestParam当请求参数和控制器参数不一致的情况表单代码```html
<form action="/login" method="post">账户:<input name="uname" id="username" ><br/>密码:<input name="pwd" id="password"><br/><button type="submit">登录</button>
</form>

Controller代码

@RequestMapping("/login")
public String login(@RequestParam("uname") String uu,@RequestParam("pwd") String password){System.out.println(""+uu+"");System.out.println(password);return "hello";
}

10.3 请求参数

10.3.1 基本数据传参

表单

<form action="/login" method="get">账户:<input name="username" id="username" ><br/>密码:<input name="password" id="password"><br/><button type="submit">登录</button>
</form>

控制器

@RequestMapping("/login")
public String login(String username,String password){System.out.println(username);System.out.println(password);return "hello";
}

​ 表单中input的name值和Controller的参数变量名保持一致,就能完成数据绑定,如果不一致可以使用@RequestParam注解。需要注意的是,如果Controller方法参数中定义的是基本数据类型,但是从页面提交过来的数据为null或者”“的话,会出现数据转换的异常。也就是必须保证表单传递过来的数据不能为null或””,所以,在开发过程中,对可能为空的数据,最好将参数数据类型定义成包装类型,具体参见下面的例子。

10.3.2 模型封装传参

声明实体类

public class Users {private Long id;
private String username;
private String password;
public Long getId() { return id;
}
public void setId(Long id) { this.id = id;
}
public String getUsername() {第二步,在控制器中通过模型的方式传递参数
使用HttpServletRequest对象
在servlet时代,我们可以使用HttpServletRequest对象的getParameter方法获取参数,在spring mvc中也可以获
取到HttpServletRequest对象,获取该对象后,就可以使用之前的方式接收参数了
return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password;
}
public void setPassword(String password) { this.password = password;
} }

在控制器中使用封装类模型来传递参数,注意表单name和实体类属性一致。


10.3.3 使用原生API

pom.xml引入原生jar

<!--引入原生javax.-->
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version>
</dependency>

控制器代码


10.3.4 后台向前台传递数据

1.使用Model


2.使用原生HttpServletRequest


3.使用Map


JAVAEE框架之SpringMVC基础相关推荐

  1. 面试题大全1-javaSE部分-JavaEE框架中间件

    文章目录 Java面试题大全 一.JavaSE 部分 基础部分 1.Java中基本数据类型有哪些? 2.Integer 和 int的区别 3.String和StringBuilder和StringBu ...

  2. SpringMVC基础学习之Controller的两种实现方式和RequstMapping注解的使用

    前言: 小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师. 这个SpringM ...

  3. (Java每日一谈:第四日——幸福的四象限)主流框架:Dubbo基础实战篇--Dubbo快速入门

    在昨天的Dubbo基础篇中,小编对Dubbo的相关基础理论知识进行了一个详细的解释,如果大家对这一块的知识感到好奇,推荐大家可以去阅读一下小编昨天写的Dubbo相关知识点,今天小编会进行Dubbo实用 ...

  4. SSM框架:SpringMVC

    SSM框架:SpringMVC 文章目录 前言 一.回顾 1. 学习方法说明 2. 回顾MVC架构 1.什么是MVC 2.MVC的结构分析 3.Model1时代 4.Model2时代 3. 回顾Ser ...

  5. SpringMVC基础配置及使用

    SpringMVC基础配置及使用 SpringMVC: 1.SpringMVC和Spring的关系:     软件开发的三层架构: web层[表示层.表现层]---->Service层----& ...

  6. JavaEE开发之SpringMVC中的自定义拦截器及异常处理

    上篇博客我们聊了<JavaEE开发之SpringMVC中的路由配置及参数传递详解>,本篇博客我们就聊一下自定义拦截器的实现.以及使用ModelAndView对象将Controller的值加 ...

  7. 【Java从0到架构师】SpringMVC - 基础

    SpringMVC - 基础 SpringMVC - 入门 web.xml 配置 DispatcherServlet appliactionContext.xml 新建 Controller Spri ...

  8. javaweb实训第五天下午——SpringMVC基础

    SpringMVC基础 1.课程介绍 2.SpringMVC概述 3.SpringMVC入门 3.1.入门需知 3.1.1.Jar包管理 3.1.2.核心控制器(前端控制器) 3.2.加入相关Spri ...

  9. 瑞思拜 我儿豁 SpringMVC基础 兄弟们冲冲冲

    SpringMVC基础 课程介绍 1. SpringMVC概述: (了解) 2. SpringMVC入门: (掌握) 3. 前端控制器<url-pattern>配置: (掌握) 4. 业务 ...

最新文章

  1. poj3686(最小费用流)
  2. 转载:vs配置opencv教程
  3. 为什么parsefloat加出来还是字符串_为什么酒店的包子做的这么好吃?里面加了什么说出来你可能不信...
  4. putty连接Linux
  5. Continue to debug QDD504 read - Service Order extractor debug
  6. P4445 最长回文串
  7. Win10安全特性之执行流保护
  8. java之父_java之父:被下载达7000万次的编程视频教程,你还没有看过?
  9. python读取txt文件为字典username_如何使用txt和ids将.txt文件内容解析为python中的字典?...
  10. 解决Mac无法编辑 .bash_profile文件与使用sudo时permission denied报错
  11. 年味PSD素材|非常喜庆吉祥手工剪纸
  12. JS 监听绑定和取消事件
  13. 基于阿里云的MQTT远程控制
  14. 单片机r6/r7c语言怎么用,第5章MCU混合编程与C语言和汇编语言
  15. 408计算机考研题型分布,计算机考研:计算机408大纲考点变化解析指导
  16. 微信小程序使用组件库
  17. Spinner的用法(转)
  18. Edge浏览器主页被hao123劫持怎么办?
  19. vsftpd 操作手册 - 完整版
  20. python识别中文验证码_Python实现验证码识别

热门文章

  1. NumPy之:结构化数组详解
  2. Redis学习之复制(三)
  3. JUC锁-CyclicBarrier(七)
  4. TED演讲——人生的12条法则
  5. spark读取文件源码分析-3
  6. 【简便解法】1074 宇宙无敌加法器 (20分)_40行代码AC
  7. C语言 满分代码 L1-047 装睡(解题报告)
  8. 【解题报告+感想感言】2019年第十届蓝桥杯【C++省赛B组】【第五题:迷宫】
  9. 最优解法——7-3 将数组中的数逆序存放 (20 分)——10行代码AC
  10. wifi模块 服务器通讯协议,模块之间通信协议