😀前言
本篇讲解了什么是springMVC 视图和视图解析器
🏠个人主页:尘觉主页
🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉
在csdn获奖荣誉: 🏆csdn城市之星2名
💓Java全栈群星计划top前5
🤗 端午大礼包获得者
💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦😊
文章目录
- 😀什么是springMVC 视图和视图解析器
- 🥰基本介绍
- 😉自定义视图
- 为什么需要自定义视图
- 自定义视图实例-代码实现
- 配置 springDispatcherServlet-servlet.xml , 增加自定义视图解析器
- 建MyView.java -自定义视图类
- 解读
- 注意
- 创建GoodsHandler.java类
- 创建view.jsp类
- 创建/WEB-INF/pages/my_view.jsp类
- 完成测试(Postman 测试)
- 自定义视图-小结
- 自定义视图-工作流程
- 😘目标方法直接指定转发或重定向
- 应用实例-代码实现
- 修改 GoodsHandler.java, 增加方法 order()
- 直接指定要请求转发的或者是重定向的页面
- 修改view.jsp
- 完成测试(页面测试)
- 完成测试(Postman 测试)
- 💖综合代码演示
- 完成一个简单的用户登录案例
- 代码实现
- 创建login.jsp
- 创建login_ok.jsp
- 创建login_error.jsp
- 创建 User.java
- 创建LoginHandler.java
- 😄总结
😀什么是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
😁热门专栏推荐
想学习vue的可以看看这个
java基础合集
数据库合集
redis合集
nginx合集
linux合集
等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持
🤔欢迎大家加入我的社区 尘觉社区
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞