1.视图
1.基本介绍
1.视图介绍
2.为什么需要自定义视图
2.自定义视图实例
1.思路分析
2.代码实例
1.view.jsp
<%--
Date: 2024/2/26
Time: 14:17
User: 孙显圣
Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h4><a href="selfview">点击跳转到自定义视图解析器</a> </h4>
</body>
</html>
2.接口
@RequestMapping("/selfview")
public String selfview() {
return "sunView";
}
3.配置自定义视图解析器springDispatcherServlet-servlet.xml
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="99"/>
</bean>
4.自定义视图MyView.java
package com.sun.web.view;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.view.AbstractView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
@Component(value = "sunView")
public class MyView extends AbstractView {
@Override
protected void renderMergedOutputModel(Map<String, Object> map, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
System.out.println("自定义视图");
httpServletRequest.getRequestDispatcher("/WEB-INF/pages/view_result.jsp").forward(httpServletRequest, httpServletResponse);
}
}
5.view_result.jsp
<%--
Date: 2024/2/26
Time: 14:27
User: 孙显圣
Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>view——result</h3>
</body>
</html>
6.结果展示
3.自定义视图执行流程
4.自定义视图执行流程debug
1.打断点
2.找到自定义视图的源码,下断点
3.进入这个断点
4.下一步
5.下一步
6.下一步
7.在自己的视图中下一个断点
8.下一步
5.SpringMVC执行流程图再次理解
6.默认视图执行流程debug
1.调整默认视图优先级
2.下断点,跳到这个断点
3.在默认视图解析器中下断点,跳到这个断点
4.一直下一步到return view
7.多个视图解析器执行流程
- 如果默认解析器优先级低于普通解析器,则在容器中找不到视图解析器的view对象的话,就会去找默认解析器并执行,默认解析器是一定可以找到view的,所以返回执行那个view
- 如果默认解析器的优先级高于普通解析器,则在容器中一定可以找到view对象,所以就直接返回这个view,如果报错了则不会继续找普通的解析器
- 总结:默认视图解析器是根据适配器返回的信息创建一个view对象,所以一定可以找到这个view对象,所以返回这个view对象进行渲染而自定义视图解析器是根据适配器返回的信息从容器中查找一个view对象,所以存在找不到的情况
2.指定请求转发或重定向
1.基本介绍
2.重定向
@RequestMapping("/redirect")
public String redirect() {
return "redirect:/success.jsp";
}
3.请求转发
@RequestMapping("/forward")
public String forward() {
return "forward:/WEB-INF/pages/success.jsp";
}
3.课后练习
1.User.java
package com.sun.web.entity;
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;
}
@Override
public String toString() {
return "user{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
2.login.jsp
<%--
Date: 2024/2/23
Time: 20:44
User: 孙显圣
Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--这里使用浏览器默认路径,目前在上下文路径下,所以可以直接找到/login--%>
<form action="doLogin" method="post">
username:<input name="username" type="text">
password:<input name="password" type="password">
<input type="submit" value="登录">
</form>
</body>
</html>
3.接口
@RequestMapping("/doLogin")
public String doLogin(User user) {
if ("sun".equals(user.getUsername()) && "123".equals(user.getPassword())) {
System.out.println("验证通过");
return "forward:/success.jsp";
}
else {
return "redirect:/fail.jsp";
}
}
4.success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>重定向成功</h1>
</body>
</html>
5.fail.jsp
<%--
Date: 2024/2/26
Time: 21:42
User: 孙显圣
Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>error!!!</h2>
<h2><a href="login.jsp">请重新登陆</a> </h2>
</body>
</html>
6.结果展示