概念:SpringMVC 是相似于 Struts2 的一个 MVC 框架,在实际开发中,接收浏览器的请求响应,对数据进行处理,而后返回页面进行显示,可是上手难度却比 Struts2 简单多了。并且因为 Struts2 所暴露出来的安全问题,SpringMVC 已经成为了大多数企业优先选择的框架。html
在Spring框架体系中的位置java
特色:
结构松散,几乎能够在 Spring MVC 中使用各种视图
松耦合,各个模块分离
与 Spring 无缝集成web
在pom.xml文件增长spring
<!--springmvc,webmvc间接依赖于web包,使用这个便可--><dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.5.RELEASE</version></dependency>123456
<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>123456789101112131415
这个文件和以前的beans.xml都在resources下api
<?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>1234567891011121314151617
mvc:annotation-driven会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean浏览器
java代码在src下创建。spring-mvc
@Controllerpublic class HelloController{ @RequestMapping("/hello") public String hello(){ System.out.println("----"); return "hello"; }}12345678
url地址栏输入:http://localhost:8080/hellotomcat
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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文件。
工做流程概述:
一、客户端向web服务器(如tomcat)发送一个http请求,web服务器对http请求进行解析,解析后的URL地址若是匹配了DispatcherServlet的映射路径(经过web.xml中的servlet-mapping配置),web容器就将请求交给DispatcherServlet处理。
二、DispatcherServlet接收到这个请求后,再对URL进行解析,获得请求资源标识符(URI)。而后调用相应方法获得的HandlerMapping对象,再根据URI,调用这个对象的相应方法得到Handler对象以及它对应的拦截器。(在这里只是得到了Handler对象,并不会操做它,在SpringMVC中,是经过HandlerAdapter对Handler进行调用、控制的)
三、DispatcherServlet根据获得的Handler对象,选择一个合适的HandlerAdapter,建立其实例对象,执行拦截器中的preHandler()方法。
四、在拦截器方法中,提取请求中的数据模型,填充Handler入参,因此全部准备工做都已作好,开始执行Handler(咱们写的controller代码并非能被直接执行,须要有刚才那些操做,才能转变为Handler被执行)。
五、Handler执行完毕后返回一个ModelAndView对象给DispatcherServlet。
六、这个ModleAndView只是一个逻辑视图,并非真正的视图,DispatcherServlet经过ViewResolver视图解析器将逻辑视图转化为真正的视图(通俗理解为将视图名称补全,如加上路径前缀,加上.jsp后缀,能指向实际的视图)。
七、DispatcherServlet经过Model将ModelAndView中获得的处数据解析后用于渲染视图。将获得的最终视图经过http响应返回客户端。
@RequestMapping 注解 配置请求的路径,这个注解能够加到控制器的方法上,也能够加到类上,加到类上至关
于命名空间。
用户保存的请求:
http://localhost:8080/spring_mvc/user/save.do
保存部门的请求:
http://localhost:8080/spring_mvc/dept/save.do
比较经常使用的有:
指定请求的实际地址,指定的地址能够是 URI Template 模式
指定请求的 method 类型。例如 GET、POST、PUT、DELETE 等
当请求参数和控制器参数不一致的状况
表单代码
<form action="/login" method="post"> 帐户:<input name="uname" id="username" ><br/> 密码:<input name="pwd" id="password"><br/> <button type="submit">登陆</button></form>12345
Controller代码
@RequestMapping("/login")public String login(@RequestParam("uname") String uu,@RequestParam("pwd") String password){ System.out.println(""+uu+""); System.out.println(password); return "hello";}123456
表单
<form action="/login" method="get"> 帐户:<input name="username" id="username" ><br/> 密码:<input name="password" id="password"><br/> <button type="submit">登陆</button></form>12345
控制器
@RequestMapping("/login")public String login(String username,String password){ System.out.println(username); System.out.println(password); return "hello";}123456
表单中input的name值和Controller的参数变量名保持一致,就能完成数据绑定,若是不一致可使用@RequestParam注解。须要注意的是,若是Controller方法参数中定义的是基本数据类型,可是从页面提交过来的数据为null或者”“的话,会出现数据转换的异常。也就是必须保证表单传递过来的数据不能为null或””,因此,在开发过程当中,对可能为空的数据,最好将参数数据类型定义成包装类型,具体参见下面的例子。
声明实体类
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;} }12345678910111213141516171819
在控制器中使用封装类模型来传递参数,注意表单name和实体类属性一致。
1
pom.xml引入原生jar
<!--引入原生javax.--><dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version></dependency>123456
控制器代码
1
1.使用Model
1
2.使用原生HttpServletRequest
1
3.使用Map
Servlet根据获得的Handler对象,选择一个合适的HandlerAdapter,建立其实例对象,执行拦截器中的preHandler()方法。四、在拦截器方法中,提取请求中的数据模型,填充Handler入参,因此全部准备工做都已作好,开始执行Handler(咱们写的controller代码并非能被直接执行,须要有刚才那些操做,才能转变为Handler被执行)。五、Handler执行完毕后返回一个ModelAndView对象给DispatcherServlet。六、这个ModleAndView只是一个逻辑视图,并非真正的视图,DispatcherServlet经过ViewResolver视图解析器将逻辑视图转化为真正的视图(通俗理解为将视图名称补全,如加上路径前缀,加上.jsp后缀,能指向实际的视图)。七、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>1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
Controller代码
@RequestMapping("/login")public String login(@RequestParam("uname") String uu,@RequestParam("pwd") String password){ System.out.println(""+uu+""); System.out.println(password); return "hello";}123456
表单
<form action="/login" method="get"> 帐户:<input name="username" id="username" ><br/> 密码:<input name="password" id="password"><br/> <button type="submit">登陆</button></form>12345
控制器
@RequestMapping("/login")public String login(String username,String password){ System.out.println(username); System.out.println(password); return "hello";}123456
表单中input的name值和Controller的参数变量名保持一致,就能完成数据绑定,若是不一致可使用@RequestParam注解。须要注意的是,若是Controller方法参数中定义的是基本数据类型,可是从页面提交过来的数据为null或者”“的话,会出现数据转换的异常。也就是必须保证表单传递过来的数据不能为null或””,因此,在开发过程当中,对可能为空的数据,最好将参数数据类型定义成包装类型,具体参见下面的例子。
声明实体类
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;} }12345678910111213141516171819
在控制器中使用封装类模型来传递参数,注意表单name和实体类属性一致。
1
pom.xml引入原生jar
<!--引入原生javax.--><dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version></dependency>123456
控制器代码
1
1.使用Model
1
2.使用原生HttpServletRequest
1
3.使用Map