03Struts1.x(三)(标签库)
- 格式:ppt
- 大小:532.50 KB
- 文档页数:35
Struts标签库一.概述Struts不仅提供了一组非常丰富的框架组件,同样它也提供了一组标签库用于和组件进行交互。
Struts之所以受到越来越多的关注,很大程度上要归功于它强大的标记功能。
熟练使用和掌握struts各种标记不但可以简化页面代码,同时可以简化编程。
1.struts标签库类型:分为以下几类:HTML 标签库Bean标签库Logic标签库Templete标签库Tiles标签库Nested标签库2.Struts标签库的使用第一步:在web.xml中用<taglib>标记声明第二步:在页面文件(.jsp)中用<%@taglib >引用例如:要在页面(login.jsp)中使用struts标签库,可以如下操作:第一步:在web.xml中声明标签库,如:<taglib><taglib-uri>/struts-bean</taglib-uri><taglib-location>/WEB-INF/tld/struts-bean .tld</taglib-location></taglib><taglib><taglib-uri>/struts-html</taglib-uri><taglib-location>/WEB-INF/tld/struts-html .tld</taglib-location></taglib>第二步:在login.jsp文件开头引用标签库<%@ taglib uri=”/struts-bean” prefix=”bean” %><%@ taglib uri=”/struts-htm l” prefix=”html” %><%@ taglib uri=”/struts-logic” prefix=”logic” %>Html标签库它包含了创建Html页面的常用标签,常用的Struts Html标签如下:标签中的name。
struts1.x一、开发struts1应用的基本步骤1)首先导入struts1的所有jar包;2)在WEB-INF下创建struts-config.xml这个核心配置文件;3)在web.xml文件中配置struts的主控器ActionServlet;注:以上三步可以通过MyEclipse插件自动完成4)创建一个ActionForm类,继承ActionForm(可选),在这个类中提供属性和getter/setter方法来获得客户端提交的参数值;5)创建一个Action类,继承Action。
在execute方法中编写处理请求的代码,处理完成后返回一个ActionForward对象给主控器。
注:ActionForword实际上是一个包含了视图路径和转发请求方式的一个对象,这个对象可以有两种创建方式:1.直接new一个,在创建的时候,通过构造器传入视图路径和转发请求方式等信息。
2.通过ActionMapping对象的findForward方法创建,这种方式实际上是在配置文件中配置转发请求的一些信息,然后根据这些信息创建一个ActionForward对象。
6)在struts-config.xml文件中配置Action;7)在jsp页面上指定发送请求的路径,必须以.do结尾。
二、Struts的工作流程***装载并实例化ActionServlet***当Web Server启动装载Web应用(基于Struts)时,容器先将ActionServlet装载进虚拟机并实例化,接着调用init()方法,在init()中ActionServlet去解析struts-config.xml文件,将其中的元素信息封装到相应的对象中,对象被存放到Struts框架维护的集合中。
例如:<form-bean>元素 --> ActionFormBean对象<action>元素 --> ActionMapping对象元素中的属性 --> 对象中的属性注: ActionFormBean和ActionMapping对象被存放在Struts框架维护的HashMap 中HashMap formbeans(name,ActionFormBean对象引用)HashMap actionconfigs(path,ActionMapping对象引用)init()方法调用完毕后,ActionServlet处于service状态,可以接受客户端的请求。
流程服务器启动后,根据web.xml加载ActionServlet读取struts-config.xml文件内容到内存。
以登录为例:第一次进login.jsp会先实例化Form、把默认值(String默认为空字符串,整形默认为0)赋给表单元素。
输入用户名密码提交表单、提交到action属性的login.do,通过ActionServlet读struts-config.xml文件找到 action下的path属性找到.do,通过name属性找form-beans中的form-bean的name属性得到ActionForm的包名类名,先实例化form,把表单的值填充给form,调用form 的validate方法验证、ActionErrors返回null表示验证通过,否则失败返回input指定的页面.验证通过会实例化Action,执行Action的execute方法。
框架结构图综述相应框架结构如图:Struts对Model,View和Controller都提供了对应的组件。
在上图中,ActionServlet,这个类是Struts的核心控制器,负责拦截来自用户的请求。
Action,这个类通常由用户提供,该控制器负责接收来自ActionServlet 的请求,并根据该请求调用模型的业务逻辑方法处理请求,并将处理结果返回给JSP页面显示。
Model部分由JavaBean组成,ActionForm用于封装用户的请求参数,封装成ActionForm对象,该对象被ActionServlet转发给Action,Action根据ActionForm里面的请求参数处理用户的请求。
JavaBean则封装了底层的业务逻辑,包括数据库访问等。
View部分该部分采用JSP实现。
Struts提供了丰富的标签库,通过标签库可以减少脚本的使用,自定义的标签库可以实现与Model的有效交互,并增加了现实功能。
对应上图的JSP 部分。
01struts基础J2EE1.4ServletJspJDBCJTA(Java Transaction API)JPA(Java persistence API)---EJBJavaMailJSTLEJBJNDIModel_1的执行流程Mode2_2的执行流程Struts框架的版本Struts充当表现层的作用。
Struts框架的核心组件ActionServlet总控制器。
核心组件,用于将具体的请求分配到各自处理的Action组件中。
Action具体的业务处理过程组件ActionFrom(FormBean)获取表单参数,并将参数封装到Bean中。
ActionForward用来Action的请求转发ActionMapping帮助控制器[ActionServlet]将请求映射到操作类[Action]Struts-config.xml用来配置Stuts组件的关联关系。
Struts框架的工作流程Struts-config.xml<form-bean name="loginForm" type="com.softfz.login.LoginForm" />name:用来表示actionform的名称type:用来表示actionform的类路径<actionattribute="loginForm" name="loginForm"path="/loginAction" scope="request"type="com.softfz.login.LoginActionAction" validate="true"input="/index.jsp" />attribute:表示ActionFrom的实例放到作用域中的名称.LoginForm aa = new LoginForm();aa.setUsername(request.getParameter("username"));aa.setPassword(request.getParameter("password"));request.setAttribute("attribute的值",aa);name:表示Action和ActionFrom关联的名称。
学习struts1.3配置环境(日,学什么都要配置环境)1.首先先建一个web工程,名字随便的2.然后进行导包(找到包再导进去,是struts的包才好)3.对配置文件进行配置,貌似应该是没有配置文件的,要先创建,创建在WEB-INF目录下,和web.xml放在一个目录,名字的话可以随便3.先对struts-confing.xml进行简单的配置吧(前面说了,名字随便取无所谓的,但这是一个标准吧,大家都这么取的),内容如下4.还没搭建完,还要对web.xml进行配置写一个简单的例子(第一次接触struts,个人感觉不简单 1.建立ActionFrom 2.建立Action 3.页面访问)1.开发FROM建立一个类,继承ActionFrom注册,修改配置文件struts-config.xml,即加一个<form-bean>标签就行了2.开发Action建立一个类,继承Action覆盖excute方法需要强制转换(即转成与jsp页面对应的form)调用其他模块跳转(根据关键字,关键字参照该Action中forward标签中的name属性)注册,修改配置文件struts-confing.xml,也就是配置<action>标签(并写出可以forward跳转的页面,上面的action只能跳转到forward里配置的页面)对应的jsp页面LoginSuccess和LoginFailure没什么用,只是为了显示,Login页面有一个要注意的地方,就是那个form变迁的action属性就是要跳转到那个action去,那个action必须是struts-confing.xml的<action-mappings>里面的<action>有配置才行,看上面的action就配了一个Login,至于后面那个.do的话是在web.xml里面有配置的,切记切记,个人理解为要在web.xml里面配置了才能访问action模型strutsForm请求页面ActionServlet处理Action Servlet业务代码数据库无论是否成功都要给人家返回一个结果这是为了给客户一个良好的体返回的页面jsp,html 之类的成功失败Action1.Action什么时候初始化?发出该Action请求时,不是在读取配置初始化时2.每个Action只会初始化一次3.Action是线程不安全的,因为所有的请求会共享一个Action实例4.怎样实现Action的安全性编程A.注意不要用实例变量或者类变量共享只是针对某个请求的数据B.注意资源操作的同步性应用:统计一个Action的访问数据,只要定义一个类变量,再++即可Action中的Mapping来自配置文件中的Action元素,代表着控制器的请求信息String name=mapping.getName();//获取配置文件中<action-mappings>元素中的<action>的一个属性,即nameString path=mapping.getPath();//获取配置文件中<action-mappings>元素中的<action>的一个属性,即pathString type=mapping.getType();//获取配置文件中<action-mappings>元素中的<action>的一个属性,即type,可用于反射String type=mapping.findForwards();//获取配置文件中<action-mappings>元素中的<forward>属性,获取全部forward的nameActionForward froward=mapping.findForward(“指定名字(即forward标签里配置的name)”);ActionForwardActionForward有个Redirect属性,可以设置false或者trueFalse,no--------RequestDispatcher forward 只能跳转到当前应用的页面,不设置也可以True,yes--------HttpServletResponse sendRedirect 可以跳转到应用外的页面,必须设置ActionForm工作原理处理ActionForm的一般步骤:A.检查Action的映射,确定Action中已经配置了对ActionForm的映射B.根据name属性,查找form bean的配置信息C.检查Action的form bean的使用范围,确定在此范围下(request,session),是否有此form bean实例D.假如当前范围下,已经存在了此form bean的实例,而是对当前请求来说,是同一种类型的话,请慎用E.否则,就重新构建一个form bean的实例(调用构造方法),并且保存在一定作用范围F.Form bean的reset()方法被调用G.调用对应的setter方法,对状态属性赋值H.如果validate的属性设置为true那么就调用form bean的validate()方法I.如果validate()方法没有返回任何错误,控制器将ActionForm作为参数,传给Action 实例的execute()方法并执行J.注意:直接从ActionFrom类继承的reset()和validate()方法,并不能实现什么处理功能,所以有必要自己重新覆盖由页面向Action发出请求查找Action,看Action是否有name属性查找,根据name和scope Scope getAttribute(name)Scope 是struts-config.xml中的Action标签的一个属性,表示作用范围(个人理解是否就是Action实例化存在的域),默认值为session, 是否找到没找到就实例化一个Scope setAttribute(name,form)和查找Action类似,看一下有没有可用的form bean有就直接调用该form bean的reset方法,没有就创建一个,并保存在一定作用范围找到Action的实例就跳过实例化一个Action 的步骤取值,从客户端参数,request.getParameter()获取用户提交的数据和赋值是否需要校验validate校验是否校验成功校验成功,发送请求到Action 校验失败错误页面监听器在struts里面还有监听器,监听器要继承你要监听的东西如下面代码上面代码继承两个域的属性监听,当然要让监听器生效,还要对web.xml配置文件进行配置,web经常需要配置配置文件在上面web.xml里面接近结尾处加了一个listener标签,这是让listener运行的关键,很明显,框架的作用这时候就体现出来了,只要你写好代码再配置一下文件,框架就会帮你自动运行,而不用你操心手动在Action里获取ActionForm对象在一个Action的excute方法里添加这个方法,然后获取form,再与excute传进去的那个form 是否一致,值得注意的是那个Attribute是你设置的form的名字服务端校验在对应的Form覆盖validate方法即可一般情况下校验都是开着的,而为什么就算数据错误都会不报错呢,那是继承ActionForm 接口的同时也继承了ActionForm的validate(校验)方法,而ActionForm的validate方法是没有返回值的,在没有覆盖父类的validate方法之前,默认的validate是来自父类的validate 方法如何关闭校验呢上面的绿色的字已经大概解析了,下面再发一个图片演示一下配置文件简介作用:使ActionServlet,ActionMapping,Action,ActionForm这几个不同层次的组件相互协调工作。
struts的循环标签-回复关于Struts循环标签的用法和实际应用一、Struts循环标签介绍Struts是一个MVC(Model-View-Controller)框架,被广泛用于Java Web开发中。
在Struts中,循环标签是一种非常实用的技术,用于在JSP 页面中重复显示数据。
它提供了多种循环方式,如for循环、while循环和foreach循环等。
使用Struts循环标签,可以简化开发过程,提高代码的可读性和维护性。
二、Struts循环标签的原理Struts循环标签通过利用EL(Expression Language)和JSTL(JSP标准标签库)提供的表达式,动态生成HTML代码。
循环标签会根据表达式的结果,在页面上展示对应的数据。
通过迭代集合、数组或者Map等数据类型,循环标签可以将其中的每个元素都用相同的HTML元素包装起来,并在页面上显示。
三、Struts循环标签的使用步骤1. 导入Struts标签库在JSP页面的顶部,通过`< taglib uri=" prefix="html" >`导入Struts标签库,以便使用循环标签。
2. 准备数据在Action类中,准备需要在页面上显示的数据。
可以通过集合、数组或者Map等数据结构来存储数据。
3. 使用循环标签在JSP页面中,使用循环标签来迭代数据,并将每个元素都渲染成HTML 元素。
根据需要选择不同的循环标签,比如`<html:iterate>`、`<html:optionsCollection>`和`<html:options>`等。
4. 设置循环标签的属性循环标签通常有一些可选的属性,用于进一步配置标签的行为。
比如`collection`属性指定要迭代的集合,`name`属性用于指定迭代变量的名称。
在实际使用中,可以根据需求设置这些属性。
5. 在循环标签中处理数据在循环标签内部,可以使用EL表达式或者Struts的表单标签来访问被迭代的数据,并将其渲染到页面上。
Struts1.X 学习笔记8月28日2009[在此处键入文档的摘要。
摘要通常是对文档内容的简短总结。
在此处键入文档的摘要。
摘要通常是对文档内容的简短总结。
] MVC框架以及标签的使用Structs1.x 框架工作流程方法介绍Action 是Struct 父接口,其中里面的方法是public ActionForwardexecute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response){}throws ExceptionActionForm 是获取表单中的数据 ActiionForward 是进行转向处理工作流程requestdispatchBrouse (浏览器) ActionServlet (中央控制器) (1. 负责截取url ) (2. 数据的分发dispatch)Struts-config.xmlAction(ActionForm,ActionForward))Model(模型层)业务逻辑forwardJSPresponseStruts Taglib(标签)Struts 标签的配置和使用配置:* 在struts-config.xml文件中加入<message-resources parameter="MessageResources" />* 拷贝MessageResources.properties文件到src下使用:* 采用taglib指令引入<%@ taglib prefix="bean" uri="/tags-bean"%><%@ taglib prefix="logic"uri="/tags-logic"%>Struts 常使用的标签如下:<bean:write name=””>等同于request.getAttribute(“”)/或是request.getPrameatery(“”)<logic:empty> </logic:empty><logic:notEmpty name="attr3"></logic:notEmpty><logic:present></logic:present><logic:notPresent></logic:notPresent>是逻辑判断标记相当于if else JSTL标签的使用(学习的重点,必须掌握)简介:SUN的标准taglib库Jsp标准标签库(jsp standard Tag Library,JSTL)迭代和条件判断数据管理格式化XML操作数据库访问函数标签库表达式语言(EL)El隐式对象存取器运算符EL实例如下:<h1>测试EL表达式</h1><br><hr><li>普通字符串</li><br>hello(jsp脚本):<%=request.getAttribute("hello") %><br>hello(el表达式,el表达式的使用方法$和{}):${hello }<br>hello(el表达式,el的隐含对象pageScope,requestScope,sessionScope,applicationScope,<br> 如果未指定scope,它的搜索顺序为pageScope~applicationScope):${requestScope.hello }<br> hello(el表达式,scope=session):${sessionScope.hello }<br><p><li>结构,采用.进行导航,也称存取器</li><br>姓名:${ername }<br>年龄:${user.age }<br>所属组:${ }<br><p><li>输出map,采用.进行导航,也称存取器</li><br>mapvalue.key1:${mapvalue.key1 }<br>mapvalue.key2:${mapvalue.key2 }<br><p><li>输出数组,采用[]和下标</li><br>strarray[2]:${strarray[1] }<br><p><li>输出对象数组,采用[]和下标</li><br>userarray[3].username:${users[2].username }<br><p><li>输出list,采用[]和下标</li><br>userlist[5].username:${userlist[4].username }<br><p><li>el表达式对运算符的支持</li><br>1+2=${1+2 }<br>10/5=${10/5 }<br>10 div 5=${10 div 5 }<br>10%3=${10 % 3 }<br>10 mod 3=${10 mod 3 }<br><!--==/eq!=/ne</lt>/gt<=/le>=/ge&&/and||/or!/not//div%/mod--><li>测试empty</li><br>value1:${empty value1 }<br>value2:${empty value2 }<br>value3:${empty value3 }<br>value4:${empty value4 }<br>value4:${!empty value4 }<br>JSTL_核心库标签<h1>测试jstl核心库</h1><hr><li>测试c:out</li><br>hello(default):<c:out value="${hello}"/><br>hello(el表达式):${hello }<br>hello(default="123"):<c:out value="${abc}" default="123"/><br>hello(default="123"):<c:out value="${abc}">123</c:out><br>bj(defalut):<c:out value="${bj}"/><br>bj(escapeXml="true"):<c:out value="${bj}" escapeXml="true"/><br> bj(escapeXml="false"):<c:out value="${bj}" escapeXml="false"/><br> bj(el表达式):${bj }<br><p><li>测试c:set和c:remove</li><br><c:set value="123" var="temp"/>temp:${temp }<br><c:remove var="temp"/>temp:${temp }<br><p><li>测试条件控制标签c:if</li><br><c:if test="${v1 lt v2}" var="v">v1小于v2<br>v=${v }<br></c:if><c:if test="${empty v3}">v3为空<br></c:if><c:if test="${empty v4}">v4为空<br><p><li>测试条件控制标签c:choose,c:when,c:otherwise</li><br><c:choose><c:when test="${v1 lt v2}">v1小于v2<br></c:when><c:otherwise>v1大于v2<br></c:otherwise></c:choose><c:choose><c:when test="${empty v4}">v4为空<br></c:when><c:otherwise>v4不为空<br></c:otherwise></c:choose><p><li>测试循环控制标签c:forEach</li><br><table border="1"><tr><td>姓名</td><td>年龄</td><td>所属组</td></tr><c:choose><c:when test="${empty userlist}"><tr><td colspan="3">没有符合条件的数据!</td> </tr></c:when><c:otherwise><c:forEach items="${userlist}" var="u"><tr><td>${ername }</td><td>${u.age }</td><td>${ }</td></tr></c:forEach></c:otherwise></c:choose></table><li>测试循环控制标签c:forEach,varstatus</li><br><table border="1"><tr><td>姓名</td><td>年龄</td><td>所属组</td></tr><c:choose><c:when test="${empty userlist}"><tr><td colspan="3">没有符合条件的数据!</td></tr></c:when><c:otherwise><c:forEach items="${userlist}" var="user" varStatus="vs"><c:choose><c:when test="${vs.count % 2 == 0}"><tr bgcolor="red"></c:when><c:otherwise><tr></c:otherwise></c:choose><td><c:out value="${ername}"/></td><td><c:out value="${user.age}"/></td><td><c:out value="${}"/></td></tr></c:forEach></c:otherwise></c:choose></table><p><li>测试循环控制标签c:forEach,begin,end,step</li><br><table border="1"><tr><td>姓名</td><td>年龄</td><td>所属组</td></tr><c:choose><c:when test="${empty userlist}"><tr><td colspan="3">没有符合条件的数据!</td></tr></c:when><c:otherwise><c:forEach items="${userlist}" var="user" begin="2" end="8" step="2"> <tr><td>${ername}</td><td>${user.age}</td><td>${ }</td></tr></c:forEach></c:otherwise></c:choose></table><p><li>测试循环控制标签c:forEach,普通循环</li><br><c:forEach begin="1" end="10">a<br></c:forEach><p><li>测试循环控制标签c:forEach,输出map</li><br><c:forEach items="${mapvalue}" var="v">${v.key }=${v.value }<br></c:forEach><p><li>测试循环控制标签c:forTokens</li><br><c:forTokens items="${strTokens}" delims="," var="v">${v }<br></c:forTokens><p><li>测试c:catch</li><br><%try {Integer.parseInt("asdfsdf");}catch(Exception e) {out.println(e.getMessage());}%><p><c:catch var="exinfo"><%Integer.parseInt("asdfsdf");%></c:catch>${exinfo }<br><p><li>测试c:import</li><br><c:import url="http://localhost:8080/struts_login"/><p><li>测试c:url和c:param</li><br><c:url value="http://localhost:8080/drp/sysmgr/user_add.jsp" var="v"><c:param name="username" value="Jack"/><c:param name="age" value="20"/></c:url>${v }<br><li>测试:redirect</li><br><c:redirect context="/struts_login" url="/index.jsp"/>Jstl格式化标签的使用实例<li>fmt时间格式化</li><br>date(default):<fmt:formatDate value="${date}" var="d"/><br>d=${d}<br>date(type="time"):<fmt:formatDate value="${date}" type="time"/><br> date(type="date"):<fmt:formatDate value="${date}" type="date"/><br> date(type="both" ):<fmt:formatDate value="${date}"type="both"/><br>date(type="both" dateStyle="long"):<fmt:formatDate value="${date}" type="both"dateStyle="long"/><br>date(type="both" dateStyle="full"):<fmt:formatDate value="${date}" type="both"dateStyle="full"/><br>date(type="both" timeStyle="full"):<fmt:formatDatevalue="${date}" type="both"timeStyle="full"dateStyle="full"/><br>date(type="both" pattern="yyyy-mm-dd hh-mm=ss" ):<fmt:formatDate value="${date}" pattern="yyyy-mm-dd hh-mm-ss"/><li>数字的格式化</li><br>数字的格式化(default):<fmt:formatNumbervalue="${number}"></fmt:formatNumber><br>数字格式化(type="number"):<fmt:formatNumber value="${number}" pattern="###,###.0000"type="number"maxIntegerDigits="10"maxFractionDigits="2"></fmt:formatNumber><br>数字格式化 (type="currency"):<fmt:formatNumber value="${number}" type="currency"var="m"></fmt:formatNumber><br>总共的金额是:${m}<br>百分比(pdate type="percent" ): <fmt:formatDate value="${pdate}"type="percent"var="p"pattern=".0000"/>${p}<br>JSTL函数库(以及自定义函数库)自定义函数的规则jstl_fn自定义函数库:1、定义类和方法(方法必须是public static)2、编写自定义tld文件,并且将此文件放到WEB-INF或WEB-INF任意子目录下3、在jsp中采用taglib指令引入自定义函数库4、采用前缀+冒号+函数名调用即可实例<h4align="center">jstl函数库的测试</h4><li>和那书库的测试</li><br>hello(jsp 脚本):<%=((String)request.getAttribute("hello")).length() %><br>helo(jstl函数库,函数调用必须在el表达式中前缀+冒号+函数名):${fn:length(hello)}<br>list集合的长度:${fn:length(list) }<li>自定义和那书库的测试</li><br>sayHello(自定义函数):${myfunction:sayhello(name)}动态ActionForm(可以动态的获取页面提交的数据)1、动态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="ng.String" /><form-property name="age" type="ng.Integer"/> </form-bean></form-beans>*在Action中使用动态ActionForm,参见DynaActionFormTestAction.java 使用了DynaActionForm累中get的方法DynaActionForm daf = (DynaActionForm)form;String username = (String)daf.get("username");Integer age = (Integer)daf.get("age");注意:DynaActionForm是Struct1.x自带的一个类动态ActionForm其实是把页面中的html元素的名字和值放到了map中,所以通过get方法可以取出相应的值动态ActionForm采用EL表达式的输出方式,${dynabean.map.prop}, 参见:dyna_actionform.jsp动态Action的验证,通常使用动态验证框架validator2、采用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来接收上传的文件,参见:UploadActionForm.java * 在Action中调用FormFile取得上传文件数据,采用流输出,即完成上传,参见:UploadTestAction.java* 采用<controller/>标签配置上传参数,如:<controller maxFileSize="10M"/>3、空字段测试* 在表单中没有input输入域,jsp脚本接收到的值为null,el表达式接收到的值为空串* 如果表单中的值,没有输入,那么jsp脚本和el表达式接收到的值都为空串4测试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(目标对象,源对象)方法进行对象值的复制。
Struts1之HTML标签库详解12010-05-09 15:19Struts提供了五个标签库,即:HTML、Bean、Logic、Template和Nested。
标签的公共特征使用固定属性名称的Struts 标签:Struts 标签也支持嵌套引用,例如:虽然Struts 标签的设计原意是为了避免使用scriptlet,scriptlet的表达式还能够提供给所有的Struts 标签使用。
但请确保使用完整的表达式:Html 标签库1.<html>标签它有两个属性:locale和xhtml,两者都不是必需的。
2.说明:生成的结果取决于Struts应用程序所位于的服务器的locale。
如果你将应用程序部署到一个不同locale的服务器,你不需要改变代码,Locale会自动调整。
3.<base>标签:表示所包含页面的绝对位置。
这个标签只有内嵌在head标签中才有效。
4.<img>标签最重要的属性page:图象文件的路径,前面必须带有一个斜线。
其它属性:heignt、width、alt。
5.<link>标签6.<errors>标签:通过一个简单的<html:errors/>标签,你就可以在一个JSP页面上显示完全自定义的错误信息。
功能超强大!!说明:这个标签在Request对象的属性集合中查找reserved key。
如果它找到一个reserved key,它就假设这个key是一个String、或是一个String数组(它包含在模块的MessageResources中查找的message keys)、或是类型为org.apache.struts.action.ActionErrors的一个对象。
如果在应用程序资源中存在相应的信息,那么就可以用下面这些可选的message keys:· errors.header or errors.prefix:相应的信息在错误信息的单独列表前显示。