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
< 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文件,这个文件的文档类型在 中定义,Spring的IOC容器实现知道如何处理其中定义的各个元素.这个配置文件命名为config.xml,名字可以任意取,但必须在web描述符文件中指定见下文.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"""><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="" xmlns:xsi="" xsi:schemaLocation="" 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.
原文链接: