您的位置:首页 > 编程语言 > Java开发

SSH:Struts1框架(简介)

2015-11-19 10:46 453 查看
Struts最早是作为Apache Jakarta项目的组成部分,项目的创立者希望通过对该项目的研究,改进和提高JavaServer Pages
、Servlet、标签库以及面向对象的技术水准。Struts这个名字来源于在建筑和旧式飞机中使用的支持金属架。这个框架之所以叫"Struts",是为了提醒我们记住那些支撑我们房屋,建筑,桥梁,甚至我们踩高跷时候的基础支撑。这也是一个解释Struts在开发Web应用程序中所扮演的角色的精彩描述。当建立一个物理建筑时,建筑工程师使用支柱为建筑的每一层提供支持。同样,软件工程师使用Struts为业务应用的每一层提供支持。它的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间。我们仍然需要学习和应用该架构,不过它将可以完成其中一些繁重的工作。如果想混合使用Servlets和JSP的优点来建立可扩展的应用,Struts是一个不错的选择。


下面对Struts作一个整体的认知,后面具体讲解:

一、MVC
model         业务逻辑 有关数据库的操作
view           展示         jsp动态页面
controller 控制器     截取数据 分发 转向      

Struts中MVC模式执行流程:                                  


browse

   /            /

       request            response

      /                             /

actionServlet--forward---jsp

/       /                    

   config.xml    actionForm                       

        |               

Model    

 

二、Struts配置过程:

1、配置struts

* 拷贝struts lib下的所有jar到WEB-INF/lib下

* 修改web.xml文件,配置ActionServlet

* 提供struts-config.xml文件

<action-mappings>

   <action path="/login"

     type="com.struts.LoginAction"

     name="loginForm"

     scope="request"

     validate="false"

...

>

    <forward name="success" path="/success.jsp"/>

     </action> 

</action-mappings>

<action>标签中的属性含义描述如下:

1).name:表示ActionForm的名称。也就是<form-bean>标签中的name属性的值。

2).path:表示Struts动作,必须以“/”开头。

3).scope:表示ActionForm类的对象实例(在本例中是SimpleValidationForm类的对象实例)保存的范围。

这个属性值只能取request和session。默认值是session。

如果scope的值为request,表示将SimpleValidationForm类的对象实例以simpleValidationForm

作为键值保存到了request的属性中。如果scope的值为session,

表示不将SimpleValidationForm类的对象实例保存到request的属性中。但不管scope的值是request还是session。

Struts都会将SimpleValidationForm类的对象实例保存到session的属性中。

4). type:表示SimpleValidationAction类的全名。

5). input:表示如果客户端提交的数据未通过简单验证后要跳转到的页面,也就是在SimpleValidationForm类的validate方法中返回的ActionErrors对象中含有错误描述信息。Struts会自动跳转到input属性所指的JSP页面。

<action>标签中的子标签<forward>定义了可以在动作类(在本例中就是SimpleValidationAction类)中读取的forward页的URL。

 

 

2、创建登录项目

* 创建jsp页面(login.jsp,login_success.jsp,login_error.jsp) 

* 创建LoginActionForm.java

* 创建LoginAction.java

* 配置struts-config.xml文件

   处理登陆失败:

   forward name="error" path="/login_error.jsp"/> 配置登陆失败转向信息

三、struts标签的配置和使用

配置:

* 在struts-config.xml文件中加入

<message-resources parameter="MessageResources" />

* 拷贝MessageResources.properties文件到src下

使用:

* 采用taglib指令引入

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

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

四、JSTL

jstl标签库的配置

* 将jstl.jar和standard.jar拷贝到WEB-INF/lib下(如果使用el表达式,不用拷贝这两个jar)

标签库的使用

* 采用taglib指令引入

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> 

五、自定义函数库:

a、定义类和方法(方法必须是public static) 

b、编写自定义tld文件,并且将此文件放到WEB-INF或WEB-INF任意子目录下

c、在jsp中采用taglib指令引入自定义函数库

d、采用 前缀+冒号+函数名 调用即可 

mytaglibfn.tld

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

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">

<description>JSTL 1.1 functions library</description>

<display-name>JSTL functions</display-name>

<tlib-version>1.1</tlib-version>

<short-name>my</short-name>

<uri>http://com.java</uri><!-- 自定义前缀-->

<function>

    <name>sayHello</name><!--自定义方法名-->

    <function-class>com.struts.JSTL.TestMyTaglibFn</function-class><!--对应的方法类-->

    <function-signature>java.lang.String sayHello(java.lang.String)</function-signature><!--返回值类型和参数类型-->

</function>

</taglib>

引入指令后直接使用:

<%@ taglib prefix="my" uri="http://com.java"%>

EL表达式 ${my:sayHello(“Tom”)}

六、I18N国际化

a.了解缺省Locale是由操作系统决定的,Locale是由语言和国家代码组成

b.国际化资源文件是由baseName+locale组成,如:MessageBundle_en_US.properties

baseName是任意合法的文件名

c.native2ascii命令的位置和用法

* 位置:JAVA_HOME/bin

* 使用native2ascii.exe o.properties MessagesBundle_zh_CN.properties

JAVA国际化:

国际化资源文件(MessagesBundle_en_US.properties)

key1=hello,{0}

key2=good by

主要方法

Locale defaultlocale = Locale.getDefault(); //获取本地默认语言信息

ResourceBundle rb = ResourceBundle.getBundle("res.MessagesBundle",defaultlocale);//配置国际化资源文件

System.out.println(rb.getString("key1"));//取出对应的信息

//国际化资源文件中带站位符{0}时,处理方法:

MessageFormat mf = new MessageFormat(rb.getString("key1"));

System.out.println(mf.format(new Object[]{"Tom"}));

struts国际化的配置

* 在struts-config.xml文件中加入:<message-resources parameter="MessageResources" />

*提供不同版本的国际化资源文件,中文需要采用native2ascii转换成unicode

*在jsp中采用<bean:message>标签来读取国际化消息文本

*了解利用struts默认将locale放到session中的特性,完成采用编程的方式切换语言设置

currentLocale = new Locale("zh","CN");

   this.setLocale(request,currentLocale);

消息文本的国际化处理,共有三个步骤:

* 创建国际化消息

* 传递国际化消息

* 显示国际化消息

如何创建国际化消息?

理解ActionMessage和ActionMessages两个对象的区别

如何传递国际化消息?

* 调用saveMessage()传递普通消息,调用saveErrors传递错误消息

如何显示国际化消息?

通过<html:messages>标签显示消息(可以显示普通消息和错误消息)

通过<html:errors>显示消息(只能显示错误消息)  

七、动态ActionForm

动态ActionForm是为了避免标准ActionForm膨胀而设计的,使用动态ActionForm可以获得标准

ActionForm的所有功能

* 在struts-config.xml文件中定义动态ActionForm,如:

<form-beans>

   <form-bean name="dynaForm" type="org.apache.struts.action.DynaActionForm">

    <form-property name="username" type="java.lang.String" />

    <form-property name="age" type="java.lang.Integer"/>

   </form-bean>

</form-beans>

*在Action中使用动态ActionForm,参见DynaActionFormTestAction.java

   DynaActionForm daf = (DynaActionForm)form;

   String username = (String)daf.get("username");

   Integer age = (Integer)daf.get("age");

  

动态ActionForm其实是把页面中的html元素的名字和值放到了map中,所以通过get方法可以取出相应的值

动态ActionForm采用EL表达式的输出方式,${dynabean.map.prop} 

动态Action的验证,通常使用动态验证框架validator

八、采用struts上传文件

* 页面的配置,如:

   <form action="upload.do" method="post" enctype="multipart/form-data">

   标题:<input type="text" name="title"><br>

   文件:<input type="file" name="myfile"><br>

   <input type="submit" value="提交">

</form>

   * ActionForm中使用FormFile来接收上传的文件,参见:

UploadFileActiomForm ufaf = (UploadFileActiomForm)form;

   String title = ufaf.getTitle();

   FormFile myfile = ufaf.getMyfile();//注意使用FormFile对象,来实现Struts文件上传

   if(myfile!=null){

    FileOutputStream fos = new FileOutputStream("d://"+myfile.getFileName());

    fos.write(myfile.getFileData());

    fos.flush();

    fos.close();

   }

   * 在Action中调用FormFile取得上传文件数据,采用流输出,即完成上传。

   * 采用<controller/>标签配置上传参数,如:<controller maxFileSize="10M"/>

  
九、空字段测试

* 在表单中没有input输入域,jsp脚本接收到的值为null,el表达式接收到的值为空串

* 如果表单中的值,没有输入,那么jsp脚本和el表达式接收到的值都为空串

十、测试ActionForm类型的自动转换

* boolean:yes,1,on,true都会转换成True类型,而且忽略大小写,其他情况转换成false

* Date类型的转换:

   * 如果是java.sql.Date,页面日期的格式必须为yyyy-mm-dd,才可以转换

   * 如果是java.util.Date,默认情况下struts无法转换

* 自定义转换器的实现步骤

   * 实现converter接口,实现convert方法

   * 将实现的conerter注册,通常情况采用servlet注册

   * 采用servlet注册需要注意标签的配置,<load-on-startup>10</load-on-startup>(也可以采用struts plugin注册)

  

Struts对ActionForm的自动搜集过程:

* 将页面数据放到map中,其中map中的key为页面中的名称,map中的value为页面中的value值

* 调用BeanUtils.setProperties方法,将map中的值逐个设置到ActionForm实例上,对于ActionForm中的每个属性

    根据类型调用相应的Converter,然后调用相应的convert方法,将相应的字符串转换成ActionForm中指定的类型

    

可以通过BeanUtils.copyProperties(目标对象,源对象)方法进行对象值的复制。

十一、ActionMapping

struts-config.xml文件中,每个<action>标签对应一个ActionMapping实例

了解<action>标签中的forward和unknown属性的含义

<action path="/unknown"

     unknown="true"

     forward="/unknown.jsp"

   >

   </action>

了解采用jstl和struts标签保持页面数据

十二、ActionForward的使用

a.理解全局和局部ActionForward的概念

b.redirect的使用redirect = "true" 为重定向 url会变

c.struts-config.xml文件不允许动态修改

d.理解动态ActionForward,动态的ActionForward是可以运行期修改的( 

ActionForward af = new ActionForward();

   af.setPath("/"+page+".jsp");  

   return af;

十三、动态验证框架struts validator

1、配置:

* 加入国际化配置在struts-config.xml文件中,如:

   <message-resources parameter="MessageResources" />

* 提供国际化资源文件

* 引入validator插件在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>

* 提供validation.xml和validator_rules.xml文件,将此文件拷贝到WEB-INF下

2、validator服务器端验证

* 配置validation.xml文件

3、validator客户端验证(javascript)

) * 配置validation.xml文件

* 在jsp页面中包含< html:javascript> 

* 对需要验证的表单定义onsubmit事件,其中事件名称为validate+ActionForm的名称,如:validateLoginForm 

<!------------------------------------------------------validation.xml------------------------>

...........................................

<form-validation>

    <formset>

        <form name="loginForm">

            <field property="username" depends="required">

                    <arg key="prompt.username"/>

            </field>

            <field property="password" depends="required,mask">

                    <arg key="prompt.password"/>

                    <var>

                        <var-name>mask</var-name>

                        <var-value>^[0-9a-zA-Z]*$</var-value>

                    </var>

            </field>

        </form>

    </formset>

</form-validation>

十四、异常

a、编程式异常

* 截获异常

* 创建相应的异常消息

* 传递异常消息

* 转向相应的页面处理异常

b、声明式异常(自动处理的异常)

* 在struts-config.xml文件中配置<exeception/>标签

* 理解局部和全局exception

* 注意局部<exception/>标签需要配置到<forward/>标签的前面,详见dtd中的约束

<exeception/>标签中的属性说明:

   * key:指异常信息对应的国际化消息文本,这个key值需要在国际化资源文件中定义

   * type: 处理那种异常

   * path: 定义一但出现异常,需要转向那个页面,如果不定义path,

           默认情况下将使用<action>标签中input属性对应的页面

   * scope:可以取值request和session,默认为request

   * handler:异常的处理类,struts默认采用org.apache.struts.action.ExceptionHandler,

              如果做个性化的异常处理可以继承此类覆写相应的方法

              

十五、DispatchAction

DispatchAction是一个特殊的Action,通过统一命名规则,配置相关的属性parameter="command",来减少Action数量,同时也减少了Action的配置量。

DispatchAction中unspecified方法,Struts找不到在parameter配置的参数对应的值时,Struts会默认执行重写的该方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struts apache ssh 框架