(Struts重构)构建一个简单的基于MVC模式的JavaWeb

构建一个简单的基于MVC模式的JavaWeb 中,我们使用了JSP+Servlet+JavaBean构建了一个基于MVC模式的简单登录系统,但在其小结中已经指出,这种模式下的Controller 和 View有紧密的耦合度,因为在Controller代码中夹杂了组件部份的名称!
那么在这一篇我,我再改用Struts框架来构建这个系统,要注意的是,构建Struts应用程序时,一般不用自己去写中心控制器ActionServlet代码,因为ActionServlet是Struts框架的一个内置组件。但我们需要编写ActionForm和Action等组件的代码。
开发步骤如下:
Step1:设计数据表,与构建一个简单的基于MVC模式的JavaWeb 里面的表相同。
Step2:构建JSP页面,注意要把JSP中的HTML梅花鹿改为Struts特有的标记。
Step3:构建ActionForm,ActionForm其实是一个JavaBean,可以手工编写它,也可以使用工具生成!
Step4:构建Action,可以手工编写,也可以用工具!
Step5:构建模型组件和数据访问组件,与构建一个简单的基于MVC模式的JavaWeb 的相同!
Step6:构建Struts配置文件!
Step7:编译,打包,部署!

详细设计:
A:构建视图组件JSP页面,可以直接COPY构建一个简单的基于MVC模式的JavaWeb 中的三个页面,我们仅仅修改login.jsp页面,引入Struts标记,如下:

ExpandedBlockStart.gif ContractedBlock.gif <% dot.gif @ page language="java" pageEncoding="GBK" %>
ExpandedBlockStart.gifContractedBlock.gif
<% dot.gif @ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>  
ExpandedBlockStart.gifContractedBlock.gif
<% dot.gif @ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>  
None.gif
< html >  
None.gif    
< head >
None.gif        
< title > JSP for LoginHandlerForm form </ title >
None.gif    
</ head >
None.gif    
< body >
None.gif        
< html:form  action ="/loginHandler" >
None.gif            userName : 
< html:text  property ="userName" />< html:errors  property ="userName" />< br />
None.gif            userPwd : 
< html:text  property ="userPwd" />< html:errors  property ="userPwd" />< br />
None.gif            
< html:submit />< html:cancel />
None.gif        
</ html:form >
None.gif    
</ body >
None.gif
</ html >

B:构建数据访问组件,与 构建一个简单的基于MVC模式的JavaWeb 一样,COPY过来
C:构建模型组件LoginHanlder,与 构建一个简单的基于MVC模式的JavaWeb 一样,COPY!
D:构建ActionForm,代码如下:
ExpandedBlockStart.gif ContractedBlock.gif /**/ /*
InBlock.gif * Generated by MyEclipse Struts
InBlock.gif * Template path: templates/java/JavaClass.vtl
ExpandedBlockEnd.gif 
*/

None.gif
package  struts.form;
None.gif
None.gif
import  javax.servlet.http.HttpServletRequest;
None.gif
import  org.apache.struts.action.ActionErrors;
None.gif
import  org.apache.struts.action.ActionForm;
None.gif
import  org.apache.struts.action.ActionMapping;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/** */ /** 
InBlock.gif * Struts框架的ActionForm对象,它可用来在用户和业务层之间舆用户的输入数据。
InBlock.gif * ActionForm也叫FormBean.Struts框架会自动从请求中惧输入数据,再将 这些
InBlock.gif * 数据交给一个使用FormBean的Action对象,接着FormBean可以再交给业务层
ExpandedBlockEnd.gif 
*/

ExpandedBlockStart.gifContractedBlock.gif
public   class  LoginHandlerForm  extends  ActionForm  dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//*
InBlock.gif     * Generated fields
ExpandedSubBlockEnd.gif     
*/

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** *//** userName property */
InBlock.gif    
private String userName;
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** *//** userPwd property */
InBlock.gif    
private String userPwd;
InBlock.gif
InBlock.gif    
//验证方法,主要用于验证视图上的数据,例如非空之类,
InBlock.gif    
//如果要进行业务验证,则应该在Action中进行!
InBlock.gif
    public ActionErrors validate(ActionMapping mapping,
ExpandedSubBlockStart.gifContractedSubBlock.gif            HttpServletRequest request) 
dot.gif{
InBlock.gif        
InBlock.gif        
return null;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
//初始化首先调用的方法
ExpandedSubBlockStart.gifContractedSubBlock.gif
    public void reset(ActionMapping mapping, HttpServletRequest request) dot.gif{
InBlock.gif        
// TODO Auto-generated method stub
ExpandedSubBlockEnd.gif
    }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public String getUserName() dot.gif{
InBlock.gif        
return userName;
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public void setUserName(String userName) dot.gif{
InBlock.gif        
this.userName = userName;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public String getUserPwd() dot.gif{
InBlock.gif        
return userPwd;
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public void setUserPwd(String userPwd) dot.gif{
InBlock.gif        
this.userPwd = userPwd;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
E:构建Action
ExpandedBlockStart.gif ContractedBlock.gif /**/ /*
InBlock.gif * Generated by MyEclipse Struts
InBlock.gif * Template path: templates/java/JavaClass.vtl
ExpandedBlockEnd.gif 
*/
None.gif
package  struts.action;
None.gif
None.gif
import  java.util.ArrayList;
None.gif
None.gif
import  javax.servlet.http.HttpServletRequest;
None.gif
import  javax.servlet.http.HttpServletResponse;
None.gif
import  javax.servlet.http.HttpSession;
None.gif
None.gif
import  model.LoginHandler;
None.gif
None.gif
import  org.apache.struts.action.Action;
None.gif
import  org.apache.struts.action.ActionForm;
None.gif
import  org.apache.struts.action.ActionForward;
None.gif
import  org.apache.struts.action.ActionMapping;
None.gif
None.gif
import  struts.form.LoginHandlerForm;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
/** */ /** 
InBlock.gif * MyEclipse Struts
InBlock.gif * Creation date: 01-06-2007
InBlock.gif * 
InBlock.gif * XDoclet definition:
InBlock.gif * @struts.action path="/loginHandler" name="loginHandlerForm" input="/login.jsp" scope="request" validate="true"
ExpandedBlockEnd.gif 
*/

ExpandedBlockStart.gifContractedBlock.gif
public   class  LoginHandlerAction  extends  Action  dot.gif {
InBlock.gif
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** *//** 
InBlock.gif     * Method execute
InBlock.gif     * 
@param mapping
InBlock.gif     * 
@param form
InBlock.gif     * 
@param request
InBlock.gif     * 
@param response
InBlock.gif     * 
@return ActionForward
ExpandedSubBlockEnd.gif     
*/

InBlock.gif    
public ActionForward execute(ActionMapping mapping, ActionForm form,
ExpandedSubBlockStart.gifContractedSubBlock.gif            HttpServletRequest request, HttpServletResponse response) 
dot.gif{
InBlock.gif        
InBlock.gif        LoginHandlerForm loginHandlerForm 
= (LoginHandlerForm) form;// TODO Auto-generated method stub
InBlock.gif        
//从Form中取得表单数据
InBlock.gif
        String userName = loginHandlerForm.getUserName();
InBlock.gif        String userPwd 
= loginHandlerForm.getUserPwd();
InBlock.gif        
InBlock.gif        
//生成一个Session对象
InBlock.gif
        HttpSession session = request.getSession(true);
InBlock.gif        session.removeAttribute(
"userName");
InBlock.gif        session.setAttribute(
"userName", userName);
InBlock.gif        
InBlock.gif        
//生成一个ArrayList 
InBlock.gif
        ArrayList arr = new ArrayList();
InBlock.gif        arr.add(userName);
InBlock.gif        arr.add(userPwd);
InBlock.gif        
InBlock.gif        String forward;
InBlock.gif        
InBlock.gif        
//调用模型组件
InBlock.gif
        LoginHandler login = new LoginHandler();
InBlock.gif        
boolean flag = login.checkLogin(arr);
InBlock.gif        
if(flag)
InBlock.gif            forward 
= "success";
InBlock.gif        
else
InBlock.gif            forward 
= "fail";
InBlock.gif        
InBlock.gif        
//转向
InBlock.gif
        return mapping.findForward(forward);
InBlock.gif        
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

F:构建Struts的配置文件
None.gif <? xml version="1.0" encoding="GBK" ?>
None.gif
<! DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd" >
None.gif
None.gif
< struts-config >
None.gif  
< data-sources  />
None.gif  
<!--  表单配置  -->
None.gif  
< form-beans  >
None.gif    
< form-bean  name ="loginHandlerForm"  type ="struts.form.LoginHandlerForm"   />
None.gif  
</ form-beans >
None.gif  
<!--  全局异常  -->
None.gif  
< global-exceptions  />
None.gif  
<!--  全局转发  -->
None.gif  
< global-forwards  />
None.gif  
None.gif  
<!--  表单Action映射  -->
None.gif  
< action-mappings  >
None.gif    
< action
None.gif      
attribute ="loginHandlerForm"
None.gif      input
="/login.jsp"
None.gif      name
="loginHandlerForm"
None.gif      path
="/loginHandler"
None.gif      scope
="request"
None.gif      type
="struts.action.LoginHandlerAction"   >
None.gif          
<!--  action与视图组件的联系在配置文件中写,这样就大大降低了Action和VIEW的耦合性  -->
None.gif          
< forward  name ="success"  path ="/main.jsp"   />
None.gif          
< forward  name ="fail"  path ="/register.jsp"   />
None.gif     
</ action >
None.gif      
None.gif  
</ action-mappings >
None.gif
<!--  资源文件  -->
None.gif  
< message-resources  parameter ="struts.ApplicationResources"   />
None.gif
</ struts-config >
None.gif
None.gif

WEB配置文件
None.gif <? xml version="1.0" encoding="GBK" ?>
None.gif
< web-app  xmlns ="http://java.sun.com/xml/ns/j2ee"  xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"  version ="2.4"  xsi:schemaLocation ="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
None.gif  
< welcome-file-list >
None.gif      
< welcome-file > /login.jsp </ welcome-file >
None.gif  
</ welcome-file-list >
None.gif  
< servlet >
None.gif    
< servlet-name > action </ servlet-name >
None.gif    
< servlet-class > org.apache.struts.action.ActionServlet </ servlet-class >
None.gif    
< init-param >
None.gif      
< param-name > config </ param-name >
None.gif      
< param-value > /WEB-INF/struts-config.xml </ param-value >
None.gif    
</ init-param >
None.gif    
< init-param >
None.gif      
< param-name > debug </ param-name >
None.gif      
< param-value > 3 </ param-value >
None.gif    
</ init-param >
None.gif    
< init-param >
None.gif      
< param-name > detail </ param-name >
None.gif      
< param-value > 3 </ param-value >
None.gif    
</ init-param >
None.gif    
< load-on-startup > 0 </ load-on-startup >
None.gif  
</ servlet >
None.gif  
< servlet-mapping >
None.gif    
< servlet-name > action </ servlet-name >
None.gif    
< url-pattern > *.do </ url-pattern >
None.gif  
</ servlet-mapping >
None.gif
</ web-app >
None.gif
None.gif
小结:在开发Struts时,不需要开发人员自己编写中心控制器 的代码,但需要开发ActionForm,和Action组件,而且它 的JSP页面中的HTML标记需要转化为Struts自定义标记。这是开发Struts应用程序与开发一般基于MVC模式的主要不同!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值