鍍金池/ 教程/ Java/ 使用Spring MVC構(gòu)建Hello World
Tomcat 的運(yùn)行機(jī)制
理解HTTP
使用Spring MVC構(gòu)建Hello World
過濾器與監(jiān)聽器
文件上傳
使用 velocity 模板引擎
攔截器
Spring 與依賴注入
轉(zhuǎn)換器與格式化
基于注解的 URL 映射
JSON
Spring與面向切面編程
JdbcTemplate
理解Servlet
從JSP開始
校驗(yàn)器
使用數(shù)據(jù)庫連接池
國際化

使用Spring MVC構(gòu)建Hello World

本文演示如何使用Spring MVC做出最簡單的Hello World應(yīng)用。

示例1

項(xiàng)目創(chuàng)建和之前一樣,不過在最后一步要選擇Spring Web MVC:
http://wiki.jikexueyuan.com/project/java-web/images/01-02/01.png" alt="" />

項(xiàng)目結(jié)構(gòu)如下:
http://wiki.jikexueyuan.com/project/java-web/images/01-02/02.png" alt="" />

web.xml源碼:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>

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

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>

    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>redirect.jsp</welcome-file>
    </welcome-file-list>
</web-app>

如果遇到匹配*.htm的URL,會使用org.springframework.web.servlet.DispatcherServlet來處理。

applicationContext.xml源碼:

<?xml version='1.0' encoding='UTF-8' ?>
<!-- was: <?xml version="1.0" encoding="UTF-8"?> -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

    <!--bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
          p:location="/WEB-INF/jdbc.properties" />

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"
    p:driverClassName="${jdbc.driverClassName}"
    p:url="${jdbc.url}"
    p:username="${jdbc.username}"
    p:password="${jdbc.password}" /-->

    <!-- ADD PERSISTENCE SUPPORT HERE (jpa, hibernate, etc) -->

</beans>

applicationContext.xml是Spring的配置文件。

dispatcher-servlet.xml源碼:

<?xml version='1.0' encoding='UTF-8' ?>
<!-- was: <?xml version="1.0" encoding="UTF-8"?> -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>

    <!--
    Most controllers will use the ControllerClassNameHandlerMapping above, but
    for the index controller we are using ParameterizableViewController, so we must
    define an explicit mapping for it.
    -->
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="index.htm">indexController</prop>
            </props>
        </property>
    </bean>

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

    <!--
    The index controller.
    -->
    <bean name="indexController"
          class="org.springframework.web.servlet.mvc.ParameterizableViewController"
          p:viewName="index" />

</beans>

<bean id="viewResolver" .../>定義了JSP模板文件的位置和后綴(這樣其他地方就可以省略后綴了)。

URL為index.htm時,對應(yīng)的控制器是indexController,其調(diào)用了/WEB-INF/jsp/下的模板index.jsp

redirect.jsp源碼

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<% response.sendRedirect("index.htm"); %>

index.jsp源碼

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Welcome to Spring Web MVC project</title>
    </head>

    <body>
        <p>Hello! This is the default welcome page for a Spring Web MVC project.</p>
        <p><i>To display a different welcome page for this project, modify</i>
            <tt>index.jsp</tt> <i>, or create your own welcome page then change
                the redirection in</i> <tt>redirect.jsp</tt> <i>to point to the new
                welcome page and also update the welcome-file setting in</i>
            <tt>web.xml</tt>.</p>
    </body>
</html>

運(yùn)行項(xiàng)目,打開瀏覽器訪問http://localhost:8084/Project_0102/,會自動跳轉(zhuǎn)到 http://localhost:8084/Project_0102/index.htm,并顯示index.jsp的內(nèi)容。

Hello World

修改dispatcher-servlet.xml,將<bean id="urlMapping" .../>修改為:

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="index.htm">indexController</prop>
            <prop key="hello.htm">helloController</prop>
        </props>
    </property>
</bean>

并添加:

<bean name="helloController"
      class="me.letiantian.controller.HelloController" />

HelloController.java的源碼如下:

package me.letiantian.controller;

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 HelloController implements  Controller{

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {

        ModelAndView mv = new ModelAndView();
        mv.addObject("message", "Hello World!你好");  
        mv.setViewName("hello");
        return mv;
    }

}

模板hello.jsp的源碼如下:

<html>
    <head>
        <title>Hello world</title>
    </head>
    <body>
        <h1>${message}</h1>
    </body>
</html>

創(chuàng)建static目錄,在static目錄下創(chuàng)建test.js,內(nèi)容如下:

console.log("hello world");

web.xml中添加:

<servlet-mapping>  
    <servlet-name>default</servlet-name>
    <url-pattern>*.jpg</url-pattern>   
</servlet-mapping>  

<servlet-mapping>  
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>   
</servlet-mapping>  

<servlet-mapping>    
    <servlet-name>default</servlet-name>  
    <url-pattern>*.js</url-pattern>  
</servlet-mapping>  

<servlet-mapping>    
    <servlet-name>default</servlet-name>    
    <url-pattern>*.css</url-pattern>   
</servlet-mapping>

好了,現(xiàn)在的項(xiàng)目結(jié)構(gòu)如下:
http://wiki.jikexueyuan.com/project/java-web/images/01-02/03.png" alt="" />

瀏覽器訪問結(jié)果:
http://wiki.jikexueyuan.com/project/java-web/images/01-02/04.png" alt="" />
http://wiki.jikexueyuan.com/project/java-web/images/01-02/05.png" alt="" />

亂碼了~囧~

解決方法:
HelloController.java加入response.setContentType("text/html;charset=UTF-8");

package me.letiantian.controller;

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 HelloController implements  Controller{

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        response.setContentType("text/html;charset=UTF-8");  // 新加入的內(nèi)容
        ModelAndView mv = new ModelAndView();
        mv.addObject("message", "Hello World!你好");  
        mv.setViewName("hello");
        return mv;
    }

}

示例2

換種方法配置靜態(tài)資源

刪掉在web.xml中的:

<servlet-mapping>  
    <servlet-name>default</servlet-name>
    <url-pattern>*.jpg</url-pattern>   
</servlet-mapping>  

<servlet-mapping>  
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>   
</servlet-mapping>  

<servlet-mapping>    
    <servlet-name>default</servlet-name>  
    <url-pattern>*.js</url-pattern>  
</servlet-mapping>  

<servlet-mapping>    
    <servlet-name>default</servlet-name>    
    <url-pattern>*.css</url-pattern>   
</servlet-mapping>

dispatcher-servlet.xml中增加以下內(nèi)容:

<?xml version='1.0' encoding='UTF-8' ?>
<!-- was: <?xml version="1.0" encoding="UTF-8"?> -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

    <!-- 其他內(nèi)容 -->
    <mvc:resources mapping="/static/**" location="/static/"/>  

</beans>

注意,在beans的屬性中增加了xmlns:mvc="http://www.springframework.org/schema/mvc",屬性xsi:schemaLocation中增加了http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd

不再使用任何后綴(例如.html,.jsp)

redirect.jsp修改為:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<% response.sendRedirect("index"); %>

將web.xml中的:

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.htm</url-pattern>
</servlet-mapping>

修改為:

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

dispatcher-servlet.xml中的:

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="index.htm">indexController</prop>
            <prop key="hello.htm">helloController</prop>
        </props>
    </property>
</bean>

修改為:

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="index">indexController</prop>
            <prop key="hello">helloController</prop>
        </props>
    </property>
</bean>

然后,瀏覽器訪問http://localhost:8084/Project_0102/hello。

示例3

這個示例展示如何獲取URL中的數(shù)據(jù)。

修改HelloController.java:

package me.letiantian.controller;

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 HelloController implements  Controller{

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        response.setContentType("text/html;charset=UTF-8");
        ModelAndView mv = new ModelAndView();
        mv.addObject("name", request.getParameter("name"));  
        mv.setViewName("hello");
        return mv;
    }

}

修改hello.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<html>
    <head>
        <title>Hello world</title>
    </head>
    <body>
        <h1>${pageContext.request.contextPath}</h1>

        <form action="${pageContext.request.contextPath}/hello" method="GET">
            <input name="name" />
            <input type="submit" value="提交"/>
        </form>

        <h2>提交的數(shù)據(jù): ${name}</h2>

    </body>
</html>

${pageContext.request.contextPath}的輸出是/Project_0102。
瀏覽器訪問:
http://wiki.jikexueyuan.com/project/java-web/images/01-02/06.png" alt="" />

再編輯JSP文件時候遇到了這樣的問題:

The header.jspf contains characters which will probably be damaged during conversion to the ISO-8859-1 character set. Do you want to save the file using this character set?

解決辦法見http://stackoverflow.com/questions/15499182/netbeans-forces-me-to-save-in-specific-encoding。

資料