Chapter 1. Spring Hello World

Table of Contents

1.1. 配置 JSP 运行环境
1.1.1. 网站所需的库文件
1.1.2. 编辑网站的配置文件
1.1.3. 用 JSP Hello World 页面验证环境是否配置成功
1.2. 配置 Eclipse 环境
1.2.1. 在Eclipse中新建Java工程
1.2.2. 设置文本编码为UTF-8
1.2.3. 设置项目编译后的输出目录
1.3. Spring Web MVC Hello World
1.3.1. 编写Hello World的Controller
1.3.2. 编写 JSP 视图显示模板
1.3.3. 配置 URL 映射和视图处理器
1.3.4. Spring Hello World 运行效果
1.4. 小结

本章讲 Spring 的环境配置和 Spring Web 应用的一般结构和开发方法.

1.1. 配置 JSP 运行环境

1.1.1. 网站所需的库文件

Tomcat安装目录下的webapps目录是放置网站的目录, 在该目录里建立一个 ideashopx 目录, 这就是我们的博客网站的目录, 它的访问地址是 http://localhost:8080/ideashopx/

到 Spring 的官方网站下载 Spring Framework 2.0(一定要下载 with-dependencies 的包, 因为里面包含了所需要的依赖文件, 例如你可以下载 spring-framework-2.0.6-with-dependencies.zip).

我们要开发的网站的目录结构如下:

网站的目录结构

Figure 1.1. 网站的目录结构


然后按照下面的路径建立以下5个文件:

<Tomcat Home>/webapps/ideashopx/
    index.jsp
    WEB-INF/
        applicationContext.xml
        ideashopx-servlet.xml
        web.xml

然后解压缩Spring Framework的压缩文件, 分别从dist和lib目录下找到并将下面jar文件拷贝到网站目录下的WEB-INF/lib目录下, 这些文件是一般网站开发都要用到的:

antlr-2.7.6.jar
cglib-nodep-2.1_3.jar
commons-collections.jar
commons-dbcp.jar
commons-fileupload.jar
commons-io.jar
commons-logging.jar
commons-pool.jar
dom4j-1.6.1.jar
ehcache-1.2.jar
hibernate3.jar
jstl.jar
jta.jar
log4j-1.2.13.jar
spring.jar
standard.jar

解压缩standard.jar文件, 从里面的META-INF文件夹中拷贝 c.tld, fmt.tld 两个文件拷贝到 WEB-INF/tld 目录下.

1.1.2. 编辑网站的配置文件

编辑WEB-INF/目录下的以下配置文件:

Example 1.1. 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">

    <context-param>
        <param-name>webAppRootKey</param-name>
        <param-value>ideashopx.root</param-value>
    </context-param>

    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/log4j.properties</param-value>
    </context-param>
	
    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/applicationContext.xml
        </param-value>
    </context-param>
    
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-mapping>
    
    <servlet>
        <servlet-name>ideashopx</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>ideashopx</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

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

</web-app>
	

ideashopx-servlet.xml 文件没有实质的内容, 因为我们目前还用不上它:

Example 1.2. ideashopx-servlet.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
        "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <value>
            </value>
        </property>
    </bean>

</beans>
	

applicationContext.xml 也只是个空壳文件:

Example 1.3. applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
        "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>

</beans>
	

log4j.properties 配置日志输出. 日志在开发和运行过程中是非常重要的.

Example 1.4. log4j.properties

log4j.rootLogger=INFO, stdout, logfile

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=${ideashopx.root}/WEB-INF/logs/ideashopx.log
log4j.appender.logfile.MaxFileSize=1024KB
# Keep three backup files.
log4j.appender.logfile.MaxBackupIndex=3
# Pattern to output: date priority [category] - message
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
	

log4j.properties 配置日志输出. 日志在开发和运行过程中是非常重要的.

1.1.3. 用 JSP Hello World 页面验证环境是否配置成功

我们先运行JSP的Hello World例子, 确保我们的环境设置正确. 编辑 ideashopx/index.jsp文件, 让它输出Hello World!.

ideashopx/index.jsp文件内容为:

Example 1.5. index.jsp

<%@ page contentType="text/html; charset=UTF-8" %> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Hello World from JSP!</title>
<style type="text/css">
body{
    font-size: 12px;
    font-family: arial;
}
</style>
</head>
<body>

<h1>Hello World from JSP!</h1>

${param.name}

</body>
</html>
	

启动 Tomcat. 如果是从命令行启动, 你会看到类似的启动信息:

E:\Tomcat5.5\bin>tomcat5.exe
2007-7-4 19:32:02 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
2007-7-4 19:32:02 org.apache.coyote.http11.Http11BaseProtocol init
信息: Initializing Coyote HTTP/1.1 on http-8080
2007-7-4 19:32:02 org.apache.catalina.startup.Catalina load
信息: Initialization processed in 937 ms
2007-7-4 19:32:02 org.apache.catalina.core.StandardService start
信息: Starting service Catalina
2007-7-4 19:32:02 org.apache.catalina.core.StandardEngine start
信息: Starting Servlet Engine: Apache Tomcat/5.5.23
2007-7-4 19:32:02 org.apache.catalina.core.StandardHost start
信息: XML validation disabled
...
FrameworkServlet 'ideashopx': initialization completed in 234 ms
Servlet 'ideashopx' configured successfully
2007-7-15 20:53:07 org.apache.coyote.http11.Http11BaseProtocol start
信息: Starting Coyote HTTP/1.1 on http-8080
2007-7-15 20:53:07 org.apache.jk.common.ChannelSocket init
信息: JK: ajp13 listening on /0.0.0.0:8009
2007-7-15 20:53:07 org.apache.jk.server.JkMain start
信息: Jk running ID=0 time=0/31  config=null
2007-7-15 20:53:07 org.apache.catalina.storeconfig.StoreLoader load
信息: Find registry server-registry.xml at classpath resource
2007-7-15 20:53:07 org.apache.catalina.startup.Catalina start
信息: Server startup in 3172 ms

建议你总是使用命令行方式启动Tomcat, 这样, 在以后的开发中你能通过控制台立即查看出错信息, 了解网站的运行情况, 特别是调试Hibernate时, 可以查看生成的SQL语句.

如果启动正常, 在浏览器地址栏中输入http://localhost:8080/ideashopx/, 你应该能看到index.jsp的运行结果:

测试实例运行效果

Figure 1.2. 测试实例运行效果


在浏览器地址栏中输入http://localhost:8080/ideashopx/?name=myshop, 你看到了什么? 你应该看到显示的文本增加了小号的 myshop 字样. 这就是index.jsp文件中${param.name}的效果. ${param.name}是JSTL语句, 用来输出变量, param.name是网页请求中的name参数. JSTL在后面的章节中有详细介绍.

目前为止, 我们还没有应用到Spring框架. 接下来, 我们要编写Spring的Hello World例子. 通过这个例子, 你将看到基于Spring的网站的一般结构.