struts1

1 helloworld(不带form)
  strutt1.2与1.3在lib上的差别 由于1.2中没有标签库包 ,所以需要相关的tld文件
  (struts-bean.tld,struts-html.tld,struts-logic.tld,struts-nested.tld,struts-tiles.tld)
  (1)导包 拷贝需要相关的tld文件(1.2)
  (2)写action类 继承action 重写execute方法
     public class HelloWorldAction extends Action {

       @Override
       public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
HelloWorldForm hwForm = (HelloWorldForm) form;
hwForm.setMessage("Hello World");
return mapping.findForward("success");
      }
     }
  (3)在web-inf新建struts-config.xml文件
     <?xml version="1.0" encoding="UTF-8" ?>

  <!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">


  <struts-config>
    <action-mappings>
        <action input="/jsp页(如xx.jsp)"  path="/取个名字" scope="session"  type="包名.类名">          
         <forward name="取个名字" path="/jsp页(如xx.jsp)" />
        </action>
        <action path="/取个名字" forward="/jsp页(如xx.jsp)"/>
    </action-mappings>
  </struts-config>


  (4)在web.xml进行struts配置
      <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>2</load-on-startup>
        </servlet>
      <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
      </servlet-mapping>
  (5)运行  http://localhost:端口号/应用名/配置的path
     演示不同路径访问 以及传值回jsp页面

2 helloworld(在1的基础上 带form)
    (1) 编写ActionForm  继承ActionForm
       
    (2) 在struts-config.xml配置 form-bean
       
     <form-beans>
    <form-bean name="取个名字" type="包名.类名"/>
     </form-beans>
       
     在action配置处加入 name=上面配置的form名 指定formbean的scope (request或者session)  可再次演示request属性值丢失问题
    
      演示 request或者session的formbean使用
      action类中的代码 给HelloForm设置一个属性
       HelloForm f=(HelloForm)form;
f.setName("pppppppppp");

   在jsp页面上取出来
     <%
HelloForm f=(HelloForm)session.getAttribute("helloform"); //此处的属性helloform就是在struts-config.xml的formbean名称
out.print(f.getName());

%>
    (3) actionform如何自动获取页面值 只需要form表单中名字与formbean名字相同即可

跳转演示
登录练习

地址栏斜杠的演示  /  如何精确定位action

多个方法的演示(增加,删除,修改)

3 Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的    并且要在开发时特别小心。Action资源必须是线程安全的或同步的。   


4 全局转发与局部转发 全局异常与局部异常
   <global-forwards>
<forward name="xxx" path="/global.jsp"></forward>
  <forward name="success" path="/uuu.jsp"></forward>
</global-forwards>
  全局转发  所有的action共用   局部转发 自己的action用 当两者重名时,优先选择局部转发


全局异常与局部异常(附件 struts1.x中的异常处理.txt)
  <global-exceptions>
<exception key="资源文件中的key" type="包名.类名(如java.lang.ArithmeticException") path="/error.jsp"></exception>
</global-exceptions>

在error.jsp页面 <html:errors/>获取异常信息

全局异常 所有的action共用  局部异常 自己的action用 当两者重名时,优先选择局部异常



5  资源文件的使用(附件 资源文件设置.txt)   默认情况下,Struts默认的资源文件为ApplicationResources.properties文件。

   在src目录下建立一个properties文件 一般为ApplicationResource.properties 里面写着键值对信息
   如
      aaa=111
      bbb=222
      ccc=333
  在 struts-config.xml中配置使用资源文件 与<action-mappings>同级别,一般在<action-mappings>后,
     <message-resources parameter="文件名(不需要后缀名)"/> 如上的配置为<message-resources parameter="ApplicationResource"/>

如果该资源文件不在src目录下,而在其他包名下,则应加上包名,假设ApplicationResource.properties在com包下,则配置修改为
<message-resources parameter="com/ApplicationResource"/>


在jsp页面上通过bean标记 可输出资源文件的内容
  <bean:message key="aaa"/>
  在页面上将显示111



ActionError与ActionMessage
   actionError 1.1版本  1.2版本推出actionMessage actionMessage是actionError的父类
   actionError从语义上一般是指错误信息  actionMessage指的是一般信息

ActionError类与ActionErrors类
ActionError类从不独立进行错误处理,它们总是被存储在ActionErrors对象中。ActionErrors对象保存ActionError类的集合以及它们特定的属性值,我们可以使用自己定义的属性值,或是使用ActionErrors.GLOBAL_ERROR.

如下使用
   ActionErrors errors = new ActionErrors();
   ActionError error = new ActionError("资源文件中的key值",“要传递进去的参数值(一个或多个(字符串数组))");
  errors.add(ActionErrors.GLOBAL_ERROR,error);//或者使用
  errors.add("属性名",error )
  saveErrors(req,errors);

在页面上通过

<html:errors />   显示所有错误

<html:errors property="属性名"/>  显示对应的属性错误

ActionError类有两个构造方法 分别有一个参数和两个参数的
一个参数的 参数就是资源文件中的键值
两个参数的  第一个参数是资源文件中的键值,第2个参数是我们可以传进资源文件中的参数值


  ActionMeaaage类与ActionMeaaages类


    <html:messages id="aaa" property="属性名" message="true">
    <bean:write name="aaa"/>
</html:messages>



6 dispatchaction  action类继承DispatchAction
   (1)编写如下类似方法
   public ActionForward add(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
         System.out.println("进入add方法");
        return mapping.findForward(SUCCESS);
    }

    public ActionForward update(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
       System.out.println("进入update方法");
        return mapping.findForward(SUCCESS);
    }
(2)在action配置处加入parameter="method" 
(3)调用该action时传参数methoda=add或者其他方法名即可
  
  小技巧 不需要强转
      String name = (String) PropertyUtils.getSimpleProperty(form, "userName");
     String password = (String) PropertyUtils.getSimpleProperty(form, "password");


7 actionforward
 
ActionForward  aw=new ActionForward();
aw.setPath("/taglibdemo.jsp");
return  aw;

8 标记库
<logic:iterate>
<bean:write>  filter="false"  显示含html标签的  输出int类型的时候加上format属性  format="#"
<bean:define>
<logic:empty>
<logic:present> 作用域是否存在
复选框与下拉框使用
用<bean:write>演示actionform
          
             // action中片段代码

          //list中放简单基本数据
List listBasic=new ArrayList();
listBasic.add("test1");
listBasic.add("test2");
listBasic.add("test3");
listBasic.add("test4");
request.setAttribute("listBasic", listBasic);

// list中 bean
List listBean=new ArrayList();
TaglibBean tb=new TaglibBean();
tb.setName("TaglibBean1");
tb.setAge(11);
tb.setMoney(12.4567);
listBean.add(tb);

tb=new TaglibBean();
tb.setName("TaglibBean2");
tb.setAge(12);
tb.setMoney(12.111);
listBean.add(tb);

tb=new TaglibBean();
tb.setName("TaglibBean3");
tb.setAge(13);
tb.setMoney(12.2222222222);
listBean.add(tb);

request.setAttribute("listBean", listBean);

//hashmap 简单数据
Map map=new HashMap();
map.put("mapkey1", "mapvalue1");
map.put("mapkey2", "mapvalue2");
map.put("mapkey3", "mapvalue3");
request.setAttribute("map", map);

//hashmap 放bean
Map beanMap=new HashMap();
tb=new TaglibBean();
tb.setName("TaglibBean1map");
tb.setAge(11);
tb.setMoney(12.4567);
beanMap.put("mapkey1map", tb);

tb=new TaglibBean();
tb.setName("TaglibBean2map");
tb.setAge(12);
tb.setMoney(12.111);
beanMap.put("mapkey2map", tb);

tb=new TaglibBean();
tb.setName("TaglibBean3map");
tb.setAge(13);
tb.setMoney(12.2222222222);
beanMap.put("mapkey3map", tb);
request.setAttribute("beanMap", beanMap);

//html标签输出 使用filter=false
String strTable="<table border=1><tr><td>aaaa</td></tr></table>";
request.setAttribute("strTable", strTable);

//类似 if else
String ifStr="xxx";
request.setAttribute("ifStr", ifStr);

//单独bean 属性比较 if else
tb=new TaglibBean();
tb.setName("onlyyou");
request.setAttribute("onlybean", tb);


  //jsp中片段代码  (附件taglibdemo.jsp)
     1 logic:present与logic:iterate 简单集合数据<br>
<logic:present name="listBasic">
xxxx
<logic:iterate name="listBasic"  id="element" >
<bean:write name="element"/><br>
</logic:iterate>

</logic:present>

<logic:notPresent name="listBasic">
作用域不存在listBasic
</logic:notPresent>


2 logicempty与logic:iterate 简单集合数据<br>

<logic:notEmpty name="listBasic">

<logic:iterate name="listBasic"  id="element" >
<bean:write name="element"/><br>
</logic:iterate>

</logic:notEmpty>


<logic:empty  name="listBasic">

集合元素为空
</logic:empty>



3 logicempty与logic:iterate  list中 bean   (含bean 中list)<br>

<logic:notEmpty name="listBean">

<logic:iterate name="listBean"  id="element" >
<bean:write name="element" property="name"/><br>
<bean:write name="element" property="age" format="#.00"/><br>
  <bean:write name="element" property="money" format="#.000"/><br>
       <logic:notEmpty name="element" property="list">

<logic:iterate name="element"  id="bean_list" property="list">
<bean:write name="bean_list"/><br>
</logic:iterate>

        </logic:notEmpty>
       
       
</logic:iterate>

</logic:notEmpty>


4 logicempty与logic:iterate  map<br>

<logic:notEmpty name="map">
<logic:iterate name="map" id="element">
<bean:write name="element" property="value"/><br>
  </logic:iterate>
</logic:notEmpty>

5  hashmap 放bean<br>

<logic:notEmpty name="beanMap">
<logic:iterate name="beanMap" id="element">
<bean:define id="map_bean" name="element" property="value"/>
<bean:write name="map_bean" property="name"/><br>
  </logic:iterate>
</logic:notEmpty>


6 作用域中的简单字符串  html标签输出 使用filter=false<br>
<logic:present name="strTable">
<bean:write name="strTable" filter="false"/>
</logic:present>


7 类似if else<br>

<logic:equal name="ifStr" value="xxx">
等于 xxx
</logic:equal >

<logic:notEqual name="ifStr" value="xxx">
不等于 xxx
</logic:notEqual >


7 类似if else  单独bean<br>
<logic:equal name="onlybean" property="name" value="xxx">
等于 xxx
</logic:equal >

<logic:notEqual name="onlybean" property="name" value="xxx">
<bean:write name="onlybean"  property="name"/>
</logic:notEqual >






9 动态form (附件 动态form.txt)

     动态ActionForm是struts从1.1版本开始引入一项新的技术,即在创建ActionForm时
                      可以不用通过编程的方式而只要通过struts-config.xml文件中进行配置,以后在struts运行时,会自动根

                      据struts-config.xml中配置的DynaActionform来生成一个Action实例
    为什么要使用DynaActionform

                       很显然随着应用程序的变大,数百个ActionForm 这样不仅编程起来麻烦,以后维护起来也麻烦,比如:

                       某个属性变化了,则需要修改源代码,然后重新编译,但是如果使用DynaActionform则只需要修改

                       struts-config.xml配置文件就行了。这样提高了应用程序的开发效率与应用程序的可维护性


10 国际化
11 验证以及验证框架
一种是通过ActionForm的validate函数进行验证,另一种就是利用validate框架进行验证

   
六种类的关系:

1:普通form(从下向上继承) 
ActionForm  //不用验证框架作验证    如要验证  重写validate方法         
|
|
validatorForm //使用验证框架时必须继承它,但只能做同一种验证(即只提交一个按键时的验证)
|
|
validatorActionForm //使用验证框架验证时,可以更为精确的去处理业务逻辑,针对的是不同的按键的path(即可以作不同的验证,如,既可以验证是否为空,又可以同时验证是否小于几位)

2:动态form(从下向上继承) 动态form不能new
DynaActionForm     //不用验证框架作验证    如要验证 写一个form类继承它 重写validate方法 struts-config.xml配置时改为你写的类        
  |
  |
DynaValidatorForm
  |
  |
DynaValidatorActionForm


我们自己的form 必须继承validatorForm 或validatorActionForm 或DynavalidatorForm 或DynavalidatorActionForm

对于 validatorForm 和DynavalidatorForm 是针对form的验证
对于 validatorActionForm 和DynavalidatorActionForm 是针对path的验证


创建Validation.xml
下面介绍一下validation.xml配置文件的标签:
<form-validation></form-validation>是总框架
<formset></formset>是对Form里的数据进行配置
<form name="ActionForm对应的名称"></form>对一个ActionForm里的数据进行验证配置
<field property="ActionForm里的属性名" depends="验证规则,可以是Validation-rules里定义好的也可以是自定义的验证规则">这里配置一个属性的验证内容
<arg0 name="对应的验证规则名称" key="可以直接填入数值,也可填入变量表达式:${var:变量名}" resource="true/false"(代表是否从资源文件中读取信息,否则Key的值以参数的形式返回)>
<var></var>定义一个变量的标签体,可以在里面具体设置变量的名称以及数值
<var-name>对应Key里定义的变量名称</var-name>
<var-value>值</var-value>
<msg name="对应的验证规则名称" key="资源文件中定义的变量名称">这里定义了信息变量后,会默认定义的信息变量。
在验证规则中大部分可以使用已经预定义好的规则,它们在validator-rules.xml里,当然我们自己也可以定义规则。

其实,这个文件名可以是任意的,可以起成别的名字,比如:validators.xml,不过,也要相应修改struts-config.xml文件中的加入validator框架PlugIn中的value属性。这个value属性用来指定validator-rules文件和具体的验证文件。

1)根元素:
validators.xml文件的“根元素(Root)”是form-validation,
意味着整个文件的内容包含在“<form-validation>”和“</form-validation>”之间,

2)元素global:
这个东西包含constant子元素,用来定义一个全局的“验证限制”,
以便在这个文件的其他地方使用这些验证规则。

    如下global   phone的应用
      <golobal>
  <constant>
<constant-name>phone</ constant-name>
<constant-value>7</constant-value>
</constant>
</golobal>


  <form name=”checkoutForm”>
        <field
          property=”phone”
depends=”required,mask,minlength”>
<arg0 key=”label.phone”/>
<arg1 name=”minilength” key=”${var:minlength}” resource=”false”/>
<var>
  <var-name>mask</ var-name >
  <var-value>${phone} </var-value>
</var>
<var>
  <var-name>minlength</ var-name >
  <var-value>${phone}</var-value>
</var>
</field>
   </form>





客服端提示 <html:form action="/loginValidatorForm.do" οnsubmit="return validateLoginValidatorForm(this);">
<html:javascript formName="loginValidatorForm"/>


在struts-config.xml配置插件
       <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
        <set-property
            property="pathnames"
            value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
    </plug-in>


可以通过在struts-config.xml中配置action时指定 validate="false" 关闭验证框架



Tiles框架的提出背景:

传统的GUI工具包,如Java AWT和Java Swing,都提供了一些功能强大的布局管理器,它们指定各个视图组件在窗口中的分布位置。布局管理器有助于创建复合式的复杂界面,一个复合式界面由一些简单的基本界面组成。
利用布局管理器来创建GUI界面有以下优点:
         可重用性:基本界面可以被重用,组合成各种不同的复合式界面
         可扩展性:可以方便的扩展基本界面,从而创建更复杂的界面(其实此处我的感觉并非如此,可扩展性并不是为了创建复杂界面的,越是复杂的界面在比较独立的情况下更容易创建。)
         可维护性:每个基本界面之间相互独立,当复合式界面中的局部区域发生变化,不会影响其它区域
         不幸的是,JSP技术本身并没有直接提供布局或布局管理器。为了简化Web页面的开发,提高可重用性和可扩展性,Struts Tiles框架提供了一种模板机制,模板定义了网页的布局,同一模板可以被多个Web页面共用。此外,Tiles框架还允许定义可重用的Tiles组件,它可以描述一个完整的网页,也可以描述网页的局部内容。简单的Tiles组件可以被组合或扩展成为更复杂的Tiles组件。


Tiles框架的基本用法:
       使用Tiles框架大大提高了视图层程序代码的可重用性、可扩展性和可维护性,也增加了开发视图的难度和复杂度,在使用Tiles框架之前一定要结合Web应用的规模。
在开发Web站点时,常常要求同一站点的所有Web页面保持一致的外观,比如有相同的布局、页头、页尾和菜单。 网页被划分为四个部分:Header、Menu、Footer和Content。对于同一站点的所有Web页面,Header、Menu和Footer部分的内容相同,仅仅Content部分的内容不相同。如果采用基本的JSP语句来编写所有的Web页面,显然会导致大量的重复编码,增加开发和维护成本。
    Tiles框架为创建Web页面提供了一种模板机制,它能将网页的布局和内容分离。它允许先创建模板,然后在运行时动态地将内容插入到模板中。Tiles框架建立在JSP的include指令的基础上,但它提供了比JSP的include指令更强大的功能。

Tiles框架具有如下特性:
创建可重用的模板
动态构建和装载页面
定义可重用的Tiles组
支持国际化
Tiles框架包含以下内容:
Tiles标签库
Tiles组件的配置文件
TilesPlugIn插件

什么是tiles框架?
   Tiles框架是struts的一个页面布局插件。提高了代码可重用性、可扩展性和可维护性,同时也增加了开发难度
tiles的特点?
   1,可定义重用tiles组件
   2,动态装载页面
   3,支持国际化
   4,能创建可重用模块
  



Tiles框架是Struts的一个插件。我们可以使用Tiles框架来进行页面布局设计。Tiles框架提供了一种模板机制,它可以将网页内容和布局分离,并允许先创建模板,然后在页面中再插入具体的内容。

一、安装Tiles框架

为了使用Tiles,我们必须首先在struts-config.xml文件中声明Tiles,配置代码如下:


<plug-in className="org.apache.struts.tiles.TilesPlugin">
    <set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml" />
</plug-in>


其中org.apache.struts.tiles.TilesPlugin类只需要设置一个definitions-config属性。这个属性值指向了一个定义文件tiles-defs.xml。这个定义文件的基本格式如下:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
       "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">


<!--
     This is a blank Tiles definition file with a commented example.
-->
      
<tiles-definitions>
<definition name="yyy" path="/aaa.jsp">

</definition>

<definition name="base" path="/layout.jsp">
<put name="header" type="page" value="/header.jsp"/>
<put name="content" type="page" value="/content.jsp"/>
<put name="foot" type="page" value="/foot.jsp"/>
</definition>

<definition name="base1" extends="base">//继承
<put name="content" type="page" value="/content1.jsp"/>

</definition>



</tiles-definitions>



        其中<tiles-definitions>元素中可以包含多个<definition>子元素。我们还可以将一个定义文件拆成多个定义文件,如A-defs.xml、B-defs.xml和C-defs.xml。在为definitions-config属性赋值时,如果有多个定义文件,中间用逗号(,)分割。如下面的代码所示:




<set-property property="definitions-config" value="/WEB-INF/A-defs.xml, /WEB-INF/B-defs.xml, /WEB-INF/C-defs.xml " />


Tiles框架还有一个定制标签库。我们可以使用如下的taglib指令来声明这个标签库:




  <%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>


二、<jsp:include>和<tiles:insert>标签

    由于在编写Web程序的过程中,很多页面会出现同样的内容,如所有的页面都使用同样的的页头和页尾。在JSP标签库中提供了一个include标签可以将其他的页面包含到当前的页面中,如我们可以使用如下的代码包含页头和页尾。
<jsp:include page = "header.jsp" />
  
  <jsp:include page = "footer.jsp" />
  



在Tiles框架的标签库中也提供了一个insert标签。这个标签也可以完成和include同样的工作。如上述代码也可以写成如下形式:





  <%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>
  
  <tiles:insert page = "header.jsp" />
  
  <tiles:insert page = "footer.jsp" />
  



    虽然include和insert标签都可以很好地解决代码重用问题,但是并不能完全避免代码重复的问题。如很多使用include或insert标签的页面也拥有很多类似或相同的代码。如使用css布局、用table、div等HTML元素进行位置控制等。如果想避免这些代码的重复。光使用include或insert标签是无法做到的。而要想做到这一点,就要使用下一篇文章中介绍的Tiles模板。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值