多年来一直保存的武林秘籍
SpringMVC:基于MVC开发模式的框架,用来优化控制器
MVC:是一种开发模式,模型视图控制器的简称,所有web应用都是基于MVC开发
M:模型层:包含实体类,业务逻辑成,数据访问层
V:视图层,html,javaScript,vue等都是视图JSP也可以定义为视图层(但并不标准),视图层就是用来呈现数据的
C:控制器,它是用来接收客户端的请求,并返回相应到客户端的组件,Servlet就是组件
所谓的SSM框架就是Spring,SpringMVC,Mybatis
Mybatis优化的是数据访问层
SpringMVC优化控制器
Spring优化管理对象(控制反转),通过DI(依赖注入)实现IOC(控制反转),AOP(面向切面编程),Spring整合了其他框架,整合了Mybatis,Redis,XXX,XXXX,XXXXX,XXXXXX一塌糊涂
以前用的SSH框架:Spring,Struts2,Hibernate.
演示SpringMVC基于注解的开发:
1)新建项目,选择webapp模块
2)修改目录
3)修改pom.xml文件,添加SpringMVC的依赖,添加Servlet的依赖
4)添加springmvc.xml,指定包扫描(基于注解必须指定包扫描),添加视图解析器
5)删除web.xml,新建web.xml
6)在web.xml文件中注册springmvc框架(所有的web请求都是基于servlet的)
7)在webapp下新建admin目录,在admin目录下新建main.jsp页面,删除index.jsp页面,并新建,发送请求给服务器
8)开发控制器
目录结构
根据Maven结构 src下有main和test src/main/java和resources test下也有java和resources
新建个包叫test
然后配置下4个包的属性
pom.xml
-
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0modelVersion>
-
- <groupId>com.hruigroupId>
- <artifactId>springmvc-01-demoartifactId>
- <version>1.0-SNAPSHOTversion>
- <packaging>warpackaging>
-
-
- <properties>
- <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
- <maven.compiler.source>1.7maven.compiler.source>
- <maven.compiler.target>1.7maven.compiler.target>
- properties>
-
- <dependencies>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-webmvcartifactId>
- <version>5.2.6.RELEASEversion>
- dependency>
-
- <dependency>
- <groupId>javax.servletgroupId>
- <artifactId>javax.servlet-apiartifactId>
- <version>3.1.0version>
- dependency>
- <dependency>
- <groupId>junitgroupId>
- <artifactId>junitartifactId>
- <version>4.11version>
- <scope>testscope>
- dependency>
- dependencies>
-
- <build>
-
- <resources>
- <resource>
-
- <directory>src/main/javadirectory>
- <includes>
- <include>**/*.xmlinclude>
- <include>**/*.propertiesinclude>
- includes>
- resource>
-
- <resource>
-
- <directory>src/main/resourcesdirectory>
- <includes>
- <include>**/*.xmlinclude>
- <include>**/*.propertiesinclude>
- includes>
- resource>
- resources>
- build>
- project>
添加配置文件springmvc.xml(名字叫啥都行)文件名无所谓(就是在web.xml配置springmvc时会指定该文件名)
引入SpringWEB依赖 也就是引入Spring,那么下面目录下自动会有spring.config选项
注意下目录结构
main.jsp就个简单jsp用来演示用
web请求分析:
客户端请求到index.jsp
index.jsp发请求到servlet SpringMVC里用一个共有的servlet DisPatcherServlet接收
DisPatcherServlet经过处理指定跳转或者重定向页面 交给视图解析器 视图解析器加上前缀后缀到具体指定页面
DispatcherServlet要在web.xml文件中注册才可用
将原先存在的webapp/WEB-INF/web.xml删掉(原因:版本太低)
这样就注册了SpringMVC(就是注册了DispatcherServlet)
原先的index.jsp重新写一个太low了 写个更low的
写控制器
请求流程分析:
客户访问index.jsp页面
跳转到demo.action 被映射到DispatcherServlet(这一步我不是太确认,个人理解)
而自己写的DemoController可以理解为DispatcherServclet
找到路径demo找到对应控制器
通过spring配置的视图解析器加上前后缀 就变成/admin/main.jsp
然后找到对应的main.jsp
添加一个tomcat让war在tomcat应用服务器上运行
访问通
关于@RequestMapping注解:用来映射服务器访问的路径
1)此注解可加在方法上,是为此方法注册一个可以访问的名称(路径)
2)此注解可以加在类上,相当于(好比包名)
举个栗子:
3)此注解可以区分get请求和post等请求
举例:
新写一个controller
可以配置下这两个
jsp和代码修改了会实时刷新
SpringMVC优化的内容
1.五种数据提交方式的优化
1.1) 散提交数据
测试
1.2)对象封装提交数据:在提交请中,保证请求参数的名称与实体类中成员变量的名称一致,则 可自动提交数据,自动类型转换,自动封装数据到对象中
举例
创建实体类接收
控制器
测试
关于中文问题测试(form表单默认提交方式是get)
如果我改成post请求
post提交中文请求出现乱码
get请求不需要处理中文问题是tomcat7之后解决了这个问题,但是post请求中文没有解决,后面会讲
1.3)动态占位符提交数据(Restful风格):仅限于超链接或地址栏提交数据.它是一杠一值,一 杠一大括号,使用注解来解析
举例
也可以这样写
测试
1.4)映射名称不一致:当提交请求参数与action方法的形参不一致,使用注解@RequestParam来解析
举例
测试
1.5)手动提取数据
1.6)Map接收参数
get和post都可以接收
SpringMVC中get请求中文乱码在tomcat7之后解决了,但是Post请求中含有中文还是会有中文乱码问题.
中文乱码解决方案:
在web.xml中配置过滤器
测试访问
访问后端输出都是中文OK的
2.关于控制器方法的返回值(action方法)
原先我们一直返回的String
2.1) 返回String:客户端资源的地址,自动拼接前缀和后缀.还可以屏蔽自动自动拼接字符串,可以指定返回路径(下面会说)
2.2)可返回Object对象类型:返回json格式的对象.自动将对象或集合转为json.使用的是jackson工具进行转换,必须添加依赖,一般用于ajax请求
2.3)void:无返回值.一般用于ajax请求
2.4)返回基本数据类型:用于ajax请求
2.5)返回ModelAndView:返回数据和视图(现在用的很少)
关于发送Ajax请求,SpringMVC接收步骤
需求发送ajax请求访问服务器,返回学生集合
1)添加jackson依赖
2)在webapp目录下新建js目录,添加jQuery函数库
3)在index.jsp页面上导入函数库
4)在控制器方法(所谓action上)添加注解@ResponseBody,@ResponseBody专门用来处理ajax请求
5)在springmvc.xml添加注解驱动
新建个module
相同步骤.
首先结构:
根据Maven结构 src下有main和test src/main/java和resources test下也有java和resources
然后配置下4个包的属性
修改pom.xml引入依赖 多加了一个jackson依赖
-
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0modelVersion>
-
- <groupId>com.hruigroupId>
- <artifactId>springmvc-02-ajaxartifactId>
- <version>1.0-SNAPSHOTversion>
- <packaging>warpackaging>
-
-
- <properties>
- <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
- <maven.compiler.source>1.8maven.compiler.source>
- <maven.compiler.target>1.8maven.compiler.target>
- properties>
-
- <dependencies>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-webmvcartifactId>
- <version>5.2.6.RELEASEversion>
- dependency>
-
- <dependency>
- <groupId>javax.servletgroupId>
- <artifactId>javax.servlet-apiartifactId>
- <version>3.1.0version>
- dependency>
-
- <dependency>
- <groupId>com.fasterxml.jackson.coregroupId>
- <artifactId>jackson-databindartifactId>
- <version>2.9.8version>
- dependency>
- <dependency>
- <groupId>junitgroupId>
- <artifactId>junitartifactId>
- <version>4.11version>
- <scope>testscope>
- dependency>
- dependencies>
-
-
-
- <build>
-
- <resources>
- <resource>
-
- <directory>src/main/javadirectory>
- <includes>
- <include>**/*.xmlinclude>
- <include>**/*.propertiesinclude>
- includes>
- resource>
-
- <resource>
-
- <directory>src/main/resourcesdirectory>
- <includes>
- <include>**/*.xmlinclude>
- <include>**/*.propertiesinclude>
- includes>
- resource>
- resources>
- build>
- project>
配置spring配置文件,文件名无所谓(就是在web.xml配置springmvc时会指定该文件名)
添加注解驱动1.为了支持ajax请求@ResponseBody的使用 2.日期转换会用到注解驱动 3.静态资源分流
原有的web.xml版本太低 新建 web.xml用来注册SpringMVC的 控制器
- <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
- version="4.0">
-
-
- <filter>
- <filter-name>encodefilter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
-
-
- <init-param>
- <param-name>encodingparam-name>
- <param-value>UTF-8param-value>
- init-param>
- <init-param>
- <param-name>forceRequestEncodingparam-name>
- <param-value>trueparam-value>
- init-param>
- <init-param>
- <param-name>forceResponseEncodingparam-name>
- <param-value>trueparam-value>
- init-param>
- filter>
- <filter-mapping>
- <filter-name>encodefilter-name>
- <url-pattern>/*url-pattern>
- filter-mapping>
-
- <servlet>
- <servlet-name>springmvcservlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>、
- <init-param>
- <param-name>contextConfigLocationparam-name>
- <param-value>classpath:springmvc.xmlparam-value>
- init-param>
- servlet>
-
-
- <servlet-mapping>
- <servlet-name>springmvcservlet-name>
-
- <url-pattern>*.actionurl-pattern>
- servlet-mapping>
- web-app>
需要用jQuery发送ajax请求,在webapp下新建一个js包用来存放jQuery函数库
删掉index.jsp新建一个index.jsp 原因模板自带的index.jsp没有带
<%@ page contentType="text/html;charset=UTF-8" language="java" %>page指令
事实上stu.name stu.age实际上就是调用了实体类里的get方法 图片引入jQuery写粗哦了 写了个t
实体类
控制器
添加tomcat应用服务器
启动时,非常好
端口占用 解决办法
启动访问
请求与转发的和重定向
重定向和转发的区别
1.重定向访问服务器两次,转发只访问服务器⼀次。
2.转发页⾯的URL不会改变,⽽重定向地址会改变
3.转发只能转发到⾃⼰的web应⽤内,重定向可以重定义到任意资源路径等等等
还有很多理论区别概念
SpringMVC的四种跳转方式:其实是衍生出来的,转发分转发页面,转发action(控制器),而重定向也可以重定向页面,重定向action 还是转发和重定向,只不过写法不同
先将admin那个main复制进来,且同时配置视图解析器和注解驱动,如果在没有视图解析器,只有注解驱动的时候返回String会报错,/main找不到
转发的代码实现:
forward:就不会加前后缀,往控制器走
注意:转发无论是转发页面还是转发控制器,地址栏都是第一次请求的地址,不会改变,无论转发多少次,转发到哪个控制器或者转发到哪个页面, 都是第一次请求的地址
重定向的代码实现: