注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

我的博客

学如逆水行舟,不进则退!

 
 
 

日志

 
 
关于我

我崇拜伟人,但我从不追逐伟人,因为自知没有那么开阔的步伐!

网易考拉推荐

用Spring MVC轻松进行应用程序开发  

2007-01-03 11:45:42|  分类: 学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

     最近正在学习spring,在网上找到一篇入门及的文章,觉得不错,转过来以做备份.在此要感谢文章的原始创作者及各位转贴朋友.

    一 开发环境
首先需要JDK 1.4以上,Tomcat 4.0以上的版本, 到http://www.springframework.org/ 下载spring-framework-1.2.7-with-dependencies.zip. 这是Spring 1.2.7的版本. 下载完Spring后解压,把里面的spring.tld拷贝到您项目的WEB-INF目录下,把commons-logging.jar,jstl.jar,log4j-1.2.13.jar,spring.jar,standard.jar拷贝到您项目的lib目录下.
  
二 背景知识
1 需要您了解Java, JSP的技术和Spring依赖注射(IOC)的概念。

2Spring MVC框架简介  
  Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还是 Struts 这样的 Web 框架。通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iText 和 POI。Spring MVC 框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
  
  Spring 的 Web MVC 框架是围绕 DispatcherServlet 设计的,它把请求分派给处理程序,同时带有可配置的处理程序映射、视图解析、本地语言、主题解析以及上载文件支持。默认的处理程序是非常简单的 Controller 接口,只有一个方法 ModelAndView handleRequest(request, response)。Spring 提供了一个控制器层次结构,可以派生子类。如果应用程序需要处理用户输入表单,那么可以继承 AbstractFormController。如果需要把多页输入处理到一个表单,那么可以继承 AbstractWizardFormController。
  
  示例应用程序有助于直观地学习这些特性。银行应用程序允许用户检索他们的帐户信息。在构建银行应用程序的过程中,可以学到如何配置 Spring MVC 框架和实现框架的视图层,视图层包括 JSTL 标记(用于显示输出的数据)和JavaServer Pages 技术。

三 开发步骤
1 配置 Spring MVC, 这需要写两个xml文件.
清单一.  WEB-INF /web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "
http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <servlet>
    <servlet-name>sampleBanking</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>sampleBanking</servlet-name>
    <url-pattern>*.htm</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <taglib>
    <taglib-uri>/spring</taglib-uri>
    <taglib-location>/WEB-INF/spring.tld</taglib-location>
  </taglib>
</web-app>  
 
说明: 这个文件首先配置 Spring MVC 的 DispatcherServlet。把所有*.htm的URL请求转到DispatcherServlet来处理.请注意<servlet-name>这个tag,这个servlet-name也暗示了Spring配置文件的名称. 按照这个例子的定义,这个servlet-name是sampleBanking, 相应的Spring配置文件就是sampleBanking-servlet.xml。DispatcherServlet是根据sampleBanking-servlet.xml里面的定义来运作的. Spring没有象Struts那样容易学习,是最拐弯抹角的架构(可能是为了实现松偶合,没办法呀),连一个配置文件的名称都需要到web.xml里面去找一下,不像Struts就是通过固定的struts-config.xml定义的.
  
清单二.  WEB-INF /sampleBanking-servlet.xml  
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "
http://www.springframework.org/dtd/spring-beans.dtd">
<!--  - Application context definition for "springapp" DispatcherServlet.  -->
<beans>
      <bean >
      </bean>
 
      <bean >
      </bean>
 
      <bean >
       <property ><value>true</value></property>
        <property ><value>loginCommand</value></property>
        <property ><value>springexample.commands.LoginCommand</value></property>
       <property >
              <ref bean="authenticationService" />
       </property>
       <property >
              <ref bean="accountServices" />
       </property>
       <property ><value>login</value></property>
       <property ><value>accountdetail</value>
       </property>
      </bean>
 
      <bean >
           <property >
            <props>
           <prop key="/login.htm">loginBankController</prop>
            </props>
           </property>
      </bean>
 
      <bean >
        <property ><value>org.springframework.web.servlet.view.JstlView</value></property>
        <property ><value>/WEB-INF/jsp/</value></property>
        <property ><value>.jsp</value></property>
      </bean>
</beans>

说明:
1 这个Spring的配置文件,一开始定义了3个用户JavaBean。然后通过urlMapping定义了一个url映射,规定当有“/login.htm”的URL请求时候,系统将用springexample.contoller.LoginBankController这个JavaBean来处理。
2 <bean >这个tag主要来定义寻找view文件的. 目前定义了view文件的前缀是"/WEB-INF/jsp/",后缀是".jsp".

2 commands包:这个包里有四个文件. 主要是MVC架构里的Model层的类
清单三: src\springexample\commands\User.java  
package springexample.commands;

/**
 * @author naveenb
 */
public class User {
 
 private String userId;
 private String firstName;
 private String lastName;
 //Address and so on.
 
 /**
  * @return Returns the firstName.
  */
 public String getFirstName() {
  return firstName;
 }
 /**
  * @param firstName The firstName to set.
  */
 public void setFirstName(String firstName) {
  this.firstName = firstName;
 }
 /**
  * @return Returns the lastName.
  */
 public String getLastName() {
  return lastName;
 }
 /**
  * @param lastName The lastName to set.
  */
 public void setLastName(String lastName) {
  this.lastName = lastName;
 }
 /**
  * @return Returns the userId.
  */
 public String getUserId() {
  return userId;
 }
 /**
  * @param userId The userId to set.
  */
 public void setUserId(String userId) {
  this.userId = userId;
 }
}

清单四:src\springexample\commands\Account.java
package springexample.commands;
import java.math.BigDecimal;

/**
 * @author naveenb
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class Account {
 
 private String accountName;
 private String accountType;
 private BigDecimal accountbalance;
 private String accountNumber;
 

 /**
  * @return Returns the accountbalance.
  */
 public BigDecimal getAccountbalance() {
  return accountbalance;
 }
 /**
  * @param accountbalance The accountbalance to set.
  */
 public void setAccountbalance(BigDecimal accountbalance) {
  this.accountbalance = accountbalance;
 }
 /**
  * @return Returns the accountName.
  */
 public String getAccountName() {
  return accountName;
 }
 /**
  * @param accountName The accountName to set.
  */
 public void setAccountName(String accountName) {
  this.accountName = accountName;
 }
 /**
  * @return Returns the accountType.
  */
 public String getAccountType() {
  return accountType;
 }
 /**
  * @param accountType The accountType to set.
  */
 public void setAccountType(String accountType) {
  this.accountType = accountType;
 }
 /**
  * @return Returns the accountNumber.
  */
 public String getAccountNumber() {
  return accountNumber;
 }
 /**
  * @param accountNumber The accountNumber to set.
  */
 public void setAccountNumber(String accountNumber) {
  this.accountNumber = accountNumber;
 }
}

清单五:src\springexample\commands\AccountDetail.java
package springexample.commands;

import java.util.List;

/**
 * @author naveenb
 */

public class AccountDetail {
 
 private List accountsList;
 
 private User user;
 
 /**
  * @return Returns the accountsList.
  */
 public List getAccountsList() {
  return accountsList;
 }
 /**
  * @param accountsList The accountsList to set.
  */
 public void setAccountsList(List accountsList) {
  this.accountsList = accountsList;
 }
 /**
  * @return Returns the user.
  */
 public User getUser() {
  return user;
 }
 /**
  * @param user The user to set.
  */
 public void setUser(User user) {
  this.user = user;
 }
}

清单六:src\springexample\commands\LoginCommand.java
package springexample.commands;

/**
 * @author naveenb
 * LoginCommand for Login Controller.
 */

public class LoginCommand {

 public LoginCommand(){
  
 }
 
 private String userId;

 private String password;
 
 /**
  * @return Returns the password.
  */
 public String getPassword() {
  return password;
 }
 /**
  * @param password The password to set.
  */
 public void setPassword(String password) {
  this.password = password;
 }
 /**
  * @return Returns the userId.
  */
 public String getUserId() {
  return userId;
 }
 /**
  * @param userId The userId to set.
  */
 public void setUserId(String userId) {
  this.userId = userId;
 }
}

3 services包:这个包里有2个文件. 主要是Business logic的类
清单七:src\springexample\services\AuthenticationService.java
package springexample.services;

import springexample.commands.LoginCommand;

/**
 * @author naveenb
 */
public class AuthenticationService {
 
 public AuthenticationService(){
  
 }
 
 public int authenticate(LoginCommand command) throws Exception{
  
  //Check with some dummy data.
  if(command.getUserId()!= null && command.getUserId().equalsIgnoreCase("admin")
    && command.getPassword()!= null && command.getPassword().equalsIgnoreCase("password")){ 
  
   System.out.println("Login sucessful");
   return 1;
  }else{
   System.out.println("Login Failed");
   return -1;
  }
 }
}

清单八:src\springexample\services\AccountServices.java
package springexample.services;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import springexample.commands.Account;
import springexample.commands.AccountDetail;
import springexample.commands.User;


/**
 * @author naveenb
 */
public class AccountServices {
 
 public AccountServices(){  
 }
 
 public AccountDetail getAccountSummary(String userId){
  
  //Return some dummy data
  AccountDetail accountDetail = new AccountDetail();
  
  Account account1 = new Account();
  account1.setAccountType("Checking");
  account1.setAccountName("Bob Checking Account");
  account1.setAccountNumber("1111111-C123");
  account1.setAccountbalance(new BigDecimal(5000.00));
  
  Account account2 = new Account();
  account2.setAccountType("Checking");
  account2.setAccountName("Bob Saving Account");
  account2.setAccountNumber("1111111-S123");
  account2.setAccountbalance(new BigDecimal(15000.00));
  
  
  List arrayList = new ArrayList();
  arrayList.add(account1);
  arrayList.add(account2);
  
  accountDetail.setAccountsList(arrayList);
  
  User user = new User();
  user.setUserId(userId);
  user.setFirstName("Bob");
  user.setLastName("Simpson");
  
  return accountDetail;
 }
}

3 contoller包:这个包里有1个文件. 主要是MVC架构里的Controll层的类
清单九:src\springexample\contoller\LoginBankController.java
package springexample.contoller;

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

import springexample.commands.AccountDetail;
import springexample.commands.LoginCommand;
import springexample.services.AccountServices;
import springexample.services.AuthenticationService;

/**
 * @author naveenb
 */
public class LoginBankController extends SimpleFormController {
 
 public LoginBankController(){ 
 } 
 
 protected ModelAndView onSubmit(Object command) throws Exception{
  
  LoginCommand loginCommand = (LoginCommand) command;
  int flag=authenticationService.authenticate(loginCommand);
  if(flag==1)
  {
   AccountDetail accountdetail = accountServices.getAccountSummary(loginCommand.getUserId());
   return new ModelAndView(getSuccessView(),"accountdetail",accountdetail);
  }
  else
  {
   return new ModelAndView("error");
  }
 }
 
 private AuthenticationService authenticationService;
 
 private AccountServices accountServices;
 
 /**
  * @return Returns the accountServices.
  */
 public AccountServices getAccountServices() {
  return accountServices;
 }
 /**
  * @param accountServices The accountServices to set.
  */
 public void setAccountServices(AccountServices accountServices) {
  this.accountServices = accountServices;
 }
 /**
  * @return Returns the authenticationService.
  */
 public AuthenticationService getAuthenticationService() {
  return authenticationService;
 }
 /**
  * @param authenticationService The authenticationService to set.
  */
 public void setAuthenticationService(
   AuthenticationService authenticationService) {
  this.authenticationService = authenticationService;
 }
}

4 View层的文件
清单十:\WEB-INF\jsp\login.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="spring" uri="/spring" %>

<html><head>
<title>Login to Spring Example Account Banking</title></head>

<body>

<h1>Please enter your userid and password.</h1>

<p><form method="post">
<spring:bind path="loginCommand">
<c:forEach items="${status.errorMessage}" var ="errorMessage">
<font color="red">
<c:out value ="${errorMessage}"/><br>
</font>
</c:forEach>
</spring:bind>


<table width="95%" bgcolor="f8f8ff" border="0" cellspacing="0" cellpadding="5">
<tr>
<td alignment="right" width="20%">User id:</td>
<spring:bind path="loginCommand.userId">
<td width="20%">
<input type="text" value="${status.expression}"/>" value="<c:out value="${status.value}"/>">
</td>
</spring:bind>
<td width="60%">
</tr>

<tr>
<td alignment="right" width="20%">Password:</td>
<spring:bind path="loginCommand.password">
<td width="20%">
<input type="password" value="${status.expression}"/>" value="<c:out value="${status.value}"/>">
</spring:bind>
</td>
<td width="60%">
</tr>

</table>
<br>
<br>
<input type="submit" alignment="center" value="login">
</form>
</p>

</body>
</html>

清单十一:\WEB-INF\jsp\accountdetail.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="spring" uri="/spring" %>

<html><head>
<title>Login to Spring Example Account Banking</title></head>

<body>

<h1>Account Details</h1>

<p><form method="post">
<spring:bind path="accountdetail">
<c:forEach items="${status.errorMessage}" var ="errorMessage">
<font color="red">
<c:out value ="${errorMessage}"/><br>
</font>
</c:forEach>
</spring:bind>

<table width="95%" bgcolor="f8f8ff" border="0" cellspacing="0" cellpadding="5">
Following are the list of your accounts and its details.
<c:forEach items="${accountdetail.accountsList}" var ="accountsList">
<tr>
<td alignment="right" width="20%">Account Name: <c:out value ="${accountsList.accountName}"/></td>
<td alignment="right" width="20%">Account Type: <c:out value ="${accountsList.accountType}"/></td>
<td alignment="left" width="20%">Account Number: <c:out value ="${accountsList.accountNumber}"/></td>
<td alignment="right" width="20%">Account Balance: <c:out value ="${accountsList.accountbalance}"/></td>
<td width="60%">
</tr>
<tr>
</tr>
</c:forEach>
</table>
<br/>
<a href="/springbanking/login.html">logout</a>
</body>
</html>

清单十二:\WEB-INF\jsp\error.jsp
<html><head>
<title>Error</title></head>

<body>

<h1>Your user id or password invalid!</h1>

</body>
</html>

程序使用方法:用上面的源文件编译好项目,然后部署,例如部署在WebApps\SpringMVC目录下,启动Tomcat,在IE的地址栏输入http://localhost:8080/SpringMVC/login.htm,系统会出现用户登陆界面,user id框里输入admin,password框里输入password,然后提交,系统会出现这个账户的信息界面. 如果用户名,密码输错,系统跳到出错页面.

程序运作原理:要理解这个Spring MVC的运作过程最重要是要理解Spring配置文件sampleBanking-servlet.xml里面的<bean >和<bean >这两个tag,<bean >告诉你当有"/login.htm"的URL请求的时候,系统将调用bean id是loginBankController的JavaBean,再通过查找bean id查找,我们才知道bean id是loginBankController的JavaBean是类springexample.contoller.LoginBankController的实例.

<bean >tag定义了springexample.contoller.LoginBankController运行时候需要的参数,下面是这个bean的完整定义.

   <bean >
 <property ><value>true</value></property>
        <property ><value>loginCommand</value></property>
        <property ><value>springexample.commands.LoginCommand</value></property>
 <property >
  <ref bean="authenticationService" />
 </property>
 <property >
  <ref bean="accountServices" />
 </property>
 <property ><value>login</value></property>
 <property ><value>accountdetail</value>
 </property>
   </bean>
上面这个bean tag通过<property>子tag完成依赖注射.然后loginBankController首先把<property >里面的view显示给用户,这个例子里面是login这个view,然后根据<bean >这个tag解析出这个view的具体路径是/WEB-INF/jsp/login.jsp.

当用户输入了用户名和password,按了提交后,系统仍然把控制交给loginBankController,这次系统首先调用这个bean里面的onSubmit方法,让这个方法做一些业务逻辑,然后由这个方法决定再转到哪个view.在这个例子里首先检查用户名,密码是否正确, 如果用户输入正确就去获得账号信息,再转到显示账户信息的页面;如果错误则转到出错页面.

 


  评论这张
 
阅读(225)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017