今天开始写Spring的了。感觉Spring和Struts差不多,不过Spring更为灵活。用Spring来代管Struts很方便,而且好用。不多说了,开始吧。
环境:jdk1.5, Eclipse3.2, Tomcat5.5, 以及Spring1.2的包。
Spring框架也采用的是一个前端控制器,即DispatcherServlet。符合url-pattern的所有请求都会先送到这个控制器,再由这个控制器转发给不同的控制器来处理各个请求。我们先来配置web.xml。
web.xml:
<?
xml version="1.0" encoding="UTF-8"?><
web-app id="WebApp_ID" 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>test</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>test</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <display-name>SpringTest
</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list></
web-app>在这里,我们给DispatcherServlet取名为test,那么,在WEB-INF下,应该有一个名为test-servlet.xml的配置文件。所有以.do结尾的请求将会由test-servlet来分发处理。
然后,我们来写一个简单的index.jsp:
<%@
page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%><!
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><
html><
head><
meta. http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><
title>Index Page</title></
head><
body><
center><
form. action="home.do" method="post">Name:
<input type="text" name="name" /><br/><
input type="submit" value="Submit" /></
form></
center></
body></
html>这里就是一个简单的form,提交一个name属性。需要注意这里的action,是以.do结尾的,跟Struts很像,不过并没有以"/"开头。
然后,我们来写一个控制器来处理这个请求。
HomeController.java:
package
src;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 HomeController implements Controller{ private String greeting; public String getGreeting() { return greeting;}
public void setGreeting(String greeting) { this.greeting = greeting;}
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception{ greeting = request.getParameter("name"); return new ModelAndView("home", "message", greeting);}
}
Spring的控制器要求返回一个ModelAndView对象,即需要返回一个视图或其逻辑名称。其中包含了处理后的一些数据。这里的数据就是简单的返回一个name属性。在return语句中,new ModelAndView()有三个参数,第一个参数是返回视图的逻辑名称,第二个是该视图中的一个变量,第三个是该变量的值。我们将index.jsp中的name传递给了home视图中的message变量。
下面就是test-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 name="/home.do" class="src.HomeController"> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/jsp/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean></
beans>这里我们采用的是InternalResourceViewResolver,prefix属性表示前缀为/WEB-INF/jsp/,suffix表示后缀为.jsp。那么,视图将会在符合这两个条件的情况下寻找跟ModelAndView中视图逻辑名一样的视图返回给用户。这里要返回的就是/WEB-INF/jsp/home.jsp。注意第一个bean,表示home.do请求由src.HomeController来处理。这个是Spring默认的映射方式即BeanNameUrlHandlerMapping。
下面就是写/WEB-INF/jsp/下的home.jsp了:
<%@
page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%><!
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><
html><
head><
meta. http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><
title>Home Page</title></
head><
body><
center><
h2>${message }</h2></
center></
body></
html>我们将这个jsp作为一个视图,同时显示出message这个值,这个例子就完成了。