朗读文章 17.5 ViewResolver 实例 目录结构 项目详解 app17b应用的部署描述符web.xml app17b的配置文件 控制器 InputProductController.java SaveProductController.java 其他代码 运行效果 朗读文章
17.5 ViewResolver Spring MVC
中的视图解析器负责解析视图 。可以通过在配置文件
中定义一个ViewResolver
(如下)来配置视图解析器:
1 2 3 4 5 <bean id ="viewResolver" class ="org.springframework.web.servlet.view.InternalResourceViewResolver" > <property name ="prefix" value ="/WEB-INF/jsp/" /> <property name ="suffix" value =".jsp" /> </bean >
如上视图解析器设置了前缀
和后缀
两个属性 。这样可以缩短view
的路径。例如,仅需提供myPage
,视图解析器将会自动增加前缀和后缀
,这样的到的真实路径为:/WEB-INF/jsp/myPage.jsp
实例 以app17b
应用为例,该例子与app17a
应用类似,但调整了配置文件的名称和路径 。此外,它还配置了默认的视图解析器 ,为所有视图路径添加前缀和后缀 。
目录结构 以下为所示为app17b
的目录结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 E:\workspace_web \app17b ├─pom.xml └─src ├─main │ ├─java │ │ └─app17b │ │ ├─controller │ │ │ ├─InputProductController.java │ │ │ └─SaveProductController.java │ │ ├─domain │ │ │ └─Product.java │ │ └─form │ │ └─ProductForm.java │ ├─resources │ └─webapp │ ├─css │ │ └─main.css │ ├─index.jsp │ ├─META -INF │ │ └─MANIFEST.MF │ └─WEB -INF │ ├─config │ │ └─springmvc -config.xml │ ├─jsp │ │ ├─ProductDetails.jsp │ │ └─ProductForm.jsp │ ├─lib │ └─web.xml └─test └─java
项目详解 在app17b
项目中,Spring MVC
的配置文件被重命名为springmvc-config.xml
中并移动到/WEB-INF/config
目录下。为了让Spring MVC
可以正确加载到该配置文件,需要将文件路径配置到Spring MVC
的Dispatcherservlet
。
app17b应用的部署描述符web.xml 下面显示了app17b
应用的部署描述符(web.xml
文件)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <?xml version="1.0" encoding="UTF-8"?> <web-app version ="3.0" 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" > <servlet > <servlet-name > springmvc</servlet-name > <servlet-class > org.springframework.web.servlet.DispatcherServlet </servlet-class > <init-param > <param-name > contextConfigLocation</param-name > <param-value > /WEB-INF/config/springmvc-config.xml</param-value > </init-param > <load-on-startup > 1</load-on-startup > </servlet > <servlet-mapping > <servlet-name > springmvc</servlet-name > <url-pattern > *.action</url-pattern > </servlet-mapping > </web-app >
需要特别注意的是web.xml
文件中的init-param
元素。不要使用默认命名和路径的配置文件,要使用名为contextConfigLocation
的init-param
,其值应为配置文件在应用中的相对路径。
app17b的配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns ="http://www.springframework.org/schema/beans" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" > <bean name ="/product_input.action" class ="app17b.controller.InputProductController" /> <bean name ="/product_save.action" class ="app17b.controller.SaveProductController" /> <bean id ="viewResolver" class ="org.springframework.web.servlet.view.InternalResourceViewResolver" > <property name ="prefix" value ="/WEB-INF/jsp/" /> <property name ="suffix" value =".jsp" /> </bean > </beans >
控制器 使用视图解析器可以简化视图的路径,修改app17a
之中的InputProductController.java
代码如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package app17b.controller;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.mvc.Controller;public class InputProductController implements Controller { private static final Log logger = LogFactory .getLog(InputProductController.class); @Override public ModelAndView handleRequest (HttpServletRequest request, HttpServletResponse response) throws Exception { logger.info("InputProductController called" ); return new ModelAndView("ProductForm" ); } }
注意最后一行代码return new ModelAndView("ProductForm");
,相较于app17a
对应的return new ModelAndView("/WEB-INF/jsp/ProductForm.jsp");
精简了好多.
SaveProductController.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 package app17b.controller;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.mvc.Controller;import app17b.domain.Product;import app17b.form.ProductForm;public class SaveProductController implements Controller { private static final Log logger = LogFactory .getLog(SaveProductController.class); @Override public ModelAndView handleRequest (HttpServletRequest request, HttpServletResponse response) throws Exception { logger.info("SaveProductController called" ); ProductForm productForm = new ProductForm(); productForm.setName( request.getParameter("name" )); productForm.setDescription( request.getParameter("description" )); productForm.setPrice(request.getParameter("price" )); Product product = new Product(); product.setName(productForm.getName()); product.setDescription(productForm.getDescription()); try { product.setPrice(Float.parseFloat( productForm.getPrice())); } catch (NumberFormatException e) {} return new ModelAndView("ProductDetails" , "product" , product); } }
其他代码 其他代码与app17a
完全一致,这里不再列举。
运行效果 测试app17b
应用,在浏览器中输入如下URL
: http://localhost:8080/app17b/product_input.action 即可看到下图所示的表单页面。 填写并提交表单,显示效果如下:
原文链接: 17.5 使用视图解析器ViewResolver