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
即可看到下图所示的表单页面。
填写并提交表单,显示效果如下: