第一节:SpringMVC 视图解析【1】应用案例
一、搭建环境
创建一个 web 工程,进行环境配置
1、web.xml 的配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<welcome-file-list>
<welcome-file>index.jspwelcome-file>
welcome-file-list>
<servlet>
<servlet-name>DispatcherServletservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:springmvc.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>DispatcherServletservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
<filter>
<filter-name>characterEncodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
init-param>
<init-param>
<param-name>forceEncodingparam-name>
<param-value>trueparam-value>
init-param>
filter>
<filter-mapping>
<filter-name>characterEncodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<filter>
<filter-name>HiddenHttpMethodFilterfilter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class>
filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
web-app>
2、springmvc.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.njf.mvc">context:component-scan>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/">property>
<property name="suffix" value=".jsp">property>
bean>
beans>
3、测试
页面请求:
hello
后端控制器:
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello() {
return "success";
}
}
通过上面的配置,保证项目可以正常运行。测试运行:
一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理。
因为在springmvc的配置文件中配置了视图解析器,对于方法中返回的字符串类型,就会被视图解析器进行解析,然后拼接上前缀和后缀,然后进行页面的渲染:
/WEB-INF/pages/success.jsp
而且这是通过请求转发的方式来进行的页面跳转。
二、实现请求转发
上面是通过视图解析器来实现的请求转发,我们还可以使用以下几种方式
1、相对路径
@RequestMapping("/hello")
public String hello() {
/*
使用相对路径
"../../hello" 解析后: /WEB-INF/pages/hello.jsp ==> hello.jsp
如果只写 "hello" 解析为: /WEB-INF/pages/hello.jsp
*/
return "../../hello";
}
2、使用 forward
/**
* forward:前缀指定一个转发操作,转发到一个页面
* /hello.jsp:转发当前项目下的 hello.jsp
*
* 一定要加上 /:如果不加 / 就是相对路径,容易出问题
* forward:/hello.jsp
* forward:前缀的转发,不会由我们配置的视图解析器进行拼串
*
* @return
*/
@RequestMapping(value = "/handle01")
public String handle01() {
System.out.println("handle01...");
return "forward:/hello.jsp";
}
3、方式二变种
@RequestMapping(value = "/handle02")
public String handle02() {
System.out.println("handle02...");
return "forward:/handle01";
}
因为 handle01 已经实现了重定向,可以通过再次请求转发到 handle01 来进行处理。
三、实现重定向
上面都是请求转发,可以使用 redirect 实现重定向:
1、方式一
/**
* 重定向到 hello.jsp 页面
*
* 有前缀的转发和重定向操作,配置的视图解析器就不会进行拼串
* 转发: forward:转发的路径
* 重定向: redirect:重定向的路径
*
* /hello.jsp:代表就是从当前项目下开始,SpringMVC 会为路径自动的拼接上项目名
*
* 原生的 Servlet 重定向/路径需要加上项目名才能成功
* response.sendRedirect("/hello.jsp");
* @return
*/
@RequestMapping(value = "/handle03")
public String handle03() {
System.out.println("handle03...");
return "redirect:/hello.jsp";
}
2、方式一的变种
@RequestMapping(value = "/handle04")
public String handle04() {
System.out.println("handle04...");
return "redirect:/handle03";
}
通过重定向到 handle03 来进行重定向操作。