forword
forword前缀指定一个转发操作
@RequestMapping("/hello")
public String helloHander() {
//现要求index.jsp发起请求后,经此方法转发至WebContet下的hello.jsp;
//若return "hello";会经过springmvc的配置文件springmvc2-servlet.xml里配置的前缀和后缀进行拼串:WebContent/WEB-INF/page/hello.jsp,找不到该页面
//方法一:使用相对路径
System.out.println("这是hello页面");
return "../../hello";
}
//方法二:使用:forward:+路径
/* forward: 转发到一个页面
* /hello.jsp 转发到当前项目下的hello页面
* 注意:/一般必须加上,若不加上/就是相对路径,容易出错
* */
@RequestMapping("/handle01")
public String handle01() {
System.out.println("handle01");
return "forward:/hello.jsp";
}
/*
* 通过index页面的handle02请求转发至handle01
*/
@RequestMapping("/handle02")
public String handle02() {
System.out.println("handle02");
return "forward:/handle01";
}
redirect
redirect前缀指定重定向到页面
/* 重定向到hello.jsp
* 有前缀的转发和重定向操作,配置的视图解析器不会进行拼串
*
* 转发: forward:转发的路径
* 重定向 redirect:重定向路径
* /hello.jsp代表的是从当前项目下,springmvc会自动为该路径自动拼串上项目名
*
* 原生的Servlet重定向操作需要加上项目名(/项目名)
* response.sendRedirect("/hello.jsp")
* */
@RequestMapping("/handle03")
public String handle03() {
System.out.println("重定向至hello");
return "redirect:/hello.jsp";
}
/* 多次重定向
* handle04重定向--->handle03重定向--->hello.jsp
* */
@RequestMapping("/handle04")
public String handle04() {
System.out.println("这是多次重定向");
return "redirect:/handle03";
}
视图解析流程
1、视图解析源码分析:重要的两个接口:View、ViewReslover
2、视图和视图解析器
1)请求处理方法执行完成后,最终返回一个 ModelAndView 对象。对于那些返回 String, View 或 ModeMap 等类型的处理方法,Spring MVC 也会在内部将它们装配成一个ModelAndView 对象,它包含了逻辑名和模型对象的视图
2)Spring MVC 借助视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以是 JSP ,也可能是 Excel、JFreeChart 等各种表现形式的视图
3)对于最终究竟采取何种视图对象对模型数据进行渲染,处理器并不关心,处理器工作重 点聚焦在生产模型数据的工作上,从而实现 MVC 的充分解耦
3、视图
1)视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户。
2)为了实现视图模型和具体实现技术的解耦,Spring 在 org.springframework.web.servlet包中定义了一个高度抽象的 View 接口:
3)视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们不会有线程安全 的问题
4、常用的视图实现类
5、视图解析器
1)SpringMVC 为逻辑视图名的解析提供了不同的策略,可以在 Spring WEB 上下文中配置一种或多种解析策略,并指定他们之间的先后顺序。每一种映射策略对应一个具体的 视图解析器实现类。
2)视图解析器的作用比较单一:将逻辑视图解析为一个具体的视图对象。
3)所有的视图解析器都必须实现 ViewResolver 接口:
6、常用的视图解析器实现类
1)可以选择一种视图解析器或混用多种视图解析器
2)每个视图解析器都实现了 Ordered 接口并开放出一个 order 属性,可以通过 order 属性指定解析器的优先顺序,order越小优先级越高。
3)SpringMVC 会按视图解析器顺序的优先顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则将抛出 ServletException 异常
4)InternalResourceViewResolver
①JSP 是最常见的视图技术,可以使用 InternalResourceViewResolve 作为视图解析器:
JstlView(国际化)
1、导包导入了jstl的时候会自动创建为一个jstlView;可以快速方便的支持国际化功能;
taglibs-standard-impl-1.2.1.jar
taglibs-standard-spec-1.2.1.jar
2、可以支持快速国际化;
1)、javaWeb国际化步骤;
1)、得得到一个Locale对象;
2)、使用ResourceBundle绑定国际化资源文件;
3)、使用ResourceBundle.getString("key");获取到国际化配置文件中的值;
4)、web页面的国际化,fmt标签库来做;
<fmt:setLocale>
<fmt:setBundle >
<fmt:message>
2)、有了JstlView以后;
①让Spring管理国际化资源就行
<!--让SpringMVC管理国际化资源文件;配置一个资源文件管理器 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- basename指定基础名-->
<property name="basename" value="i18n"></property>
</bean>
②直接去页面使用fmt:message;
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- <a>欢迎来到登录界面</a>
<form action="">
用户名:<input/><br/>
密码:<input/><br/>
<input type="submit" value="登录"/> -->
<a>
<fmt:message key="welcomeinfo"></fmt:message>
</a>
<form action="">
<fmt:message key="username"/>:<input/><br/>
<fmt:message key="password"/>:<input/><br/>
<input type="submit" value='<fmt:message key="loginbtn"/>'/>
</form>
</body>
</html>
i18n_en_US.properties
welcomeinfo=welcome to login page
username=USERNAME
password=PASSWORD
loginbtn=LOGIN
i18n_zh_CN.properties
welcomeinfo=w\u6B22\u8FCE\u6765\u5230\u767B\u5F55\u9875\u9762
username=\u7528\u6237\u540D
password=\u5BC6\u7801
loginbtn=\u767B\u5F55
一定要过SpringMVC的视图解析流程,springmvc会创建一个jstlView帮你快速国际化;
若是不经过视图解析流程,fmt:message/标签会出现异常
也不能写forward
forward:(
if (viewName.startsWith(FORWARD_URL_PREFIX)) {
String forwardUrl = viewName.substring(FORWARD_URL_PREFIX.length());
return new InternalResourceView(forwardUrl);
}
)
这是因为创建视图对象的方法时,若前缀是forward,创建的视图对象是InternalResourceView,不带local(国际化)
若只是单纯的写一个方法,页面发起请求到另一个页面,且该方法内没有其他内容
<!-- 发送一个请求("toLoginPage"):直接来到web-inf下的login页面
mvc名称空间下有一个请求映射标签mvc:view-controller
-->
<!-- path:指定哪个请求
view-name:指定映射给那个视图
通过mvc映射标签,使得该过程经过了springmvc的整个过程(视图解析过程)
但是使用了该标签就会导致其他的请求不能正常使用
-->
<mvc:view-controller path="/toLoginPage" view-name="login"></mvc:view-controller>
<!-- 为了解决mvc:view-controller出现的问题,开启mvc注解驱动模式 -->
<mvc:annotation-driven></mvc:annotation-driven>