1.
Struts是什么?
答:1)
Struts是一个开源框架,用于构建MVC架构Web应用程序;
2) Struts是Jakarta项目的部分,
由Apache软件基金赞助;
3)
通过使用Struts,你可在程序中清晰地分隔表现层和业务逻辑层;
4)
通过提供广泛JSP标签库,Struts也提高了开发效率。标签库解析和验证用户输入、错误处理以及国际化支持。
5)
我们将会向您展现如何使用Struts开发工具构建Struts的Web应用程序。
2.
Struts资源
答:为了学习更多Struts框架有关知识,请关注Struts官方网站以及用户向导:
. http://jakarta.apache.org/struts
. http://jakarta.apache.org/struts/userGuide/introduction.html
3.
MVC(model-view-controller)架构模式
答:1)
MVC架构模式在1980年由Smalltalk-80的图形用户界面库的开发者提出;
2)
从此它在面向对象的用户界面和应用程序控制工具包中得到了广泛地应用,例如Struts,以及经过改良去满足特定平台需求,例如J2EE。
3)
根据MVC模式,一个软件组件(一个应用程序、一个模块等)应该将它商业逻辑和它的表现层分离;
4. 使用MVC模式的理由
答:1) 对于相同的model你有超过一个view;
2)
假如商业逻辑和它的表现层构建在一块,增加额外的view会导致相当大的中断以及增加组件的复杂性;
3)
一个model有二个view的一个好的例子是一个银行应用程序,它可以通过互联网以及手机访问;
4) 改变view的时候,你不希望每次改变model;
5)
view依赖于model,它显示给用户model的特定方面;
6)
将view和model构建在一块,每次当你对view进行细小改动的时候,你不得不改动model;
5. 什么是
MVC模式
答:这种分离可通过将组件分成以下层达到:
. model层,实现商业逻辑;
.
view层,实现一个特定客户端类型的用户界面;
.
有了这二层,我们可实现商业逻辑并且将它呈现给用户。但这只解决了问题的一半,我们应该还能和model交互。这种交互的实现层称为控制层。
6. MVC间的依赖性
答:
|-----------------|
| Control |
|__________|
╱╲
╱ ╲
╱ ╲
↙
↘
|-------------|
|--------------|
| View
|------>| Model |
|_______|
|________|
7.
MVC框架和Struts
答:Struts提供了下面这些组件使用MVC开发应用程序:
.
Model:Struts没有提供model类。这个商业逻辑必须由Web应用程序的开发者以JavaBean或EJB的形式提供;
. View:Struts提供了action form创建form bean,
用于在controller和view间传输数据;
此外,Struts提供了自定义JSP标签库,辅助开发者用JSP创建交互式的以表单为基础的应用程序;
应用程序资源文件保留了一些文本常量和错误消息,可转变为其它语言,可用于JSP中。
. Controller:Struts提供了一个action
serlvet,接收JSP输入字段形成action form,然后调用一个action
class。action class提供了model的逻辑接口。
8. Struts
Web应用程序中的组件
答:1) 一个servlet,继承自org.apache.struts.action.ActionServlet(控制器);
.
主要实现一个映射功能:将一个请求的URI映射至一个action class;
. 在调用action
class之前,它接收JSP输入字段然后形成form
bean;
. 如果指定了,action
servlet也会请求form bean去验证数据;
. 它然后调用action
class完成请求的功能;
. 假如form
bean验证失败,控制然后返回给JSP,以便用户可以改正数据;
. action
servlet由一个XML配置文件配置。这个XML配置文件指定了组件的环境和它们之间的关系。
2)
多个JSP页面,给终端用户提供界面(视图层);
.
Struts提供了广泛的标签库使得JSP开发起来容易;
.
JSP显示了action准备好的信息以及用于用户请求新的信息;
3) 多个action class,继承自org.apache.struts.action.Action;
. model的接口;
.
当一个action完成执行后,它返回一个action转发对象。该对象确定用户界面是否显示响应。
. action
class预备了必须的消息用于显示响应,通常是作为一个form
bean,然后使它对JSP页面有用。
. 用于传送消息给action的form
bean,也用于传送响应。但专门的显示数据的view
bean的存在也很普遍。
. 一个action
forward包括它的名字、地址(URL)以及一个标记。这个标记指定一个forward或redirect调用是否应该进行。
. 一个action
forward的地址通常硬编码入action
servlet的配置文件,但是也可以由action本身动态产生。
4) 多个action form,继承自org.apache.struts.action.ActionForm。
. action
form是一般的带有set和get方法的javabean;
. 通常每个Web页面存在一个form
bean,但是你也可以使用粗粒度的form
bean用于在多个Web页面间保持输入内容。
.
假如需要进行数据验证,直到form
bean成功完成验证,它才会传递至action。
. 因此form
bean可以作为介于JSP和action中的防火墙,它仅允许有效的数据进入系统。
5) 每种语言一个应用程序资源文件,它包含了一些应用程序文本常量以及错误信息,这使得国际化变得容易。
9.
Struts的请求时序
答:1)
来自于Web浏览器的一个请求到达ActionServlet;
2) 假如处理请求的action有一个相联系的form
bean,Struts创建form bean并且将来自于浏览器的输入数据填充它;
3) 然后调用form bean的验证方法;
4)
假如验证失败,用户返回至输入页面去改正输入;
5)
假如验证成功,Struts调用action的execute方法;
6) action接收到来自于form
bean的数据并且执行相应的逻辑;
7) Action通常调用session EJB处理商业逻辑;
8) 当商业逻辑处理完,action要么创建一个新的form
bean(或其它对应的view
bean),要么重用已经存在的。用新的数据填充它然后存储于请求(或会话)范围内。
9) 它然后返回一个forward对象给action
servlet,该servlet将其转送至相应的输出JSP页面。
10)JSP使用form bean中的数据输出结果。
10.Eclipse实战struts框架:
所需文件:login.jsp,login_success.jsp,LoginAction.java,LoginForm.java
以及对struts-config.xml的必要配置
1)新建一个WEB
project名为"userLogin",导入struts框架所需的jar包;
2)建一个web
package,下面再建action和form连个package,新建一个LoginForm.class,
我们把这个类作为action
form,定义用户登录的常用变量,代码如下:
//用户登录ActionForm
public class LoginForm extends ActionForm {
private String password;
private String username;
private String id;
//validate方法表示对数据校验,如果不对数据校验,则return
null
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors ae=new ActionErrors();
if(id==null||id.equals(""))
{
ae.add("id",new
ActionError("error.no.id"));
}
if(username==null||username.equals(""))
{
ae.add("username", new
ActionError("error.no.username"));
}
if(password==null||password.equals(""))
{
ae.add("password", new
ActionError("error.no.password"));
}
return ae;
}
//reset方法表示对参数赋初始值
public void reset(ActionMapping mapping, HttpServletRequest
request) {
// TODO Auto-generated method stub
}
public String getPassword() {
return password;
}
public void setPassword(String
password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String
username) {
this.username = username;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
接下来写一个Action,用来处理用户的登录请求:
public class LoginAction extends Action
{
public ActionForward
execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse
response)throws IOException {
//这里定义异常
if(true){
throw new
IOException("error");
}
LoginForm loginForm = (LoginForm)
form;
//这里添加一些业务方法,如写数据库等
.....
//处理完毕,返回到指定的页面
return mapping.findForward("show");
}
}
配置struts-config.xml,action的参数说明:
input-->表示数据来源页面,如果用户定义了validate,校验不通过则返回到input页面
name-->与formbean对应
path-->表示表单提交的action
type-->action的类
具体代码实现如下:
<form-beans >
<form-bean name="loginForm"
type="marco.struts.form.LoginForm" />
</form-beans>
<global-exceptions />
<global-forwards />
<action-mappings >
<action
attribute="loginForm"
input="/login.jsp"
name="loginForm"
path="/login"
type="marco.struts.action.LoginAction">
<exception
key="global.error.message"
path="/error.jsp"
scope="request"
type="java.lang.Exception"
/>
<forward name="show"
path="/show.jsp" />
</action>
接下来写两张jsp页面:
login.jsp:
<form action="login.do" method="post">
ID:<input type="text" name="id"/><br/>
userName:<input type="text"
name="username"/><br/>
passWord:<input type="password"
name="password"/><br/>
<input type="submit" value="submit"/>
</form>
login_success.jsp:
<h2>Login seccess!</h2>
<jsp:useBean id="loginForm"
class="marco.struts.form.LoginForm"
scope="session"></jsp:useBean>
id:<jsp:getProperty name="loginForm" property="id"
/><br>
username:<jsp:getProperty name="loginForm"
property="username"/><br>
password:<jsp:getProperty name="loginForm"
property="password" /><br>
到此,我们的一个简单struts的应用开发完了,部署到Tomcat,运行http://localhost:8080/userLogin