Spring的Web应用框架也是一个基于web容器的一个框架,因此作为一个Servlet应用运行在容器中,实际上也就是一个普通的web应用,本文已Tomcat5.59版本容器为例来看Spring(V1.21)的配置和应用.
在Spring Web框架中一般我们要提供三样东西:一个是自己的表示层页面,可以是velocity,xslt,freemarker,jasperreports等资源,一个是值对象类,再一个就是控制器,在这个类的子类中提供我们自己的业务功能,比如扩展了SimpleFormController类的控制器处理表单数据. Spring提供了多种控制器拱扩展,我们需要覆盖这些类中的:
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response);
protected ModelAndView onSubmit(Object cmd, BindException ex)throws Exception
protected ModelAndView onSubmit(HttpServletRequest request,HttpServletResponse response,
Object cmd,BindException ex)
如果两个onSubmit同时出现在类中,则参数多的那个具有较高的调用优先级.
首先,创建一个简单的控制类LoginAction ,它扩展Spring框架提供的SimpleFormController 类:
public class LoginAction extends SimpleFormController {
private String fail_view;
private String success_view;
protected ModelAndView onSubmit(Object vo, BindException ex)throws Exception {
LoginInfo loginInfo = (LoginInfo) vo;
if (login(loginInfo) == 0) {
HashMap result_map = new HashMap();
result_map.put("logininfo", loginInfo);
return new ModelAndView(this.getSuccess_view());
} else {
return new ModelAndView(this.getFail_view());
}
}
private int login(LoginInfo loginInfo) {
if ("user".equalsIgnoreCase(loginInfo.getUsername())
&& "password".equals(loginInfo.getPassword())) {
return 0;
}
return 1;
}
public String getFail_view() {
return fail_view;
}
public String getSuccess_view() {
return success_view;
}
public void setFail_view(String string) {
fail_view = string;
}
public void setSuccess_view(String string) {
success_view = string;
}
}
通过覆盖父类中的onSubmit方法,我们提供了自己的认证功能,它接受的vo参数是一个用户信息类,这个类中的信息由Spring框架根据客户发来的请求对象中的信息填充,并通过调用LoginAction类对象的onSubmit方法传递给我们的业务方法进行处理.那个值对象定义如下:
public class LoginInfo {
private String username;
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
现在,该是编写表示层的时候了,由三个页面组成:login.htm,index.jsp和loginfail.jsp.
登录页面login.htm
<html>
<body>
<p align="center">登录</p>
<form method="POST" action="login.do">
<br>
用户名:
<input type="text" name="username" >
<br>
密 码 :
<input type="password" name="password" >
<br>
<p>
<input name="submit" type="submit" value="提交" >
<input name="reset" type="reset" value="重置">
</p>
</form>
</body>
</html>
主页面index.jsp
<%@page import="com.web.spring.*"%>
<html>
<body>
<jsp:useBean id="logininfo" scope="request" type="com.web.spring.LoginInfo"/>
<p>Login Success!!!</p>
<p>Current User:
<jsp:getProperty name="logininfo" property="username"/>
</p>
</body>
</html>
loginfail.jsp,只是向你报告登录失败.
<html>
<body>
<p>Login Failure!!!</p>
</body>
</html>
Spring需要的三样资源都提供完毕了,如何装配呢,利用一个xml文件,这个文件的文档类型在http://www.springframework.org/dtd/spring-beans.dtd 中定义,Spring的IOC容器实现知道如何处理其中定义的各个元素.这个配置文件命名为config.xml,名字可以任意取,但必须在web描述符文件中指定见下文.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!--定义一个视图解析器,用于把输出结果与输出界面相融合,为表现层提供呈现资源;viewClass属性的值还可以是org.springframework.web.servlet.view.freemarker.FreeMarker,
org.springframework.web.servlet.view.velocity.VelocityView,这个例子用的是JstlView,处理jsp页面,通过这种方式,Spring的Web框架提供了利用多种表现层技术的方式.属性prefix告诉Spring资源来自哪里,suffix告诉Spring要处理的是哪类资源.
-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass">
<value>org.springframework.web.servlet.view.JstlView</value>
</property>
<property name="prefix">
<value>WEB-INF/view/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<!--影射请求的URL到对应的控制器 -->
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="login.do">LoginAction</prop>
</props>
</property>
</bean>
<!---控制器定义-->
<bean id="LoginAction" class="com.web.spring.LoginAction">
<property name="commandClass">
<!-- 由LoginAction处理的VO资源 -->
<value>com.web.spring.LoginInfo</value>
</property>
<!-- 登录失败 将处理的资源 :WEB-INF/view/loginfail.jsp -->
<property name="fail_view">
<value>loginfail</value>
</property>
<!-- 登录失败 将处理的资源 :WEB-INF/view/index.jsp -->
<property name="success_view">
<value>index</value>
</property>
</bean>
</beans>
这个配置文件定义了三个bean,全都被Spring的IOC容器管理.
最后,看看它的web描述符文件web.xml.
<?xml version="1.0" encoding="ISO-8859-1" ?>
<web-app 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" version="2.4">
<servlet>
<servlet-name>Dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/conf/config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
这个配置文件即可把Spring纳入到容器中,使你能利用到它的功能.其中在<init-param>节点中配置了名为“contextConfigLocation”指定了Spring的配置文件为:/WEB-INF/conf/config.xml,如果不提供这个参数将使用默认配置文件:/WEB-INF/<servlet name>-servlet.xml,在本例中servlet name元素的值是Dispatcher 所以默认配置文件是:Dispatcher-servlet.xml.
到此,在演示了IOC容器的类型2使用方式的同时,一个简单的纯Spring MVC Web框架的Web应用也介绍完了,复制这里的例子文件可以运行它,需要保证lib下至少有4个库:spring.jar,log4j-1.2.9.jar,jstl.jar,standard.jar.