一个完整的Struts框架Web结构的实现

2.1一个完整的Struts框架Web结构

2.1.1 form表单(可以动态的生成):

提取相应的用户信息,并通过配置文件找到相应的路径,
由相应的action进行跳转处理;form表单是和用户在浏览器上输入的信息相对的。

2.1.2 formAction(处理表单的动作):

处理不同页面间业务逻辑任务,实现页面间信息的交互跳
转。当用户提交了一个form之后,可能会有多种行为,而此时用formAction来处理
不同行为所产生的结果,查询服务器中数据库,并做出相应的回应跳转。

2.1.3 config-struts:

配置form表单文件,相关路径的配置;form表单可以动态生成(具体
下边会详细讲解)。

2.1.4 *.jsp文件:

直接可以呈现给用户的视图层文件。

2.1.5.FormTo(传输对象):

在form表单和formAction中起着桥梁作用。因为一个form可能会
对应着多个formAction,需要有个句柄对象,来供不同的formAction操作。
其中config-struts是关键!!!
其实,FormTo可以不用。尤其是在action中转发的动作比较多时,用起来反而不方便。
下图是笔者在做学生选课系统时,采用Struts框架整体结构的截图:

这里选择NetBeans工具,配置文件目录下的文件除了struts-config.xml是手工配置外,其他的都是自动的生成;源包目录下的第二项也是自动生成的

2.2 form表单的动态创建

下边我们就来简单的谈一下子如何动态的创建form表单:
首先: 在config-struts配置文件<form-beans>中 增加(只是简单的举例)

<form-bean name="StuCourForm" type="org.apache.struts.action.DynaActionForm"> <form-property name="Cno" type="java.lang.String"/> </form-bean>
其中name是form表单的名字(应该和formAction中创建的form表单的实例相同);
type指明了是动态创建表单,包含了DyanActionForm的完整路径和类名.
<form-property>可以设置表单的属性,其中上述两个属性必不可少.此处<form-property>中属性的设置需要注意两点:
首先、其中name属性要和用户提交表单的name属性一一对应,而type一般是固定的;
其次、在action动作处理中利用DynaActionForm来创建form表单实例(注意该实例的名字要和config-struts中的name一致);最后通过form表单实例来取用户提交的数据.
下边就是在action动作处理中应该添加的生成表单和创建表单实例的例子:

DynaActionForm StuCourForm = (DynaActionForm)form; String cno = StuCourForm.getString("Cno");

2.3 Struts的配置文件(config-struts)

其实看过上边的论述,大家应该明白其实struts框架的编写就需要彻底的弄懂两部分的内容:一种是,struts配置文件的编写;另一种是,struts表单的动作处理.
下表我们就先来讲述struts的配置文件的编写
即config-struts的配置:
注释:其实配置文件在struts框架中有两个:一个是web.xml(这个配置文件在所有的java web项目中都会有,而且在netBeans中自动生成web.xml配置),另一个是就是和struts框架相关配置文件必须有而且特有的文件config-struts
结合NetBeans工具来谈个人经验:
当在NetBeans中创建了一各struts项目时,会自动生成好多的config-struts内容(其实大多数都不用,用户可以根据增加的需要来自己配置,并保留基本的结构即可)
下边通过一个例子简单阐述一下子:

<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"? "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"> <struts-config> <form-beans> <form-bean name="StuCourForm" type="org.apache.struts.action.DynaActionForm"> <form-property name="Cno" type="java.lang.String"/> </form-bean> </form-beans> <action-mappings> <action input="/Show_Course.jsp" name="StuCourForm" path="/student" scope="request" type="action.StuCourForm"> <forward name="StuCour_failure" path="/Show_Course.jsp"/> <forward name="StuCour_success" path="/Show_CS.jsp"/> </action> </action-mappings> </struts-config>

其中的<struts-config>是根元素,其包括两个主要的属性:

2.3.1 <action-beans>描述系统中的ActionForm对象

(可以是静态的也可以是动态的)
如果是创建静态的<form-bean>时:
<form-bean>的格式
<form-bean name=” ” type=” ”/>
其中name是表单的类名,type是表单的全路径和类名.
总之,<action-beans>说明了用户提交表单的信息的字段属性,当用户提具体信息之后,可以在formAction中生成具体的实例进行具体的处理。
在用静态的创建表单的时候,常常需要formTo传输对象,写起来比较麻烦(有兴趣读者请自学相关资料来深入了解formTo),所以我们一般使用的是上述的动态的创建表单.

2.3.2 <action-mapping>描述了转发路径

其中input 是用户所提交表单的jsp页面的在本地的文件名字;
name 指定该表单的类名;
path是指定该表单提交经过处理后,在浏览器页面所显示的文件名字此处注意两点:第一,该处没有后缀,且前边有/; 第二:该处的名字要与input所提交页面的表单的action的名字相同(但action处需要加后缀.do, 浏览器在解析时,会根据web.xml自动去掉后边的.do然后在config-struts中找对应的路径).
Type指定了表单类的完整路径和类名;
Scope指定了该请求所适用的范围;一般用request;
Forward指定了该请求页面要与那些页面进行打交道(即进行请求转发),其有两个属性:第一,name属性指定是action中的prompt所指代的哪个字符串,第二,path是根据第一个的name属性来跳转到哪个页面(有请求转发和重定向;要注意该处的path是本地的jsp带后缀的文件名字).

2.4 处理表单的动作FormAction

其实,在config-struts配置文件的过程中,大家应该发现这样的问题:
首先、配置文件中只是动态的创建了表单,那么用户提交的表单又怎么知道自动的填充配置文件中创建的表单呢?
其次、在配置文件中的映射部分,那些有关用户提交完表单所要到达的目标页面是如何处理的?
下边我们通过struts中另一个必不可少的部分formAction动作处理来进行讲解:
formAction动作其实和servlet的大同小异,只要掌握的Struts思想会JSP和Servlet,相信应该不会有问题。
当然说再多也无用,只要读者感兴趣去实践,相信实践出真知会在您那里得到验证!
下边就是笔者在用struts框架做学生选课系统的loginForm的一个处理动作代码loginAction.java

package action; import org.apache.struts.action.*; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionForward; import org.apache.struts.action.DynaActionForm; import db.dbConn; import java.sql.ResultSet; import javax.servlet.http.*; public class loginAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { DynaActionForm loginForm = (DynaActionForm) form; dbConn javaBean = new dbConn(); HttpSession session = request.getSession(); String prompt = null; String sno = loginForm.getString("Sno"); String key = loginForm.getString("Key"); String kind = loginForm.getString("Kind"); if (session.getAttribute("sno") == null) { session.setAttribute("Sno", sno); session.setAttribute("Key", key); }//更新session的内容; if (sno != null && key != null) { //管理员登陆页面控制处理 if (kind.equals("admin")) { String SQL = "SELECT* From admins where id='" + sno + "'"; ResultSet rs1 = (ResultSet) javaBean.executeQuery(SQL); if (rs1.next() && key.equals(rs1.getString("key"))) { prompt = "ad_success"; } else { request.setAttribute("msg", "管理员同志您的身份验证不正确!"); prompt = "failureLogin"; } } //学生登陆页面控制处理 else { String SQL = "SELECT * From stuinfo where Sno='" + sno + "'" + "and keys='" + key + "'"; ResultSet rs2 = (ResultSet) javaBean.executeQuery(SQL); if (!rs2.next()) { request.setAttribute("ms", "您登陆的帐号和密码不一致!"); return (mapping.findForward("failureLogin")); } else { session.setAttribute("Sno", rs2.getString("Sno")); session.setAttribute("Sname", rs2.getString("Sname")); prompt = "stu_success"; } } } return (mapping.findForward(prompt));//需要有返回值; } }
DynaActionForm loginForm = (DynaActionForm) form; //动态创建实例表单;

String sno = loginForm.getString("Sno"); String key = loginForm.getString("Key"); String kind = loginForm.getString("Kind"); 提取用户输入的信息,并加入到动态创建的表单中。

return (mapping.findForward("failureLogin"));

根据配置文件config-struts映射文件中跳转指令forward中的name字段的值来进行相应的跳转。
如果对servlet很熟悉的话,那么实现formAction这部分并不难。只要明白上边三个关键部分,其他的处理几乎和JSP+Servlet项目中的代码重复。

2.5 小结

本篇讲述了在web开发过程中Struts的主要组成部分,以及个部分是如何实现的。如果搞懂了form表单、formAction、config-struts之间的工作过程:
Config-struts中有form表单的字段属性,跳转路径。其中form表单,是在用户提交了信息之后,被实例化,并通过formAction动作处理,对应config-struts中forword中的name字段的值,来决定跳转到那个页面。
对JSP和servlet很熟悉,做出struts框架web开发是不是难事!





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值