1.3. Spring Web MVC Hello World

1.3.1. 编写Hello World的Controller

在 ideashopx 项目中新建一个Package命名为 net.ideawu.ideashopx.web. 然后在该Package下新建一个Class命名为IndexController.

建立 IndexController 类

Figure 1.12. 建立 IndexController 类


文件的源码为:

Example 1.6. 控制器 IndexController.java

/***********************************************************
 * Date: 2007-7-15
 * File: IndexController.java
 * Author: ideawu
 ***********************************************************/

package net.ideawu.ideashopx.web;

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

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

/**
 * 测试用的控制器.
 * @author ideawu
 */
public class IndexController implements Controller {
	
    public ModelAndView handleRequest(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        // 将一条信息放入 HttpServletRequest 对象中, 视图模板文件将通过 "text" 访问该信息.
        request.setAttribute("text", "Hello World from Spring!");
        // 调用名为 index 的视图模板文件.
        return new ModelAndView("index");
    }
    
}
	

[Tip] Eclipse 快捷键

有一个小技巧, 你在输入 implements Controller之后, Eclipse提示无法识别Controller. 这时, 你在源码编辑区点鼠标右键 ->Source->Organize Imports或者按CTRL+SHIFT+O, Eclipse便会自动添加Controller的引用.

这时, Eclipse又提示错误信息, IndexController没有实现接口的方法. 在源码编辑区点鼠标右键 ->Source->Override/Implement Methods, Eclipse便会自动添加Controller接口的所有方法的默认实现, 如果方法有返回值, 默认返回null.

编译后, 你应该能在/WEB-INF/classes/net/ideawu/ideashopx/web目录下找到一个IndexController.class文件, 这是IndexController.java生成的类文件.

1.3.2. 编写 JSP 视图显示模板

编辑/WEB-INF/jsp/index.jsp文件, 内容为:

Example 1.7. 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>${text}</title>
<style type="text/css">
body{
    font-size: 12px;
    font-family: arial;
}
</style>
</head>
<body>

<h1>${text}</h1>

</body>
</html>
	

IndexController是MVC模式中的控制器, 处理客户的请求, 产生数据放入HttpServletRequest中, 然后调用一个ModelAndView视图来显示, 上文的视图中, 使用/WEB-INF/jsp/index.jsp作为显示模板.

1.3.3. 配置 URL 映射和视图处理器

为了做到这一点, 我们还需要配置/WEB-INF/ideashopx-servlet.xml文件:

Example 1.8. 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>
                /index.do=indexController
            </value>
        </property>
    </bean>

    <bean id="indexController" class="net.ideawu.ideashopx.web.IndexController">
    </bean>

</beans>
	

ViewResolver配置了JSP模板文件放置在/WEB-INF/jsp/目录下, 在 Java 文件中, 我们指定视图模板文件的名为 index, 那么 viewResolver 会给它加上前缀 /WEB-INF/jsp/ 和后缀 .jsp, 组成 /WEB-INF/jsp/<b>index</b>.jsp. 这就是 JSP 视图模板文件的实际地址, 相对于 Web 上下文. SimpleUrlHandlerMapping中的/index.do=indexController表明, 如果URL中的访问地址是/index.do的话, 就调用indexController控制器来处理.

<bean id="indexController" class="net.ideawu.ideashopx.web.IndexController">
</bean>

表示会在服务器启动的时候创建IndexController的实例, 名字为indexController.

[Tip] 保护 JSP 文件

我们把 JSP 视图模板文件放在 /WEB-INF/jsp 目录下, 这样用户将无法直接访问到这些文件. 如果把 JSP 视图模板文件放在网站可访问目录下, 如 /ideashopx/ 目录, 是危险的. 虽然你认为即使用户直接在浏览器中输入网址访问了它们也只是得到 JSP 文件解析后的 HTML 代码, 但是, 这些 JSP 视图模板文件中的 JSP 标签有时会依赖 Controller 中的处理结果, 直接访问它们会导致抛出异常. 终归来说, 如果你不是有意让用户访问某个资源, 那么就让他无法访问该资源.

1.3.4. Spring Hello World 运行效果

启动服务器, 然后在浏览器的地址栏中输入http://localhost:8080/ideashopx/index.do就可以浏览运行效果了.

Spring Hello World 的运行效果

Figure 1.13. Spring Hello World 的运行效果


你是不是想在输入地址的时候省略index.do, 也就是把index.do作为welcome-file? 直接在web.xml中设置可不行. 解决方法是让index.jsp(不是/WEB-INF/jsp目录下的那个)的内容为:

<jsp:forward page="index.do" />

这样, 用户的URL请求如果是http://localhost:8080/ideashopx/, Tomcat服务器会调用index.jsp文件进行处理, 但是, index.jsp文件简单的把请求转交给index.do.