Struts1.x 总结(很全面)

2024-02-19 17:08
文章标签 总结 全面 struts1

本文主要是介绍Struts1.x 总结(很全面),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Struts1.x学完,整理一下:
Struts1.x是基于MVC框架的,学Struts1.x前先了解MVC

一、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会默认执行重写的该方法。

这篇关于Struts1.x 总结(很全面)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/725333

相关文章

关于C++中的虚拟继承的一些总结(虚拟继承,覆盖,派生,隐藏)

1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如下: class A class B1:public virtual A; class B2:pu

揭秘未来艺术:AI绘画工具全面介绍

📑前言 随着科技的飞速发展,人工智能(AI)已经逐渐渗透到我们生活的方方面面。在艺术创作领域,AI技术同样展现出了其独特的魅力。今天,我们就来一起探索这个神秘而引人入胜的领域,深入了解AI绘画工具的奥秘及其为艺术创作带来的革命性变革。 一、AI绘画工具的崛起 1.1 颠覆传统绘画模式 在过去,绘画是艺术家们通过手中的画笔,蘸取颜料,在画布上自由挥洒的创造性过程。然而,随着AI绘画工

十五.各设计模式总结与对比

1.各设计模式总结与对比 1.1.课程目标 1、 简要分析GoF 23种设计模式和设计原则,做整体认知。 2、 剖析Spirng的编程思想,启发思维,为之后深入学习Spring做铺垫。 3、 了解各设计模式之间的关联,解决设计模式混淆的问题。 1.2.内容定位 1、 掌握设计模式的"道" ,而不只是"术" 2、 道可道非常道,滴水石穿非一日之功,做好长期修炼的准备。 3、 不要为了

人工智能机器学习算法总结神经网络算法(前向及反向传播)

1.定义,意义和优缺点 定义: 神经网络算法是一种模仿人类大脑神经元之间连接方式的机器学习算法。通过多层神经元的组合和激活函数的非线性转换,神经网络能够学习数据的特征和模式,实现对复杂数据的建模和预测。(我们可以借助人类的神经元模型来更好的帮助我们理解该算法的本质,不过这里需要说明的是,虽然名字是神经网络,并且结构等等也是借鉴了神经网络,但其原型以及算法本质上还和生物层面的神经网络运行原理存在

Java注解详细总结

什么是注解?         Java注解是代码中的特殊标记,比如@Override、@Test等,作用是:让其他程序根据注解信息决定怎么执行该程序。         注解不光可以用在方法上,还可以用在类上、变量上、构造器上等位置。 自定义注解  现在我们自定义一个MyTest注解 public @interface MyTest{String aaa();boolean bbb()

tensorboard-----summary用法总结

Tensorflow学习笔记——Summary用法         最近在研究tensorflow自带的例程speech_command,顺便学习tensorflow的一些基本用法。 其中tensorboard 作为一款可视化神器,可以说是学习tensorflow时模型训练以及参数可视化的法宝。 而在训练过程中,主要用到了tf.summary()的各类方法,能够保存训练过程以及参数分布图并在

七种排序方式总结

/*2018.01.23*A:YUAN*T:其中排序算法:冒泡排序,简单排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序*/#include <stdio.h>#include <math.h>#include <malloc.h>#define MAXSIZE 10000#define FALSE 0#define TRUE 1typedef struct {i

Java实现MD5加密总结

Java实现MD5加密总结 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 1. 什么是MD5加密 MD5是一种常用的哈希算法,用于将任意长度的数据通过哈希运算转换为固定长度的数据串,通常为128位的二进制串,常用于对密码等敏感信息进行加密存储或传输。 2. Java实现MD5加密的方法 2.1 使用java.sec

Linux通配符总结

Linux通配符总结 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在Linux系统中,通配符是一种用于匹配文件名或路径名的特殊字符。通过使用通配符,可以方便地匹配多个文件或目录,从而进行文件操作或查找。 2. 常用的通配符 在Linux系统中,常用的通配符包括以下几种: *:匹配任意长度的任意字符。?:匹配任意单个字符

【Linux文件系统】被打开的文件与文件系统的文件之间的关联刨析总结

操作系统管理物理内存以及与外设磁盘硬件进行数据的交换 操作系统如何管理物理内存呢? 其实操作系统内核先对内存先描述再组织的!操作系统管理内存的基本单位是4KB,操作系统会为每一个4KB大小的物理内存块创建一个描述该4KB内存块的struct page结构体,该结构体存储着这4KB内存块的属性信息,通过管理struct page来对内存进行管理,page结构体的大小比较小,OS通常将它们组成一个