structs构架
在周报管理系统中,要求系统安全可靠系统采用了structs构架,系统层内及每层之间都采用了安全验证,用户密码采用了MD5加密,系统具有数据库备份功能.请问什么是struc...
在周报管理系统中,要求系统安全可靠 系统采用了structs构架,系统层内及每层之间都采用了安全验证,用户密码采用了MD5加密,系统具有数据库备份功能.
请问什么是structs构架?密码大概怎样加密? 展开
请问什么是structs构架?密码大概怎样加密? 展开
2个回答
展开全部
密码使用SHA加密就可以了,
给你一个加密的例子,JAVA自带的
public static String hashMessage(String message){
MessageDigest md;
try {
md = MessageDigest.getInstance("SHA");
} catch (java.security.NoSuchAlgorithmException e) {
throw new RuntimeException(e.getMessage());
}
md.update(message.getBytes());
return new BigInteger(md.digest()).toString();
}
这里还有更详细的加密
public class sha1 {
private int a = 0x67452301;
private int b = 0xefcdab89;
private int c = 0x98badcfe;
private int d = 0x10325476;
private int e = 0xc3d2e1f0;
private int tmpData[] = new int[80];
private int tmpInt = 0;
public sha1() {
}
private void init() {
a = 0x67452301;
b = 0xefcdab89;
c = 0x98badcfe;
d = 0x10325476;
e = 0xc3d2e1f0;
tmpInt = 0;
for(int i = 0; i < tmpData.length; i++) {
tmpData[i] = 0;
}
}
public void byteToInt(byte byteData[], int i) {
tmpData[tmpInt++] = ((byteData[i] & 0xff)<<24) | ((byteData[i + 1] & 0xff)<<16) | ((byteData[i + 2] & 0xff)<<8) | (byteData[i + 3] & 0xff);
if(tmpInt == 16) {
encrypt();
}
}
private void intToByte(int intValue, byte byteData[], int i) {
byteData[i] = (byte)(intValue>>>24);
byteData[i + 1] = (byte)(intValue>>>16);
byteData[i + 2] = (byte)(intValue>>>8);
byteData[i + 3] = (byte)intValue;
}
public void setLength(long l) {
if(tmpInt > 14) {
encrypt();
}
tmpData[14] = (int)(l>>>32);
tmpData[15] = (int)(l & -1L);
}
public int getResult(byte byteData[]) {
intToByte(a, byteData, 0);
intToByte(b, byteData, 4);
intToByte(c, byteData, 8);
intToByte(d, byteData, 12);
intToByte(e, byteData, 16);
init();
return 20;
}
private int f1(int x, int y, int z) {
return (x & y) | (~x & z);
}
private int f2(int x, int y, int z) {
return x ^ y ^ z;
}
private int f3(int x, int y, int z) {
return (x & y) | (x & z) | (y & z);
}
private int f4(int x, int y) {
return (x<<y) | x>>>(32 - y);
}
public void encrypt() {
for(int i = 16; i <= 79; i++) {
tmpData[i] = f4(tmpData[i - 3] ^ tmpData[i - 8] ^ tmpData[i - 14] ^ tmpData[i - 16], 1);
}
int tmpa = a;
int tmpb = b;
int tmpc = c;
int tmpd = d;
int tmpe = e;
for(int j = 0; j <= 19; j++) {
int tmp = f4(tmpa, 5) + f1(tmpb, tmpc, tmpd) + tmpe + tmpData[j] + 0x5a827999;
tmpe = tmpd;
tmpd = tmpc;
tmpc = f4(tmpb, 30);
tmpb = tmpa;
tmpa = tmp;
}
for(int k = 20; k <= 39; k++) {
int tmp = f4(tmpa, 5) + f2(tmpb, tmpc, tmpd) + tmpe + tmpData[k] + 0x6ed9eba1;
tmpe = tmpd;
tmpd = tmpc;
tmpc = f4(tmpb, 30);
tmpb = tmpa;
tmpa = tmp;
}
for(int l = 40; l <= 59; l++) {
int tmp = f4(tmpa, 5) + f3(tmpb, tmpc, tmpd) + tmpe + tmpData[l] + 0x8f1bbcdc;
tmpe = tmpd;
tmpd = tmpc;
tmpc = f4(tmpb, 30);
tmpb = tmpa;
tmpa = tmp;
}
for(int m = 60; m <= 79; m++) {
int tmp = f4(tmpa, 5) + f2(tmpb, tmpc, tmpd) + tmpe + tmpData[m] + 0xca62c1d6;
tmpe = tmpd;
tmpd = tmpc;
tmpc = f4(tmpb, 30);
tmpb = tmpa;
tmpa = tmp;
}
a += tmpa;
b += tmpb;
c += tmpc;
d += tmpd;
e += tmpe;
tmpInt = 0;
for(int n = 0; n < tmpData.length; n++) {
tmpData[n] = 0;
}
}
}
这里是struts的架构
理解Struts 原理
使用Struts 控制流 讨论Struts 的优缺点
A common mistake that people make whencompletely foolproof is to un?框架,以及它能给你的应用开发所带来的好处。我们相信一旦你也构和设计,你就可以很好的在你的应用中使用架构有个充分的全面印象,我们将总体介绍响应事件循环的方式。只有彻底理解这个处理原理才能最好的在应用中使用这个框架。应该是个漫不经心的决定。很多人将使用这本书,特别是用是否适合它们的项目。因此, 对专业开发人员。为做出正确的决策,Struts
trying to design something
derestimate the ingenuity of
complete fools.
Douglas Adams, Mostly Harmless
2.1 Talking the talk
本章深入探讨Struts
能“随便谈谈 ”web架 Struts。
为了能对Struts Struts的控制流和它处理请
求-
选择一个web 应用框架不
这章的内容来评价Struts 我们在这章的最后将有一个关于Struts
优缺点的公正的看法,并阐明其总体性能。
Struts 设计针 专业人员应该知晓工具的能力和限
制性。
2.2 为什么我们需要
今天的web 应用基本上都是代表共同理念的关键组件。通常,开发团队需要在有限的
时间里创建应用,然它们不得不正确的构建,并能持续构建它。
Java web 开发人员已经有一些工具可用来建立表现层,比如JavaServer Pages 和
Velocity 模板。也有一些机制来处理数据库?如JDBC 和Enterprise JavaBeans (EJBs)。但我们
用什么来将它们集合在一起? 我们已经有了型材和砖墙…还缺什么?
2.2.1 退一进三
在上世纪80年代,当GUI被发明时,软件架构认为,应用具有3个主要部件:
管理数据的部件,创建屏幕和报表的部件,以及处理用户交互和子系统交互的部件
[Ooram]。
在90年代早期,ObjectWorks/Smalltalk 编程环境将这个3角结构引入为一个开发框架。
按Smalltalk 80的说法,数据系统称为模型 Model,表现系统称为视图 View, 而交互系统称为
控制器Controller.。许多现代开发环境,包括Java的Swing, 都使用Model/View/Controller
(MVC) 架构作为它们的基础架构 。
图 2-1 MVC架构 Java web 开发者已经有很多有用的工具,比如JDBC 和 JSP, 作为 Model 和 View的
2.2.2 进入 Struts
制器。Struts 控制器搭起了Model 和View之间的桥
梁。框架也包括开发人员想用来开发可伸缩的、先进的应用的其他组件。Struts是一个“隐
应用如何准确的和
用户进行交互。这些组件在逻辑名称后隐藏了令人讨厌的、繁琐的实现细节。开发人员可以
编 细节,然后转头考虑它们的应用应该做什么,而不是考虑应用应该如何
做。
据和其
手段,但作为控制器的工具和组件在哪? Struts 的核心是一个MVC风格的控藏支柱”的集合,帮助开发人员将分散的材料如数据库和页面,结合成一个整体的应用程序。2.2.3 Struts控制器组件 Struts 控制器组件是一个可编程的组件集,允许开发人员定义它们的一次性写这些实现 用户通过超链接和HTML form与Web应用程序进行交互。超链接引导页面显示数他内容,如文本和图像。表单通常通过一些定制动作向应用提交数据。 主要 Struts 组件
如图5中所示, Struts提供了开发人员可用来定义超链接,表单,和定制动作这些交互
的组件。我们已经使用这些组件在第1章创建了一个入门程序。第3章,我们还要用他们来创
建另一个程序。然后,在第4章,我们将讨论这些组件的详细配置。随后的章节,将详细讨
论如何将每个组件用在你的程序之中。在第4章,我们将展示如何在运行的程序上下文中使
用这些组件。但是,因为这章是架构性的总体介绍,所以我们继续介绍Struts的主要部件。
图 2-2
注
Struts 组件是通过一个XML 文件进行配置的。实践中,配置项是Struts 框架的有机组成部分。为了
将他们糅合在
2.2.3.1 超链
web页面,
或者是定制动作。 人员可以定义超链接为一个
ActionForward.
path 然后通过
名称来引用Acti
Struts启动时读入。 onForward列表。
可用来创建到欢迎页面链接的
一起,我们在讲述它们的时候,会展示每个组件的XML配置项。 接 对应用开发人员来说, 超链接是指向应用中某些资源的路径。它们可能是 它可以包含特殊的参数。在Struts中,开发。 这些对象都有个逻辑名称和一个path 属性。这使得开发人员可以设置onForward。ActionForward 通常在一个XML文件中定义,这个配置文件在Struts 使用 XML 定义来创建Struts 配置,包括一个ActiActionForward 对象的XML元素看起来可能像:
<forward
name="welcome" path="/pages/index.jsp"/>
这个元素创建一个 ActionForward JavaBean ,其name属性设置为welcome, path 属
标而不用改变所有引用该链接的组件。在大多数Web应用中,像这样的细节被硬编码到JSP
困难并且容易发生错误。在Struts 应用中,这些细节可以通过
应用配置来改变,而不用触及到具体的页面和Java 类。
难题留给了开发人员。Struts framework 提供了ActionForm 类, 它设计来处理从
修订循环的
性设置为/pages/index.jsp. JSP 页面和其它组件就可以引用welcome 转发。Struts 框架将查找welcome ActionForward bean 并检索path 属性来完成这个超链接。这时开发人员可以改变链接的目或 Java code中,使维护变得2.2.3.2 HTML表单 web 协议,HTTP 和 HTML,提供了一个从表单提交数据的机制,但却把数据接收作为一个HTML 表单来的输入,校验输入,重新显示表单以供用户进行修订(如果需要),以及伴随相应的提示和信息。ActionForm 其实是具有一些标准方法来管理校验和JavaBean。Struts 自动匹配JavaBean 属性和HTML 表单控件的属性。开发者定义ActionForm类,余下的就交给Struts 。 例如,这个类将自动用HTML表单中同名的属性来组装username域: public final class LogonForm extends ActionForm { private String username = null;
public String getUsername() { return (this.username); } public void setUsername(String username) { this.username = username; }
}
其它属性也会根据表单中的每个域被自动加入。们想要的属性。所以,完全不需要详细分析HTTP 请求。 ActionForm 是按通常的Java 类创建的。Struts配置通过一系列描述符引用A
这使其它组件可以从标准的JavaBean取得它
ctionForm
: <form-beans> 和 <form-bean> 元素。<form-bean> 元素是框架用来识别和实
ionF 的描述符:
类例化Actorm 对象
<form-bean name="articleForm" type="org.apache.artimus.struts.Form"/>
Struts 配置列出它使用的ActionForm bean的清单,并给每个bean一个在应用中被引用时的逻辑名。 1.0 和 1.1
Struts 1.1 中,ActionForm 可以使用Map (java.util.Map) 来存储属性名,而不是单独定义它们。
一种新的JavaBean, DynaBean, 可以在Struts 1.1 和后来的版本中使用。
你可以使用XML 元素来标识DynaActionForm 的属性。这使你可以使用 Struts 配置文件来定义
ActionForms。 2.2.3.3 定制动作
HTML 表单使用 action 参数来告诉浏览器将数据送到哪里? Struts 框架提供相应
的Action 类来接收数据。框架会自动创建、组装、校验和最后处理Action 对象对应的
ctionForm。这样,Action 就可以直接从ActionForm bean取得它需要的数据。比如下例:
A public final class LogonAction extends Action {
public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { MyForm myForm = (MyForm) form;
// ...
return mapping.findForward("continue"); } } Action 根据返回到控制器的ActionForward 对象作出控制流的决定。这允许Action 选
为保证扩展性,控制器也传递当前的请求和响应对象。实际上, Action 可以做所有Java
可以做的事情。
择一个逻辑名称,象continue 或者 cancel,而不是系统路径。 Servlet 1.0 vs 1.1 在Struts 1.1 中,新的 execute 方法应该是首选,而不是我们例子中的perform 方法。perform
已经不被推荐,但还保持向后兼容,予以支持。execute 方法体允许更好的例外处理。新的
ExceptionHandler 在第9章讲述。 关于Action 对象的详细信息,见第8 章。
onForm,和 Action 对象,Struts控制器层还提供几个特殊的组件,
包括ActionMappings 和 ActionServlet。 Struts 也提供在控制器层的应用本地化。
2.2.3.4 ActionMappings
来进行引用。 资源包括HTML 页面,JSP 页
URI, 或者说路径,Struts 框架提供了一个
ActionMapping 对象。 象ActionForward 和 ActionForm一样, ActionaMapping通常也在
L配置文件中定义:
除了ActionForward, Acti 在一个web 应用中,每个资源必须通过URI面,和定制动作。为了给定制动作一个XM
<action-mappings>
<action
path="/logonSubmit"
type="app.LogonAction"
name="logonForm" scope="request" validate="true" input="/pages/logon.jsp"/> </action-mappings> 这也允许同一个Action 对象定义为不同的ActionMappings。例如, 一个映射要求校验
而另一个映射不要求校验。
ervlet
虽然它也可以子类化,
但大多数Struts 1.0 的开发人员将ActionServlet 处理为一个黑盒:他们只是配置它,然后让
自己工作。
在Struts 1.1中,ActionServlet 是比较易于扩展的。第9 章将讨论Struts 1.1 ActionServlet
的扩展点和配置选项。
Web 应用也通过各种提示和信息与用户进行交互。Struts 组件均有内建的本地化特征,
以便Struts应用可以为国际化用户使用。我们在此书中贯穿使用本地化特征。本地化的详细
讨论见第13章。
Form,定制的服务器端动作定义为Action 类。
需要访问JDBC和EJB的开发人员也可通过Action对象进行。这样,表现层不需要和Model
2.2.3.5 ActionS Struts ActionServlet 完全在幕后工作,它将其他组件绑定在一起。它 新2.2.3.6 本地化 2.2.4 用Struts开发Web应用 要使用Struts开发web 应用,开发人员将需要的超链接定义为ActionForward,HTML 表单定义为Action
层打交道truts Actio 。S n 对象将收集View 需要的数据,然后将它们转发到表现页面。Struts
JSP 页面一起使用,简化 提供 JSP 标记库,它们和 HTML 表单和存取Action 要转发的其它数据。其它表现机制,比如Velocity templates, 也可用来访问 Struts 框架,来创建动态的web 页面。这种处理流程入下图: 传给视图
第10章和第11章学习如何创建
Struts的表现页面。
架构前,让我们看看一个Web应用框架必须说明的问题。
2.3 为什么需要框架
论了为什么框架很重要。但为了真正理解一个解
决方案,我们需要了解问题所在。为web开发应用虽然是值得的,但也要迎接各种挑战。让
挑战。
2.3.1 Web? 永无休止的修补
Web 开发者受到两种web缺陷的影响。首先,我们希望使用浏览器作为客户端。其次,
必须使用web协议进行通讯。
Web 浏览器通过HTTP协议通信,并用HTML显示页面。Web浏览器发送HTTP请求,
加工和显示它收到的响应。在处理很少改变的预先编好的页面时,这是个很好的平台。但
我们大多都是编写动态程序,页面针对不同的用户是不同的。虽然有一些现成的动态特征的
段,web 仍然受到HTTP/HTML 的制约。
如下表所示: web 协议和客户端的限制,确定了如何编写Web程序。
表格 2-1 HTTP/HTML 的限制
图 2-3 数据回 关于和Struts中如何使用各种数据系统,见第14章。 在深入Struts 第1章,我们介绍了应用框架,简短讨我们快速看看是什么使web 开发富有我们并手限制 导致的困难 协议 缺省情况下,HTTP接收来自于网络上各种客户端的连接。但各种服
务器间的行为是不一样的; 首先,HTTP用简单的文本域来传输数据。传输二进制文件需要复杂
的协议扩展
HTTP协议是无状态的,需要额外的努力来跟踪程序的用户
HTTP信赖并期望客户能提供正确的信息 客户端 浏览器是个独立的程序,处于应用的控制之外
所有的浏览器都是不一样的,都只支持官方标准的一个子集
从浏览器的输入可能是不正确或者不完整的。甚至可能是敌意的,
和对程序有害的信息
HTML不能够建立一些在桌面环境中有的接口元素
用缺省数据建立HTML控件对应用来说是个考验 很不幸,这种状况现在并没有些许改变。Web开发人员在想战胜挑战时必须看到这些缺
对编写强壮的Web应用有太多障碍,使用框架便显得至关重要,免得你的应用陷入
无休止的工作和改进之中。
我们面临的挑战是很巨大的。但同时也是值得的。HTTP 协议和
HTML 客户端使所有的人都可以访问你的应用。没有其他哪个平台能声称这样。
解决方案
,Java Servlet 平台[Sun, JST] 扮演了一个基本框架,为Java web 应用提
供了大量的能力。Servlet 提供了一个处理HTTP请求和确保响应的基本接口。它在HTTP之
话” 上下文,帮助跟踪应用程序的用户。当然它也提供其他的上下文,帮
助应用传输数据到浏览器或者应用中的其他servlet。Java web 应用也具有对基本安全特性的
不同的服务器上的管理是不一样的。
为了将这些内容集成在一起,Servlet规范引入了一个容器来管理它们。容器也可以提供
其他服务,比如作为一个JSP的处理器。Servlet 容器可以包含它自己的web server,也可以
对数据库访问, Java 应用在其建议中有另外一个通用的框架: JDBC。开发者可以写
准的SQL 接口,而将烦人的细节留给适配器来处理。这使得可以很容易的改变数据库厂
都可以和EJB一起使用。
总之,这使得基于Servlet的web应用非常轻便,并相对易于编写和维护。Servlet 和 JSP
角色。 象Strtus这样的Java web 应用框架构架于Servlet之
框架也包括一个类结构树,这些类你可以在
中实 扩展。通常, 应用框架的目标是帮助你将你需要的数据从浏览器发出,
它们既不阻碍数据库访问,也没有提供帮助。而某些框架, 如
s 库访问,而将其它任务留给开发人员或者其他框架。
2.3.3.1 通用框架策略
陷。因为 在开发Web应用时2.3.2 Servlet 如第一章所述上构建了一个“会统一访问,而这些安全特性在简单的作为一个现存服务器的附属组件。 标商,而不用重写源代码。 为了取得远程服务器的高性能数据库访问, web 开发人员可以使用EJB平台。大多数ava 应用框架,包括Struts, J 在编写应用中扮演了完全不同的上,给开发者提供一个无缝的集成环境。 2.3.3 Servlet 框架 大多数,不是全部, Java web 框架使用 Sun Servlet 平台为基础。这些框架都绑定一些预制的servlet,你可以插入到你的应用中去。你的应用现或者进入到编程结构之中,这样你的应用就可以使用它?或者从编程结构中发出,进入到浏览器之中,这样你就可以看到。 一些框架,如 Turbine [ASF, Turbine],也提供helper 类来运行于 JDBC 数据库。其他框架, 如Struts, 则是模型中立的。dbForm [dbForms],则专注于数据
如下图所示, Java web应用框架使用一些通用技术来帮助产品易于设计、编写和维护,
式(Front
外部表现系统
让不同的人同时工作在同一应 a工程师可以工作在和中心控制
相关的类,而页面设计者则专注于JSP。除了JSP,其他表现系统,如Velocity Templates 或
X
些书象 Design
Patterns [Go4] 和 Core J2EE Patterns [Go3]给出的范例中根深蒂固了。许多开发者在讨论并
些 第一次在Web环境中实现它们。使用设计模式,如MVC,使
容 情来构建你的应用。在桌面环境中使用设计模式的优点已经众
所周知了,但在Web环境部署这些模式却对大多数开发者来说还是不确定的。
包括: 外部配置文件 提供开发人员不想嵌入源代码中的实现细节。 中心控制器 提供一种方式,将HTTP 请求排入一个易于管理的队列。这种设计有时叫前端控制器模 Controller [Go3]) 用的不同部分。如, Jav器者LST, 都可以和Struts一起使用。 框架通常有各种组件,但基本上都共享这个特性。这些公共策略早已在一使用这模式,但也许还没有你可以易的通过做正确的事 图 2-4 通常使用配置文件,控制器和表现系统的框架 2.3.4 黑盒-白盒统一体 框架有时分为两极标有白盒和黑盒的统一体[Fayad]。白盒框架严重依赖于面向对象的
语言的 承和动态绑定。黑盒框架则注重定义可插入组件的接口,然后基于这些接
口提供基本的起始组件。接口和基本组件通常提供热点(hotspot )方法,这个方法可以直接
使用或者重写后提供特别的行为。
特征,如继
定义
热点有时也称为是灵活点或者扩展点,它其实是框架中的一些位置,在这里可以加入一些代码来定制框架。热
点(热点 应用中可 系统)每个以被框架所支持的不同特征。本质上,它们代表框架所解决的问题。许多面向对象
框架有一个核心系统和一些热点子系统组成[Braga, et al] 像许多正在使用的框架, Struts 使用混合的黑盒和白盒技术。但总体上,框架将偏向
统一体的黑盒一端。
黑盒框架通常依赖于设计模式。Struts 也不例外。事实上,设计模式通常被用来作为框
架的总体描述 [Johnson
在Struts 框架之中。
2.4 Struts, Model 2, 以及 MVC
Struts 关于自己要说的第一句话就
给你一个加密的例子,JAVA自带的
public static String hashMessage(String message){
MessageDigest md;
try {
md = MessageDigest.getInstance("SHA");
} catch (java.security.NoSuchAlgorithmException e) {
throw new RuntimeException(e.getMessage());
}
md.update(message.getBytes());
return new BigInteger(md.digest()).toString();
}
这里还有更详细的加密
public class sha1 {
private int a = 0x67452301;
private int b = 0xefcdab89;
private int c = 0x98badcfe;
private int d = 0x10325476;
private int e = 0xc3d2e1f0;
private int tmpData[] = new int[80];
private int tmpInt = 0;
public sha1() {
}
private void init() {
a = 0x67452301;
b = 0xefcdab89;
c = 0x98badcfe;
d = 0x10325476;
e = 0xc3d2e1f0;
tmpInt = 0;
for(int i = 0; i < tmpData.length; i++) {
tmpData[i] = 0;
}
}
public void byteToInt(byte byteData[], int i) {
tmpData[tmpInt++] = ((byteData[i] & 0xff)<<24) | ((byteData[i + 1] & 0xff)<<16) | ((byteData[i + 2] & 0xff)<<8) | (byteData[i + 3] & 0xff);
if(tmpInt == 16) {
encrypt();
}
}
private void intToByte(int intValue, byte byteData[], int i) {
byteData[i] = (byte)(intValue>>>24);
byteData[i + 1] = (byte)(intValue>>>16);
byteData[i + 2] = (byte)(intValue>>>8);
byteData[i + 3] = (byte)intValue;
}
public void setLength(long l) {
if(tmpInt > 14) {
encrypt();
}
tmpData[14] = (int)(l>>>32);
tmpData[15] = (int)(l & -1L);
}
public int getResult(byte byteData[]) {
intToByte(a, byteData, 0);
intToByte(b, byteData, 4);
intToByte(c, byteData, 8);
intToByte(d, byteData, 12);
intToByte(e, byteData, 16);
init();
return 20;
}
private int f1(int x, int y, int z) {
return (x & y) | (~x & z);
}
private int f2(int x, int y, int z) {
return x ^ y ^ z;
}
private int f3(int x, int y, int z) {
return (x & y) | (x & z) | (y & z);
}
private int f4(int x, int y) {
return (x<<y) | x>>>(32 - y);
}
public void encrypt() {
for(int i = 16; i <= 79; i++) {
tmpData[i] = f4(tmpData[i - 3] ^ tmpData[i - 8] ^ tmpData[i - 14] ^ tmpData[i - 16], 1);
}
int tmpa = a;
int tmpb = b;
int tmpc = c;
int tmpd = d;
int tmpe = e;
for(int j = 0; j <= 19; j++) {
int tmp = f4(tmpa, 5) + f1(tmpb, tmpc, tmpd) + tmpe + tmpData[j] + 0x5a827999;
tmpe = tmpd;
tmpd = tmpc;
tmpc = f4(tmpb, 30);
tmpb = tmpa;
tmpa = tmp;
}
for(int k = 20; k <= 39; k++) {
int tmp = f4(tmpa, 5) + f2(tmpb, tmpc, tmpd) + tmpe + tmpData[k] + 0x6ed9eba1;
tmpe = tmpd;
tmpd = tmpc;
tmpc = f4(tmpb, 30);
tmpb = tmpa;
tmpa = tmp;
}
for(int l = 40; l <= 59; l++) {
int tmp = f4(tmpa, 5) + f3(tmpb, tmpc, tmpd) + tmpe + tmpData[l] + 0x8f1bbcdc;
tmpe = tmpd;
tmpd = tmpc;
tmpc = f4(tmpb, 30);
tmpb = tmpa;
tmpa = tmp;
}
for(int m = 60; m <= 79; m++) {
int tmp = f4(tmpa, 5) + f2(tmpb, tmpc, tmpd) + tmpe + tmpData[m] + 0xca62c1d6;
tmpe = tmpd;
tmpd = tmpc;
tmpc = f4(tmpb, 30);
tmpb = tmpa;
tmpa = tmp;
}
a += tmpa;
b += tmpb;
c += tmpc;
d += tmpd;
e += tmpe;
tmpInt = 0;
for(int n = 0; n < tmpData.length; n++) {
tmpData[n] = 0;
}
}
}
这里是struts的架构
理解Struts 原理
使用Struts 控制流 讨论Struts 的优缺点
A common mistake that people make whencompletely foolproof is to un?框架,以及它能给你的应用开发所带来的好处。我们相信一旦你也构和设计,你就可以很好的在你的应用中使用架构有个充分的全面印象,我们将总体介绍响应事件循环的方式。只有彻底理解这个处理原理才能最好的在应用中使用这个框架。应该是个漫不经心的决定。很多人将使用这本书,特别是用是否适合它们的项目。因此, 对专业开发人员。为做出正确的决策,Struts
trying to design something
derestimate the ingenuity of
complete fools.
Douglas Adams, Mostly Harmless
2.1 Talking the talk
本章深入探讨Struts
能“随便谈谈 ”web架 Struts。
为了能对Struts Struts的控制流和它处理请
求-
选择一个web 应用框架不
这章的内容来评价Struts 我们在这章的最后将有一个关于Struts
优缺点的公正的看法,并阐明其总体性能。
Struts 设计针 专业人员应该知晓工具的能力和限
制性。
2.2 为什么我们需要
今天的web 应用基本上都是代表共同理念的关键组件。通常,开发团队需要在有限的
时间里创建应用,然它们不得不正确的构建,并能持续构建它。
Java web 开发人员已经有一些工具可用来建立表现层,比如JavaServer Pages 和
Velocity 模板。也有一些机制来处理数据库?如JDBC 和Enterprise JavaBeans (EJBs)。但我们
用什么来将它们集合在一起? 我们已经有了型材和砖墙…还缺什么?
2.2.1 退一进三
在上世纪80年代,当GUI被发明时,软件架构认为,应用具有3个主要部件:
管理数据的部件,创建屏幕和报表的部件,以及处理用户交互和子系统交互的部件
[Ooram]。
在90年代早期,ObjectWorks/Smalltalk 编程环境将这个3角结构引入为一个开发框架。
按Smalltalk 80的说法,数据系统称为模型 Model,表现系统称为视图 View, 而交互系统称为
控制器Controller.。许多现代开发环境,包括Java的Swing, 都使用Model/View/Controller
(MVC) 架构作为它们的基础架构 。
图 2-1 MVC架构 Java web 开发者已经有很多有用的工具,比如JDBC 和 JSP, 作为 Model 和 View的
2.2.2 进入 Struts
制器。Struts 控制器搭起了Model 和View之间的桥
梁。框架也包括开发人员想用来开发可伸缩的、先进的应用的其他组件。Struts是一个“隐
应用如何准确的和
用户进行交互。这些组件在逻辑名称后隐藏了令人讨厌的、繁琐的实现细节。开发人员可以
编 细节,然后转头考虑它们的应用应该做什么,而不是考虑应用应该如何
做。
据和其
手段,但作为控制器的工具和组件在哪? Struts 的核心是一个MVC风格的控藏支柱”的集合,帮助开发人员将分散的材料如数据库和页面,结合成一个整体的应用程序。2.2.3 Struts控制器组件 Struts 控制器组件是一个可编程的组件集,允许开发人员定义它们的一次性写这些实现 用户通过超链接和HTML form与Web应用程序进行交互。超链接引导页面显示数他内容,如文本和图像。表单通常通过一些定制动作向应用提交数据。 主要 Struts 组件
如图5中所示, Struts提供了开发人员可用来定义超链接,表单,和定制动作这些交互
的组件。我们已经使用这些组件在第1章创建了一个入门程序。第3章,我们还要用他们来创
建另一个程序。然后,在第4章,我们将讨论这些组件的详细配置。随后的章节,将详细讨
论如何将每个组件用在你的程序之中。在第4章,我们将展示如何在运行的程序上下文中使
用这些组件。但是,因为这章是架构性的总体介绍,所以我们继续介绍Struts的主要部件。
图 2-2
注
Struts 组件是通过一个XML 文件进行配置的。实践中,配置项是Struts 框架的有机组成部分。为了
将他们糅合在
2.2.3.1 超链
web页面,
或者是定制动作。 人员可以定义超链接为一个
ActionForward.
path 然后通过
名称来引用Acti
Struts启动时读入。 onForward列表。
可用来创建到欢迎页面链接的
一起,我们在讲述它们的时候,会展示每个组件的XML配置项。 接 对应用开发人员来说, 超链接是指向应用中某些资源的路径。它们可能是 它可以包含特殊的参数。在Struts中,开发。 这些对象都有个逻辑名称和一个path 属性。这使得开发人员可以设置onForward。ActionForward 通常在一个XML文件中定义,这个配置文件在Struts 使用 XML 定义来创建Struts 配置,包括一个ActiActionForward 对象的XML元素看起来可能像:
<forward
name="welcome" path="/pages/index.jsp"/>
这个元素创建一个 ActionForward JavaBean ,其name属性设置为welcome, path 属
标而不用改变所有引用该链接的组件。在大多数Web应用中,像这样的细节被硬编码到JSP
困难并且容易发生错误。在Struts 应用中,这些细节可以通过
应用配置来改变,而不用触及到具体的页面和Java 类。
难题留给了开发人员。Struts framework 提供了ActionForm 类, 它设计来处理从
修订循环的
性设置为/pages/index.jsp. JSP 页面和其它组件就可以引用welcome 转发。Struts 框架将查找welcome ActionForward bean 并检索path 属性来完成这个超链接。这时开发人员可以改变链接的目或 Java code中,使维护变得2.2.3.2 HTML表单 web 协议,HTTP 和 HTML,提供了一个从表单提交数据的机制,但却把数据接收作为一个HTML 表单来的输入,校验输入,重新显示表单以供用户进行修订(如果需要),以及伴随相应的提示和信息。ActionForm 其实是具有一些标准方法来管理校验和JavaBean。Struts 自动匹配JavaBean 属性和HTML 表单控件的属性。开发者定义ActionForm类,余下的就交给Struts 。 例如,这个类将自动用HTML表单中同名的属性来组装username域: public final class LogonForm extends ActionForm { private String username = null;
public String getUsername() { return (this.username); } public void setUsername(String username) { this.username = username; }
}
其它属性也会根据表单中的每个域被自动加入。们想要的属性。所以,完全不需要详细分析HTTP 请求。 ActionForm 是按通常的Java 类创建的。Struts配置通过一系列描述符引用A
这使其它组件可以从标准的JavaBean取得它
ctionForm
: <form-beans> 和 <form-bean> 元素。<form-bean> 元素是框架用来识别和实
ionF 的描述符:
类例化Actorm 对象
<form-bean name="articleForm" type="org.apache.artimus.struts.Form"/>
Struts 配置列出它使用的ActionForm bean的清单,并给每个bean一个在应用中被引用时的逻辑名。 1.0 和 1.1
Struts 1.1 中,ActionForm 可以使用Map (java.util.Map) 来存储属性名,而不是单独定义它们。
一种新的JavaBean, DynaBean, 可以在Struts 1.1 和后来的版本中使用。
你可以使用XML 元素来标识DynaActionForm 的属性。这使你可以使用 Struts 配置文件来定义
ActionForms。 2.2.3.3 定制动作
HTML 表单使用 action 参数来告诉浏览器将数据送到哪里? Struts 框架提供相应
的Action 类来接收数据。框架会自动创建、组装、校验和最后处理Action 对象对应的
ctionForm。这样,Action 就可以直接从ActionForm bean取得它需要的数据。比如下例:
A public final class LogonAction extends Action {
public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { MyForm myForm = (MyForm) form;
// ...
return mapping.findForward("continue"); } } Action 根据返回到控制器的ActionForward 对象作出控制流的决定。这允许Action 选
为保证扩展性,控制器也传递当前的请求和响应对象。实际上, Action 可以做所有Java
可以做的事情。
择一个逻辑名称,象continue 或者 cancel,而不是系统路径。 Servlet 1.0 vs 1.1 在Struts 1.1 中,新的 execute 方法应该是首选,而不是我们例子中的perform 方法。perform
已经不被推荐,但还保持向后兼容,予以支持。execute 方法体允许更好的例外处理。新的
ExceptionHandler 在第9章讲述。 关于Action 对象的详细信息,见第8 章。
onForm,和 Action 对象,Struts控制器层还提供几个特殊的组件,
包括ActionMappings 和 ActionServlet。 Struts 也提供在控制器层的应用本地化。
2.2.3.4 ActionMappings
来进行引用。 资源包括HTML 页面,JSP 页
URI, 或者说路径,Struts 框架提供了一个
ActionMapping 对象。 象ActionForward 和 ActionForm一样, ActionaMapping通常也在
L配置文件中定义:
除了ActionForward, Acti 在一个web 应用中,每个资源必须通过URI面,和定制动作。为了给定制动作一个XM
<action-mappings>
<action
path="/logonSubmit"
type="app.LogonAction"
name="logonForm" scope="request" validate="true" input="/pages/logon.jsp"/> </action-mappings> 这也允许同一个Action 对象定义为不同的ActionMappings。例如, 一个映射要求校验
而另一个映射不要求校验。
ervlet
虽然它也可以子类化,
但大多数Struts 1.0 的开发人员将ActionServlet 处理为一个黑盒:他们只是配置它,然后让
自己工作。
在Struts 1.1中,ActionServlet 是比较易于扩展的。第9 章将讨论Struts 1.1 ActionServlet
的扩展点和配置选项。
Web 应用也通过各种提示和信息与用户进行交互。Struts 组件均有内建的本地化特征,
以便Struts应用可以为国际化用户使用。我们在此书中贯穿使用本地化特征。本地化的详细
讨论见第13章。
Form,定制的服务器端动作定义为Action 类。
需要访问JDBC和EJB的开发人员也可通过Action对象进行。这样,表现层不需要和Model
2.2.3.5 ActionS Struts ActionServlet 完全在幕后工作,它将其他组件绑定在一起。它 新2.2.3.6 本地化 2.2.4 用Struts开发Web应用 要使用Struts开发web 应用,开发人员将需要的超链接定义为ActionForward,HTML 表单定义为Action
层打交道truts Actio 。S n 对象将收集View 需要的数据,然后将它们转发到表现页面。Struts
JSP 页面一起使用,简化 提供 JSP 标记库,它们和 HTML 表单和存取Action 要转发的其它数据。其它表现机制,比如Velocity templates, 也可用来访问 Struts 框架,来创建动态的web 页面。这种处理流程入下图: 传给视图
第10章和第11章学习如何创建
Struts的表现页面。
架构前,让我们看看一个Web应用框架必须说明的问题。
2.3 为什么需要框架
论了为什么框架很重要。但为了真正理解一个解
决方案,我们需要了解问题所在。为web开发应用虽然是值得的,但也要迎接各种挑战。让
挑战。
2.3.1 Web? 永无休止的修补
Web 开发者受到两种web缺陷的影响。首先,我们希望使用浏览器作为客户端。其次,
必须使用web协议进行通讯。
Web 浏览器通过HTTP协议通信,并用HTML显示页面。Web浏览器发送HTTP请求,
加工和显示它收到的响应。在处理很少改变的预先编好的页面时,这是个很好的平台。但
我们大多都是编写动态程序,页面针对不同的用户是不同的。虽然有一些现成的动态特征的
段,web 仍然受到HTTP/HTML 的制约。
如下表所示: web 协议和客户端的限制,确定了如何编写Web程序。
表格 2-1 HTTP/HTML 的限制
图 2-3 数据回 关于和Struts中如何使用各种数据系统,见第14章。 在深入Struts 第1章,我们介绍了应用框架,简短讨我们快速看看是什么使web 开发富有我们并手限制 导致的困难 协议 缺省情况下,HTTP接收来自于网络上各种客户端的连接。但各种服
务器间的行为是不一样的; 首先,HTTP用简单的文本域来传输数据。传输二进制文件需要复杂
的协议扩展
HTTP协议是无状态的,需要额外的努力来跟踪程序的用户
HTTP信赖并期望客户能提供正确的信息 客户端 浏览器是个独立的程序,处于应用的控制之外
所有的浏览器都是不一样的,都只支持官方标准的一个子集
从浏览器的输入可能是不正确或者不完整的。甚至可能是敌意的,
和对程序有害的信息
HTML不能够建立一些在桌面环境中有的接口元素
用缺省数据建立HTML控件对应用来说是个考验 很不幸,这种状况现在并没有些许改变。Web开发人员在想战胜挑战时必须看到这些缺
对编写强壮的Web应用有太多障碍,使用框架便显得至关重要,免得你的应用陷入
无休止的工作和改进之中。
我们面临的挑战是很巨大的。但同时也是值得的。HTTP 协议和
HTML 客户端使所有的人都可以访问你的应用。没有其他哪个平台能声称这样。
解决方案
,Java Servlet 平台[Sun, JST] 扮演了一个基本框架,为Java web 应用提
供了大量的能力。Servlet 提供了一个处理HTTP请求和确保响应的基本接口。它在HTTP之
话” 上下文,帮助跟踪应用程序的用户。当然它也提供其他的上下文,帮
助应用传输数据到浏览器或者应用中的其他servlet。Java web 应用也具有对基本安全特性的
不同的服务器上的管理是不一样的。
为了将这些内容集成在一起,Servlet规范引入了一个容器来管理它们。容器也可以提供
其他服务,比如作为一个JSP的处理器。Servlet 容器可以包含它自己的web server,也可以
对数据库访问, Java 应用在其建议中有另外一个通用的框架: JDBC。开发者可以写
准的SQL 接口,而将烦人的细节留给适配器来处理。这使得可以很容易的改变数据库厂
都可以和EJB一起使用。
总之,这使得基于Servlet的web应用非常轻便,并相对易于编写和维护。Servlet 和 JSP
角色。 象Strtus这样的Java web 应用框架构架于Servlet之
框架也包括一个类结构树,这些类你可以在
中实 扩展。通常, 应用框架的目标是帮助你将你需要的数据从浏览器发出,
它们既不阻碍数据库访问,也没有提供帮助。而某些框架, 如
s 库访问,而将其它任务留给开发人员或者其他框架。
2.3.3.1 通用框架策略
陷。因为 在开发Web应用时2.3.2 Servlet 如第一章所述上构建了一个“会统一访问,而这些安全特性在简单的作为一个现存服务器的附属组件。 标商,而不用重写源代码。 为了取得远程服务器的高性能数据库访问, web 开发人员可以使用EJB平台。大多数ava 应用框架,包括Struts, J 在编写应用中扮演了完全不同的上,给开发者提供一个无缝的集成环境。 2.3.3 Servlet 框架 大多数,不是全部, Java web 框架使用 Sun Servlet 平台为基础。这些框架都绑定一些预制的servlet,你可以插入到你的应用中去。你的应用现或者进入到编程结构之中,这样你的应用就可以使用它?或者从编程结构中发出,进入到浏览器之中,这样你就可以看到。 一些框架,如 Turbine [ASF, Turbine],也提供helper 类来运行于 JDBC 数据库。其他框架, 如Struts, 则是模型中立的。dbForm [dbForms],则专注于数据
如下图所示, Java web应用框架使用一些通用技术来帮助产品易于设计、编写和维护,
式(Front
外部表现系统
让不同的人同时工作在同一应 a工程师可以工作在和中心控制
相关的类,而页面设计者则专注于JSP。除了JSP,其他表现系统,如Velocity Templates 或
X
些书象 Design
Patterns [Go4] 和 Core J2EE Patterns [Go3]给出的范例中根深蒂固了。许多开发者在讨论并
些 第一次在Web环境中实现它们。使用设计模式,如MVC,使
容 情来构建你的应用。在桌面环境中使用设计模式的优点已经众
所周知了,但在Web环境部署这些模式却对大多数开发者来说还是不确定的。
包括: 外部配置文件 提供开发人员不想嵌入源代码中的实现细节。 中心控制器 提供一种方式,将HTTP 请求排入一个易于管理的队列。这种设计有时叫前端控制器模 Controller [Go3]) 用的不同部分。如, Jav器者LST, 都可以和Struts一起使用。 框架通常有各种组件,但基本上都共享这个特性。这些公共策略早已在一使用这模式,但也许还没有你可以易的通过做正确的事 图 2-4 通常使用配置文件,控制器和表现系统的框架 2.3.4 黑盒-白盒统一体 框架有时分为两极标有白盒和黑盒的统一体[Fayad]。白盒框架严重依赖于面向对象的
语言的 承和动态绑定。黑盒框架则注重定义可插入组件的接口,然后基于这些接
口提供基本的起始组件。接口和基本组件通常提供热点(hotspot )方法,这个方法可以直接
使用或者重写后提供特别的行为。
特征,如继
定义
热点有时也称为是灵活点或者扩展点,它其实是框架中的一些位置,在这里可以加入一些代码来定制框架。热
点(热点 应用中可 系统)每个以被框架所支持的不同特征。本质上,它们代表框架所解决的问题。许多面向对象
框架有一个核心系统和一些热点子系统组成[Braga, et al] 像许多正在使用的框架, Struts 使用混合的黑盒和白盒技术。但总体上,框架将偏向
统一体的黑盒一端。
黑盒框架通常依赖于设计模式。Struts 也不例外。事实上,设计模式通常被用来作为框
架的总体描述 [Johnson
在Struts 框架之中。
2.4 Struts, Model 2, 以及 MVC
Struts 关于自己要说的第一句话就
展开全部
Struts是一个MVC框架(Framework),用于快速开发Java Web应用。Struts实现的重点在C(Controller),包括ActionServlet/RequestProcessor和我们定制的Action,也为V(View)提供了一系列定制标签(Custom Tag)。但Struts几乎没有涉及M(Model),所以Struts可以采用JAVA实现的任何形式的商业逻辑。
MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。
加密的时候有专用的函数
MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。
加密的时候有专用的函数
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询