栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【SpringMVC的视图】

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【SpringMVC的视图】

目录
  • SpringMVC的视图
    • ThymeleafView
    • 转发视图
    • 重定向视图
    • 视图控制器view-controller
    • InternalResourceViewResolver
  • RESTful
    • RESTful模拟操作用户资源
      • get和post请求
      • HiddenHttpMethodFilter
    • RESTful案例
      • 具体功能
        • 访问首页
        • 查询所有员工数据
        • 删除
        • 跳转到添加数据页面

SpringMVC的视图

一、SpringMVC中的视图是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户
二、SpringMVC视图的种类很多,默认有转发视图和重定向视图
三、当工程引入jstl的依赖,转发视图会自动转换为JstlView
四、若使用的视图技术为Thymeleaf,在SpringMVC的配置文件中配置了Thymeleaf的视图解析器,由此视图解析器解析之后所得到的是ThymeleafView

ThymeleafView

当控制器方法中所设置的视图名称没有任何前缀时,此时的视图名称会被SpringMVC配置文件中所配置的视图解析器解析,视图名称拼接视图前缀和视图后缀所得到的最终路径,会通过转发的方式实现跳转

@RequestMapping("/testThymeleafView")
public String testThymeleafView(){
	return "success";
}
转发视图

一、当前我们访问的很多页面是不满足Thymeleaf视图解析器的,比如在实现转发时,我们要访问的页面或者我们要转发的资源就不符合Thymeleaf视图解析器的规则。
二、SpringMVC中默认的转发视图是InternalResourceView
三、SpringMVC中创建转发视图的情况:当控制器方法中所设置的视图名称以forward:为前缀时,创建InternalResourceView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀forward:去掉,剩余部分作为最终路径通过转发的方式实现跳转,例如forward:/、forward:/employee

@RequestMapping("/testForward")
public String testForward(){
	return "forward:/testThymeleafView";// 转发到上面那个请求:forward:要转发到的资源的路径
}

四、解析return "forward:/testThymeleafView";会创建两次视图,首先将前缀forward:去掉,剩余的部分/testThymeleafView通过转发访问,这个过程会创建转发视图InternalResourceView,但是因为/testThymeleafView也是一个请求,所以当找到/testThymeleafView的请求映射testThymeleafView方法时,还会再创建一个ThymeleafView

重定向视图

一、SpringMVC中默认的重定向视图是RedirectView
二、当控制器方法中所设置的视图名称以redirect:为前缀时,创建RedirectView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀redirect:去掉,剩余部分作为最终路径通过重定向的方式实现跳转,例如redirect:/、redirect:/employee

@RequestMapping("/testRedirect")
public String testRedirect(){
	return "redirect:/testThymeleafView";// 重定向到上面那个请求:redirect:要重定向到的资源的路径
}

三、重定向视图在解析时,会先将redirect:前缀去掉,然后会判断剩余部分是否以/开头,若是则会自动拼接上下文路径
四、重定向可以改变地址栏中的地址,相当于浏览器再次发送请求去访问,像我们某个操作成功后,如操作成功、删除成功之后和原来的请求就没有关系了,这就需要重定向跳转,如果用转发的话会保留上一次请求路径
五、转发与重定向的区别:

  1. 转发是一次请求(这个一次请求指的是浏览器发送了一次请求),第一次时浏览器发送请求,第二次请求发生在服务器内部,所以地址栏还是浏览器发送请求的那个地址,地址栏中的地址不变
  2. 重定向是两次请求,第一次访问servlet,第二次访问重定向的地址,地址栏中的地址会变为重定向的地址
  3. 转发可以获取请求域中的数据,重定向不可以,因为重定向是两次请求,两次请求对应两个request对象,而转发是一次请求,用到的request对象是同一个。(注意:能否获取域对象中的数据,主要看你使用的对象是不是同一个)
  4. 转发可以访问WEB-INF中的资源,重定向不可以,因为WEB-INF中的资源具有安全性、隐藏性,只能通过服务器内部来访问,不能通过浏览器来访问
  5. 转发不能跨域,重定向可以,因为转发是发生在服务器内部的,只能访问服务器内部资源,重定向是浏览器发送了两次请求,通过浏览器可以访问任何资源,比如从我们的项目中重定向到百度,
视图控制器view-controller

一、视图控制器view-controller是springMVC配置文件的一个标签,用于实现请求地址与视图之间的映射关系,之前我们写了一个请求映射:

@RequestMapping("/testThymeleafView")
public String testThymeleafView(){
	return "success";
}

当我们访问路径为/testThymeleafView时,可以通过视图名称success,通过视图解析器解析来跳转到相对应的页面,这种请求映射我们会写很多,比如我们在实现添加功能时,添加成功后跳转到添加页面,这时是不需要有任何其他请求的处理,我们只需要写一个请求映射,对应一个请求路径,在他对应的控制器方法中返回视图名称即可,像这种控制器方法中不需要处理其他请求的过程时,我们可以使用view-controller标签来处理请求映射的关系,也就是说,当控制器方法中,仅仅用来实现页面跳转,即只需要设置视图名称时,可以将处理器方法使用view-controller标签进行表示,在springMVC.xml文件中配置:




其中,path指定请求路径,view-name指定视图名称
二、当SpringMVC中设置任何一个view-controller时,其他控制器中的请求映射将全部失效,此时需要在SpringMVC的核心配置文件中设置开启mvc注解驱动的标签:

InternalResourceViewResolver

在springMVC.xml中配置:




	
	
	
	
/bean>

index.jsp中代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--上面这一行是jsp指令,用来设置当前页面的信息,比如上面这行代码的意思是:
内容类型是以文本形式存在的html页面,使用UTF-8编码,JSP支持语言:Java

JSP是可以直接访问的,项目一启动,默认访问index.jsp--%>


    Title


首页

<%--${pageContext.request.contextPath}动态获取上下文对象--%> success.jsp

JspController.java中代码:

@Controller
public class JspController {
    @RequestMapping("/success")
    public String success(){
        return "success";
    }
}
RESTful

一、RESTful是一种软件架构的风格/格式,不以?传参,将所有的参数以/拼接到请求路径中
二、REST:Representational State Transfer,表现层(前端的视图页面到后端的控制层)资源状态转移。

  1. 把项目部署到服务器上之后,档期那工程中的内容在服务器上都叫资源。资源是一种看待服务器的方式,即,将服务器看作是由很多离散的资源组成。每个资源是服务器上一个可命名的抽象概念。因为资源是一个抽象的概念,所以它不仅仅能代表服务器文件系统中的一个文件、数据库中的一张表等等具体的东西,可以将资源设计的要多抽象有多抽象,只要想象力允许而且客户端应用开发者能够理解。与面向对象设计类似,资源是以名词为核心来组织的,首先关注的是名词。一个资源可以由一个或多个URI来标识。URI既是资源的名称,也是资源在Web上的地址。对某个资源感兴趣的客户端应用,可以通过资源的URI与其进行交互。
  2. 资源的状态是资源的表现形式,也就是资源的表述,比如html页面、音频、类等。资源的表述是一段对于资源在某个特定时刻的状态的描述。可以在客户端-服务器端之间转移(交换)。资源的表述可以有多种格式,例如HTML/XML/JSON/纯文本/图片/视频/音频等等。资源的表述格式可以通过协商机制来确定。请求-响应方向的表述通常使用不同的格式。
  3. 状态转移说的是:在客户端和服务器端之间转移(transfer)代表资源状态的表述,就是浏览器向服务器发送请求(请求某个资源),服务器响应这一过程。通过转移和操作资源的表述,来间接实现操作资源的目的。

三、RESTful的实现
具体说,就是 HTTP 协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。
它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE用来删除资源。
REST 风格提倡 URL 地址使用统一的风格设计,从前到后各个单词使用斜杠分开,不使用问号键值对方式携带请求参数,而是将要发送给服务器的数据作为 URL 地址的一部分,以保证整体风格的一致性。

RESTful模拟操作用户资源

使用RESTFul模拟用户资源的增删改查

请求路径请求方法操作
/userGET查询所有用户信息
/user/1GET根据用户id查询用户信息
/userPOST添加用户信息
/user/1DELETE删除用户信息
/userPUT修改用户信息
get和post请求
@Controller
public class UserController {
    @RequestMapping(value = "/user", method = RequestMethod.GET)
    public String getAllUser(){
        System.out.println("查询所有用户信息");
        return "success";
    }

    @RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
    public String getUserById(){
        System.out.println("根据id查询用户信息");
        return "success";
    }

    @RequestMapping(value = "/user", method = RequestMethod.POST)
    public String insertUser(String username, String password){
        System.out.println("添加用户信息:"+username+","+password);
        return "success";
    }
}

前端代码:


查询所有用户信息
根据id查询用户信息
用户名:
密码:

HiddenHttpMethodFilter

一、由于浏览器只支持发送get和post方式的请求,那么该如何发送put和delete请求呢?SpringMVC提供了HiddenHttpMethodFilter帮助我们将POST请求转换为DELETE或PUT请求
二、HiddenHttpMethodFilter处理put和delete请求的条件:

  1. 当前请求的请求方式必须为post
  2. 当前请求必须传输请求参数_method

满足以上条件,HiddenHttpMethodFilter过滤器就会将当前请求的请求方式转换为请求参数_method的值,因此请求参数_method的值才是最终的请求方式


用户名:
密码:

三、在web.xml中注册HiddenHttpMethodFilter:


HiddenHttpMethodFilter
org.springframework.web.filter.HiddenHttpMethodFilter


HiddenHttpMethodFilter
/*

四、映射方法:

@RequestMapping(value = "/user", method = RequestMethod.PUT)
public String updateUser(String username, String password){
	System.out.println("修改用户信息:"+username+","+password);
	return "success";
}

五、目前为止,SpringMVC中提供了两个过滤器:CharacterEncodingFilter和HiddenHttpMethodFilter。在web.xml中注册时,必须先注册CharacterEncodingFilter,再注册HiddenHttpMethodFilter,因为在CharacterEncodingFilter中通过request.setCharacterEncoding(encoding)方法设置字符集的request.setCharacterEncoding(encoding)方法要求前面不能有任何获取请求参数的操作,而HiddenHttpMethodFilter恰恰有一个获取请求方式的操作:String paramValue = request.getParameter(this.methodParam);,他获取了参数_method,所以如果先注册HiddenHttpMethodFilter,再注册CharacterEncodingFilter,CharacterEncodingFilter会失效

RESTful案例

一、新建项目springMVC-rest,如前述搭建环境
二、搭建实体类src/main/java/com/atguigu/rest/bean:

public class Employee {
    private Integer id;
    private String lastName;
    private String email;
    private Integer 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;}
    public Employee(Integer id, String lastName, String email, Integer gender) {
        super();
        this.id = id;
        this.lastName = lastName;
        this.email = email;
        this.gender = gender;
    }
    public Employee() {}
}

三、准备dao模拟数据

@Repository
public class EmployeeDao {
	// 本例中我们没有service,需要从controller直接访问DAO,所以再DAO中要创建一个employees对象
    private static Map employees = null;
    static{
        employees = new HashMap();
        employees.put(1001, new Employee(1001, "E-AA", "aa@163.com", 1));
        employees.put(1002, new Employee(1002, "E-BB", "bb@163.com", 1));
        employees.put(1003, new Employee(1003, "E-CC", "cc@163.com", 0));
        employees.put(1004, new Employee(1004, "E-DD", "dd@163.com", 0));
        employees.put(1005, new Employee(1005, "E-EE", "ee@163.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 Collection getAll(){return employees.values();}
    public Employee get(Integer id){return employees.get(id);}
    public void delete(Integer id){employees.remove(id);}
}
具体功能
功能URL地址请求方式
访问首页/GET
查询全部数据/employeeGET
删除/employee/2DELETE
跳转到添加数据页面/toAddGET
执行保存/employeePOST
跳转到更新数据页面/employee/2GET
执行更新/employeePUT
访问首页

一、在springMVC.xml配置视图控制器:





二、创建页面:


	

首页

访问员工信息

三、配置tomcat

查询所有员工数据

一、控制器方法

@RequestMapping(value = "/employee", method = RequestMethod.GET)
public String getEmployeeList(Model model){
	Collection employeeList = employeeDao.getAll();
	model.addAttribute("employeeList", employeeList);
	return "employee_list";
}

二、创建employee_list.html,页面代码如下:




	
	Employee Info
	


		
Employee Info
id lastName email gender options(add)
delete update
删除

一、创建处理delete请求方式的表单


二、删除超链接绑定点击事件

  1. 引入vue.js:
  2. 删除超链接:delete
  3. 通过vue处理点击事件

  1. 控制器方法
@RequestMapping(value = "/employee/{id}", method = RequestMethod.DELETE)
public String deleteEmployee(@PathVariable("id") Integer id){
	employeeDao.delete(id);
	return "redirect:/employee";
}
  1. 静态资源不会被springMVC处理,所以无法访问vue.js资源,我们需要开放对静态资源的访问,在springMVC.xml新增代码:。以后访问静态资源的流程:首先,静态资源会先被springMVC处理,也就是前端控制器DispatcherServlet处理,如果在控制器中找不到相对应的请求映射,就会把静态资源交给默认的servlet来处理,如果默认的servlet能找到相对应的资源,那我们就访问资源,如果找不到相对应的资源,报404
跳转到添加数据页面 暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1016794.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号