一 什么是Struts
Struts是基于MVC设计模式的开发Web应用程序的开源框架,当前的版本是1.1
他的建立者是著名的开源组织Apache Software Foundation,提起Apache software Foundation(ASF) 大家一定不会陌生,好多口碑不错的开源产品像Tomcat,Ant,Velocity,JSF等都出自他们.
如果对他们感兴趣的话可以到他们的网站去看一看:http://Jakarta.apache.org
二 为什么叫Struts
Struts的英文意思是: (框架的)支柱,支撑物
就像我们盖楼一样,各楼层之间是用钢筋,混凝土构成的柱子去支撑的,在开发三层结构的Web应用程序时,Struts 的角色就是支撑这些应用程序的各个层次.
三 什么是框架
框架是可重用的应用程序的半成品,使用框架你可以构造出具体的个性化的应用程序.
框架是建立在应用程序的共性基础上的,给开发者提供了可重用的结构.像Struts,Jsf,Spring都是比较成熟的框架.
四 利用struts框架开发Web应用程序你需要哪些知识
¨ Http协议是一种无状态的协议
¨ 能够利用Jsp构建Web页面
¨ 了解Servlet技术
¨ 能够建立简单的JavaBean
¨ 对MVC思想有认识
好了,具备了这些知识你就可以利用Struts开发Web应用程序了
五 理解Struts是如何工作的
理解Struts框架的工作原理要理解下面这幅重要的图片.
Struts的ActionServlet是一个控制器,起着流程导航的作用,Struts 的Action类用来访问相关的业务类.
当ActionServlet从容器中接收到一个请求时,他会根据URI决定哪一个Action 来处理这个请求,Action进行输入的验证,访问业务层,从数据库或其他的数据服务器中获得必要的信息.
验证输入或者根据输入的数据更新数据库,Action需要知道哪些数据被提交了,ActionServlet把这些输入绑定到JavaBean中,这个JavaBean是Struts的ActionForm的子类,ActionServlet根据请求路径决定使用哪个ActionForm和Action.
每一个Http请求要对应一个Http响应,通常情况下,StrutsAction自己并不生成响应,而是把请求传递给其他的资源,比如Jsp页面.
在Struts中提供了一个ActionForward类使用逻辑名存储页面路径,当Action 完成业务逻辑处理的时候,会向AcitonServlet返回一个ActionForward,ActionServlet会根据存储在ActionForward中的对象调用相关的页面完成响应.
Struts把这些细节绑定到ActionMapping对象中,每一个ActionMapping都是和路径相关的,当这个路径被请求时,Servlet会找到哪些Action,ActionForm,ActionForward可以使用.
所有的这些细节Action,ActionForm,ActionForward,ActionMapping都在Struts-config.xml中被声明.ActionServlet在启动时会读取这个文件并且建立一个配置对象的数据库,在运行时ActionServlet会参照这些对象而不是这个配置文件.
不管你信不信,知道了这些你就可以建立一些简单的Web应用程序了.
六 建立第一Struts应用程序
我们的第一个Struts应用程序是一个简单的用户注册应用程序
1 功能描述:
用户需要输入用户名,密码,重复输入密码,当两次输入的密码相匹配时就认为注册成功,否则认为注册失败.
2 MVC模式分析:
M (model):模型层(业务逻辑) 我们这里的业务逻辑很简单就是判断两次输入的密码是否一致.
V(view):视图层:
A 用户输入的用户名,两次输入的密码
B 显示注册成功信息
C 显示注册失败信息
C(contrl)控制层:由Struts 的servlet来实现控制的导航.
3 界面原型:
A 录入注册信息
B 显示注册成功
C 显示注册失败
4 要完成这个程序我们只需要建立
¨ 一个ActionForm 绑定用户的输入信息
¨ 一个Action 进行业务处理
¨ 一个配置文件Struts-config.xml
¨ 三个表示层页面 注册信息录入页面,注册信息成功,注册失败显示页面
1) 首先建立三个显示页面
Register.jsp success.html failure.html
相关代码如下:
Register.jsp:
<%@ taglib uri="/WEB-INF/struts-form.tld" prefix="form" %>
<form:form action="register.do">
UserName:<form:text property="username"/><br>
enter password:<form:password property="password1"/><br>
re-enter password:<form:password property="password2"/><br>
<form:submit value="Register"/>
</form:form>
Success.html:
<HTML>
<HEAD>
<TITLE>SUCCESS</TITLE>
</HEAD>
<BODY>
Registration succeeded!
<P><A href="register.jsp">try another?</A></P>
</BODY>
</HTML>
Failure.html:
<HTML>
<HEAD>
<TITLE>FAILURE</TITLE>
</HEAD>
<BODY>
Registration failed!
<P><A href="register.jsp">try again?</A></P>
</BODY>
</HTML>
2) 用户的输入是绑定到ActionForm中的,接下来我们建立一个ActionForm.
RegisterForm是一个JavaBean继承自Struts框架的org.apache.struts.ActionForm,这个对象能够捕获通过请求发送的输入域.当一个web浏览器提交一个表单的时候,web浏览器会为表单的每一个域在请求中建立一个参数.在ActionForm 中对应于Html的表单的每一个域都有一个相应的属性.ActionServlet会把请求中的参数和ActionForm中的属性进行匹配,调用属性的Setter方法来绑定请求中的值.
我们这里用户需要输入的数据有userName,password1,password2,我们的ActionForm就要提供SetUserName(String),SetPassword1(String),和SetPassword2(String)方法.
下面是我们的ActionForm 的代码:
RegisterForm.java:
package app;
import org.apache.struts.action.*;
public class RegisterForm extends ActionForm {
protected String username;
protected String password1;
protected String password2;
public String getUsername () {return this.username;};
public String getPassword1() {return this.password1;};
public String getPassword2() {return this.password2;};
public void setUsername (String username) {this.username = username;};
public void setPassword1(String password) {this.password1 = password;};
public void setPassword2(String password) {this.password2 = password;};
}
3) 我们来建立业务处理层的RegisterAction类:
RegisterAction是继承自Struts框架的org.apache.struts.Action类.ActionServlet把刚刚组装的ActionForm传递给Action,Action负责验证输入,访问业务信息,决定把哪个ActionForward返回给Servlet.
RegisterAction.java的代码如下:
RegisterAction.java:
package app;
import org.apache.struts.action.*;
import javax.servlet.http.*;
import java.io.*;
public class RegisterAction extends Action {
public ActionForward perform (ActionMapping mapping,
ActionForm form,
HttpServletRequest req,
HttpServletResponse res) {
// Cast the form to the RegisterForm
RegisterForm rf = (RegisterForm) form;
String username = rf.getUsername();
String password1 = rf.getPassword1();
String password2 = rf.getPassword2();
// Apply business logic
if (password1.equals(password2)) {
try {
// Return ActionForward for success
UserDirectory.getInstance().setUser(username,password1);
return mapping.findForward("success");
} catch (UserDirectoryException e) {
return mapping.findForward("failure");
}
}
// Return ActionForward for failure
return mapping.findForward("failure");
}
}
注意:
在struts1.1中使用的execute()方法来代替了perform()方法(perform是struts1.0)中的方法,execute()方法应用了更好的异常处理机制.
通过以上步骤我们已经准备好了所有Web开发必备的材料,下面我们要做的就是把这些材料进行有机的组合,建立一个实实在在的Web应用.
4) 建立Struts的配置文件Struts-config.xml
Struts-config.xml是Struts框架中最重要的配置文件,所有的细节像Acgtions,ActionForms,ActionForwards,ActionMappings等都是在这里进行配置.ActionServlet将根据这个文件来实现流程的控制.
Struts-config.xml的内容如下:
Struts-config.xml:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">
<struts-config>
<form-beans>
<form-bean name="registerForm" type="app.RegisterForm"/>
</form-beans>
<action-mappings>
<action path="/register"
type="app.RegisterAction"
name="registerForm">
<forward name="success" path="/success.html"/>
<forward name="failure" path="/failure.html"/>
</action>
</action-mappings>
</struts-config>
七 知识回顾:
1) 我们做了什么
为了完成这个注册程序我们建立了
A RegisterForm
B RegisterAction
C 三个页面 注册页面,成功失败显示页面
D struts-config.xml文件
2) 他们是如何有机的结合起来的
我们再来改造一下前面那幅图:
我们回顾一下Struts-config.xml这个比较重要的配置文件:
Struts-config.xml:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">
<struts-config>
<form-beans>
<form-bean name="registerForm" type="app.RegisterForm"/>
</form-beans>
<action-mappings>
<action path="/register"
type="app.RegisterAction"
name="registerForm">
<forward name="success" path="/success.html"/>
<forward name="failure" path="/failure.html"/>
</action>
</action-mappings>
</struts-config>
八 思考题:
我们建立一个简单的Web程序
需求描述: 用户注册的程序我们已经完成了,假定用户需要登陆系统,登陆时需要输入用户名,密码,当用户名和密码正确时显示欢迎页面,否则显示密码或用户名错误的页面.在这里为了使程序简单我们假设输入的密码为password就通过登陆验证。