什么是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
到此这篇关于什么是springMVC 视图和视图解析器的文章就介绍到这了,更多相关springMVC视图解析器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!