公司网站怎么做分录,php网站开发技术描述,辽宁建设工程信息网】,乐从网站建设目录
一、SpringMVC 简介
1、什么是 MVC
2、什么是 SpringMVC
3、SpringMVC 实现原理
4、SpringMVC 的特点
二、简单案例
1、引入依赖
2、在 web.xml 中配置前端控制器 DispatcherServlet
3、创建 SpringMVC 的配置文件 4、创建请求控制器
5、测试页面
6、访问不到 …目录
一、SpringMVC 简介
1、什么是 MVC
2、什么是 SpringMVC
3、SpringMVC 实现原理
4、SpringMVC 的特点
二、简单案例
1、引入依赖
2、在 web.xml 中配置前端控制器 DispatcherServlet
3、创建 SpringMVC 的配置文件 4、创建请求控制器
5、测试页面
6、访问不到 Controller
7、修改项目结构
三、RequestMapping
1、RequestMapping 注解的功能
2、RequestMapping 注解的位置
3、RequestMapping 的 value 属性
4、RequestMapping 的 method 属性
5、SpringMVC 支持 ant 风格的路径
6、RequestMapping 中的占位符PathVariable 重点
四、SpringMVC 获取请求参数
1、通过 ServletAPI 获取
2、通过设置方法形参名与请求参数名一致
3、通过 POJO 获取请求参数
4、解决中文乱码 一、SpringMVC 简介
1、什么是 MVC 记住一句话SpringMVC 封装了 Servlet。 1MVC
MModel模型层指工程中的JavaBean作用是处理数据
JavaBean分为两类
一类称为实体类Bean专门存储业务数据的如 Student、User 等一类称为业务处理 Bean指 Service 或 Dao 对象专门用于处理业务逻辑和数据访问。
VView视图层指工程中的html或jsp等页面作用是与用户进行交互展示数据
CController控制层指工程中的servlet作用是接收请求和响应浏览器
2工作流程
用户通过视图层发送请求到服务器在服务器中请求被 Controller 接收Controller 调用相应的 Model 层处理请求处理完毕将结果返回到 ControllerController 再根据请求处理的结果找到相应的 View 视图渲染数据后最终响应给浏览器。
2、什么是 SpringMVC
1三层架构
我们通过浏览器访问前端页面前端页面通过异步提交的方式发送请求到后端服务器后端服务器采用 web层servlet、业务层service、数据层dao的三层架构形式进行开发其中数据的交互使用 json 来传输。 我们最开始在数据层使用的是 Jdbc 技术而 MyBatis 就是对 Jdbc 技术的又一层封装也可以称之为数据层框架。现在所讲的 SpringMVC在 web 层中与 servlet 的关系就好比 Jdbc 与 MyBatis 的关系也就是一个表现层的框架。
2SpringMVC 是一种基于 Java 实现 MVC 模型的轻量级 Web 框架
框架半成品软件加速开发过程。相比较 Servlet使用更简单开发更便捷更灵活
3、SpringMVC 实现原理 1用户发送请求到前端控制器 DispatcherServlet
DispatcherServlet的作用接收请求调用其它组件处理请求响应结果相当于转发器、中央处理器是整个流程控制的中心
2DispatcherServlet 收到请求后调用处理器映射器 HandlerMapping
处理器映射器 HandlerMapping 找到 Controller 的具体方法可以根据 xml 配置或注解进行查找并将该方法返回给 DispatcherServlet
3DispatcherServlet 调用处理器适配器 HandlerAdapter
3-1HandlerAdapter 经过适配调用具体的 Controller 的方法(Controller-- service -- Dao -- 数据库)
Controller 执行完成后返回 ModelAndViewModel模型数据即 Controller 处理的结果是一个 MapView逻辑视图名即 负责展示结果的 html 页面的名字
3-2HandlerAdapter 将 Controller 执行的结果 ModelAndView 返回给 DispatcherServlet
4DispatcherServlet 将执行的结果 ModelAndView 传给视图解析器 ViewReslover
视图解析器 ViewReslover 根据逻辑视图 View 解析后返回具体 html 页面
5DispatcherServlet 根据 Model 对 View 进行渲染将模型数据填充至视图中
DispatcherServlet 将填充了数据的网页响应给用户
4、SpringMVC 的特点
Spring 家族原生产品与 IOC 容器等基础设施无缝对接基于原生的Servlet通过了功能强大的前端控制器DispatcherServlet对请求和响应进行统一处理不在需要自己编写 Servlet 处理请求代码清新简洁大幅度提升开发效率内部组件化程度高可插拔式组件即插即用想要什么功能配置相应组件即可性能卓著尤其适合现代大型、超大型互联网项目要求
二、简单案例
1、引入依赖
即将使用 Thymeleaf 视图模板技术因此引入了相关依赖。
dependencies!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --dependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion3.1.0/versionscopeprovided/scope/dependency!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --dependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.3.1/version/dependency!-- Spring5和Thymeleaf整合包 --dependencygroupIdorg.thymeleaf/groupIdartifactIdthymeleaf-spring5/artifactIdversion3.0.12.RELEASE/version/dependency
/dependencies
2、在 web.xml 中配置前端控制器 DispatcherServlet
servletservlet-nameDispatcherServlet/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class
/servlet
servlet-mappingservlet-nameDispatcherServlet/servlet-nameurl-pattern//url-pattern
/servlet-mapping
1标签中使用 / 和 /* 的区别
/匹配浏览器向服务器发送的所有请求不包括 jsp/*匹配浏览器向服务器发送的所有请求包括 jsp
JSP 是通过 Tomcat 的 JspServlet 来处理的然后 JspServlet 将响应结果回传给页面所以 DispatcherServlet 处理不了 jsp 页面。
因此 DispatcherServlet 要使用 /而不能用 /*。在使用过滤器时若需要对所有请求进行过滤就需要使用 /* 的写法。
3、创建 SpringMVC 的配置文件
1SpringMVC 的配置文件的默认地址和名称
地址在 WEB-INF 目录下名称servlet-name-servlet.xmlservlet-name 是 web.xml 内 DispatcherServlet 的值比如 DispatcherServlet-servlet.xml 但实际开发中通常将 SpringMVC 的配置文件放在 resource 目录下。 2Thymeleaf 模板文件路径
物理视图视图前缀 逻辑视图 视图后缀逻辑视图把物理视图中的视图前缀和视图后缀去掉得到的就是逻辑视图 我们通常在 WEB-INF 目录下建立一个 templates 目录用来存放视图模板。而访问 WEB-INF 目录下的资源需要服务器端进行请求转发所以逻辑视图就被用上了。 3配置文件
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:mvchttp://www.springframework.org/schema/mvcxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd!-- 配置Thymeleaf视图解析器 --bean idviewResolver classorg.thymeleaf.spring5.view.ThymeleafViewResolverproperty nameorder value1/ !-- 优先级 --property namecharacterEncoding valueUTF-8/property nametemplateEngine !-- 模板引擎 --bean classorg.thymeleaf.spring5.SpringTemplateEngineproperty nametemplateResolver !-- 模板解析器 --bean classorg.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver!-- 视图前缀 --property nameprefix value/WEB-INF/templates//!-- 视图后缀 --property namesuffix value.html/!-- 以 html5 作为模板 --property nametemplateMode valueHTML5/property namecharacterEncoding valueUTF-8 //bean/property/bean/property/bean/beans 4、创建请求控制器
1Controller
由于 DispatcherServlet 已经对浏览器发送的请求进行了统一的处理所以我们不需要自己创建 Servlet 去处理请求。
但是具体的请求有不同的处理过程因此需要创建处理具体请求的类即请求控制器。
package com.demo.controller;import org.springframework.stereotype.Controller;Controller
public class HelloController {}SpringMVC 的控制器由一个 POJO普通的Java类担任因此需要通过 Controller 注解将其标识为一个控制层组件交给 Spring 的 IOC 容器管理此时 SpringMVC 才能够识别控制器的存在。
2RequestMapping 请求映射把浏览器发送的请求映射到具体方法去处理。 2-1其中的 value 属性值填写的是方法的路径
/代表该路径为绝对路径/ 由服务器解析代表 http://ip:port/工程名/ 由浏览器解析代表当前服务器路径http://ip:port
当 value 的值与浏览器发送的请求路径是一样的说明这个方法就是用来处理该请求的方法。
2-2方法返回值
前面我们说到服务器端进行请求转发需要用到逻辑视图那么怎么用呢
其实我们返回的字符串就是所谓的逻辑视图。紧接着 web.xml 中配置的视图解析器就会将这个返回值用视图前缀和视图后缀组装起来最终形成了请求转发的地址。
package com.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;Controller
public class HelloController {RequestMapping(/)public String index() {System.out.println(index);// 返回逻辑视图return index;}RequestMapping(/hello)public String hello() {return hello;}}5、测试页面
注意测试页面使用了 Thymeleaf 的语法。
1index.html
!DOCTYPE html
html langen xmlns:thhttp://www.thymeleaf.org
headmeta charsetUTF-8titleTitle/title
/head
bodyh1 index 页面 /h1a th:href{/hello} 测试 SpringMVC /abr/a href/hello 测试绝对路径/a
/body
/html
2hello.html
!DOCTYPE html
html langen xmlns:thhttp://www.thymeleaf.org
headmeta charsetUTF-8titleTitle/title
/head
bodyh1 hello /h1
/body
/html
3项目结构 6、访问不到 Controller
SpringMVC 访问不到 Controller网上有很多解决方法如果再尝试之后都没有办法解决比如我那么可以尝试删除当前工件新建一个该项目的工件。 有关更多项目结构问题可以查看https://www.bilibili.com/video/BV1Ry4y1574R?p15
按照其中的步骤设置 web 目录即可。
7、修改项目结构
将 DispatcherServlet-servlet.xml 文件放到 resource 目录下然后在 web.xml 文件中作如下修改
servletservlet-nameDispatcherServlet/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-classinit-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:SpringMVC.xml/param-value/init-paramload-on-startup1/load-on-startup
/servlet
servlet-mappingservlet-nameDispatcherServlet/servlet-nameurl-pattern//url-pattern
/servlet-mapping
1contextConfigLocation
这是正常项目中 Spring 配置文件放置在 resource 目录下的写法。 2load-on-startup
由于 DispatcherServlet 需要初始化的内容非常地多因此将其放在服务器启动期间去初始化可以节省页面访问的时间。
三、RequestMapping
1、RequestMapping 注解的功能
RequestMapping 注解的作用就是将请求和处理请求的控制器方法关联起来建立映射关系。SpringMVC 接收到指定的请求就会来找到在映射关系中对应的控制器方法来处理这个请求。
2、RequestMapping 注解的位置
RequestMapping 仅仅标识了方法那么可以直接访问到这个方法RequestMapping 标识了类那么想要访问方法请求路径就必须添加标识类上面写的路径
如下面代码所示
Controller
RequestMapping(/manager)
public class ManagerController {RequestMapping(/user)public String user() {return user;}
}
请求路径为
http://ip:port/工程路径/manager/user
而如果在两个不同的 Controller 里面有相同的 RequestMapping那么会直接报错。但是对于同一个资源只要请求路径不同那么就不会报错比如/manager/hello 和 /hello都可以访问到 hello.html。
3、RequestMapping 的 value 属性
一个 Servlet 可以处理多个请求在 url-pattern 中设置同样的value 属性值为数组的时候就可以接收多个请求。
Controller
RequestMapping(/manager)
public class ManagerController {RequestMapping({/hello, /also_hello})public String hello() {return hello;}
}
4、RequestMapping 的 method 属性
method 属性通过请求的请求方式get 或 post匹配请求映射。method 属性是一个 RequestMethod 类型的数组表示该请求映射能够匹配多种请求方式的请求。
若当前请求的请求地址满足请求映射的 value 属性但是请求方式不满足 method 属性则浏览器报错 405。
RequestMapping(value {/hello},method {RequestMethod.GET, RequestMethod.POST}
)
public String hello() {return hello;
}
1对于处理指定请求方式的控制器方法SpringMVC中提供了RequestMapping的派生注解
处理get请求的映射–GetMapping处理post请求的映射–PostMapping处理put请求的映射–PutMapping处理delete请求的映射–DeleteMapping
2常用的请求方式有getpostputdelete
但是目前浏览器只支持 get 和 post若在 form 表单提交时为 method 设置了其他请求方式的字符串put 或 delete则按照默认的请求方式 get 处理若要发送 put 和 delete 请求则需要通过 spring 提供的过滤器 HiddenHttpMethodFilter在 RESTful 部分会讲到
5、SpringMVC 支持 ant 风格的路径
ant 风格的路径是指
表示任意的单个字符*表示任意的0个或多个字符**表示任意的一层或多层目录
在 RequestMapping 中value 属性值可以包含上面三种格式。
RequestMapping(/a?a/test/ant)
public String testAnt() {return hello;
}
RequestMapping(/a?a/*/ant)
public String testAnt2() {return hello;
}
RequestMapping(**ant)
public String testAnt3() {return hello;
}
以上代码下面三种请求路径都能访问到 hello.html 6、RequestMapping 中的占位符PathVariable 重点
RequestMapping 修饰的方法想要使用请求参数的方法有很多其中一种就是在 RequestMapping 的 value 属性中使用“占位符{ }”。
1书写格式
假设请求路径 /func 可以访问到目标方法通常我们添加参数请求路径会这么写
/func?id1nameadmin
而如果使用 RequestMapping那么应该这么写
/func/1/admin
2对应地在代码中要怎么获取到这两个参数呢
RequestMapping(/func/{id}/{name})
public String func(PathVariable(id) String id, PathVariable(name) String name) {System.out.println(id: id);System.out.println(name: name);return index;
}
3请求路径 4输出结果 四、SpringMVC 获取请求参数
1、通过 ServletAPI 获取
如果要使用 servlet 相关的方法那么给方法的参数列表添加 request 等参数即可。
1测试代码
1-1controllersuccess.html 可以自己写
RequestMapping(/login)
public String login(HttpServletRequest req) {System.out.println(username: req.getParameter(username));System.out.println(password: req.getParameter(password));return success; // return 相当于请求转发
}
1-2index.html
form th:action{/login} methodpostinput typetext nameusername/ br/input typepassword namepassword/ br/input typesubmit valuesubmit/
/form 2输出结果 2、通过设置方法形参名与请求参数名一致
在控制器方法的形参位置设置和请求参数同名的形参当浏览器发送请求匹配到请求映射时在DispatcherServlet中就会将请求参数赋值给相应的形参。
1测试代码
1-1controller
RequestMapping(/login/param)
public String loginParam(String username, String password) {System.out.println(username: username);System.out.println(password: password);return success;
}
1-2index.html改了 action
form th:action{/login/param} methodpostinput typetext nameusername/ br/input typepassword namepassword/ br/input typesubmit valuesubmit/
/form
2输出结果 3RequestParam
如果在请求参数名和方法参数名不一致那么就会导致方法获取不到值值为 null。
为了保证一定能获取到对应值可以使用 RequestParam
public String loginParam(RequestParam(value username, required true) String username, String password)
value userName设置从 userName 请求参数获取值并且方法参数名不再需要与请求参数名一致required true设置没有该请求参数则不能发送请求默认就是 truerequired false设置可以不传该请求参数若不传递则值为 nulldefaultValue设置未传递参数时的默认值与 required 无关
4RequestHeader
将请求头信息与控制器方法的参数进行绑定当为方法参数加上 RequestHeader那么该参数就不再对应请求参数而是对应请求头信息。
用法与 RequestParam 一致。
RequestMapping(/login/param)
public String loginParam(RequestParam(value username) String name,String password,RequestHeader(value referer) String refer) {System.out.println(username: name);System.out.println(password: password);System.out.println(referer: refer);return success;
} 5CookieValue
将 cookie 数据与控制器方法的参数进行绑定因为一开始还没有 JSESSIONID 的 cookie因此需要先调用一次 request.getSession() 来创建 JSESSIONID 的 cookie。
用法与 RequestParam 一致。
RequestMapping(/login)
public String login(HttpServletRequest req) {HttpSession session req.getSession();System.out.println(创建 JSESSIONID: session.getId());return index; // return 相当于请求转发
}RequestMapping(/login/param)
public String loginParam(RequestParam(value username) String name,String password,RequestHeader(value referer) String refer,CookieValue(value JSESSIONID) String sessionId) {System.out.println(username: name);System.out.println(password: password);System.out.println(referer: refer);System.out.println(JSESSIONID: sessionId);return success;
}
5-1先访问 /login使服务器创建 JSESSIONID 5-2输入 username、password点击登录观察控制台输出 3、通过 POJO 获取请求参数
通常情况下我们会有非常多的方法参数需要设置/获取请求参数值如果都用 RequestParam 这几个注解来获取也非常麻烦。
1解决方法
我们可以用一个 pojo 类当作方法的参数让这个 pojo 类的成员变量名与请求参数名一致就可以将请求参数值封装到 pojo 类的成员变量。
RequestMapping(/login/pojo)
public String pojo(User user) {System.out.println(user);return success;
}
2 输出结果 4、解决中文乱码
因为没有 request 和 response所以无法用这两个变量设置。
并且就算使用 request 和 response其实也无法设置因为其他参数都是已经从请求中获取到了再设置也没有用了。
注意
Tomcat 7.0 的 get 和 post 请求都有乱码Tomcat 8.0 以上 get 请求没有乱码post 请求会乱码。
1解决方法
解决获取请求参数的乱码问题可以使用 SpringMVC 提供的编码过滤器 CharacterEncodingFilter再所有 servlet 处理之前拦截所有请求然后设置编码。
需要注意的是CharacterEncodingFilter 必须在 web.xml 中进行注册
init-param 设置 encoding utf-8相当于 request.CharacterSetEncoding(UTF-8)init-param 设置 forceEncoding true会把 request 和 response 都设置成 encoding前面那个
2web.xml 配置文件
!--配置springMVC的编码过滤器--
filterfilter-nameCharacterEncodingFilter/filter-namefilter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-classinit-paramparam-nameencoding/param-nameparam-valueUTF-8/param-value/init-paraminit-paramparam-nameforceResponseEncoding/param-nameparam-valuetrue/param-value/init-param
/filter
filter-mappingfilter-nameCharacterEncodingFilter/filter-nameurl-pattern/*/url-pattern
/filter-mapping
3输出结果