MyException - 我的异常网
当前位置:我的异常网» VC/MFC » Spring MVC:施用InternalResourceViewResolver视图

Spring MVC:施用InternalResourceViewResolver视图解析器

www.MyException.Cn  网友分享于:2013-10-09  浏览:33次
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"%>

这样就解决了。

文章评论

为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
那些争议最大的编程观点
那些争议最大的编程观点
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
旅行,写作,编程
旅行,写作,编程
为什么程序员都是夜猫子
为什么程序员都是夜猫子
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
每天工作4小时的程序员
每天工作4小时的程序员
我是如何打败拖延症的
我是如何打败拖延症的
中美印日四国程序员比较
中美印日四国程序员比较
总结2014中国互联网十大段子
总结2014中国互联网十大段子
10个调试和排错的小建议
10个调试和排错的小建议
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
漫画:程序员的工作
漫画:程序员的工作
Java程序员必看电影
Java程序员必看电影
程序员和编码员之间的区别
程序员和编码员之间的区别
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
一个程序员的时间管理
一个程序员的时间管理
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
程序员都该阅读的书
程序员都该阅读的书
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
我的丈夫是个程序员
我的丈夫是个程序员
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
编程语言是女人
编程语言是女人
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
老程序员的下场
老程序员的下场
代码女神横空出世
代码女神横空出世
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
鲜为人知的编程真相
鲜为人知的编程真相
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有