Chinaunix首页 | 论坛 | 博客
  • 博客访问: 102468
  • 博文数量: 51
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 580
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-05 16:28
文章分类

全部博文(51)

文章存档

2009年(51)

我的朋友

分类:

2009-01-06 17:52:26

MVC是Model,View,Controller的缩写,MVC是Application开发的设计模式,也就是大家所知道的Model2.在MVC的设计模式中,要求在Application开发中你把商业逻辑,界面显示,数据分离。也就是分别在Model,View,Controller实现:数据,控制(商业逻辑),显示(页面显示).
  
  在以前或者说传统的Web Application开发方式当中,如Asp,Php,Jsp(Model 1)开发当中,我们在Asp(Php,Jsp)中实现一切,如:从数据库中取到我们需要的数据,并根据数据之间的关联和实际的需要按照某种方式把他显示在页面中以及从页面提交的表单中提取数据,根据商业逻辑从数据库查询相关数据,或者把数据写入数据库。也就是说我们在Asp(Php,Jsp)实现一切包括:界面显示,商业逻辑,数据存取。这样带来的后果就是你所写的Asp(Php,Jsp)没有层次,并且Html和Script(JavaScript、JScript,Asp、Php、Jsp源代码)相互嵌套.可维护性差,最要命的是在Web Application通常显示一块是由美工完成的,很多时候也是你先写好Asp、Php、Jsp然后美工进行美化,很有可能你发现经过美工处理完以后你的代码已经面目全非了。你不得不把你的代码重新组织。
  在MVC模式中这个问题的解决办法是:View中负责显示,View一般从Controller得到已经处理过的数据,然后显示在页面当中,应该说这样在Html中嵌套很少的Script.基本上美工的修改不大会废掉你的劳动成果。
  在使用Java开发Web Application有几种符合MVC设计模式的开发方式让你选择。
  1:Jsp+Servlet+JavaBean(EJB)
  2:Jsp+JavaBean(Controller)+JavaBean(EJB)(Model)
  3:TDK(Turbine,Velocity...)
  4:Xsp
  5:Jsp+Struts+JavaBean(EJB)
  我个人认为后面两种比较好,其他几种都有可取的地方特别是使用TDK因为有一个比较好的工具可以自动生成很多代码,至于它的缺点在后面几种开发方式的比较当中我会介绍。
  
  Struts1.1的新功能
  Struts1.1与1.0相比加了一些很不错的功能。最主要是表单验证上功能增强。在Struts1.1数据的验证不象以前在Action中在validator具体实现,而是在validation.xml通过配置实现这样做的好处就是重用性加强了很多。
  
  Struts1.1实现的主要组成
  主要包括:Action,ActionForm,ActionMapping,ActionForward,开发当中最主要写的是Action,ActionForm根据需要可以写或不写。下面我就一一具体介绍。
  Action
  An Action is an adapter between the contents of an incoming HTTP request and the corresponding business logic that should be executed to process this request.
  上面是Struts开发小组对Action的描述,说Action实际上Request和Business Logic中间的适配器.通俗的说就是从表单中取到数据并穿给商业逻辑操作进行一系列的操作,然后返回相应的操作信息。
  
  ActionForm
  An ActionForm is a JavaBean optionally associated with one or more ActionMappings. Such a bean will have had its properties initialized from the corresponding request parameters before the corresonding action's execute() method is called.
  ActionForm实际上就是把从Request取到的数据封装并进行校验,然后把合法的数据给Action进行处理。实际上ActionForm除了进行数据校验之外另外更重要的是在表单回写的时候作用很大。反而在1.1以后数据校验的大部分工作在validation.xml去实现。
  
  ActionMapping,ActionForward
  ActionMapping主要是用与配置和描述相关属性使用的。先看下在struts-config.xml
  中的配置文件一段配置描述:
  
  
    type="com.bingo.finance.action.UseregAction"
  name="useregForm"
  scope="request"
  validate="true"
  input="/usereg.jsp">
  
  
  

  ActionMapping就是用来描述一个Action的URL、具体实现的文件、相对应的ActionForm 数据属性(request or session)、是否需要进行数据校验和回写、以及处理完成后可能跳转的URL.
  而ActionForward你就可以理解为Action 操作完成后的跳转URL,Action在处理完相关操作后,返回的是一个ActionForward也就是告诉Struts我做完这个操作下一步到哪儿去。
  
  构建Struts1.1运行环境
  我的配置是居于Tomcat4.0以上版本讨论,其他的AppServer大致相同。
  
  1:得到Struts1.1
  
  
  2:设置
  把Struts.jar Copy到$Tomcat_home/common/lib 或你使用Struts的Appaction下的WEB-INF/lib下
  在你使用Struts的Appaction下web.xml中增加下列配置
  
  <servlet>
  action
  org.apache.struts.action.ActionServlet
  
  config
  /WEB-INF/struts-config.xml
  

  
  debug
  3
  

  
  detail
  3
  

  2
  servlet>
  
  
  /WEB-INF/struts-html.tld
  /WEB-INF/struts-html.tld
  

  
  
  /WEB-INF/struts-logic.tld
  /WEB-INF/struts-logic.tld
  

  
  
  
  /WEB-INF/struts-nested.tld
  /WEB-INF/struts-nested.tld
  

  
  
  
  /WEB-INF/struts-template.tld
  /WEB-INF/struts-template.tld
  

  Struts1.1中提供了很详细的例子,你可以仔细看看.
  接下来你该根据需要配置struts-config.xml,以下是一个简单的例子
  
  
    "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
  "">
  
  
  
  
  
  
  
    type="com.bingo.finance.action.UserForm"/>
  
  

  
  
  
  
  

  
  
  
  
  
    type="com.bingo.finance.action.UseregAction"
  name="useregForm"
  scope="request"
  validate="true"
  input="/usereg.jsp">
  
  
  

  
  
  
    parameter="com.bingo.finance.common.DisplayMsg"/>
  
  
  
  
  
  
  
  

  
  

  上面的英文我相信你能够看懂。我就不做解释了。你需要继续配置validation.xml了,看如下
  简单的例子.
  
  
  
    depends="required,mask,minlength,maxlength">
  
 
现在我来总结一下就是: jsp,struts的东西:(action,actionForm,actionMapping,actionForward)这个以前使用servlet来代替的,
   (在 web.xml中引入,struts-config.xml,然后在写 struts-config.xml,validate.xml)),
我们需要注意的是,当我们我struts1.1.jar包导入我们的web-inf/lib下面时,这是引入struts的一种方法,我们还可以把这个struts1.1.jar放在$Tomcat_home/common/lib 下面,这是我以前没有用到的地方。我有一点感觉就是其实这个所谓的action 就是一中servlet,因为在web.xml中配置的时候写的是<servlet>
 

       
          
                                 depends="required,mask,minlength,maxlength">
                      
                      
                      
                         
                           mask
                           ^w+$
                         

                         
                           minlength
                           5
                         

                         
                           maxlength
                           20
                         

             
                                 depends="required,mask,minlength,maxlength">
                      
                      
                      
                         
                           mask
                           ^w+$
                         

                         
                           minlength
                           5
                         

                         
                           maxlength
                           20
                         

             
                                 depends="required,mask,minlength,maxlength">
                      
                      
                      
                         
                           mask
                           ^w+$
                         

                         
                           minlength
                           5
                         

                         
                           maxlength
                           20
                         

             
                                 depends="required,mask,minlength,maxlength">
                      
                      
                      
                         
                           mask
                           ^w+$
                         

                         
                           minlength
                           10
                         

                         
                           maxlength
                           20
                         

             
          
       

     

     上面validation.xml就是告诉Struts我的useregForm取到的数据应该做下面的验证
     username是必须不能为空的并且最小长度为5,最大长度是20.
     ................
     password,nickname,superpass基本一样我就不做更多说明.至次配置基本结束,我们要开始写第一个Struts 了。
开发Struts1.1
    
     usereg.jsp
     为了考虑页面的灵活性,在页面中显示的所有元素我都放在properties文件中并由com.bingo.finance.common.HtmlMsg这个文件取到.
     ===================================================================
     <%@ page contentType="text/html;charset=GBK" %>
    <%@ page import="java.io.*"%>
    <%@ page import="com.bingo.finance.common.HtmlMsg"%>
    <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
    <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
    <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>

    
    
    <%=HtmlMsg.TITLE_REGISET%>
    
    
    
    
    
    
      
        
          <%=HtmlMsg.TITLE_REGISET%>
        
        
          <%=HtmlMsg.COMMON_USERNAME%>:
          
            
            
          
        
        
          <%=HtmlMsg.COMMON_PASSWORD%>:
          
            
          
        
        
          <%=HtmlMsg.COMMON_NICKNAME%>:
          
            
          
        
        
          <%=HtmlMsg.COMMON_SUPERPASS%>:
          
            
          
        
        
          
            ">
          
          
            ">
          
        
      
    
    
    
     
     
     UseregActiom.java
     ===========================================================
     package com.bingo.finance.action;

    //java import
    import java.io.IOException;
    import java.util.Locale;
    
    //servlet import
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpSession;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    //struts import
    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
    import org.apache.struts.util.MessageResources;
    
    //finance import
    import com.bingo.finance.action.UserForm;
    import com.bingo.finance.manager.UserManager;
    import com.bingo.finance.entity.User;
    
    public class UseregAction extends Action {
        //在Struts1.1以前使用perform
        //struts1.1使用execute替代perform
        public ActionForward execute(ActionMapping mapping,
                     ActionForm form,
                     HttpServletRequest request,
                     HttpServletResponse response)
        throws IOException, ServletException {
            try{
                UserForm userForm=(UserForm)form;
                UserManager userManager=new UserManager();
                User     user=userManager.formToEntity(userForm);        
                userManager.add(user);
                //Insert into DataBase a Userinfo
            }catch(Exception ex){
                return mapping.findForward("error");
            }
            return mapping.findForward("success");
            //ForWard is "/msg.jsp"
        }
    }
    
    UserForm.java
    =========================================================================
    package com.bingo.finance.action;
    import java.util.*;
    import java.io.Serializable;
    //servlet import
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpSession;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    //struts import
    import org.apache.struts.action.ActionMapping;
    import org.apache.struts.validator.ValidatorForm;
    public class UserForm extends ValidatorForm implements Serializable{
    //在Struts1.1以前通常Form继承ActionForm
    //实际上ValidatorForm是继承ActionForm
    //为什么要加一层ValidatorForm是为了校验而做的

        private String  id;
        private String  username;
        private String  password;
        private String  nickname;
        private String  superpass;
    
    
        public UserForm(){
    
        }
    
        /****/
        public String  getId(){
            return this.id;
        }
    
        /****/
        public  void setId(String  _id){
            this.id=_id;
        }
    
        /****/
        public String  getUsername(){
            return this.username;
        }
    
        /****/
        public  void setUsername(String  _username){
            this.username=_username;
        }
    
        /****/
        public String  getPassword(){
            return this.password;
        }
    
        /****/
        public  void setPassword(String  _password){
            this.password=_password;
        }
    
        /****/
        public String  getNickname(){
            return this.nickname;
        }
    
        /****/
        public  void setNickname(String  _nickname){
            this.nickname=_nickname;
        }
    
        /****/
        public String  getSuperpass(){
            return this.superpass;
        }
    
        /****/
        public  void setSuperpass(String  _superpass){
            this.superpass=_superpass;
        }
    
        /**show this class info**/
        public String toString(){
            StringBuffer info=new StringBuffer();
            info.append("....id is:"+id);
            info.append("....username is:"+username);
            info.append("....password is:"+password);
            info.append("....nickname is:"+nickname);
            info.append("....superpass is:"+superpass);
            return info.toString();
        }
    
        public void reset(ActionMapping mapping, HttpServletRequest request) {
               id=null;
            username=null;
            password=null;
            nickname=null;
            superpass=null;
        }
    }
  
    UserManager.java ,User.java文件我就不提供了,这一部分在实际的开发当中根据需要自己去处理,也就是为了把数据插入数据库。
    现在一个简单的注册用户你就开发完成了。很简单吧。呵呵,继续努力...但其中还有很多 细节你需要进一步了解,我只把你领到门了,你必须自己去研究一些东西,比如说,我希望我的用户多一个Email字段和一个年龄字段我应该如何做,而且我希望validation.xml的验证有Email合法验证,年龄必须大于0而且一定是整数。那我应该如何做?我只能告诉你加两个字段你需要修改Form 增加字段,同时相应文件也要修改。在struts中Email的验证非常简单。好好看例子吧,好好研究validator-rules.xml,这个我认为struts1.1最好的功能增加(Struts1.0没有这个文件)。Struts中提供了一个非常灵活而且重用极高的验证机制。

Struts和其他开发方式的比较
    使用Struts开发至少带来如下好处:
    1:层次结构非常清晰,也使得分工很明确。
    2:重用度很高,连数据验证都可以重用,还有一个更好的重用就是Form,Action是可以很好的重用的。
    3:可维护性好。这是居于第一点的。
    .................
    下面我说一个Struts的不足之处,如果你使用或者了解TDK你就会觉得,TDK中可以自动生成很多java源代码的确可以节省不少工作量,Struts中也可以做的很好。我自己开发了一个工具,功能还不够强大。在我的计划当中,我希望Form,JavaBean(封装数据相当于EJB中的Entity Bean),甚至包括操作数据库的Method都自动生成,还有validation.xml也可以动态的生成。然而因为下一个原因:Struts到目前为止还不是一个比较成熟的项目。他的改动实在是太大了。1.0和0.5就有很大的改动。所以我的计划有变。我希望在1.1完全推出来再做开发(1.1现在是Beta版))。同时我也给Craig R. McClanahan(Struts开发的Team leader)写过信听取他的建议 .
开发J2ee项目的时候,jsp页面提交到action,没用struts之前,post="/servletUrl",用了 struts1.1之后 是 post="actionName.do"
 
阅读(1168) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~