😀前言
本篇讲解了什么是springMVC 视图和视图解析器
🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉
😀什么是springMVC 视图和视图解析器
🥰基本介绍
- 在 springMVC 中的目标方法最终返回都是一个视图(有各种视图)
- 返回的视图都会由一个视图解析器来处理 (视图解析器有很多种)
😉自定义视图
为什么需要自定义视图
- 在默认情况下,我们都是返回默认的视图, 然后这个返回的视图交由 SpringMVC 的InternalResourceViewResolver 视图处理器来处理的
- 在实际开发中,我们有时需要自定义视图,这样可以满足更多更复杂的需求
自定义视图实例-代码实现
配置 springDispatcherServlet-servlet.xml , 增加自定义视图解析器
解读
- 配置自定义视图解析器BeanNameViewResolver
- BeanNameViewResolver可以去解析我们自定义的视图
- 配置 属性 order, 表示视图解析器执行的顺序, 值越小, 优先级越高
- 属性 order 的默认值是最低优先级 ,值为 Integer.MAX_VALUE int LOWEST_PRECEDENCE = 2147483647
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"> <property name="order" value="99"/> </bean>
建MyView.java -自定义视图类
解读
- MyView继承了AbstractView, 就可以作为一个视图使用
- @Component(value = “myView”),该视图会注入到容器中, 名字/id是 myView
@Component(value = "hspView") public class MyView extends AbstractView { @Override protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception { //完成视图渲染 //并且可以确定我们要跳转的页面 [请求转发] /WEB-INF/pages/my_view.jsp System.out.println("进入到自己的视图.."); //解读 //1. 下面就是进行请求转发到 /WEB-INF/pages/my_view.jsp //2. /WEB-INF/pages/my_view.jsp 会被springmvc解析 // /springmvc/WEB-INF/pages/my_view.jsp request.getRequestDispatcher("/WEB-INF/pages/my_view.jsp") .forward(request, response); } }
注意
- 下面就是进行请求转发到 /WEB-INF/pages/my_view.jsp
- /WEB-INF/pages/my_view.jsp 会被springmvc解析 /springmvc/WEB-INF/pages/my_view.jsp
3.最后浏览器解析成http://localhost:8080 /springmvc/WEB-INF/pages/my_view.jsp
创建GoodsHandler.java类
@RequestMapping("/goods") @Controller public class GoodsHandler { @RequestMapping(value = "/buy") public String buy() { System.out.println("------buy()-----"); return "myView"; } }
创建view.jsp类
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>自定义视图测试</title> </head> <body> <h1>自定义视图测试</h1> <a href="goods/buy">点击到自定义视图-</a><br/> </body> </html>
创建/WEB-INF/pages/my_view.jsp类
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>my_view页面</title> </head> <h1>进入到my_view页面</h1> <p>是从自定义视图来的..</p> <body> </body> </html>
完成测试(Postman 测试)
自定义视图-小结
- 自定义视图: 创建一个 View 的 bean, 该 bean 需要继承自 AbstractView, 并实现renderMergedOutputModel 方法。
- 并把自定义 View 加入到 IOC 容器中
- 自定义视图的视图处理器,使用 BeanNameViewResolver, 这个视图处理器也需要配置到 ioc 容器
- BeanNameViewResolver 的调用优先级需要设置一下,设置 order 比 Integer.MAX_VAL小的值. 以确保其在 InternalResourceViewResolver 之前被调用
自定义视图-工作流程
- SpringMVC 调用目标方法, 返回自定义 View 在 IOC 容器中的 id
- SpringMVC 调用 BeanNameViewResolver 解析视图: 从 IOC 容器中获取 返回 id 值对应的 bean, 即自定义的 View 的对象
- SpringMVC 调用自定义视图的 renderMergedOutputModel 方法渲染视图
- 说明: 如果在 SpringMVC 调用目标方法, 返回自定义 View 在 IOC 容器中的 id,不存在, 则仍然按照默认的视图处理器机制处理
😘目标方法直接指定转发或重定向
- 默认返回的方式是请求转发,然后用视图处理器进行处理,比如在目标方法中这样写:
- 也可以在目标方法直接指定重定向或转发的 url 地址
- 如果指定重定向,不能定向到 /WEB-INF 目录中
应用实例-代码实现
修改 GoodsHandler.java, 增加方法 order()
直接指定要请求转发的或者是重定向的页面
- 对于重定向来说,不能重定向到 /WEB-INF/ 目录下
- redirect 关键字,表示进行重定向
- /login.jsp 在服务器解析 /springmvc/login.jsp
@RequestMapping("/goods") @Controller public class GoodsHandler { /** * 演示直接指定要请求转发的或者是重定向的页面 * @return */ @RequestMapping(value = "/order") public String order() { System.out.println("=======order()====="); // return "forward:/WEB-INF/pages/my_view.jsp"; // return "forward:/aaa/bbb/ok.jsp"; return "redirect:/login.jsp"; } }
如果是这种
return "redirect:/WEB-INF/pages/my_view.jsp";
/WEB-INF/pages/my_view.jsp 被解析成 /springmvc/WEB-INF/pages/my_view.jsp 然后会报404错误
修改view.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>自定义视图测试</title> </head> <body> <h1>自定义视图测试</h1> <a href="goods/buy">点击到自定义视图-</a><br/> <a href="goods/order">测试在目标方法中指定请求转发或者重定向的页面-</a><br/> </body> </html>
完成测试(页面测试)
完成测试(Postman 测试)
💖综合代码演示
完成一个简单的用户登录案例
- 编写登录页面 login.jsp
- LoginHandler [doLogin 方法], 如果用户输入用户名是 wyx, 密码 123 就可以登录成功.
- 创建 JavaBean : User.java
- 表单提交数据到 doLogin 方法, 以 User 对象形式接收.
- 登录成功到, 页面 login_ok.jsp 并显示登录欢迎信息
- 登录失败, 到页面 login_error.jsp
代码实现
创建login.jsp
<form action="login"> u:<input name="username" type="text"> <br/> p:<input name="password" type="password"><br/> <input type="submit" value="登录"> </form> </body> </html>
创建login_ok.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登录成功</title> </head> <h1>登录成功</h1> 欢迎你: ${requestScope.user.username} <body> </body> </html>
创建login_error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登录失败</title> </head> <body> <h1>登录失败</h1> <a href="<%=request.getContextPath()%>/homework/login.jsp">返回重新登录</a> </body> </html>
- 这里考察web工程路径的知识点 如果忘记了 可以去看我的博客 链接
- <%=request.getContextPath()%>/homework/login.jsp
服务器解析 /springmvc/homework/login.jsp
- 浏览器会解析 为 http://localhost:8080/springmvc/homework/login.jsp
创建 User.java
public class User { //属性.. private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
创建LoginHandler.java
@RequestMapping("/user") @Controller public class LoginHandler { //处理登录 @RequestMapping(value = "/login") public String doLogin(User user) { //判断 if("wyx".equals(user.getUsername()) && "123".equals(user.getPassword())){ //验证OK return "forward:/WEB-INF/pages/homework/login_ok.jsp"; } else { return "forward:/WEB-INF/pages/homework/login_error.jsp"; } } }
😄总结
- 对于重定向来说,不能重定向到 /WEB-INF/ 目录下
- redirect 关键字,表示进行重定向
- MyView继承了AbstractView, 就可以作为一个视图使用
- 配置 属性 order, 表示视图解析器执行的顺序, 值越小, 优先级越高
- 属性 order 的默认值是最低优先级 ,值为 Integer.MAX_VALUE int LOWEST_PRECEDENCE = 2147483647
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞