struts傻瓜式学习(一天篇)

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改成:


<?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,以下是这个类的内容:



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")); 
 }
}


五、以下所有新增或修改的页面相当于strutsView部分,把首页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

操作一下,就可以看到结果,并初步理解strutsMVC各部分的协同工作原理,当然这是作者的良好意愿,如果读者看得一头雾水,欢迎指出错误在哪里:)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Struts1.0学习文档-初学者入门
一、 概述

struts
是基于当前的一些相关标准的开发技术(servlet,xml…)基础之上,提供了一个开发框架的开放源码项目,由于我们开发web应用的复杂度随着系统的复杂度的要求越来越来复杂。特别是在代码重用,代码移植、代马可插扒等问题上出现了许多重复开发、维护困难等。Struts这个框架鼓励我们应用model2MVC开发模型。当然我们在基于其上的开发中不一定要进行完全遵守。当前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,valueid是对cookie在该页面中的唯一标识,在页面其它地方可以通过id进行引用。相当于用cookie直接引用。Name是相应的cookie名称。Multiple可以赋予任意值,如果该值被定义将会返回相应给定值数量的cookie数组,如果该值没有被定义Value在这里是一个默认值,当我们这里的调用的cookie不存在时,其值为我们这里的value值。

define
:相当于jsp标记,属性有idnamepropertyscopetoScopetypevalueIdcookie中的id起到了同样的作用;name是在相应的scope中唯一bean标识;scope将会在相应的范围内进行相应的查找;toScope如果在scope中找不见相应的bean,将会在toScope中建立相应的beantype是该类完全类路径和类。

例如:


<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 。用来输出客户端的请求参数和值。



例如:


<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.01.1中相应的管理方式是不一样的。这里我强烈建议使用j2ee中的相关数据源配置情况。

文件上传struts提供了类org.apache.struts.upload.FormFile,只要我们在ActionForm中提供具有该类型的字段,然后在Action中进行处理就可以了。

简单bbs的实现样例代码(基于struts1.0)要索取代码请给我发邮件luopc@edu-edu.com.cn
 
 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值