`

Spring MVC:使用InternalResourceViewResolver视图解析器

阅读更多

参考:Sping 2.0.8\docs\MVC-step-by-step

实现目标

编写一个ShirdrnController,实现了org.springframework.web.servlet.mvc.Controller接口;

使用JSP文件作为视图,将控制器返回的Model渲染出来,JSP文件中使用了JSTL;

使用InternalResourceViewResolver实现视图的解析。

准备工作

工程结构如下所示:

SpringMVCViewResolver
│ .classpath
│ .mymetadata
│ .project
│ .springBeans

├─.myeclipse
├─src
│ └─org
│      └─shirdrn
│          ├─beans
│          │      PersonBean.java
│          │
│          └─spring
│              └─controller
│                      ShirdrnController.java

└─WebRoot
    │ index.jsp
    │ persons.jsp
    │
    ├─META-INF
    │      MANIFEST.MF
    │
    └─WEB-INF
        │ c-1_0-rt.tld
        │ c-1_0.tld
        │ c.tld
        │ fmt-1_0-rt.tld
        │ fmt-1_0.tld
        │ fmt.tld
        │ fn.tld
        │ permittedTaglibs.tld
        │ scriptfree.tld
        │ shirdrn-servlet.xml
        │ spring.tld
        │ sql-1_0-rt.tld
        │ sql-1_0.tld
        │ sql.tld
        │ web.xml
        │ x-1_0-rt.tld
        │ x-1_0.tld
        │ x.tld
        │
        ├─classes
        │ └─org
        │      └─shirdrn
        │          ├─beans
        │          │      PersonBean.class
        │          │
        │          └─spring
        │              └─controller
        │                      ShirdrnController.class
        │
        └─lib
                commons-attributes-api.jar
                commons-attributes-compiler.jar
                commons-beanutils.jar
                commons-collections.jar
                commons-digester.jar
                commons-fileupload.jar
                commons-httpclient.jar
                commons-lang.jar
                commons-logging.jar
                cos.jar
                dom4j-1.6.jar
                freemarker.jar
                itext-1.3.jar
                jakarta-oro-2.0.8.jar
                jasperreports-1.0.3.jar
                jaxen-1.1-beta-4.jar
                jstl.jar
                jxl.jar
                log4j-1.2.13.jar
                poi-2.5.1.jar
                spring-beans.jar
                spring-context.jar
                spring-core.jar
                spring-web.jar
                spring-webmvc.jar
                standard.jar
                velocity-1.4.jar
                velocity-tools-generic-1.2.jar
                velocity-tools-view-1.2.jar

其中,PersonBean就是一个POJO,如下所示:

package org.shirdrn.beans;

import java.io.Serializable;
import java.util.Date;

public class PersonBean implements Serializable {
private Integer id;
private String name;
private String email;

public String getEmail() {
   return email;
}
public void setEmail(String email) {
   this.email = email;
}
public Integer getId() {
   return id;
}
public void setId(Integer id) {
   this.id = id;
}
public String getName() {
   return name;
}
public void setName(String name) {
   this.name = name;
}
}

实现过程

为了清晰,我按照步骤实现,如下所示:

第一步,注入List。

在该ShirdrnController控制器中使用Setter注入了一个PersonBean的List,作为Model,因此,首先要在shirdrn-servlet.xml中注入PersonBean的List中的每一个Person,这里注入了3个bean,如下所示:

<bean id="personABean" class="org.shirdrn.beans.PersonBean"
   abstract="false" singleton="true" lazy-init="default"
   autowire="default" dependency-check="default">
   <property name="id">
    <value>1001</value>
   </property>
   <property name="name">
    <value>张叁</value>
   </property>
   <property name="email">
    <value>shirdrn@hotmail.com</value>
   </property>
</bean>

<bean id="personBBean" class="org.shirdrn.beans.PersonBean"
   abstract="false" singleton="true" lazy-init="default"
   autowire="default" dependency-check="default">
   <property name="id">
    <value>1002</value>
   </property>
   <property name="name">
    <value>王者</value>
   </property>
   <property name="email">
    <value>jamkk@hotmail.com</value>
   </property>
</bean>

<bean id="personCBean" class="org.shirdrn.beans.PersonBean"
   abstract="false" singleton="true" lazy-init="default"
   autowire="default" dependency-check="default">
   <property name="id">
    <value>1003</value>
   </property>
   <property name="name">
    <value>将军</value>
   </property>
   <property name="email">
    <value>general@hotmail.com</value>
   </property>
</bean>

将List注入到ShirdrnController中,在shirdrn-servlet.xml文件中配置如下:

<bean id="shirdrnController"
   class="org.shirdrn.spring.controller.ShirdrnController"
   abstract="false" singleton="true" lazy-init="default"
   autowire="default" dependency-check="default">
   <property name="personsBean">
    <list>
     <ref bean="personABean" />
     <ref bean="personBBean" />
     <ref bean="personCBean" />
     </list>
   </property>
</bean>

第二步,实现ShirdrnController,如下所示:

package org.shirdrn.spring.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class ShirdrnController implements Controller {

private List personsBean;

public List getPersonsBean() {
   return personsBean;
}

public void setPersonsBean(List personsBean) {
   this.personsBean = personsBean;
}

public ModelAndView handleRequest(HttpServletRequest arg0,
    HttpServletResponse arg1) throws Exception {
   return new ModelAndView("persons","persons",getPersonsBean());
}
}

这里,返回了return new ModelAndView("persons","persons",getPersonsBean());,其中,第一个“persons”是视图文件的名称,对应于JSP文件persons.jsp,第二个“persons”就是Model。一个PersonBean的List。

第三步,定义HandlerMapping,URL映射方式。

仍然使用SimpleUrlHandlerMapping映射方式,在shirdrn-servlet.xml文件中配置URL映射方式,如下所示:

<bean id="shirdrnUrlMapping"
   class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"
   abstract="false" singleton="true" lazy-init="default"
   autowire="default" dependency-check="default">
   <property name="mappings">
    <props>
     <prop key="/shirdrn.xyz">shirdrnController</prop>
    </props>
   </property>
</bean>

当请求的URL为shirdrn.xyz的时候,使用控制器ShirdrnController进行控制转发,然后再交由中央控制器DispatcherServlet,选择合适的视图解析器,实现视图的派发。

第四步,配置视图解析器。

在shirdrn-servlet.xml文件中,配置视图解析器,如下所示:

<bean id="viewResolver"
   class="org.springframework.web.servlet.view.InternalResourceViewResolver"
   abstract="false" singleton="true" lazy-init="default"
   autowire="default" dependency-check="default">
   <property name="viewClass">
    <value>org.springframework.web.servlet.view.JstlView</value>
   </property>
   <property name="prefix">
    <value>/</value>
   </property>
   <property name="suffix">
    <value>.jsp</value>
   </property>
</bean>

bean为viewResolver,使用InternalResourceViewResolver视图解析器进行视图的解析。

这里的property的name很关键:

viewClass指定了选择何种视图技术,这里使用JSTL技术;

prefix是视图文件的前缀,即目录名,因为我们把persons.jsp放到了目录/WebRoot/之下,所以只需要配置一个“/”,如果放在目录/WebRoot/目录下的一个名称为view的目录中,这里prefix的值应该为/view/;

suffix是视图文件的后缀,即扩展名,如使用JSP文件,则为“.jsp”。

第五步,实现视图文件。

这里是用到了两个JSP文件,分别如下。

index.jsp文件,是一个中间转发页面,实现了定向,定向到/shirdrn.xyz:

<%@ page session="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
<%@ page language="java" pageEncoding="UTF-8"%>
<c:redirect url="/shirdrn.xyz"></c:redirect>

persons.jsp,实现视图的渲染,显示数据:

<%@ page session="false"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <title>人员列表页面</title>
    <style type="text/css">
    body{
       font-size:16px;
       color:yellow;
    }
    </style>
</head>
<body bgcolor="#FFFFFF">
<table bgcolor="green" border="1" borderColor="#FFFFFF" align="center" width="100%">
   <tr>
    <td colspan="3"><b>人员列表如下</td>
   </tr>
   <tr>
    <td>ID</td><td>姓名</td><td>Email</td>
   </tr>
   <c:forEach items="${persons}" var="person">
    <tr>
     <td><c:out value="${person.id}" /></td>
     <td><c:out value="${person.name}" /></td>
     <td><c:out value="${person.email}" /></td>
    </tr>
   </c:forEach>
</table>
</body>
</html>

第六步,配置应用的web.xml文件。

在web.xml文件中配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<servlet>
    <servlet-name>shirdrn</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>shirdrn</servlet-name>
    <url-pattern>*.xyz</url-pattern>
</servlet-mapping>

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

</web-app>

测试实现

启动Tomcat Web Server。

在浏览器地址栏中键入链接地址http://localhost:8080/SpringMVCViewResolver/shirdrn.xyz,显示如图所示:

关于异常

因为是第一次使用JSTL,感觉挺新鲜的。

需要两个jar包:standard.jar和jstl.jar。

但还是除了点异常:

org.apache.jasper.JasperException: /persons.jsp(27,4) According to TLD or attribute directive in tag file, attribute items does not accept any expressions
org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:39)
org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:405)
org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:146)
org.apache.jasper.compiler.Validator$ValidateVisitor.checkXmlAttributes(Validator.java:955)
org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:710)
org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1441)
org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2163)
org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2213)
org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2219)
org.apache.jasper.compiler.Node$Root.accept(Node.java:456)
org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2163)
org.apache.jasper.compiler.Validator.validate(Validator.java:1489)
org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:157)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:286)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:267)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:255)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:556)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:293)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:111)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:965)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:744)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:663)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:394)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:348)
javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

异常信息提示:items属性不能够接受任何表达式,其实怎么可能呢,不接受怎么渲染视图啊。

实际上一个版本的问题,将JSP页面中:

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

应该改为:

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

这样就解决了。

分享到:
评论

相关推荐

    Spring MVC中InternalResourceViewResolver视图解析器的默认行为.docx

    `InternalResourceViewResolver`是Spring MVC提供的一种内置的视图解析器,主要用于处理JSP视图。当我们不对其进行任何额外配置时,它会遵循一定的默认行为。 默认情况下,`InternalResourceViewResolver`会将控制...

    Spring MVC--5.视图和视图解析器

    Spring MVC提供了多种内置的视图解析器,如InternalResourceViewResolver和BeanNameViewResolver等。以最常见的InternalResourceViewResolver为例,我们在配置文件中设置其prefix和suffix属性,分别表示视图路径的...

    Spring配置Freemarker视图解析器,配置多个视图解析器

    在Spring框架中,视图解析器是用于将处理后的模型数据转换为用户可查看的页面的关键组件。Freemarker是一个强大的、轻量级的模板引擎,常被用作Spring MVC中的视图技术。本篇文章将深入探讨如何在Spring中配置...

    spring-webmvc-5.0.9 jar包、源码和javadoc

    常见的视图解析器有InternalResourceViewResolver和BeanNameViewResolver等。 六、注解驱动开发 Spring 5.0.9中,注解驱动开发已经非常成熟,@RequestMapping、@GetMapping、@PostMapping等注解用于映射URL请求,@...

    spring mvc 3_demo

    默认情况下,Spring MVC使用InternalResourceViewResolver作为视图解析器,它将视图名解析为JSP页面。例如,配置视图解析器: ```java &lt;bean id="viewResolver" class="org.springframework.web.servlet.view....

    spring学习: spring mvc基础

    视图解析器(ViewResolver)如InternalResourceViewResolver,负责根据逻辑视图名(即Controller返回的字符串)查找对应的物理视图,如JSP、Freemarker或Thymeleaf模板。通过配置,我们可以指定视图解析器的前缀和...

    Mastering Spring MVC 4(2015.09)源码

    视图解析器是Spring MVC中用于确定视图名对应的实际资源路径的组件。例如,InternalResourceViewResolver可以将视图名转换为JSP页面的URL。 依赖注入(Dependency Injection, DI)是Spring框架的核心特性之一。在...

    SpringMVC-5 视图和视图解析器

    Spring MVC提供了多种视图解析器,例如`InternalResourceViewResolver`和`BeanNameViewResolver`。 - **InternalResourceViewResolver**:最常用的视图解析器,可以配置前缀和后缀,例如,如果逻辑视图名为"user...

    spring MVC的HelloWorld完整实例

    实例中可能包含一个或多个配置文件,如`spring-servlet.xml`,用于配置Spring MVC的组件,如视图解析器、拦截器、数据源、以及控制器的bean定义。 4. **HelloWorldController**: 这个名称暗示了项目中的核心控制...

    spring mvc

    - **视图解析器**:配置视图解析器,例如 `&lt;bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt;`。 #### 七、Spring MVC 如何访问静态文件 在 Spring MVC 中,...

    Spring MVC 第一个例子

    5. 配置视图解析:在 Spring 配置文件中配置 ViewResolver,如 `InternalResourceViewResolver` 或 `BeanNameViewResolver`。 6. 测试:通过浏览器或测试工具发送请求,查看应用的响应。 以上就是 Spring MVC 的...

    spring mvc经典入门案例

    - 配置视图解析器,如使用 `InternalResourceViewResolver`,设置前缀和后缀,以便找到对应的 JSP 页面。 - 编写 JSP 视图,展示返回的数据。 - 编写测试用例,使用 `MockMvc` 进行控制器的测试,验证返回的视图...

    Java Web实战 - Spring MVC案例:设计一个简单的Web应用.pdf

    配置文件 springmvc-config.xml 是 Spring MVC 应用的核心,它包含了处理器映射器和视图解析器的配置。通过 `&lt;context:component-scan&gt;` 元素扫描指定包,使 Spring 容器自动加载控制器。而视图解析器如 ...

    Mastering Spring MVC 3中文版

    4. **视图解析器**:如InternalResourceViewResolver,自动根据逻辑视图名解析实际视图资源。 5. **数据绑定和验证**:支持自动将HTTP请求参数绑定到Java对象,并进行数据验证。 6. **异常处理**:通过@...

    spring MVC简单示例

    这个"spring MVC简单示例"是为了帮助初学者理解Spring MVC的基本工作原理和配置,通过实践这个例子,你可以了解到如何创建一个简单的Controller、配置视图解析器并建立一个基本的请求处理流程。随着对Spring MVC的...

    spring mvc step by step,例子

    2. **配置Spring MVC**:在`web.xml`中配置`DispatcherServlet`,并添加Spring MVC的配置文件,如`spring-mvc.xml`,在这里定义视图解析器、拦截器、bean等。 3. **编写Controller**:创建一个控制器类,使用`@...

    Spring MVC简单例子

    8. **配置文件**:理解Spring MVC的配置文件,如`servlet-context.xml`,它定义了Spring MVC的组件,如视图解析器、HandlerMapping和HandlerAdapter等。 9. **Maven或者Gradle构建**:项目可能使用Maven或Gradle...

    精通Spring MVC4

    视图解析器如InternalResourceViewResolver负责根据ModelAndView对象中的视图名找到对应的视图。JSP、FreeMarker、Thymeleaf等都可以作为视图技术,Spring MVC支持多种视图技术的集成。 5. **模型数据:Model和...

    spring mvc demo下载地址

    2. **视图解析**:理解如何配置视图解析器,例如使用InternalResourceViewResolver解析JSP页面。 3. **拦截器(Interceptor)**:学习如何实现自定义拦截器,以实现日志记录、权限检查等功能。 4. **异常处理**:...

Global site tag (gtag.js) - Google Analytics