struts傻瓜式学习(一天篇)
作者:林佩雯
发文时间:
2003.12.01
或许有人觉得
struts
不容易学,似乎里面的一些概念让未接触过的人迷惑,
MVC1
、
MVC2
、模式……我写这篇文章是想让从来没有接触过
struts
的人,能有个简单的入门指引,当然,系统地学习
struts
是必要的,里面有很多让人心醉的东东,那是后话了。
该案例包括首页,用户登陆、网站向导页面。就这么简单,没有深奥的 struts 概念,主要靠动手,然后用心体会。
WEB Server 用 tomcat4 。到 http://jakarta.apache.org 下载 struts1.1 ,把 zip 文件释放到 c:/struts ,拷贝 C:/struts/webapps/struts-example.war 到 c:/tomcat4/webapps 中,启动 tomcat , war 包被释放为 struts-example 文件夹,删除 war 包,把 struts-example 文件夹更名为 test 。
一、把WEB-INF/web.xml改成:
该案例包括首页,用户登陆、网站向导页面。就这么简单,没有深奥的 struts 概念,主要靠动手,然后用心体会。
WEB Server 用 tomcat4 。到 http://jakarta.apache.org 下载 struts1.1 ,把 zip 文件释放到 c:/struts ,拷贝 C:/struts/webapps/struts-example.war 到 c:/tomcat4/webapps 中,启动 tomcat , war 包被释放为 struts-example 文件夹,删除 war 包,把 struts-example 文件夹更名为 test 。
一、把WEB-INF/web.xml改成:
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"> <web-app> <!—这是struts中的Controller(控制器), 系统的指令中转由其,既ActionServlet 类负责, 它从struts-config.xml中读取配置信息, 并在服务器后台自动启动一个线程。 如果没有特别的要求(如添加语言编转功能), 程序员可以不管这部分,照用就可以了。--> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts. action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!--该系统的servlet可以映射成cool为后缀的文件, 而不是常见的.jspdo等,后缀名可以改成任何名称, 当然名字要健康#◎¥%!--> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.cool</url-pattern> </servlet-mapping> <!--该系统的默认首页是index.jsp, 可以有多个,系统按次序找,类似IIS--> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> |
二、把test/WEB-INF/ struts-config.xml改成:
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation// DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts /dtds/struts-config_1_1.dtd"> <struts-config> <!--FormBean是struts的一个概念,本质是JavaBean, 用来自动存储页面表单中各个域的值,并在适当的时候回填表单域, 不需要象传统那样request.getParameter(“fieldName”);, 常被action-mappings中的action 使用--> <form-beans> <!—稍后我们会新增一个UserForm类,用来存储用户信息。--> <form-bean name="userForm" type="test.UserForm"/> </form-beans> <!--这里存放整个系统都可以使用的全局转向中转(Forward)地址, 类似于javascript中的window.location(‘index.jsp’);, 也类似于电视控制器上的各种按钮,可以转频道、 调色等等是基于Struts的Web应用的控制流程流转。 一般情况下,一个Action处理完毕后, 会转发到一个JSP页面进行显示。 这也是JSP中的MVC的实现的要点。--> <global-forwards> <!--failed.cool将被当成servlet请求, 到action-mappings中寻找对应的action处理。--> <forward name="failed" path="/failed.cool"/> <forward name="regist" path="/regist.jsp"/> </global-forwards> <!--还记得web.xml中后缀为cool的请求吗? 它们是转到这里处理的。这里相当于struts的Model部分, Model部分是struts中比较灵活的地方。--> <action-mappings> <!--处理regist.cools的请求, 使用的FormBean是userForm,既test.UserForm类, 当处理过程发生错误时将返回index.jsp--> <action path="/regist" type="test.RegistAction" name="userForm" scope="request" input="/index.jsp" /> <action path="/overview" forward="/hello.jsp"/> <action path="/failed" forward="/wuwu.jsp" /> </action-mappings> </struts-config> |
三、增加一个FormBean,类路径为test.UserForm,以下是这个类的内容:
package test;import org.apache.struts.action.ActionForm; public class UserForm extends ActionForm { private String name="lpw"; //用户名 private String ps="1111"; //密码 public UserForm(){} public void setName(String s) {name=s;} public String getName() {return name;} public void setPs(String s) {ps=s;} public String getPs() {return ps;}} |
四、增加一个Action的子类,
类路径为test. RegistAction,以下是这个类的内容:
类路径为test. RegistAction,以下是这个类的内容:
package test; import java.lang.reflect.InvocationTargetException; import java.util.Locale; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionError; import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.util.MessageResources; import test.UserForm; public final class RegistAction extends Action { public ActionForward execute (ActionMapping mapping,ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { Locale locale = getLocale(request); MessageResources messages = getResources(request); HttpSession session = request.getSession(); UserForm userform = (UserForm) form; //此处可以调用其他类来执行数据库写入或其他逻辑判断 // 如果UserForm传来的参数name的值为默认的lpw,将forward到failed // 该名称将到struts-config.xml的<global-forwards>中寻找映射的url地址 // (可以是绝对路径,也可以是相对路径), 对于本例,是转到failed.cool, // 还记得吗?后缀为cool的请求全部到action-mappings中寻找 // 对应的action处理,最终目录是wuwu.jsp*/ if( "lpw".equals(userform.getName()) ) return (mapping.findForward("failed")); else return (mapping.findForward("regist")); } } |
五、以下所有新增或修改的页面相当于struts的View部分,把首页index.jsp改成:
<%@ page contentType="text/html; charset=GBK" language="java" %> <%@ page import = "test.*" %> <a href="overview.cool">站点导航</a><br> <form action="regist.cool" method="post"> <!—表单中的域的名称要和UserForm中的参数一样, 就可以实现数据自动获取功能, 不需要用request.getParameter(“param”);--> 用户:<input type="text" name="name"><br> 密码:<input type="password" name="ps"><br> <input type=submit value="新增用户"> </form> |
六、增加hello.jsp,用于站点导航:
<h1>site map</h1>The following is content filling by reader |
七、增加wuwu.jsp,当没有新用户登陆时,将转到这个页面:
<%@ page contentType="text/html; charset=GBK" language="java" %> <jsp:useBean id="beanlpw" class="test.UserForm" scope="session"/> 现有用户:<%=beanlpw.getName()%><br> 密码:<%=beanlpw.getPs()%><br> |
没有得到新的用户! 55555 ~~~~~
八、增加regist.jsp,当有新用户登陆时,将转到这个页面:
<%@ page contentType="text/html;charset=GBK" language="java" %> <jsp:useBean id="beanlpw" class="test.UserForm" scope="session"/> 新用户帐号:<%=beanlpw.getName()%><br> 密码:<%=beanlpw.getPs()%> |
九、启动tomcat4,浏览器中键入http://localhost:8080/test/index.jsp
操作一下,就可以看到结果,并初步理解struts的M、V、C各部分的协同工作原理,当然这是作者的良好意愿,如果读者看得一头雾水,欢迎指出错误在哪里:)
Struts1.0学习文档-初学者入门
一、 概述
struts是基于当前的一些相关标准的开发技术(servlet,xml…)基础之上,提供了一个开发框架的开放源码项目,由于我们开发web应用的复杂度随着系统的复杂度的要求越来越来复杂。特别是在代码重用,代码移植、代马可插扒等问题上出现了许多重复开发、维护困难等。Struts这个框架鼓励我们应用model2的MVC开发模型。当然我们在基于其上的开发中不一定要进行完全遵守。当前struts比较稳定的发行版时1.0,已经有了1.1的测试开发版。要了解详细的信息,请登陆www.apache.org/struts .
二、 整体结构概述
在到处可以找到关于MVC结构和struts结构的图形。这里我就不对结构图进行描述。只站在对J2EE WEB 应用的相关标准了解的基础来对struts整个框架进行一描述。
其实struts框架完全是基于J2EE相关技术和标准之上的。Struts提供一个servlet来作为控制器对客户端的相应请求进行转接给后台的模型。它为了使各个部分能够分离,提供相应的配置文件(struts-config.xml)进行请求和处理类的映射。整个类的映射完全来自java技术的类反射和相应的请求过滤技术。通过标记扩展来实现相应的视图和模型的联系。整个结构就是这样的,请不要再多想。
三、 详细开发说明
控制器
由struts自己实现,实现类为org.apache.struts.action.ActionServlet。开发者只需将相应的类映射配置在web.xml文件就可以。
请参考如下描述:
这里只对其中的初始化参数application加以介绍:其实这是struts控制器在启动时需要设置消息的属性文件,具体属性文件的格式完全遵守java属性文件的要求。属性文件的名称这里配置位ApplicationResources,当然我们可以修改,但该文件的路径必须是web-inf/classes/或者相应的包目录。
模型
关于struts的许多文章都进行相应的模型描述,分为系统状态模型和业务逻辑。这些对我们理解struts,应用struts进行开发是很重要的。但这里我只介绍两个重要的类,一个是进行相应的请求数据维护java bean类,另一个是进行相应请求处理的普通类。前者在struts中要求继承org.apache.struts.action.ActionForm类,该类由struts提供,后者需要继承org.apache.struts.action.Action类,也由struts提供。在第一个实现的bean中,各种属性必须要和客户请求的各个字段名称对应,目的是完成客户请求数据的自动化获取,我们心里明白这一件实事就可以了:即只要我们满足这种要求,struts自动会将客户端的请求填充在相应的javabean中。并且我们可以重载相应的两个方法来实现对应的javabean的各个字段的校验和重置,以确保满足我们的要求。这两个方法分别为public ActionErrors validate(ActionMapping actionMapping, HttpServletRequest httpServletRequest)和public void reset(ActionMapping actionMapping, HttpServletRequest httpServletRequest),在第一个方法中返回一个相应的处理错误对象,这个对象会自动添加到一个错误管理器中,我们直接可以在表示层的代码中进行调用,例如用标记来显示当前的请求错误信息。第二个reset方法用来
视图
视图是struts中自定义的一些标记库,其实没有struts我们为了解决视图和代码的分离,经常会采取一些自定义标记库。当然在jsp的扩展标记库应用中,也有相应的标记供我们使用。但为了和struts能进行紧密的结合,在使用struts时我们可以适当适用struts提供的标记库。对一些通过jsp标准的标记就能实现的,我们这里建议使用他们。这里分别将这些标记库进行介绍。
Bean标记库:
使用该标记前首先要在jsp的页面导入相应的标记定义,例如。
使用的方法如。
下面对该标记库做一介绍:
cookie :属性有id,name , multiple,value,id是对cookie在该页面中的唯一标识,在页面其它地方可以通过id进行引用。相当于用cookie直接引用。Name是相应的cookie名称。Multiple可以赋予任意值,如果该值被定义将会返回相应给定值数量的cookie数组,如果该值没有被定义Value在这里是一个默认值,当我们这里的调用的cookie不存在时,其值为我们这里的value值。
define:相当于jsp标记,属性有id、name、property、scope、toScope、type、value。Id和cookie中的id起到了同样的作用;name是在相应的scope中唯一bean标识;scope将会在相应的范围内进行相应的查找;toScope如果在scope中找不见相应的bean,将会在toScope中建立相应的bean;type是该类完全类路径和类。
例如:
struts是基于当前的一些相关标准的开发技术(servlet,xml…)基础之上,提供了一个开发框架的开放源码项目,由于我们开发web应用的复杂度随着系统的复杂度的要求越来越来复杂。特别是在代码重用,代码移植、代马可插扒等问题上出现了许多重复开发、维护困难等。Struts这个框架鼓励我们应用model2的MVC开发模型。当然我们在基于其上的开发中不一定要进行完全遵守。当前struts比较稳定的发行版时1.0,已经有了1.1的测试开发版。要了解详细的信息,请登陆www.apache.org/struts .
二、 整体结构概述
在到处可以找到关于MVC结构和struts结构的图形。这里我就不对结构图进行描述。只站在对J2EE WEB 应用的相关标准了解的基础来对struts整个框架进行一描述。
其实struts框架完全是基于J2EE相关技术和标准之上的。Struts提供一个servlet来作为控制器对客户端的相应请求进行转接给后台的模型。它为了使各个部分能够分离,提供相应的配置文件(struts-config.xml)进行请求和处理类的映射。整个类的映射完全来自java技术的类反射和相应的请求过滤技术。通过标记扩展来实现相应的视图和模型的联系。整个结构就是这样的,请不要再多想。
三、 详细开发说明
控制器
由struts自己实现,实现类为org.apache.struts.action.ActionServlet。开发者只需将相应的类映射配置在web.xml文件就可以。
请参考如下描述:
这里只对其中的初始化参数application加以介绍:其实这是struts控制器在启动时需要设置消息的属性文件,具体属性文件的格式完全遵守java属性文件的要求。属性文件的名称这里配置位ApplicationResources,当然我们可以修改,但该文件的路径必须是web-inf/classes/或者相应的包目录。
模型
关于struts的许多文章都进行相应的模型描述,分为系统状态模型和业务逻辑。这些对我们理解struts,应用struts进行开发是很重要的。但这里我只介绍两个重要的类,一个是进行相应的请求数据维护java bean类,另一个是进行相应请求处理的普通类。前者在struts中要求继承org.apache.struts.action.ActionForm类,该类由struts提供,后者需要继承org.apache.struts.action.Action类,也由struts提供。在第一个实现的bean中,各种属性必须要和客户请求的各个字段名称对应,目的是完成客户请求数据的自动化获取,我们心里明白这一件实事就可以了:即只要我们满足这种要求,struts自动会将客户端的请求填充在相应的javabean中。并且我们可以重载相应的两个方法来实现对应的javabean的各个字段的校验和重置,以确保满足我们的要求。这两个方法分别为public ActionErrors validate(ActionMapping actionMapping, HttpServletRequest httpServletRequest)和public void reset(ActionMapping actionMapping, HttpServletRequest httpServletRequest),在第一个方法中返回一个相应的处理错误对象,这个对象会自动添加到一个错误管理器中,我们直接可以在表示层的代码中进行调用,例如用标记来显示当前的请求错误信息。第二个reset方法用来
视图
视图是struts中自定义的一些标记库,其实没有struts我们为了解决视图和代码的分离,经常会采取一些自定义标记库。当然在jsp的扩展标记库应用中,也有相应的标记供我们使用。但为了和struts能进行紧密的结合,在使用struts时我们可以适当适用struts提供的标记库。对一些通过jsp标准的标记就能实现的,我们这里建议使用他们。这里分别将这些标记库进行介绍。
Bean标记库:
使用该标记前首先要在jsp的页面导入相应的标记定义,例如。
使用的方法如。
下面对该标记库做一介绍:
cookie :属性有id,name , multiple,value,id是对cookie在该页面中的唯一标识,在页面其它地方可以通过id进行引用。相当于用cookie直接引用。Name是相应的cookie名称。Multiple可以赋予任意值,如果该值被定义将会返回相应给定值数量的cookie数组,如果该值没有被定义Value在这里是一个默认值,当我们这里的调用的cookie不存在时,其值为我们这里的value值。
define:相当于jsp标记,属性有id、name、property、scope、toScope、type、value。Id和cookie中的id起到了同样的作用;name是在相应的scope中唯一bean标识;scope将会在相应的范围内进行相应的查找;toScope如果在scope中找不见相应的bean,将会在toScope中建立相应的bean;type是该类完全类路径和类。
例如:
<bean:define id="submitForm" scope="session" name="submitForm" type="struts.test.SubmitActionForm"/> <%=submitForm.getName()%> |
例如:
<jsp:useBean id="test1" scope="page" class="org.apache.struts.webapp.exercise.TestBean"/> <bean:define id="test1_string" name="test1" property="stringProperty"/> <bean:define id="test1_value" value="ABCDE"/> <%= test1_string %> <%= test1_value %> |
header :通过该标记可以访问相应页面请求的头的信息,具体属性有 id 、 multiple 、 name 、 value 。具体的含义和 cookie 的类似。
例如:
<%java.util.Enumeration names = ((HttpServletRequest) request).getHeaderNames();%> <%while (names.hasMoreElements()) { String name = (String) names.nextElement(); %> <bean:header id="head" name="<%= name %>"/> <tr> <td><%= name %></td> <td><%= head %></td> </tr> <%}%> |
Include :属性有 id 、 name 、 forward 、 anchor 、 href 、 transacttion 、 page 。属性的说明参考相应 apache 的网站。
例如:
<bean:include id="index" page="/index.jsp"/> <%=index%> |
message:
不常用,这里忽略。
page: 不常用,这里忽略。
Parameter: 属性有 id 、 name 、 value 、 multiple 。用来输出客户端的请求参数和值。
例如:
page: 不常用,这里忽略。
Parameter: 属性有 id 、 name 、 value 、 multiple 。用来输出客户端的请求参数和值。
例如:
<bean:parameter id="param1" name="param1"/> <bean:parameter id="param3" name="param3" value="UNKNOWN VALUE"/> <%=param1%><br> <%=param3%> |
resource: 属性有 id 、 name 、 input 。如果 input 属性被定义为任意值,导入的资源将会返回一个 InputStream 对象。如果不被定义的话,资源将会以字符串的方式返回。
例如:
<bean:resource id="webxml" name="/WEB-INF/web.xml"/> <bean:write name="webxml" filter="true"/> |
size: 用来对 Cellection 或者 Map 类型的数据进行元素个数统计。属性有: id 、 collection 、 name 、 property 、 scope 。
例如:
<% java.util.ArrayList data = new java.util.ArrayList(); data.add("First"); data.add("Second"); data.add("Third"); data.add("Fourth"); data.add("Fifth"); pageContext.setAttribute("list", data, PageContext.PAGE_SCOPE); %> <bean:size id="dataSize" collection="<%= data %>"/> <jsp:useBean id="list" scope="page" class="java.util.ArrayList"/> <bean:size id="listSize" name="list"/> |
struts: 不常用,这里忽略。
Write: 属性有 bundle 、 filter 、 format 、 formatKey 、 ignore 、 local 、 name 、 property 、 scope 。具体用法请参阅相关网站。
Html 标记库:
使用该标记库首先要在相应的页面中引入标记库定义文件,如:。其实该标记库的大多数标记可以用 html 的标记来实现。这里值对其无法用 html 实现的几个标记进行介绍。
Error: 属性有: bundle 、 name 、 property 、 local 。如果以上属性都不定义,将会从对属性文件中的所有 error.*** 错误信息显示出来。 Bundle ,邦定的错误信息管理器,如果没有定义,将默认是由 action 创建的应用程序级错误管理器。 Name 和 property 用来配合从相应的页面中调用错误信息管理 bean 来显示错误信息。 Local 是一个错误信息本地化处理器,默认会用是和本地的方式处理本地化。
属性资源文件中应该包含如下相应的信息,对错误信息的现实进行格式化:
errors.header 所有错误信息前面显示的内容,可以进行 html 修饰
errors.footer 所有错误信息后面的显示内容,可以进行 html 修饰
errors.prefix 每条错误信息前面的显示信息,可以进行 html 修饰
errors.suffix 每条错误信息后面的显示信息,可以进行 html 修饰
message: 属性有 bundle 、 footer 、 header 、 id 、 local 、 message 、 property 、 name. 具体的用法请参阅相关网站。
Logic 标记库:使用该标记库首先要在相应的页面中引入标记库定义文件,如:,具体的标记有:
Empty: 属性有 name 、 property 、 scope 。
Equal: 属性有 cookie 、 header 、 name 、 parameter 、 property 、 scope 、 value 。其中 cookie 和 header 、 parameter 是独立使用的。 Name 和 property 、 scope 结合使用,是相对系统中的 bean 的。如果是系统中某一个简单的参数,可以用 name 和 scope 结合就可以了。
Forward: 属性只有 name 。
GreaterEqual: 属性和 equal 一样。
GreaterThan :属性和 equal 一样。
LessEqual: 属性和 equal 一样。
LessThan: 属性和 equal 一样。
NotEmpty: 属性和 empty 一样。
Match: 属性和 equal 一样。
NotMatch :属性和 equal 一样。
NotEqual: 属性和 equal 一样。
NotPresent: 属性有 coolie 、 header 、 name 、 property 、 parameter 、 scope 、 role 、 user 。
Present: 和 notPresent 一样。
MessageNotPresent: 属性有 message 、 name 、 property 。
MessagePresent: 和 messageNotPresent 一样。
Iterate : 属性有 collection 、 id 、 indexId 、 scope 、 name 、 property 、 length 、 offset 、 type 。
数据库访问struts提供自己的数据源配置和管理器,但在版本1.0和1.1中相应的管理方式是不一样的。这里我强烈建议使用j2ee中的相关数据源配置情况。
文件上传struts提供了类org.apache.struts.upload.FormFile,只要我们在ActionForm中提供具有该类型的字段,然后在Action中进行处理就可以了。
简单bbs的实现样例代码(基于struts1.0)要索取代码请给我发邮件luopc@edu-edu.com.cn 。