商城网站模板 免费,广州网站建设联系信科海珠,上海 有哪些做网站的公司,vi设计作品图SpringMVC的视图
SpringMVC中的视图是View接口#xff0c;视图的作用渲染数据#xff0c;将模型Model中的数据展示给用户 SpringMVC视图的种类很多#xff0c;默认有转发视图和重定向视图 当工程引入jstl的依赖#xff0c;转发视图会自动转换为JstlView 若使用的视图技术为…SpringMVC的视图
SpringMVC中的视图是View接口视图的作用渲染数据将模型Model中的数据展示给用户 SpringMVC视图的种类很多默认有转发视图和重定向视图 当工程引入jstl的依赖转发视图会自动转换为JstlView 若使用的视图技术为Thymeleaf在SpringMVC的配置文件中配置了Thymeleaf的视图解析器由此视图解析器解析之后所得到的是ThymeleafView
ThymeleafView用的多
当控制器方法中所设置的视图名称没有任何前缀时此时的视图名称会被SpringMVC配置文件中所配置的视图解析器解析视图名称拼接视图前缀和视图
后缀所得到的最终路径会通过转发的方式实现跳转
RequestMapping(/testHello)
public String testHello(){return hello;
}转发视图不写jsp则不建议
SpringMVC中默认的转发视图是InternalResourceView
SpringMVC中创建转发视图的情况:
当控制器方法中所设置的视图名称以forward:为前缀时创建InternalResourceView视图此时的视 图名称不会被SpringMVC配置文件中所配置的视图解析器解析而是会将前缀forward:去掉剩余部 分作为最终路径通过转发的方式实现跳转
例如forward:/“forward:/employee”
RequestMapping(/testForward)
public String testForward(){return forward:/testHello;
}重定向视图
SpringMVC中默认的重定向视图是RedirectView
当控制器方法中所设置的视图名称以redirect:为前缀时创建RedirectView视图此时的视图名称不 会被SpringMVC配置文件中所配置的视图解析器解析而是会将前缀redirect:去掉剩余部分作为最 终路径通过重定向的方式实现跳转
例如redirect:/“redirect:/employee”
RequestMapping(/testRedirect)
public String testRedirect(){return redirect:/testHello;
}注:重定向视图在解析时会先将redirect:前缀去掉然后会判断剩余部分是否以/开头若是则会自动拼接上下文路径
视图控制器view-controller
当控制器方法中仅仅用来实现页面跳转即只需要设置视图名称时可以将处理器方法使用view- controller标签进行表示
!--
path:设置处理的请求地址 view-name:设置请求地址所对应的视图名称
--
mvc:view-controller path/testView view-namesuccess/mvc:view-controller
注: 当SpringMVC中设置任何一个view-controller时其他控制器中的请求映射将全部失效此时需 要在SpringMVC的核心配置文件中设置开启mvc注解驱动的标签: mvc:annotation-driven /
RESTful
RESTful简介
REST:Representational State Transfer表现层资源状态转移。
资源 资源是一种看待服务器的方式即将服务器看作是由很多离散的资源组成。每个资源是服务器上一个 可命名的抽象概念。因为资源是一个抽象的概念所以它不仅仅能代表服务器文件系统中的一个文件、 数据库中的一张表等等具体的东西可以将资源设计的要多抽象有多抽象只要想象力允许而且客户端 应用开发者能够理解。与面向对象设计类似资源是以名词为核心来组织的首先关注的是名词。一个 资源可以由一个或多个URI来标识。URI既是资源的名称也是资源在Web上的地址。对某个资源感兴 趣的客户端应用可以通过资源的URI与其进行交互。资源的表述 资源的表述是一段对于资源在某个特定时刻的状态的描述。可以在客户端-服务器端之间转移(交 换)。资源的表述可以有多种格式例如HTML/XML/JSON/纯文本/图片/视频/音频等等。资源的表述格 式可以通过协商机制来确定。请求-响应方向的表述通常使用不同的格式。状态的转移 状态转移说的是:在客户端和服务器端之间转移(transfer)代表资源状态的表述。通过转移和操作资 源的表述来间接实现操作资源的目的。
RESTful的实现
具体说就是 HTTP 协议里面四个表示操作方式的动词:GET、POST、PUT、DELETE。
它们分别对应四种基本操作:GET 用来获取资源POST 用来新建资源PUT 用来更新资源DELETE 用来删除资源。
REST 风格提倡 URL 地址使用统一的风格设计从前到后各个单词使用斜杠分开不使用问号键值对方 式携带请求参数而是将要发送给服务器的数据作为 URL 地址的一部分以保证整体风格的一致性。
HiddenHttpMethodFilter
由于浏览器只支持发送get和post方式的请求那么该如何发送put和delete请求呢?
SpringMVC 提供了 HiddenHttpMethodFilter 帮助我们将 POST 请求转换为 DELETE 或 PUT 请求
HiddenHttpMethodFilter 处理put和delete请求的条件:
a当前请求的请求方式必须为post b当前请求必须传输请求参数_method
满足以上条件HiddenHttpMethodFilter 过滤器就会将当前请求的请求方式转换为请求参数 _method的值因此请求参数_method的值才是最终的请求方式
在web.xml中注册HiddenHttpMethodFilter
filterfilter-nameHiddenHttpMethodFilter/filter-namefilter-classorg.springframework.web.filter.HiddenHttpMethodFilter/filter-class
/filter
filter-mappingfilter-nameHiddenHttpMethodFilter/filter-nameurl-pattern/*/url-pattern
/filter-mapping注: 目前为止SpringMVC中提供了两个过滤器:CharacterEncodingFilter和 HiddenHttpMethodFilter 在web.xml中注册时必须先注册CharacterEncodingFilter再注册HiddenHttpMethodFilter 原因:
在 CharacterEncodingFilter 中通过 request.setCharacterEncoding(encoding) 方法设置字符集的request.setCharacterEncoding(encoding) 方法要求前面不能有任何获取请求参数的操作而 HiddenHttpMethodFilter 恰恰有一个获取请求方式的操作:String paramValue request.getParameter(this.methodParam);
RESTful案例
准备工作
和传统 CRUD 一样实现对员工信息的增删改查。
实体类
package com.bijing.pojo;/*** author 毕晶* date 2023/2/6 21:20*/
public class Employee {private Integer id;private String lastName;private String email;//1 male, 0 femaleprivate Integer gender;public Employee() {}public Employee(Integer id, String lastName, String email, Integer gender) {this.id id;this.lastName lastName;this.email email;this.gender gender;}public Integer getId() {return id;}public void setId(Integer id) {this.id id;}public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName lastName;}public String getEmail() {return email;}public void setEmail(String email) {this.email email;}public Integer getGender() {return gender;}public void setGender(Integer gender) {this.gender gender;}Overridepublic String toString() {return Employee{ id id , lastName lastName \ , email email \ , gender gender };}
}
准备dao模拟数据
package com.bijing.dao;import com.bijing.pojo.Employee;
import org.springframework.stereotype.Repository;import java.util.Collection;
import java.util.HashMap;
import java.util.Map;/*** author 毕晶* date 2023/2/6 21:24*/
Repository
public class EmployeeDao {private static MapInteger, Employee employees null;static {employees new HashMapInteger, Employee();employees.put(1001, new Employee(1001, E-AA, aa163.com, 1));employees.put(1002, new Employee(1002, E-BB, bb163.com, 1));employees.put(1003, new Employee(1003, E-CC, cc163.com, 0));employees.put(1004, new Employee(1004, E-DD, dd163.com, 0));employees.put(1005, new Employee(1005, E-EE, ee163.com, 1));}private static Integer initId 1006;public void save(Employee employee) {if (employee.getId() null) {employee.setId(initId);}employees.put(employee.getId(), employee);}public CollectionEmployee getAll() {return employees.values();}public Employee get(Integer id) {return employees.get(id);}public void delete(Integer id) {employees.remove(id);}
}功能清单 具体功能:访问首页
1配置view-controller
mvc:view-controller path/ view-nameindex/创建页面
!DOCTYPE html
html langen xmlns:thhttp://www.thymeleaf.org
headmeta charsetUTF-8 titleTitle/title
/head
body
h1首页/h1
a th:href{/employee}访问员工信息/a /body
/html具体功能:查询所有员工数据
控制器方法
RequestMapping(value /employee, method RequestMethod.GET)
public String getEmployeeList(Model model){CollectionEmployee employeeList employeeDao.getAll();model.addAttribute(employeeList, employeeList);return employee_list;
}创建employee_list.html
!DOCTYPE html
html langen xmlns:thhttp://www.thymeleaf.org
headmeta charsetUTF-8titleEmployee Info/titlescript typetext/javascript th:src{/static/js/vue.js}/script
/head
bodytable border1 cellpadding0 cellspacing0 styletext-align:
center; iddataTabletrth colspan5Employee Info/th
/tr trthid/ththlastName/ththemail/ththgender/ththoptions(a th:href{/toAdd}add/a)/th/trtr th:eachemployee : ${employeeList}td th:text${employee.id}/tdtd th:text${employee.lastName}/tdtd th:text${employee.email}/tdtd th:text${employee.gender}/tdtda classdeleteA clickdeleteEmployee
th:href{/employee/${employee.id}}delete/aa th:href{/employee/${employee.id}}update/a/td/tr/table
/body
/html具体功能:删除
创建处理delete请求方式的表单
!-- 作用:通过超链接控制表单的提交将post请求转换为delete请求 --
form iddelete_form methodpost
!-- HiddenHttpMethodFilter要求:必须传输_method请求参数并且值为最终的请求方式 --input typehidden name_method valuedelete/
/form删除超链接绑定点击事件 引入vue.js
script typetext/javascript th:src{/static/js/vue.js}/script删除超链接
a classdeleteA clickdeleteEmployee
th:href{/employee/${employee.id}}delete/a通过vue处理点击事件
script typetext/javascriptvar vue new Vue({el:#dataTable,methods:{
//event表示当前事件 deleteEmployee:function (event) {
} }
});
/script控制器方法
script typetext/javascriptvar vue new Vue({el:#dataTable,methods:{
//event表示当前事件 deleteEmployee:function (event) {
} }
});
/script具体功能:跳转到添加数据页面
配置view-controller
mvc:view-controller path/toAdd view-nameemployee_add/mvc:view-
controller创建employee_add.html
!DOCTYPE html
html langen xmlns:thhttp://www.thymeleaf.org
headmeta charsetUTF-8titleAdd Employee/title
/head
body
form th:action{/employee} methodpostlastName:input typetext namelastNamebremail:input typetext nameemailbrgender:input typeradio namegender value1maleinput typeradio namegender value0femalebrinput typesubmit valueaddbr
/form
/body
/html具体功能:执行保存
控制器方法
RequestMapping(value /employee, method RequestMethod.POST)
public String addEmployee(Employee employee){employeeDao.save(employee);return redirect:/employee;
}具体功能:跳转到更新数据页面
修改超链接
a th:href{/employee/${employee.id}}update/a控制器方法
RequestMapping(value /employee/{id}, method RequestMethod.GET)
public String getEmployeeById(PathVariable(id) Integer id, Model model){Employee employee employeeDao.get(id);model.addAttribute(employee, employee);return employee_update;
}创建employee_update.html
!DOCTYPE html
html langen xmlns:thhttp://www.thymeleaf.org
headmeta charsetUTF-8titleUpdate Employee/title
/head
body
form th:action{/employee} methodpostinput typehidden name_method valueputinput typehidden nameid th:value${employee.id}lastName:input typetext namelastName th:value${employee.lastName}
bremail:input typetext nameemail th:value${employee.email}br!--
th:field${employee.gender}可用于单选框或复选框的回显
若单选框的value和employee.gender的值一致则添加checkedchecked属性 --gender:input typeradio namegender value1
th:field${employee.gender}maleinput typeradio namegender value0
th:field${employee.gender}femalebrinput typesubmit valueupdatebr
/form
/body
/html具体功能:执行更新
控制器方法
RequestMapping(value /employee, method RequestMethod.PUT)
public String updateEmployee(Employee employee){employeeDao.save(employee);return redirect:/employee;
}SpringMVC处理Ajax请求
RequestBody
RequestBody可以获取请求体信息使用RequestBody注解标识控制器方法的形参当前请求的请 求体就会为当前注解所标识的形参赋值
!--此时必须使用post请求方式因为get请求没有请求体--
form th:action{/test/RequestBody} methodpost
用户名:input typetext nameusernamebr
密码:input typepassword namepasswordbr
input typesubmit
/formRequestMapping(/test/RequestBody)
public String testRequestBody(RequestBody String requestBody){System.out.println(requestBody:requestBody);return success;
}输出结果: requestBody:usernameadminpassword123456
RequestBody获取json格式的请求参数
在使用了axios发送ajax请求之后浏览器发送到服务器的请求参数有两种格式:
1、namevaluenamevalue…此时的请求参数可以通过request.getParameter()获取对应 SpringMVC中可以直接通过控制器方法的形参获取此类请求参数
2、{key:value,key:value,…}此时无法通过request.getParameter()获取之前我们使用操作 json的相关jar包gson或jackson处理此类请求参数可以将其转换为指定的实体类对象或map集 合。在SpringMVC中直接使用RequestBody注解标识控制器方法的形参即可将此类请求参数 转换为java对象
使用RequestBody获取json格式的请求参数的条件:
导入jackson的依赖
dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.12.1/version
/dependencySpringMVC的配置文件中设置开启mvc的注解驱动
!--开启mvc的注解驱动-- mvc:annotation-driven /在控制器方法的形参位置设置json格式的请求参数要转换成的java类型(实体类或map)的参 数并使用RequestBody注解标识
input typebutton value测试RequestBody获取json格式的请求参数 clicktestRequestBody()br
script typetext/javascript th:src{/js/vue.js}/script
script typetext/javascript th:src{/js/axios.min.js}/script
script typetext/javascriptvar vue new Vue({el:#app,methods:{testRequestBody(){axios.post(/SpringMVC/test/RequestBody/json,{username:admin,password:123456}).then(response{console.log(response.data);
}); }
} });
/script//将json格式的数据转换为map集合 RequestMapping(/test/RequestBody/json)
public void testRequestBody(RequestBody MapString, Object map, HttpServletResponse response) throws IOException {System.out.println(map);//{usernameadmin, password123456}response.getWriter().print(hello,axios);
}
//将json格式的数据转换为实体类对象 RequestMapping(/test/RequestBody/json)
public void testRequestBody(RequestBody User user, HttpServletResponse
response) throws IOException {System.out.println(user);//User{idnull, usernameadmin, password123456, agenull,
gendernull}response.getWriter().print(hello,axios);
}ResponseBody
ResponseBody用于标识一个控制器方法可以将该方法的返回值直接作为响应报文的响应体响应到浏览器
RequestMapping(/testResponseBody)
public String testResponseBody(){
//此时会跳转到逻辑视图success所对应的页面return success;
}
RequestMapping(/testResponseBody)
ResponseBody
public String testResponseBody(){
//此时响应浏览器数据successreturn success;
}ResponseBody响应浏览器json数据
ResponseBody用于标识一个控制器方法可以将该方法的返回值直接作为响应报文的响应体响应到浏览器
RequestMapping(/testResponseBody)
public String testResponseBody(){
//此时会跳转到逻辑视图success所对应的页面return success;
}
RequestMapping(/testResponseBody)
ResponseBody
public String testResponseBody(){
//此时响应浏览器数据successreturn success;
}ResponseBody响应浏览器json数据
服务器处理ajax请求之后大多数情况都需要向浏览器响应一个java对象此时必须将java对象转换为 json字符串才可以响应到浏览器之前我们使用操作json数据的jar包gson或jackson将java对象转换为 json字符串。在SpringMVC中我们可以直接使用ResponseBody注解实现此功能
ResponseBody响应浏览器json数据的条件:
导入jackson的依赖
dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.12.1/version
/dependencySpringMVC的配置文件中设置开启mvc的注解驱动
!--开启mvc的注解驱动-- mvc:annotation-driven /使用ResponseBody注解标识控制器方法在方法中将需要转换为json字符串并响应到浏览器 的java对象作为控制器方法的返回值此时SpringMVC就可以将此对象直接转换为json字符串并响应到 浏览器
input typebutton value测试ResponseBody响应浏览器json格式的数据 clicktestResponseBody()br
script typetext/javascript th:src{/js/vue.js}/script
script typetext/javascript th:src{/js/axios.min.js}/script
script typetext/javascriptvar vue new Vue({el:#app,methods:{testResponseBody(){axios.post(/SpringMVC/test/ResponseBody/json).then(response{console.log(response.data);
}); }
} });
/script//响应浏览器list集合 RequestMapping(/test/ResponseBody/json) ResponseBody
public ListUser testResponseBody(){
User user1 new User(1001,admin1,123456,23,男); User user2 new User(1002,admin2,123456,23,男); User user3 new User(1003,admin3,123456,23,男); ListUser list Arrays.asList(user1, user2, user3); return list;
}
//响应浏览器map集合 RequestMapping(/test/ResponseBody/json) ResponseBody
public MapString, Object testResponseBody(){
User user1 new User(1001,admin1,123456,23,男); User user2 new User(1002,admin2,123456,23,男); User user3 new User(1003,admin3,123456,23,男); MapString, Object map new HashMap(); map.put(1001, user1);map.put(1002, user2);map.put(1003, user3);return map;
}
//响应浏览器实体类对象 RequestMapping(/test/ResponseBody/json) ResponseBody
public User testResponseBody(){return user;
}RestController注解
RestController注解是springMVC提供的一个复合注解标识在控制器的类上就相当于为类添加了 Controller注解并且为其中的每个方法添加了ResponseBody注解