兰色精灵 发表于 2015-1-18 11:28:03

JAVA网站制作之Struts1.1 先容

那这个对象有什么意义?现在很多用javabean的人就不能保证对象有完整的意义,不成熟的使用模式等导致代码疯狂增长,调试维护的时间要得多得多。在说性能之前,先说说你这个比较的来历。据说微软为了证明。net比java好。前一段工夫好象有人问关于Struts的事变,自己寄望了一下.请有乐趣的同道不防研讨研讨.
(1)
1. 先容

1.1 Model-View-Controller (MVC) 计划形式

FIXME - 必要一个对该形式一样平常性的先容。(译注:能够参考机器产业出书社的《计划形式》。)
 
1.2 将MVC观点映照到Struts组件中

Struts 的系统布局完成了Model-View-Controller计划形式的观点,它将这些观点映照到web使用程序的组件和观点中。 
这一系统布局中每一个次要的组件都将鄙人面做具体的会商。 

1.3 Model: 体系形态和贸易逻辑JavaBeans

基于MVC的体系中的 Model 部分能够细分为两个观点 -- 体系的外部形态, 可以改动形态的举动。用语术数语来讲,我们能够把形态信息看成名词(事物),把举动看成动词(事物形态的改动)。 
一般说来,你的使用程序将体系外部的形态暗示为一组一个或多个的JavaBeans,利用属性(properties)来暗示形态的细节。依附于你的使用程序的庞大度,这些beans能够是自包括的(以某种体例晓得如何永世地保留它们的形态信息),大概能够是正面的(facades),晓得当被哀求时如何从内部数据源(比方数据库)中获得信息。Entity EJBs一般也用来暗示外部形态。
年夜型使用程序常常将体系大概的贸易逻辑举动暗示为能够被保护形态信息的beans挪用的办法。举个例子,你有一个为每一个以后用户保留在session中的购物车bean,内里是暗示以后用户决意购置物品的属性。这个bean有一个checkOut()办法用来考证用户的信誉卡,将订单发给库房以选择货物和出货。其余体系分离地暗示一样的举动,也许利用Session EJBs。
在一些小型使用程序中,一样的举动又大概嵌进到作为Controller一部分的 Action 类中。这在逻辑十分复杂大概其实不想要在别的情况中重用这些贸易逻辑时是得当的。Struts框架撑持一切这些办法,但倡议将贸易逻辑(“做甚么”)和 Action 类(“决意做甚么”)分别开。 

1.4 View: JSP页面和暗示组件

基于Struts的使用程序中的 View 部分一般利用JSP手艺来构建。JSP页面包括称为“模版文本”的静态HTML(或XML)文本,加上拔出的基于对特别举动标志注释的静态内容。JSP情况包含了其用处由JSP标准来形貌的一套尺度的举动标志,比方 <jsp:useBean> 。别的,另有一个用来界说你本人标志的尺度机制,这些自界说的标志构造在“定制标志库”中。 
Struts包含了一个宽广的便于创立用户界面,而且充实国际化的定制标志库,与作为体系 Model 部分一部分的ActionForm beans美好地互相共同。这些标志的利用将在前面做具体会商。
除JSP页面和其包括的举动及定制标志,贸易对象常常必要可以基于它们在被哀求时确当前形态将本人处置成HTML(或XML)。从这些对象处置过的输入能够很简单地利用 <jsp:include> 尺度举动标志包含在了局的JSP页面中。 

1.5 Controller: ActionServlet和ActionMapping

使用程序的 Controller 部分会合于从客户端吸收哀求(典范情形下是一个运转扫瞄器的用户),决意实行甚么贸易逻辑功效,然后将发生下一步用户界面的义务委派给一个得当的View组件。在Struts中,controller的基础组件是一个 ActionServlet 类的servlet。这个servlet经由过程界说一组映照(由Java接口 ActionMapping 形貌)来设置。每一个映照界说一个与所哀求的URI相婚配的路径和一个 Action 类(一个完成 Action 接口的类)完全的类名,这个类卖力实行预期的贸易逻辑,然后将把持分拨给得当的View组件来创立呼应。 
Struts也撑持利用包括有运转框架所必须的尺度属性以外的附加属性的 ActionMapping 类的才能。这同意你保留特定于你的使用程序的附加信息,同时仍可使用框架其他的特征。别的,Struts同意你界说把持将重定向到的逻辑名,如许一个举动办法能够哀求“主菜单”页面(举例),而不必要晓得响应的JSP页面的实践名字是甚么。这个功效极年夜地匡助你分别把持逻辑(下一步做甚么)和显现逻辑(响应的页面的称号是甚么)。 

2. 创立Model组件

2.1 概述

你用到的使用程序的需求文档极可能会合于创立用户界面。但是你应当包管每一个提交的哀求所必要的处置也要被分明的界说。一般说来,Model 组件的开辟者会合于创立撑持一切功效需求的JavaBeans类。一个特别使用请求的beans的准确特征依附于详细需求变更会十分的年夜,可是它们一般能够分红上面会商的几品种型。但是,起首对“局限”观点做一个冗长的回忆是有效的,由于它与beans有关。 

2.2 JavaBeans和局限

在一个基于web的使用程序中,JavaBeans能够被保留在(并从中会见)一些分歧“属性”的汇合中。每个汇合都有汇合保存期和所保留的beans可见度的分歧的划定规矩。总的说来,界说保存期和可见度的这些划定规矩被叫做这些beans的 局限 。JSP标准中利用以下术语界说可选的局限(在圆括号中界说servlet API中的等价物): 
page - 在一个独自的JSP页面中可见的Beans,保存刻日于以后哀求。(service()办法中的部分变量) request - 在一个独自的JSP页面中可见的Beans,也包含一切包括于这个页面或从这个页面重定向到的页面或servlet。(Request属性) 
session - 介入一个特定的用户session的一切的JSP和servlet都可见的Beans,超过一个或多个哀求。(Session属性) 
application - 一个web使用程序的一切JSP页面和servlet都可见的Beans。(Servlet context属性) 
记着统一个web使用程序的JSP页面和servlets共享一样一组bean汇合是很主要的。比方,一个bean作为一个request属性保留在一个servlet中,就象如许: 
MyCart mycart = new MyCart(...);
request.setAttribute("cart", mycart);
将当即被这个servlet重定向到的一个JSP页面利用一个尺度的举动标志看到,就象如许: 
<jsp:useBean id="cart" scope="request"class="com.mycompany.MyApp.MyCart"/>

2.3 ActionForm Beans

Struts框架一般假定你已为每个你的使用程序中哀求的输出创立了一个 ActionForm bean(即一个完成了 ActionForm 接口的类)。假如你在你的 ActionMapping 设置文件中界说了如许的beans(见“创立Controller组件”),Struts的controller servlet在挪用得当的 Action 办法前将主动为你实行以下的服务: 
用得当的关头字反省用户的session中是不是有得当的类的bean的一个实例。 
假如没有如许的session局限的bean,主动创建一个新的bean并增加到用户的session中。 
对每一个名字对应于bean中的一个属性的哀求参数,挪用响应的set办法。这个操纵相似于当你以通配符“*”选择一切属性利用尺度的JSP举动标志 <jsp:setProperty> 。 
更新的ActionForm bean在被挪用时将被传送给Acton类的perform()办法,以使这些值可以当即失效。 
当你在写你的ActionForm beans时,记着以下的准绳: 
ActionForm 接口自己不必要特别的完成办法。它是用来标识这些特定的beans在全部系统布局中的感化。典范情形下,一个ActionForm bean只包含属性的get办法和set办法,没有贸易逻辑。 
一般在一个ActionForm bean中只要很少的输出考证逻辑。如许的beans存在的次要来由是保留用户为相干的表单所输出的年夜部分近期值 -- 乃至在毛病被检测到时 -- 如许一样的页面能够被重修,陪伴有一组堕落信息,如许用户仅仅必要改正毛病的字段。用户输出的考证应当在 Action 类中实行(假如是很复杂的话),大概在得当的贸易逻辑beans中实行。 
为每一个表单中呈现的字段界说一个属性(用相干的getXxx()和setXxx()办法)。字段名和属性名必需依照JavaBeans的商定相婚配。比方,一个名为 username 的输出字段将引发 setUsername() 办法被挪用。 
你应当注重一个“表单”在这里会商时的意义其实不必需对应于用户界面中的一个独自的JSP页面。在良多使用程序中一个“表单”(从用户的概念)延长最多个页面也是很寻常的。想一想看,比方,一般在安装新的使用程序时利用的导航安装程序的用户界面。Struts勉励你界说一个包括一切字段属性的独自的ActionForm bean。不论字段实践上是显现在哪一个页面上。一样的,统一表单的分歧的页面应当提交到不异的Action类。假如你依照这个倡议,在年夜多半情形下,页面计划者能够从头构造分歧页面中的字段而不必要改动处置逻辑。 

2.4 体系形态Beans

体系的实践形态一般暗示为一组一个或多个的JavaBeans类,其属性界说以后形态。比方,一个购物车体系包含一个暗示购物车的bean,这个bean为每一个独自的购物者保护,这个bean中包含(在别的事物当中)一组购物者以后选择购置的项目。分离地,体系也包含保留用户信息(包含他们的信誉卡和送货地点)、可取得项目标目次和它们以后库存程度的分歧的beans。 
关于小范围的体系,大概关于不必要长工夫保留的形态信息,一组体系形态beans能够包括一切体系已经履历的特定细节的信息。大概常常是,体系形态beans暗示永世保留在一些内部数据库中的信息(比方CustomerBean对象对应于表 CUSTOMERS 中的特定的一行),在必要时从服务器的内存中创立或扫除。在年夜范围使用程序中,Entity EJBs也用于这类用处。 

2.5 贸易逻辑Beans

你应当把你的使用程序中的功效逻辑封装成对为此目标计划的JavaBeans的办法挪用。这些办法能够是用于体系形态beans的不异的类的一部分,大概能够是在专门实行贸易逻辑的自力的类中。在后一种情形下,你一般必要将体系形态beans传送给这些办法作为参数处置。 
为了代码最年夜的可重用性,贸易逻辑beans应当被计划和完成为它们不晓得本人被实行于web使用情况中。假如你发明在你的bean中你必需import一个 javax.servlet.* 类,你就把这个贸易逻辑绑缚在了web使用情况中。思索从头构造事物使你的 Action 类(Controller义务的一部分,鄙人面形貌)翻译一切从HTTP哀求中哀求被处置为对你的贸易逻辑beans属性set办法挪用的信息,然后能够收回一个对 execute() 的挪用。如许的一个贸易逻辑类能够被重用在除它们最后被机关的web使用程序之外的情况中。 
依附于你的使用程序的庞大度和局限,贸易逻辑beans能够是与作为参数传送的体系形态beans交互感化的一般的JavaBeans,大概利用JDBC挪用会见数据库的一般的JavaBeans。而关于较年夜的使用程序,这些beans常常是有形态或无形态的EJBs。 

2.6 题外话: 会见干系数据库

良多web使用程序使用一个干系数据库(经由过程一个JDBC driver会见)来保留使用程序相干的永世数据。别的使用程序则利用Entity EJBs来完成这个目标,他们委派EJBs本人来决意如何保护永世形态。假如你是利用EJBs来完成这个目标,依照EJB标准中形貌的客户端计划形式。 
关于基于间接数据库会见的web使用程序,一个一般的计划成绩是当必要会见低层数据库时如何发生一个得当的JDBC毗连对象。办理这个成绩有几种办法 -- 以下准绳形貌了保举的一种办法: 
创立或失掉一个同意一组数据库毗连被多个用户共享的ConnectionPool类。Struts(以后)没有包含如许的一个类,可是有良多如许的类能够失掉。 
当使用程序初始化时,在使用程序睁开(deployment)形貌符中界说一个有一个“启动时加载”值的servlet。我们将把这个servlet叫做 启动 servlet。在年夜多半情形下,这个servlet不必要处置任何的哀求,以是没有一个 <servlet-mapping> 会指向它。 
在启动servlet的 init() 办法中,设置并初始化一个ConnectionPool类的实例,将其保留为一个servlet context属性(从JSP的概念看同等于一个application局限的bean)。一般基于传送给启动servlet初始化参数来设置连接缓冲池是很便利的。 
在启动servlet的 destroy() 办法中,包括了开释连接缓冲池所翻开的连接的逻辑。这个办法将在servlet容器停止这个使用程序的时分被挪用。 
当 Action 类必要挪用一个必要数据库连接的贸易逻辑bean中的办法(比方“insert a new customer”)时,将实行上面的步骤: 
为这个web使用程序从servelt context属性中失掉一个连接缓冲池对象。 
挪用连接缓冲池对象的 open() 办法来失掉一个在 Action 类挪用中利用的连接。 
挪用贸易逻辑bean中符合的办法,将数据库连接对象作为一个参数传送给它。 
挪用分派的连接中的 close() 办法,这将引发这个连接为了今后别的哀求的重用被前往到缓冲池中。 
一个一般的编程毛病是健忘了把数据库连接前往给缓冲池,这将终极招致用完一切的连接。必定要确信 Action 类的逻辑老是前往连接,乃至在贸易逻辑bean抛出一个背例时。 
依照下面保举的计划形式意味着你可以编写你的贸易逻辑类而不必要忧虑它们如何失掉一个JDBC连接来利用-- 复杂地在任何必要会见数据库的办法中包括一个Connection参数。当你的贸易逻辑类在一个web使用程序中被使用时,分派和开释得当的连接是 Action 类的义务。当你利用不异的贸易逻辑类时,比方,在一个批处置事情中,供应一个得当的连接是谁人使用程序的义务(这不必要从缓冲池中取得,由于年夜多半批处置事情运转于一个单线程情况中)。 

3. 创立View组件

3.1 概述

这一章会合于创立使用程序中的 View 组件的义务,次要利用JSP手艺创建。出格的,Struts除供应了与输出表单的交互外还供应了创建国际化使用程序的撑持。几个别的的与View相干的主题也被复杂地会商。 

3.2 国际化动静

几年之前,使用程序开辟者可以思索到仅仅撑持他们本国的只利用一种言语(大概偶然候是两种)和一般只要一种数目体现体例(比方日期、数字、泉币值)的住民。但是,基于web手艺的使用程序的爆炸性增加,和将这些使用程序睁开在Internet或别的被普遍会见的收集之上,已在良多情形下使得国度的界限淡化到不成见。这类情形变化成为一种关于使用程序撑持国际化(常常被称做“i18n”,由于18是字母“i”和字母“n”之间的字母个数)和当地化的需求。 
Struts创建于Java平台之上为创建国际化和当地化的使用程序供应匡助。必要熟习的关头观点是: 
Locale - 基本的撑持国际化的Java类是 java.util.Locale 。每一个 Locale 代表一个出格的国度和言语选择(加上一个可选的言语变量),和一套格局假定,比方数字和日期等等。 
ResourceBundle - java.util.ResourceBundle 类供应撑持多种言语动静的基础工具。检察文档中关于ResourceBundle 类和你的JDK版本的文档包中关于国际化的更多内容。 
PropertyResourceBundle - 一个 ResourceBundle 类的尺度完成同意你利用与初始化properties文件一样的“name=value”语法来界说资本。这关于利用为用于一个web使用程序的动静筹办资本包长短常便利的,由于这些动静一般都是面向文本的。 
MessageFormat - java.text.MessageFormat 类同意你利用运转时指定的参数交换一个动静字符串中的一部分(在这类情形下,是一个从一个资本包失掉的动静)。这在你创立一个句子的场所中是有效的,可是词会以分歧的言语依照分歧的按次呈现。动静中的占位符字符串{0}用第一个运转时参数交换,{1}用第二个运转时参数交换,以此类推。 
MessageResources - Struts的类 org.apache.struts.util.MessageResources 使你可以将一套资本包视做一个数据库,而且同意你为一个特定的Locale(一般是与以后用户绝对应)哀求一个特定的动静,而不是为服务器运转在个中的缺省的Locale哀求动静。 
关于一个国际化的使用程序,依照JDK文档包中国际化文档所形貌的步骤来创立一个包括每种言语的动静的属性文件。上面举一个例子申明。 
假定你的源代码创建在包 com.mycompany.mypackage 中,因而它保留于一个叫做(相对你的源目次)com/mycompany/mypackage 的目次中。为创立一个叫做 com.mycompany.mypackage.MyResources 的资本包,你应当在目次 com/mycompany/mypackage 中创立以下文件: 
MyResources.properties - 包括你的服务器的缺省言语的动静。假如你的缺省言语是英语,你大概有一个如许的条目: 
prompt.hello=Hello
MyResources_xx.properties - 包括ISO言语编程为“xx”(检察ResourceBundle的Java文档页面失掉一个以后列表的连接)的一样的动静。关于下面的动静的法语版,你能够有这个条目: 
prompt.hello=Bonjour
你能够有你必要的恣意多的言语的资本包文件。
当你在web使用程序睁开形貌符中设置controller servlet时,你必要在一个初始化参数中界说的一件事是使用程序的资本包的基本名。在上述的情形中,这应当是 com.mycompany.mypackage.MyResources 。 

3.3 表单和FormBean的交互

年夜部分web开辟者已经利用HTML的尺度功能来创建表单,比方利用 <input> 标志。用户但愿交互程序具有必定的举动,这些等候中的一个与毛病处置有关 -- 假如用户呈现一个毛病,使用程序应当同意他们仅仅修正必要修正的部分 -- 而不必要从头敲进以后页面或表单中的任何别的信息。 
利用尺度的HTML和JSP编程来完整完成这个希冀是单调而沉重的。举例来讲,一个用户名字段的输出元素看起来能够象是如许(在JSP中) 
<input type="text" name="username"
value="<%= loginBean.getUsername() %>">
这很难敲对,会把没有编程观点的HTML开辟者弄懵懂,而且会在HTML编纂器中形成成绩。取而代之的是,Struts供应了一种周全的基于JSP 1.1的定制标志库功效的机制来创建表单。下面的情形利用Struts处置后将象是如许: 
<struts:text name="username"/>
没有需要再显式地触及到从中取得初始值的JavaBean。这将由框架主动处置。 

3.3.1 利用Struts创建表单

一个完全的注册表单将演示Struts相对间接利用HTML和尺度的JSP功效如何极年夜地加重了处置表单的疾苦。思索以下称为logon.jsp的页面(来自Struts的例子程序): 
<%@ page language="java" %>
<%@ taglib uri="/WEB-INF/struts.tld" prefix="struts" %>
<html>
<head>
<title><struts:message key="logon.title"/></title>
<body bgcolor="white">

<struts:errors/>

<struts:form action="logon.do" name="logonForm"
type="org.apache.struts.example.LogonForm"/>
<table border="0" width="100%">
<tr>
<th align="right">
<struts:message key="prompt.username"/>
</th>
<td align="left">
<struts:text name="username" size="16"/>
</td>
</tr>
<tr>
<th align="right">
<struts:message key="prompt.password"/>
</th>
<td align="left">
<struts:password name="password" size="16"/>
</td>
</tr>
<tr>
<td align="right">
<struts:submit>
<struts:message key="button.submit"/>
</struts:submit>
</td>
<td align="right">
<struts:reset>
<struts:message key="button.reset"/>
</struts:reset>
</td>
</tr>
</table>
</struts:form>

</body>
</html>
上面的条目基于这个例子演示在Struts中处置表单的关头的特征: 
taglib指令告知JSP页面编译器从那里找到Struts标志库的 标志库形貌符 。在这类情形下,我们利用struts作为前缀来标识来自这个库中的标志,可是可使用任何你想用的前缀。 
这个页面利用了几个 message 标志来从一个包括有这个使用程序一切资本的 MessageResources 对象中查找国际化的动静字符串。为了让这个页面可以事情,以下的动静关头字必需在这些资本中被界说: 
logon.title - 注册页面的题目 
prompt.username - 一个 “Username:” 提醒字符串 
prompt.password - 一个 “Password:” 提醒字符串 
button.submit - “Submit”按钮的标签 
button.reset - “Reset”按钮的标签 
当用户注册时,使用程序能够在用户的session中保留一个 Locale 对象。这个 Locale 将用来选择得当言语的动静。这使得给用户一个切换言语的可选项完成起来变的简单了 -- 仅仅改动保留的 Locale 对象,一切的动静就会主动切换。 
errors 标志显现由一个贸易逻辑组件保留的任何堕落动静,大概假如没有堕落动静保留就甚么都没有。这个标志将鄙人面做深切的形貌。 
form 标志基于指定的属性对一个HTML <form> 元素举行处置。它也将一切在这个表单中的字段与一个保留在关头字 logonForm 下的session局限的FormBean相干联。这个bean用来为一切的具有与bean中的属性名婚配的名字的输出字段供应初始值。假如得当的bean没有找到,一个新的bean将会被主动创建,利用指定的Java类名。 
text 标志对一个范例为“text”的HTML <input> 元素举行处置。在这类情形下,占有扫瞄器屏幕的字符地位的数字也被指定。当页面被实行时,是绝对应的bean的 username 属性确当前值(也就是 getUsername() 的前往值)。 
password 标志利用办法相似。分歧的地方是当用户敲进他们的口令时扫瞄器将回应星号字符,而不是输出值。 
submit 和 reset 标志在表单低部天生响应的按钮。每一个按钮的文本标签利用 message 标志创建,同时带有提醒,如许这些值就是国际化的。 

3.3.2 输出字段范例撑持

Struts为一切以下范例的输出字段界说了标志,带有与其响应的参考信息的超连接。 
checkboxes 
hidden 字段 
password 输出字段 
radio 按钮 
reset 按钮 
select 列表和嵌进的 
options 
submit 按钮 
text 输出字段 
textareas 
在一切情形下,一个字段标志都必需嵌套在一个 form 标志中,如许字段才晓得利用哪一个bean来初始化显现的值。 

3.3.3 别的有效的暗示标志

在Struts的标志库中有几个别的的标志关于创建用户界面是有匡助的: 
enumerate 为一个指定汇合的每一个元素反复一次标志体(能够是一个Enumeration,一个Hashtable,一个Vector或一个对象数组)。 
getProperty 从指定的bean中失掉指定的属性,而且在本页面的其他部分作为一个page局限的bean存在。这是会见一个被 enumerate 利用的汇合的便利的办法。 
ifAttributeExists 只要在一个指定的属性存在于一个指定的局限中时才对标志体求值。 
ifAttributeMissing 只要在一个指定的属性不存在于一个指定的局限中时才对标志体求值。 
ifParameterEquals 只要在一个指定的哀求参数具有一个指定的值时才对标志体求值。 
ifParameterNotEquals 只要在一个指定的哀求参数不具有一个指定的值大概不存在时才对标志体求值。 
ifParameterNotNull 只要在一个指定的哀求参数包括在这个哀求中而且长度年夜于0时才对标志体求值。 
ifParameterNull 只要在一个指定的哀求参数不包括在这个哀求中大概长度即是0时才对标志体求值。 
iterate 为一个指定汇合中的每一个元素反复一次标志体(能够是一个Collection,一个Iterator,一个Map,大概一个对象数组)。这个标志在Java2情况中取代了 enumerate 标志。 
link 天生一个超连接,当没有cookie撑持时主动使用URL编程来保护session形态。 
parameter 处置指定哀求参数的值,得当地过滤HTML中有特别寄义的字符。 
property 显现一个表单中定名的bean属性 -- 在属性应当是只读时利用这个标志而不是 text 标志。 

3.3.4 主动表单考证

除下面形貌的表单和bean的交互外,假如你的bean晓得如何考证它吸收的输出字段,Struts还供应一种附加的机制。为了使用这个特征,使你的bean类完成 ValidatingActionForm 接口,而不是 ActionForm 接口。一个 ValidatingActionForm 增添了一个附加的办法署名: 
public String[] validate()
关于一个被controller servlet在bean属性已组装可是在响应的举动类的 perform() 办法被挪用之前挪用的办法,validate() 办法有以下可选项: 
实行得当的考证发明没有毛病 -- 前往 null 大概一个非0长度字符串数组,而且controller servlet将持续挪用得当的 Action 类的 perform() 办法。 
实行得当的考证发明有毛病 -- 前往一个内容为应当被显现的堕落动静关头字(进进使用程序的MessageResources 包)的字符串数组。controller servlet将作为合适于 <struts:errors> 标志利用的哀求属性保留这个数组,而且将把持重定向回输出表单(由这个 ActionMapping 的 inputForm 属性标识)。 
正如之前提到的,这个特征完整是可选的。假如你的form bean 仅仅完成了 ActionForm 接口,controller servlet将假定任何哀求的考证由action类完成。 

3.4 别的的暗示手艺

只管你的使用程序的表面和感到能够完整基于尺度的JSP才能和Struts的定制标志库构建,你也应当思索睁开别的改善组件重用、削减办理包袱大概削减堕落的手艺。鄙人面的部分会商几个可选的手艺。 

3.4.1 特定于使用程序的定制标志

在利用Struts库供应的定制标志以外,很简单创建特定于你创立的使用程序的标志来匡助创建用户界面。Struts包含的例子程序用创建以下仅用于完成这个使用程序的标志演示了这个准绳: 
checkLogon - 反省一个特别的会话对象的存在,假如不存在将把持重定向到注册页面。这是用来捕获如许的情形,用户在你的使用程序实行的两头把一个页面做成书签而且试图跳过注册,大概用户的会话超时。 
linkSubscription - 为一个具体的订单页面熟成一个超连接,它将必要的主关头字值作为一个哀求属性传送。这在列出与一个用户相干的订单并供应编纂或删除订单的连接时利用。 
linkUser - 为一个用户的一个详细的页面熟成一个超连接,它将它将必要的主关头字值作为一个哀求属性传送。 
这些标志的源代码在 src/example 目次中,在包 org.apache.struts.example 里,还带有一些别的的用在这个使用程序中的Java类。 

3.4.2 有包括文件的页面组件

在一个JSP文件(包括定制标志和beans用来会见哀求的静态数据)中创立完全的暗示是一种十分一般的计划办法,在Struts包含的例子程序中被接纳。但是良多使用程序请求在独自一个页面中显现你的使用程序的多个逻辑上自力的部分。 
举例来讲,一个出口使用程序能够在出口的主页面上有一些大概全体以下的功效: 
会见这个出口的一个搜刮引擎。 
一个或更多的“供应旧事”的显现,含有依照用户的注册信息定制的感乐趣的题目。 
会见与这个出口相干的会商的主题。 
假如你的出口供应收费邮件帐号,还要有一个“邮件守候”的提醒。 
假如你可以将事情分别开,分派分歧的开辟者往做分歧的片断,那末这个站点分歧片断的开辟就会加倍复杂。然后,你可使用JSP手艺的 include 才能来将这些片断组合进一个独自的页面。有两种 include 可用,依附于你但愿输入的组合产生在甚么工夫: 
include 指令 (<%@ include file="xxxxx" %>)在JSP页面被编译时处置。它用于包含不必要在哀求时改动的HTML代码。它把包含出去的文本看成静态文本,很象C或C++中的 #include 指令。 
include 举动 (<jsp:include page="xxxxx" flush="true" />)在哀求时处置,而且是由服务器通明处置。这意味着你能够经由过程把它嵌套在一个相似ifParameterEquals的标志中有前提地实行include 。 

3.4.3 图片处置组件

一些使用程序请求静态天生图片,就象一个股市呈报站点的代价图一样。一般利用两种分歧的办法来完成这个需求: 
处置一个实行一个servlet哀求的URL的超连接。这个servlet将利用一个图像库来天生图片,设置得当的content范例(比方 image/gif),而且将图片的字撙节发送回扫瞄器。扫瞄器就会象从一个静态文件中吸收到的一样显现图片。 
处置HTML代码必要下载一个创立哀求的图像的Java applet。你能够经由过程为在处置的代码中的这个applet设置得当的初始化参数设置这个图像,大概你可让这个applet与服务器创建本人连接来吸收这些参数。 

4. 创立Controller组件

4.1 概述

如今我们了解了如何机关你的使用程序的Model和View组件,如今是会合到 Controller 组件的时分了。Struts包含一个完成映照一个哀求URI到一个举动类的次要功效的servlet。因而你的与Controller有关的次要义务是: 
为每个大概吸收的逻辑哀求写一个 Action 类(也就是,一个 Action 接口的完成) 
写一个界说类名和与每一个大概的映照相干的别的信息的 ActionMapping 类(也就是,一个 ActionMapping 接口的完成) 
写举动映照设置文件(用XML)用来设置controller servlet。 
为你的使用程序更新web使用程序睁开形貌符文件(用XML)用来包含必须的Struts组件。 
给你的使用程序增加得当的Struts组件。 

4.2 Action类

Action 接口界说一个单一的必需由一个 Action 类完成的办法,就象上面如许: 
public ActionForward perform(ActionServlet servlet,
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException;
一个 Action 类的方针是处置这个哀求,然后前往一个标识JSP页面的 ActionForward 对象,把持应当重定向这个JSP页面以天生响应的呼应。在 Model 2 计划形式中,一个典范的 Action 类将在它的 perform() 办法中完成上面的逻辑: 
考证用户session确当前形态(比方,反省用户已乐成地注册)。假如 Action 类发明没有注册存在,哀求应当重定向到显现用户名和口令用于注册的JSP页面。应当如许做是由于用户大概试图从“两头”(也就是,从一个书签)进进你的使用程序,大概由于session已超时而且servlet容器创立了一个新的session。 
假如考证还没有产生(因为利用一个完成 ValidatingActionForm 接口的form bean),考证这个 form bean 的属性是必需的。假如发明一个成绩,看成一个哀求属性保留符合的堕落信息关头字,然后将把持重定向回输出表单如许毛病能够被改正。 
实行请求的处置来处置这个哀求(比方在数据库里保留一行)。这能够用嵌进 Action 类自己的代码来完成,可是一般应当挪用一个贸易逻辑bean的一个符合的办法来实行。 
更新将用来创立下一个用户界面页面的服务器端对象(典范情形下是request局限或session局限beans,界说你必要在多长工夫内坚持这些项目可取得)。 
前往一个标识天生呼应的JSP页面的得当的 ActionForward 对象,基于早先更新的beans。典范情形下,你将经由过程在你吸收到的 ActionMapping 对象(假如你利用一个部分于与这个映照上的逻辑名)大概在controller servlet 自己(假如你利用一个全局于使用程序的逻辑名)上挪用 findForward() 失掉一个对如许一个对象的援用。 
当为 Action 类编程时要记着的计划要点包含以下这些: 
controller servlet仅仅创立一个你的 Action 类的实例,用于一切的哀求。如许你必要编写你的 Action 类使其可以在一个多线程情况中准确运转,就象你必需平安地编写一个servlet的 service() 办法一样。 
匡助线程平安编程的最主要的准绳就是在你的 Action 类中仅仅利用部分变量而不是实例变量。部分变量创立于一个分派给(由你的JVM)每一个哀求线程的栈中,以是没有需要忧虑会共享它们。 
只管不该该,代表你的体系中Model部分的的beans仍有大概抛出背例。你应当在你的 perform() 办法的逻辑中捕获一切如许的背例,而且经由过程实行以下语句将它们纪录在使用程序的日记文件中(包含响应的栈跟踪信息): 
servlet.log("Error message text", exception);
作为一个通用的划定规矩,分派很少的资本并在来自统一个用户(在用户的session中)的哀求间坚持它们会招致可伸缩性的成绩。你应当在将把持重定向到得当的View组件前勉力开释如许的资本(比方数据库连接) -- 乃至在你挪用的一个bean抛出了一个背例时。 
别的,你将会想要避免呈现十分年夜的 Action 类。最复杂的完成路子是将你的功效逻辑嵌进到 Action 类自己,而不是将其写在自力的贸易逻辑beans中。除使 Action 类难于了解和保护外,这类办法也使得难于重用这些贸易逻辑代码,由于代码被嵌进到一个组件(Action 类)中并被绑缚运转于web使用程序情况中。 
包含在Struts中的例子程序某种水平上延长了这个计划准绳,由于贸易逻辑自己是嵌进到 Action 类中的。这应当被看做是在这个样本使用程序计划中的一个bug,而不是一个Struts系统布局中的固有特征,大概是一个值得仿效的办法。 

4.3 ActionMapping完成

为了乐成地运转,Struts的controller servlet必要晓得关于每一个URI该如何映照到一个得当的 Action 类的几件事。必要懂得的常识封装在一个叫做 ActionMapping 的Java接口中,它有以上司性: 
actionClass - 用于这个映照的 Action 类完全的Java类名。第一次一个特定的映照被利用,一个这个类的实例将被创立并为今后重用而保留。 
formAttribute - session局限的bean的名字,以后的这个映照的 ActionForm 被保留在这个bean之下。假如这个属性没有被界说,没有 ActionForm 被利用。 
formClass - 用于这个映照的 ActionForm 类完全的Java类名。假如你在利用对form beans的撑持,这个类的一个实例将被创立并保留(在以后的用户会话中) 
path - 婚配选择这个映照的哀求的URI路径。看上面怎样婚配的例子。 
Struts在一个叫做 ActionMappingBase 的类中包含了一个 ActionMapping 接口的便利的完成。假如你不必要为你本人的映照界说任何附加的属性,只管把这个类作为你的 ActionMapping 类好了,就向上面部分形貌的那样设置。但是,界说一个 ActionMapping 完成(多数是扩大 ActionMappingBase 类)来包括附加的属性也是大概的。controller servlet晓得如何主动设置这些定制属性,由于它利用Struts的Digester模块来读设置文件。 
包含在Struts的例子程序中,这个特征用来界说两个附加的属性: 
failure - 假如Action类检测到它吸收的输出字段的一些成绩,把持应当被重定向到的高低文相干的URI。典范情形下是哀求发向的JSP页面名,它将引发表单被从头显现(包括Action类设置的堕落动静和年夜部分比来的来自ActionForm bean的输出值)。 
success - 假如Action类乐成实行哀求的功效,把持应当被重定向到的高低文相干的URI。典范情形下是筹办这个使用程序的会话流的下一个页面的JSP页面名。 
利用这两个分外的属性,例子程序中的 Action 类几近完整自力于页面计划者利用的实践的JSP页面名。这个页面能够在从头计划时被重定名,但是几近不会影响到 Action 类自己。假如“下一个”JSP页面的名字被硬编码到 Action 类中,一切的这些类也必要被修正。 

4.4 Action映照设置文件

controller servlet如何晓得你想要失掉的映照?写一个复杂地初始化新的 ActionMapping 实例而且挪用一切得当的set办法的小的Java类是大概的(可是很贫苦)。为了使这个处置复杂些,Struts包含一个Digester模块可以处置一个想失掉的映照的基于XML的形貌,同时创立得当的对象。看 API 文档 以取得关于Digester更多的信息。 
开辟者的义务是创立一个叫做 action.xml 的XML文件,而且把它放在你的使用程序的WEB-INF目次中。(注重这个文件其实不必要 DTD,由于实践利用的属性关于分歧的用户能够是分歧的)最表面的XML元素必需是<action-mappings>,在这个元素当中是嵌进的0个或更多的 <action> 元素 -- 每个对应于你但愿界说的一个映照。 

来自例子程序的 action.xml 文件包含“注册”功效的以下映照条目,我们用来讲明这个需求: 

<action-mappings>

<forward name="logon" path="/logon.jsp"/>

<action path="/logon"
actionClass="org.apache.struts.example.LogonAction"
formAttribute="logonForm"
formClass="org.apache.struts.example.LogonForm"
inputForm="/logon.jsp">
<forward name="success" path="/mainMenu.jsp"/>
</action>

</action-mappings>
就象你所看到的,这个映照婚配路径 /logon (实践上,由于例子程序利用扩大婚配,你在一个JSP页面指定的哀求的URI停止于/logon.do)。当吸收到一个婚配这个路径的哀求时,一个 LogonAction 类的实例将被创立(仅仅在第一次)并被利用。controller servlet将在关头字 logonForm 下查找一个session局限的bean,假如必要就为指定的类创立并保留一个bean。 
这个 action 元素也界说了一个逻辑名“success”,它在 LogonAction 类中被用来标识当一个用户乐成注册时利用的页面。象如许利用一个逻辑名同意将 action 类断绝于任何因为从头计划地位而大概产生的页面名改动。 

这是第二个在任何 action 以外宣布的 forward 元素,如许它就能够被一切的action全局地取得。在这个情形下,它为注册页面界说了一个逻辑名。当你挪用 mapping.findForward() 时在你的 action 代码中,Struts起首查找这个action当地界说的逻辑名。假如没有找到,Struts会主动为你查找全局界说的逻辑名。 

4.5 Web使用程序睁开形貌符

设置使用程序最初的步骤是设置使用程序睁开形貌符(保留在文件WEB-INF/web.xml中)以包含一切必须的Struts组件。作为一个指南利用例子程序的睁开形貌符,我们看到上面的条目必要被创立或修正。 

4.5.1 设置Action Servlet实例

增加一个条目界说action servlet自己,同时包含得当的初始化参数。如许一个条目看起来象是如许: 
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-p
aram>
<param-name>application</param-name>
<param-value>org.apache.struts.example.ApplicationResources</param-value>
</init-param>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/action.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>mapping</param-name>
<param-value>org.apache.struts.example.ApplicationMapping</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
controller servlet撑持的初始化参数鄙人面形貌,拷贝自 ActionServlet 类的 Javadocs 。方括号形貌假如你没无为谁人初始化参数供应一个值时假定的缺省值。 
application - 使用程序资本包基类的Java类名。. 
config - 包括设置信息的XML资本的高低文相干的路径。 
debug - 这个servlet的调试级别,它把持纪录几信息到日记中。 
digester - 我们在 initMapping() 中使用的Digester的调试级别,它纪录到System.out而不是servlet的日记中。 
forward - 利用的ActionForward完成的Java类名。 
mapping - 利用的ActionMapping完成的Java类名。 
nocache - 假如设置为 true,增添HTTP头信息到一切呼应中使扫瞄器关于天生或重定向到的任何呼应不做缓冲。 
null - 假如设置为 true,设置使用程序资本使得假如未知的动静关头字被利用则前往 null。不然,一个包含不接待的动静关头字的堕落动静将被前往。 

4.5.2 设置Action Servlet映照

有两种一般的办法来界说将被controller servlet处置的URL -- 前缀婚配和扩大婚配。每种办法的一个得当的映照条目将鄙人面被形貌。 
前缀婚配意义是你想让一切以一个特别值开首(在高低文路径部分以后)的URL传送给这个servlet。如许一个条目看起来能够象是如许: 

<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>/execute/*</url-pattern>
</servlet-mapping>
它意味着一个婚配后面形貌的 /logon 路径的哀求的URL看起来象是如许: 
http://www.mycompany.com/myapplication/execute/logon
这里 /myapplicationis 是你的使用程序睁开地点的高低文路径。 
另外一方面,扩大映照基于URL以一个随着界说的一组字符的句点停止的现实而将URL婚配到action servlet 。比方,JSP处置servlet映照到 *.jsp 形式如许它在每一个JSP页面哀求时被挪用。为了利用 *.do 扩大(它意味着“做某件事”)映照条目看起来应当象是如许: 

<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
而且一个婚配之前形貌的 /logon 路径的哀求的URI能够看起来象是如许: 
http://www.mycompany.com/myapplication/logon.do

4.5.3 设置Struts标志库

下一步,你必需增加一个界说Struts标志库的条目。这个条目看起来应当象是如许: 
<taglib>
<taglib-uri>/WEB-INF/struts.tld</taglib-uri>
<taglib-location>/WEB-INF/struts.tld</taglib-location>
</taglib>
它告知JSP体系到那里往找这个库的标志库形貌符(在你的使用程序的WEB-INF目次,而不是在内部互联网上的某个中央)。 

4.5.4 增加Struts组件到你的使用程序中

为了在你的使用程序运转时利用Struts,你必需将 struts.tld 文件拷贝到你的 WEB-INF 目次,将 struts.jar 文件拷贝到你的 WEB-INF/lib 。 ? 



(2)
懂得MVC

MVC是Model,View,Controller的缩写,MVC是Application开辟的计划形式,也就是人人
所晓得的Model2.在MVC的计划形式中,请求在Application开辟中你把贸易逻辑,界面
显现,数据分别。也就是分离在Model,View,Controller完成:数据,把持(贸易逻辑)
显现(页面显现).
在之前大概说传统的WebApplication开辟体例傍边,如Asp,Php,Jsp(Model1)开辟傍边,我们在Asp(Php,Jsp)中完成统统,如:从数据库中取到我们必要的数据,并依据数据之间的联系关系和实践的必要依照某种体例把他显现在页面中和从页面提交的表单中提取数据,依据贸易逻辑从数据库查询相干数据,大概把数据写进数据库。也就是说我们在Asp(Php,Jsp)完成统统包含:界面显现,贸易逻辑,数据存取。如许带来的成果就是你所写的Asp(Php,Jsp)没有条理,而且Html和Script(JavaScript、JScript,Asp、Php、Jsp源代码)互相嵌套.可保护性差,最要命的是在WebApplication一般显现一块是由美工完成的,良多时分也是你先写好Asp、Php、Jsp然后美工举行丑化,很有大概你发明经由美工处置完今后你的代码已改头换面了。你不能不把你的代码从头构造。
在MVC形式中这个成绩的办理举措是:View中卖力显现,View一样平常从Controller失掉已处置过的数据,然后显现在页面傍边,应当说如许在Html中嵌套很少的Script.基础上美工的修正不年夜会废失落你的休息功效。
在利用Java开辟WebApplication有几种切合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
AnActionisanadapterbetweenthecontentsofanincomingHTTPrequest
andthecorrespondingbusinesslogicthatshouldbeexecutedtoprocessthis
request.
下面是Struts开辟小组对Action的形貌,说Action实践上是Request和BusinessLogic
两头的适配器.普通的说就是从表单中取到数据并穿给贸易逻辑操纵举行一系列的操纵
然后前往响应的操纵信息。

ActionForm
AnActionFormisaJavaBeanoptionallyassociatedwithoneormore
ActionMappings.Suchabeanwillhavehaditspropertiesinitializedfrom
thecorrespondingrequestparametersbeforethecorresondingactionsexecute()
methodiscalled.
ActionForm实践上就是把从Request取到的数据封装并举行校验,然后把正当的数据给
Action举行处置。实践上ActionForm除举行数据校验以外别的更主要的是在表单回写
的时分感化很年夜。反而在1.1今后数据校验的年夜部合作作在validation.xml往完成。

ActionMapping,ActionForward
ActionMapping次要是用与设置和形貌相干属性利用的。先看下在struts-config.xml
中的设置文件一段设置形貌:
<action-mappings>
<!--RegistrationAction-->
<actionpath="/usereg"
type="com.bingo.finance.action.UseregAction"
name="useregForm"
scope="request"
validate="true"
input="/usereg.jsp">
<forwardname="success"path="/msg.jsp"/>
</action>
</action-mappings>
ActionMapping就是用来形貌一个Action的URL、详细完成的文件、绝对应的ActionForm
数据属性(requestorsession)、是不是必要举行数据校验和回写、和处置完成后大概
跳转的URL.
而ActionForward你就能够了解为Action操纵完成后的跳转URL,Action在处置完相干操纵后
前往的是一个ActionForward也就是告知Struts我做完这个操纵下一步到哪儿往。


构建Struts1.1运转情况
我的设置是居于Tomcat4.0以上版本会商,其他的AppServer大抵不异。
1:失掉Struts1.1
http://jakarta.apache.org/builds/jakarta-struts/release/v1.1-b1/jakarta-struts-1.1-b1.zip
2:设置
把Struts.jarCopy到$Tomcat_home/common/lib或你利用Struts的Appaction下的WEB-INF/lib下
在你利用Struts的Appaction下web.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>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>

<taglib>
<taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-html.tld</taglib-location>
</taglib>

<taglib>
<taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>

<!--NestedTagLibraryDescriptor-->
<taglib>
<taglib-uri>/WEB-INF/struts-nested.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-nested.tld</taglib-location>
</taglib>

<!--TemplateTagLibraryDescriptor-->
<taglib>
<taglib-uri>/WEB-INF/struts-template.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-template.tld</taglib-location>
</taglib>
Struts1.1中供应了很具体的例子,你能够细心看看.
接上去你该依据必要设置struts-config.xml,以下是一个复杂的例子
<?xmlversion="1.0"encoding="ISO-8859-1"?>

<!DOCTYPEstruts-configPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration1.1//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

<struts-config>

<!--==========FormBeanDefinitions===================================-->
<form-beans>

<!--Registrationformbean-->
<form-beanname="useregForm"
type="com.bingo.finance.action.UserForm"/>

</form-beans>

<!--==========GlobalForwardDefinitions==============================-->
<global-forwards>
<forwardname="error"path="/error.jsp"/>
</global-forwards>

<!--==========ActionMappingDefinitions==============================-->
<action-mappings>

<!--RegistrationAction-->
<actionpath="/usereg"
type="com.bingo.finance.action.UseregAction"
name="useregForm"
scope="request"
validate="true"
input="/usereg.jsp">
<forwardname="success"path="/msg.jsp"/>
</action>
</action-mappings>

<!--==========MessageResourcesDefinitions===========================-->

<message-resources
parameter="com.bingo.finance.common.DisplayMsg"/>

<!--==========PlugInsConfiguration==================================-->

<!--Addmultiplevalidatorresourcefilesbysettingthepathnameproperty-->
<plug-inclassName="org.apache.struts.validator.ValidatorPlugIn">
<set-propertyproperty="pathname"value="/WEB-INF/validator-rules.xml"/>
<set-propertyproperty="pathname"value="/WEB-INF/validation.xml"/>
</plug-in>

</struts-config>
下面的英文我信任你可以看懂。我就不做注释了。你必要持续设置validation.xml了,看以下
复杂的例子.
<form-validation>
<formset>
<formname="useregForm">
<fieldproperty="username"
depends="required,mask,minlength,maxlength">
<arg0key="common_username"/>
<arg1name="minlength"key="${var:minlength}"resource="false"/>
<arg1name="maxlength"key="${var:maxlength}"resource="false"/>
<var>
<var-name>mask</var-name>
<var-value>^w+$</var-value>
</var>
<var>
<var-name>minlength</var-name>
<var-value>5</var-value>
</var>
<var>
<var-name>maxlength</var-name>
<var-value>20</var-value>
</var>
</field>
<fieldproperty="password"
depends="required,mask,minlength,maxlength">
<arg0key="common_password"/>
<arg1name="minlength"key="${var:minlength}"resource="false"/>
<arg1name="maxlength"key="${var:maxlength}"resource="false"/>
<var>
<var-name>mask</var-name>
<var-value>^w+$</var-value>
</var>
<var>
<var-name>minlength</var-name>
<var-value>5</var-value>
</var>
<var>
<var-name>maxlength</var-name>
<var-value>20</var-value>
</var>
</field>
<fieldproperty="nickname"
depends="required,mask,minlength,maxlength">
<arg0key="common_nickname"/>
<arg1name="minlength"key="${var:minlength}"resource="false"/>
<arg1name="maxlength"key="${var:maxlength}"resource="false"/>
<var>
<var-name>mask</var-name>
<var-value>^w+$</var-value>
</var>
<var>
<var-name>minlength</var-name>
<var-value>5</var-value>
</var>
<var>
<var-name>maxlength</var-name>
<var-value>20</var-value>
</var>
</field>
<fieldproperty="superpass"
depends="required,mask,minlength,maxlength">
<arg0key="common_superpass"/>
<arg1name="minlength"key="${var:minlength}"resource="false"/>
<arg1name="maxlength"key="${var:maxlength}"resource="false"/>
<var>
<var-name>mask</var-name>
<var-value>^w+$</var-value>
</var>
<var>
<var-name>minlength</var-name>
<var-value>10</var-value>
</var>
<var>
<var-name>maxlength</var-name>
<var-value>20</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
下面validation.xml就是告知Struts我的useregForm取到的数据应当做上面的考证
username是必需不克不及为空的而且最小长度为5,最年夜长度是20.
................
password,nickname,superpass基础一样我就不做更多申明.至次设置基础停止,我们要入手下手写
第一个Struts了。

开辟Struts1.1

usereg.jsp
为了思索页面的天真性,在页面中显现的一切元素我都放在properties文件中并由
com.bingo.finance.common.HtmlMsg这个文件取到.
===================================================================
<%@pagecontentType="text/html;charset=GBK"%>
<%@pageimport="java.io.*"%>
<%@pageimport="com.bingo.finance.common.HtmlMsg"%>
<%@tagliburi="/WEB-INF/struts-html.tld"prefix="html"%>
<%@tagliburi="/WEB-INF/struts-logic.tld"prefix="logic"%>
<%@tagliburi="/WEB-INF/struts-bean.tld"prefix="bean"%>

<html>
<head>
<title><%=HtmlMsg.TITLE_REGISET%></title>
<metahttp-equiv="Content-Type"content="text/html;charset=gb2312">
</head>

<bodybgcolor="#FFFFFF"text="#000000">
<formname="usereg"method="post"action="usereg.esp">
<!--在Struts中默许的后缀是.do你能够依据必要本人修正-->
<tablewidth="100%"border="0"cellspacing="1"cellpadding="1">
<tralign="center">
<tdcolspan="2"><%=HtmlMsg.TITLE_REGISET%></td>
</tr>
<tr>
<tdwidth="49%"align="right"><%=HtmlMsg.COMMON_USERNAME%>:</td>
<tdwidth="51%">
<!--为了完成回写在Struts中倡议你利用Tag利用以下写法取代一样平常的写法
<html:textproperty="username"size="20"maxlength="30"styleClass="css"styleId="userId"/>
下面的代码你看不懂你必要进一步懂得Tag.
-->
<inputtype="text"name="username"size="20"maxlength="20">
</td>
</tr>
<tr>
<tdwidth="49%"align="right"><%=HtmlMsg.COMMON_PASSWORD%>:</td>
<tdwidth="51%">
<inputtype="password"name="password"size="20"maxlength="20">
</td>
</tr>
<tr>
<tdwidth="49%"align="right"><%=HtmlMsg.COMMON_NICKNAME%>:</td>
<tdwidth="51%">
<inputtype="text"name="nickname"size="20"maxlength="20">
</td>
</tr>
<tr>
<tdwidth="49%"align="right"><%=HtmlMsg.COMMON_SUPERPASS%>:</td>
<tdwidth="51%">
<inputtype="password"name="superpass"size="20"maxlength="20">
</td>
</tr>
<tr>
<tdwidth="49%"align="right">
<inputtype="submit"name="Submit"value="<%=HtmlMsg.ACTION_REGISET%>">
</td>
<tdwidth="51%">
<inputtype="reset"name="Submit2"value="<%=HtmlMsg.COMMON_RESET%>">
</td>
</tr>
</table>
</form>
</body>
</html>


UseregActiom.java
===========================================================
packagecom.bingo.finance.action;

//javaimport
importjava.io.IOException;
importjava.util.Locale;

//servletimport
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpSession;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;

//strutsimport
importorg.apache.struts.action.Action;
importorg.apache.struts.action.ActionForm;
importorg.apache.struts.action.ActionForward;
importorg.apache.struts.action.ActionMapping;
importorg.apache.struts.util.MessageResources;

//financeimport
importcom.bingo.finance.action.UserForm;
importcom.bingo.finance.manager.UserManager;
importcom.bingo.finance.entity.User;

publicclassUseregActionextendsAction{
//在Struts1.1之前利用perform
//struts1.1利用execute替换perform
publicActionForwardexecute(ActionMappingmapping,
ActionFormform,
HttpServletRequestrequest,
HttpServletResponseresponse)
throwsIOException,ServletException{
try{
UserFormuserForm=(UserForm)form;
UserManageruserManager=newUserManager();
Useruser=userManager.formToEntity(userForm);
userManager.add(user);
//InsertintoDataBaseaUserinfo
}catch(Exceptionex){
returnmapping.findForward("error");
}
returnmapping.findForward("success");
//ForWardis"/msg.jsp"
}
}

UserForm.java
=========================================================================
packagecom.bingo.finance.action;

柔情似水 发表于 2015-1-21 07:36:40

学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。

再见西城 发表于 2015-1-24 14:42:44

如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。

山那边是海 发表于 2015-1-25 18:20:18

是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能

老尸 发表于 2015-1-26 20:58:49

是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言

飘灵儿 发表于 2015-1-28 15:53:57

是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言

金色的骷髅 发表于 2015-1-30 07:30:52

那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!

飘飘悠悠 发表于 2015-1-31 19:12:19

你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。

分手快乐 发表于 2015-2-2 22:30:15

我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。

不帅 发表于 2015-2-5 09:54:39

自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。

谁可相欹 发表于 2015-2-5 12:42:31

Java 编程语言的风格十分接近C、C++语言。

变相怪杰 发表于 2015-2-9 21:38:11

你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。

再现理想 发表于 2015-2-27 22:22:52

《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。

若相依 发表于 2015-3-6 13:14:21

你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。

莫相离 发表于 2015-3-8 11:33:56

是一种将安全性(Security)列为第一优先考虑的语言

仓酷云 发表于 2015-3-9 00:13:24

Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。

小女巫 发表于 2015-3-9 10:23:46

你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。

乐观 发表于 2015-3-9 15:07:51

Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。

海妖 发表于 2015-3-10 07:21:05

《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。

只想知道 发表于 2015-3-10 21:24:36

如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
页: [1] 2
查看完整版本: JAVA网站制作之Struts1.1 先容