前言
记录学习过程
直接页面转发
不经过控制器类的处理方法直接转发到页面,可以通过使用< mvc:view-controller >元素来实现。在SpringMVC配置文件springmvc.xml中:
<!--不经过控制器类的处理方法直接转发到页面-->
<!--如果当前请求为“/success”时,则转发到“/success.jsp”-->
<mvc:view-controller path="/success" view-name="success"/>
运行Web,输入地址http://localhost:8080/success
运行成功
注意:springmvc.xml文件需要配置< mvc:annotation-driven/>
配置了mvc:annotation-driven/后,Spring就知道了我们启用注解驱动,然后Spring通过context:component-scan/标签的配置,会自动为我们将扫描到的@Component,@Controller,@Service,@Repository等注解标记的组件注册到工厂中,来处理我们的请求
定义视图
通过BeanNameViewResolver类可以实现用户自定义的视图
(1)创建一个类MyView,实现View接口
package com.springmvc.view;
import org.springframework.web.servlet.View;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
@Component
public class MyView implements View {
@Override
public String getContentType() {
return "text/html";
}
@Override
public void render(Map<String, ?> arg0, HttpServletRequest requset, HttpServletResponse response)
throws Exception
{
//自定义页面内容
response.getWriter().println("hello,this is myView");
}
}
注意!!!!!这个View接口是Spring框架的。。。第一次以为是自己写的接口,没想到是自带的,坑了我半天
(2)在控制器中添加方法
@RequestMapping("/beanNameViewResolver")
public String beanNameViewResolver(){
System.out.println("MyView");
return "myView";
}
(3)在springmvc.xml配置视图解析器,使用视图名称实现视图解析
<context:component-scan base-package="com.springmvc.view"/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="10"/>
</bean>
如果配置文件前面没有context:component-scan,加上这个配置自动扫描的包
(4)index.jsp设置超链接,测试 成功
<a href="/springmvc/beanNameViewResolver">BeanNameViewResolver</a>
页面重定向
前面的例子中,控制器类的方法返回的字符串默认通过转发的方式跳转到目标页面
如果返回的字符串中带redirect前缀,会采用重定向的方式跳转到目标页面
例:
(1)HelloController控制器类添加方法
@RequestMapping("/redirect")
public String redirect(){
return "redirect:/success.jsp";
}
(2)index.jsp添加超链接
<a href="/springmvc/redirect">redirect success.jsp</a>
(3)测试成功
注意:WEB-INF目录下的文件受保护,无法直接访问,如果直接重定向该目录下的文件会404
WEB-INF下面的内容都是只能由服务器级别才能访问,客户端并不能访问
重定向与转发
forward(转发):
是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,因为这个跳转过程实在服务器实现的,并不是在客户端实现的所以客户端并不知道这个跳转动作,所以它的地址栏还是原来的地址.
redirect(重定向):
是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
转发是服务器行为,重定向是客户端行为