Struts 学习之01(启航)

本文介绍Struts框架的基础知识,包括其MVC设计模式的应用及如何搭建首个Struts项目。通过实例演示了Struts配置文件的设置,表单Bean的创建,以及Action与JSP之间的交互过程。

       前段时间个人开始学习struts,从今天起把一些个人的学习经历记录下来
       Struts 是一种基于SUN的J2EE技术的一种框架,主要技术还是servlet和JSP技术来
实现的。通过模型+视图+控制(MVC)设计模式来设计出一种框架结构来统一目前个
人自行使用的框架结构,使程序员,特别是新手可以很好的运用MVC来开发系统。
struts更多的应用于视图,而把控制层交给Spring,而模型层用Hibernate做持久层。
与后台的数据库相分离。
        框架有点像我们现实生活中的钢架构,比如说现在的厂房构建的时候都是用钢架构
去构建,先用钢铁架设出一个厂房的整体结构,然后我们再加上如玻璃钢这些东西
很快就能构建出一个厂房,而如果说按照原有的设计方式,就是建筑上来说,我们
要用一砖一瓦,水泥呀石灰呀 一点点做上去的话,很慢的,所以说架构的出现以及
框架的出现,无非就是方便我们开发,给我们主体部分相对来说已经固定死的早期
程序员给我们提供的一种优秀的程序来组成,然后剩余的部分由我们自己来设计,而
struts就是其中的一种
      其官方站点:http://struts.apache.org/ 目前最新版本:struts2.0
      首先看看MVC,下图

 上图是大部份B/S结构程序扬采用的一种模型,也将MVC的基本工作原理描述清楚!
下面是模型 1:

而新手一般都是将jsp写的有点像 asp,就是将大量的代码写在jsp中,我目前就是如此,虽然使用JAVABEAN
可以减少一部分 代码,但页面中依然还会存在少量JAVA代码,也因此才决定来开始学习Strits,那么现在来看看Struts的工作原理



针对上图的一些说明如下:
1.Servlet是Struts框架最重要的组件,它通过org.apache.struts,action.ActionServlet来实现。
2.struts-config.xml是配置文件,它负责将请求转发给适当的Action对象,如果该对象不存
在,ActionServlet会先创建这个对象
3.Action类负责调用模型的方法,更新模型的状态,并帮助控制器应用程序的流程

          下面我来开始我的第一个Struts程序,我所使用的工具是:
                    JDK1.5+ Eclipse 3.2.1  +MyEclipse5.1.0GA+Struts1.2+Tomcat 5.5.20
         Step1:新建项目  File -->New-->Project 选择 MyEclipse -->WebProject  输入项目名MyFirstStruts
         Step2:   为项目添加Struts  选中项目名 右键-->MyEclipse-->Add Struts Capabilities   选择Struts1.2
                       将com.yourcompany.struts改为自己的fengyan.struts
                        加载完后我们可以在WebRoot/WEB-INF下面看到一些标签文件,我们先看看web.xml
                        我们可以看到servlet对象和servlet部署 的配置信息 如下

ContractedBlock.gif ExpandedBlockStart.gif servlet对象
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>
ContractedBlock.gif ExpandedBlockStart.gif servlet部署
None.gif<servlet-mapping>
None.gif    
<servlet-name>action</servlet-name>
None.gif    
<url-pattern>*.do</url-pattern>
None.gif
</servlet-mapping>

上面说明servlet的访问路径为 ***.do,只要是.do的程序它就导向action对象,而通过servlet对象可知这个action对象,它产生一个org.apache.struts.action.ActionServlet这样一个类对象,而这个对象产生后它所读取的配置文件是通过参数config指定也即为/WEB-INF/struts-config.xml,那么它就根据该文件中的描述来运行,现在我们再看看struts-config.xml文件!

ContractedBlock.gif ExpandedBlockStart.gif struts-config.xml文件
None.gif<struts-config>
None.gif  
<data-sources />
None.gif  
<form-beans />
None.gif  
<global-exceptions />
None.gif  
<global-forwards />
None.gif  
<action-mappings />
None.gif  
<message-resources parameter="fengyan.struts.ApplicationResources" />
None.gif
</struts-config>

<data-sources/>配置数据源,<form-beans/>表明表单bean的产生,<global-exception/>用于全局异常的处理
<g;obal-forwards/>主要是全局跳转,<action-mapping/>是action映射的,它和formbean是最重要的,最后一个一般是国际化处理·它读取的就是一个属性文件~
好了,在明白这上面这些后,开始创建strurts了,为了方便,我使用可视化的开发,
         
         step4:   打开struts-config.xml 切换到view; 右键-->New-->Form,Action and JSP.这样做的目的是同时生成
                      Form,action 以及JSP~在Use case 中输入User 在From properties Add  添加二个属性 userPwd
                     和 userName;切换到JSP 勾选create jsp form 在地址栏中 去掉/form就可以让它生成在我们的根
                     目录下了!确定后,看下struts-config.xml中给我们产生了哪些东东
            

ContractedBlock.gif ExpandedBlockStart.gif 生成后的struts-config.xml
None.gif<struts-config>
None.gif  
<data-sources />
None.gif  
<form-beans >
None.gif    
<form-bean name="userForm" type="fengyan.struts.form.UserForm" />
None.gif
None.gif  
</form-beans>
None.gif
None.gif  
<global-exceptions />
None.gif  
<global-forwards />
None.gif  
<action-mappings >
None.gif    
<action
None.gif      
attribute="userForm"
None.gif      input
="/user.jsp"
None.gif      name
="userForm"
None.gif      path
="/user"
None.gif      scope
="request"
None.gif      type
="fengyan.struts.action.UserAction" />
None.gif
None.gif  
</action-mappings>
None.gif  
<message-resources parameter="fengyan.struts.ApplicationResources" />
None.gif
</struts-config>

         说明:产生了一个userForm对象,它的类类型为fengyan.struts.form.UserForm,这个对象在action-mappings中会被调用,一般有请求路径为 /user的时候,将/user.jsp表单中的数据读取出来,读出来后写入到userForm属性中,而这个userForm就是刚刚定义的一个form-bean  那么userForm在接收到这些数据的时候就可以填充自己的属性了,这时我们来看看UserForm.java

ContractedBlock.gif ExpandedBlockStart.gif fengyan.struts.form.UserForm.java表单Bean
ExpandedBlockStart.gifContractedBlock.gif/**//*
InBlock.gif * Generated by MyEclipse Struts
InBlock.gif * Template path: templates/java/JavaClass.vtl
ExpandedBlockEnd.gif 
*/

None.gif
package fengyan.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
public class UserForm extends ActionForm dot.gif{
InBlock.gif    
private String userName;
InBlock.gif
InBlock.gif    
InBlock.gif    
private String userPwd;
InBlock.gif
InBlock.gif    
public ActionErrors validate(ActionMapping mapping,
ExpandedSubBlockStart.gifContractedSubBlock.gif            HttpServletRequest request) 
dot.gif{
InBlock.gif        
// TODO Auto-generated method stub
InBlock.gif
        return null;
ExpandedSubBlockEnd.gif    }

ExpandedSubBlockStart.gifContractedSubBlock.gif    
public void reset(ActionMapping mapping, HttpServletRequest request) dot.gif{
InBlock.gif        
// TODO Auto-generated method stub
ExpandedSubBlockEnd.gif
    }

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

ExpandedSubBlockStart.gifContractedSubBlock.gif    
public void setUserName(String userName) dot.gif{
InBlock.gif        
this.userName = userName;
ExpandedSubBlockEnd.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}

         这里面有二个我们刚刚定义的属性userName和userPwd,另外还有2个方法validate和reset,看名字就知道,validate方法是用来验证数据有效性的,而reset就是初始化,有点像我们表单中reset按扭的作用啦~

ExpandedBlockStart.gif ContractedBlock.gif public   void  reset(ActionMapping mapping, HttpServletRequest request)  dot.gif {
InBlock.gif        
//让userName初始化为fengyan
InBlock.gif
        userName = "fengyan";
ExpandedBlockEnd.gif    }

启动tomcat  运行 效果如下:

         
            step5:   我们现在再加点,在该页面输入内容然后在另外一个页面来接收!产生一点我们为了传递,将
                        struts-config.xml中 scope值改为session!
            step6:    打开UserAction.java   可以看到里面有一个execute方法可以通过mapping来指定转向,当然,要转
                         向到的页面也要在action-mapping 中注册,修改后的struts-config.xml如下:

ContractedBlock.gif ExpandedBlockStart.gif 修改后的struts-config.xml
None.gif  <action-mappings >
None.gif    
<action
None.gif      
attribute="userForm"
None.gif      input
="/user.jsp"
None.gif      name
="userForm"
None.gif      path
="/user"
None.gif      type
="fengyan.struts.action.UserAction">
None.gif      
<forward
None.gif        
name="show"
None.gif        path
="/show.jsp"
None.gif        redirect
="true" />
None.gif    
</action>
None.gif
None.gif  
</action-mappings>

               step7:   现在回头写UserAction.java中的execute方法如下:

None.gif public  ActionForward execute(ActionMapping mapping, ActionForm form,
ExpandedBlockStart.gifContractedBlock.gif            HttpServletRequest request, HttpServletResponse response) 
dot.gif {
InBlock.gif        UserForm userForm 
= (UserForm) form;// TODO Auto-generated method stub
InBlock.gif
        
InBlock.gif        
return mapping.findForward("show");
InBlock.gif        
//该show 就是上面在action-mapping中注册的键值值,指向show.jsp
ExpandedBlockEnd.gif
    }

               step8:   最后当然就是在show.jsp中将其读取出来。代码如下

ContractedBlock.gif ExpandedBlockStart.gif show.jsp
ExpandedBlockStart.gifContractedBlock.gif<%dot.gif@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
None.gif
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
None.gif
<html>
None.gif  
<head>  
None.gif    
<title>My JSP 'show.jsp' starting page</title>
None.gif  
</head>  
None.gif  
<body>
None.gif  
<jsp:useBean id="userForm" class="fengyan.struts.form.UserForm" scope="session"/>
None.gif  
None.gif  your   userName    is:
<B><jsp:getProperty name="userForm" property="userName"/></B><BR>
None.gif  here is tour password:
<B><jsp:getProperty name="userForm" property="userPwd"/></B>
None.gif  
</body>
None.gif
</html>

            总算写完了,最后看下运行效果。
                                               

                  总结:整个模型运行流程为; 客户端的HTTP请求--> .do(控制器ActionServlet)-->struts-config.xml
                             然后将input中的数据填充给actionform,然后提交给action处理,根据需要action会和后台的
                              actionBean交互,(本例中是UserAction.java)最后action提交给jsp视图进行输出!

             示例下载

          

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值