??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲成a人片在线观看无码,亚洲一区AV无码少妇电影☆,亚洲国产成人久久笫一页 http://www.tkk7.com/wyz191/category/18594.html走向一条通往JAVA的不归\... zh-cn Thu, 22 Nov 2007 02:37:56 GMT Thu, 22 Nov 2007 02:37:56 GMT 60 jstl与strutsl合 http://www.tkk7.com/wyz191/articles/101340.htmljava_蝈蝈 java_蝈蝈 Fri, 02 Mar 2007 00:50:00 GMT http://www.tkk7.com/wyz191/articles/101340.html http://www.tkk7.com/wyz191/comments/101340.html http://www.tkk7.com/wyz191/articles/101340.html#Feedback 0 http://www.tkk7.com/wyz191/comments/commentRss/101340.html http://www.tkk7.com/wyz191/services/trackbacks/101340.html 阅读全文 ]]> 用Struts的Token机制解决表单重复提交 http://www.tkk7.com/wyz191/articles/99354.htmljava_蝈蝈 java_蝈蝈 Sun, 11 Feb 2007 23:50:00 GMT http://www.tkk7.com/wyz191/articles/99354.html http://www.tkk7.com/wyz191/comments/99354.html http://www.tkk7.com/wyz191/articles/99354.html#Feedback 0 http://www.tkk7.com/wyz191/comments/commentRss/99354.html http://www.tkk7.com/wyz191/services/trackbacks/99354.html Struts的TokenQo牌)机制能够很好的解册单重复提交的问题Q基本原理是Q服务器端在处理到达的请求之前,会将h中包含的令牌g保存在当前用户会话中的o牌D行比较,看是否匹配。在处理完该h后,且在{复发送给客户端之前,会产生一个新的o牌,该o牌除传给客户端以外,也会用户会话中保存的旧的o牌进行替换。这样如果用户回退到刚才的提交面q再ơ提交的话,客户端传q来的o牌就和服务器端的令牌不一_从而有效地防止了重复提交的发生?br />
q时其实也就是两点,W一Q你需要在h中有q个令牌|h中的令牌值如何保存,其实和我们qx在页面中保存一些信息是一LQ通过隐藏字段来保存,保存的Ş式如Q?〈input type="hidden" name="org.apache.struts .taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"〉,q个value是TokenProcessorcM的generateToken()获得的,是根据当前用Lsession id和当前时间的long值来计算的。第二:在客L提交后,我们要根据判断在h中包含的值是否和服务器的令牌一_因ؓ服务器每ơ提交都会生成新的TokenQ所以,如果是重复提交,客户端的Token值和服务器端的Token值就会不一致。下面就以在数据库中插入一条数据来说明如何防止重复提交?br />
在Action中的addҎ中,我们需要将Token值明的要求保存在页面中Q只需增加一条语句:saveToken(request);Q如下所C:
public ActionForward add(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
//前面的处理省?br />
saveToken(request);
return mapping.findForward("add");
}在Action的insertҎ中,我们Ҏ表单中的Tokeng服务器端的Token值比较,如下所C:
public ActionForward insert(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
if (isTokenValid(request, true)) {
// 表单不是重复提交
//q里是保存数据的代码
} else {
//表单重复提交
saveToken(request);
//其它的处理代?br />
}
}
其实使用h很简单,举个最单、最需要用这个的例子Q?br />
一般控刉复提交主要是用在Ҏ据库操作的控制上Q比如插入、更新、删除等Q由于更新、删除一般都是通过id来操作(例如QupdateXXXById, removeXXXByIdQ,所以这cL作控制的意义不是很大Q不排除个别现象Q,重复提交的控制也׃要是在插入时的控制了?br />
先说一下,我们目前所做项目的情况Q?br />
目前的项目是用StrutsQSpringQIbatisQ页面用jstl QStruts复杂View层,Spring在Service层提供事务控ӞIbatis是用来代?a >JDBC Q所有页面的讉K都不是直接访问jspQ而是讉KStructs的ActionQ再由Action来ForwardC个JspQ所有针Ҏ据库的操作,比如取数据或修改数据Q都是在Action里面完成Q所有的Action一般都l承BaseDispatchActionQ这个是自己建立的类Q目的是为所有的Action做一些统一的控Ӟ在Struts层,对于一个功能,我们一般分Z个ActionQ一个Action里的功能是不需要调用Struts的验证功能的Q常见的Ҏ名称有add,edit,remove,view,listQ,另一个是需要调用Struts的验证功能的Q常见的Ҏ名称有insert,updateQ?br />
拿论坛发脓来说吧,论坛发脓首先需要蟩转到一个页面,你可以填写帖子的主题和内容,填写完后Q单?#8220;提交”Q脓子就发表了,所以这里经q两个步骤:
1、{C个新增的面Q在Action里我们一般称为addQ例如:
public ActionForward add(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//q一句是输出调试信息Q表CZ码执行到q一D了
log.debug(":: action - subject add");
//your code here
//q里保存Token?br />
saveToken(request);
//跌{到add面Q在Structs-config.xml 里面定义Q例如,跌{到subjectAdd.jsp
return mapping.findForward("add");
}
2、在填写标题和内容后Q选择 提交 Q会提交到insertҎQ在insertҎ里判断,是否重复提交了?br />
public ActionForward insert(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response){
if (isTokenValid(request, true)) {
// 表单不是重复提交
//q里是保存数据的代码
} else {
//表单重复提交
saveToken(request);
//其它的处理代?br />
}
}
下面更详l一点(注意Q下面所有的代码使用全角括号Q:
1、你惛_贴时Q点?#8220;我要发脓”链接的代码可以里q样的:
〈html:link action="subject.do?method=add"〉我要发贴?html:link?br />
subject.do ?method q些在struct-config.xml 如何定义我就不说了,点击链接后,会执行subject.do的addҎQ代码如上面说的Q蟩转到subjectAdd.jsp面。页面的代码大概如下Q?br />
〈html:form action="subjectForm.do?method=insert"?br />
〈html:text property="title" /?br />
〈html:textarea property="content" /?br />
〈html:submit property="发表" /?br />
〈html:reset property="重填" /?br />
〈html:form?br />
如果你在addҎ里加?#8220;saveToken(request);”q一句,那在subjectAdd.jsp生成的页面上Q会多一个隐藏字D,cM于这栗input type="hidden" name="org.apache.struts .taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"〉,
2、点d表后Q表单提交到subjectForm.do里的insertҎ后,你在insertҎ里要表单的数据插入到数据库中,如果没有q行重复提交的控Ӟ那么每点Mơ浏览器的刷新按钮,都会在数据库中插入一条相同的记录Q增加下面的代码Q你可以控制用L重复提交了?br />
if (isTokenValid(request, true)) {
// 表单不是重复提交
//q里是保存数据的代码
} else {
//表单重复提交
saveToken(request);
//其它的处理代?br />
}
注意Q你必须在addҎ里用了saveToken(request)Q你才能在insert里判断,否则Q你每次保存操作都是重复提交?br />
C一点,Struts在你每次讉KAction的时候,都会产生一个o牌,保存在你的Session里面Q如果你在Action里的函数里面Q用了saveToken(request);Q那么这个o牌也会保存在q个Action所Forward到的jsp所生成的静态页面里?br />
如果你在你Action的方法里使用了isTokenValidQ那么Struts会将你从你的request里面去获取这个o牌|然后和Session里的令牌值做比较Q如果两者相{,׃是重复提交,如果不相{,是重复提交了?br />
׃我们目的所有Action都是l承自BaseDispatchActionq个c,所以我们基本上都是在这个类里面做了表单重复提交的控Ӟ默认是控制addҎ和insertҎQ如果需要控制其它的ҎQ就自己手动写上面这些代码,否则是不需要手写的Q控制的代码如下Q?br />
public abstract class BaseDispatchAction extends BaseAction {
protected ActionForward perform(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
String parameter = mapping.getParameter();
String name = request.getParameter(parameter);
if (null == name) { //如果没有指定 method Q则默认?list
name = "list";
}
if ("add".equals(name)) {
if ("add".equals(name)) {
saveToken(request);
}
} else if ("insert".equals(name)) {
if (!isTokenValid(request, true)) {
resetToken(request);
saveError(request, new ActionMessage("error.repeatSubmit"));
log.error("重复提交Q?);
return mapping.findForward("error");
}
}
return dispatchMethod2(mapping, form, request, response, name);
}
}
www.javaeye.com 里关于struts----token的讨?
http://www.javaeye.com/topic/141071
http://www.tkk7.com/os586/archive/2007/02/11/99305.html
]]>Struts-Bean 标签?[转蝲] http://www.tkk7.com/wyz191/articles/struts_bean.htmljava_蝈蝈 java_蝈蝈 Wed, 10 Jan 2007 03:52:00 GMT http://www.tkk7.com/wyz191/articles/struts_bean.html http://www.tkk7.com/wyz191/comments/92863.html http://www.tkk7.com/wyz191/articles/struts_bean.html#Feedback 0 http://www.tkk7.com/wyz191/comments/commentRss/92863.html http://www.tkk7.com/wyz191/services/trackbacks/92863.html
Struts-Bean 标签?/font>
此标{ֺ和Java Bean有很强的兌性,设计的本意是要在JSP 和JavaBean 之间提供一个接口。Struts 提供了一套小巧有用的标签库来操纵JavaBean和相关的对象Qcookie、 header、 parameter、 define、write、message、 include、page、resource、size、struts?
bean:cookie、bean:header、bean:parameter
q三个标{来重新得到cookie, request header和request parameter?br />bean:header和bean:parameter标签定义了一个字W串Qbean:cookie标签定义了一个Cookie对象。你可以使用value属性做为默认倹{如果找不到指定的|且默认值没有设定的话,会抛Z个request time异常。如果你期望q回多个值的话,可把multiple属性设为true?br />
<bean:cookie id="sessionID" name="JSESSIONID" value="JSESSIONID-ISUNDEFINED"/> // q段代码定义了一个名为sessionID的脚本变量,如果找不C个名为JSESSIONID的cookieQ那sessionID // 的值就被设|ؓJSESSIONID-ISUNDEFINED?/font>
下面代码会输Z些Cookie对象的一些属性:
<jsp:getProperty name="sessionID " property="comment"/> ?br /> <jsp:getProperty name="sessionID" property="domain"/> ?br /> <jsp:getProperty name="sessionID" property="maxAge"/> ?br /> <jsp:getProperty name="sessionID" property="path"/> ?br /> <jsp:getProperty name="sessionID" property="value"/> ?br /> <jsp:getProperty name="sessionID" property="version"/> ?/font>
下面是在request中输出所有header的例子:
<% java.util.Enumeration names =((HttpServletRequest) request).getHeaderNames(); %> ?br /><% while (names.hasMoreElements()) { String name = (String) names.nextElement(); %> <bean:header id="head" name="<%= name %>"/> ?<%= name %> ?<%= head %> ?br /><% } %>
下面是parameter的例子:
<bean:parameter id="param1" name="param1"/> <bean:parameter id="param2" name="param2" multiple="true"/> // 此处定义了一个param2[]?br /> <bean:parameter id="param3" name="param3" value="UNKNOWN VALUE"/>
于其它标{合用:
<bean:header id="browser" name="User-Agent"/> <P>You are viewing this page with: <bean:write name="browser"/></P> ---------------------------------------------------------------------------------------------------------------------------------- <bean:cookie id="username" name="UserName" scope="session" value="New User" /> <P>Welcome <bean:write name="username" property="value"/!</P> // Ҏcookie创徏一个新的BeanQ如果用户名U已l存储在cookie中,它就不显CZؓ一个新用户。?/font>
bean:defineQ有三个用途?br />一是定义新字符串常量:
<bean:define id="foo" value="This is a new String"/> <bean:define id="bar" value='<%= "Hello, " + user.getName() %>'/> <bean:define id="last" scope="session" value='<%= request.getRequestURI() %>'/>
二是复制一个现有的beanl新的beanQ?br />
<bean:define id="foo" name="bar"/> <bean:define id="baz" name="bop" type="com.mycompany.MyClass"/> //定义脚本变量的类型,默认为Object
三是复制一个现有的bean的属性给新的beanQ?br />
<bean:define id="bop" name="user" property="role[3].name"/> <bean:define id="foo" name="bar" property="baz" scope="request" toScope="session"/> //toScope属性指新bean的scopeQ默认ؓpage
上段代码的意思是把名为bar的bean的baz属性赋值给fooQfoo的类型ؓString(默认)?br />
bean:include q个标签和bean:include标签和相|不同点就是它定义了一个可以复用的脚本变量。用id属性命名一个新的脚本变量,q支持forward、href、page和transaction.属性,和html:link中的属性意义一栗?br />
<bean:include id="footerSpacer" page="/long/path/footerSpacer.jsp"/> 然后你能够在多个地方(scope为page)调用Q?br /> <bean:write name="footerSpacer" />
bean:message 用来实现对国际化的支持的一个标{,配合java.util数据包中定义的Locale和ResourceBundlecL完成q个dQ用java.text.MessageFormatc配|消息的格式?br /> 首先要指定资源文件的名称。这个文件会包含用默认语a~写的在E序中会出现的所有消息,q些消息以“关键字-值”的形式存储。文仉要存储在c\径下Q\径要作ؓ初始化参C送给ActionServlet?br /> 实现国际化的规定Q所有的资源文g必须都存储在基本资源文g所在的目录中。基本资源文件包含的是用默认地区语言-本地语言~写的消息。如果基本资源文件的名称是ApplicationResources.propertiesQ那么用其他特定语言~写的资源文件的名称应该是ApplicationResources_xx.properties(xx为ISO~码Q如p是en)。因此这些文件应包含相同的关键字Q但关键字的值是用特定语a~写的?br /> 然后QActionServlet的区域初始化参数必须与一个trueg起传送,q样ActionServlet׃在用户会话中的Action.LOCALE_KEY关键字下存储一个特定用戯机的区域对象。现在可以运行一个国际化的web站点Q它可以Ҏ用户计算Z的设|的区域自动以相应的语言昄?br /> 使用特定的字W串来替换部分消息:
在资源文件中的定义:info.myKey = The numbers entered are {0},{1},{2},{3} 标记的用:<bean:message key="info.myKey" arg0="5" arg1="6" arg2="7" arg3="8"/> Jsp面的显C:The numbers entered are 5,6,7,8 // 最多支?个参?/font>
bean:pageQ把Jsp中的内部对象做ؓ脚本变量?br />
<bean:page id="requestObj" property="request"/>
bean:resourceQ获得应用程序的资源Q这个资源可以是一个String或从java.io.InputStream中读入。用ServletContext.getResource()ServletContext.getResourceAsStream() Ҏ索web应用中的资源Q如果在索资源时发生问题Q就会生一个ruquest time异常。?
<bean:resource id="webxml" name= "/WEB-INF/web.xml"/>
使用input属性时Q资源会做ؓ一个InputStreamQ如果不指定p当成一个String?br />
bean:sizeQ得到存储在array、collection或map中的数目Q类型ؓjava.lang.Integer?br />
<bean:size id="count" name="employees" />
bean:strutsQ复制Struct 对象(三种cd)l新的beanQscope为page?br />
<bean:struts id="form" formBean="CustomerForm"/> <bean:struts id="fwd" forward="success"/> <bean:struts id="map" mapping="/saveCustomer"/>
bean:writeQ以字符串Ş式输出bean的属性倹{?br />filter属性:设ؓtrueӞHTML保留字{换ؓ实体("<" 转换?<); ignore属性:如果对象不存在,不会抛出异常?br />
<bean:write name="userRegistration" property="email" scope="request"/>
]]> 用Validator查你的表? http://www.tkk7.com/wyz191/articles/struts_validator.htmljava_蝈蝈 java_蝈蝈 Tue, 09 Jan 2007 17:07:00 GMT http://www.tkk7.com/wyz191/articles/struts_validator.html http://www.tkk7.com/wyz191/comments/92795.html http://www.tkk7.com/wyz191/articles/struts_validator.html#Feedback 0 http://www.tkk7.com/wyz191/comments/commentRss/92795.html http://www.tkk7.com/wyz191/services/trackbacks/92795.html 阅读全文 ]]> JSTL与Struts的结合(十)[转蝲] http://www.tkk7.com/wyz191/articles/92387.htmljava_蝈蝈 java_蝈蝈 Mon, 08 Jan 2007 07:26:00 GMT http://www.tkk7.com/wyz191/articles/92387.html http://www.tkk7.com/wyz191/comments/92387.html http://www.tkk7.com/wyz191/articles/92387.html#Feedback 0 http://www.tkk7.com/wyz191/comments/commentRss/92387.html http://www.tkk7.com/wyz191/services/trackbacks/92387.html 阅读全文 ]]> W??Struts与表现层技术的l合[转蝲] http://www.tkk7.com/wyz191/articles/92385.htmljava_蝈蝈 java_蝈蝈 Mon, 08 Jan 2007 07:25:00 GMT http://www.tkk7.com/wyz191/articles/92385.html http://www.tkk7.com/wyz191/comments/92385.html http://www.tkk7.com/wyz191/articles/92385.html#Feedback 0 http://www.tkk7.com/wyz191/comments/commentRss/92385.html http://www.tkk7.com/wyz191/services/trackbacks/92385.html 阅读全文 ]]> Struts-Logic 标签库[转蝲] http://www.tkk7.com/wyz191/articles/struts-logic.htmljava_蝈蝈 java_蝈蝈 Sun, 07 Jan 2007 08:04:00 GMT http://www.tkk7.com/wyz191/articles/struts-logic.html http://www.tkk7.com/wyz191/comments/92227.html http://www.tkk7.com/wyz191/articles/struts-logic.html#Feedback 0 http://www.tkk7.com/wyz191/comments/commentRss/92227.html http://www.tkk7.com/wyz191/services/trackbacks/92227.html
Struts-Logic 标签?/font>
此标{ֺ可以分ؓ三种cdQ条件、@环、{?重定向?br /> 一.) 条gcd
logic:empty和logic:notEmpty logic:empty标签判断脚本变量是否为nullQ是否是一个空的字W串(长度?)Q是否是一个空的collection或map(调用isEmpty()Ҏ来判?。logic:notEmpty标签cM?br />
<logic:empty name="myBean"> The bean is missing </logic:empty> <logic:notEmpty name="myBean"> The bean is not missing </logic:notEmpty>
上段代码表示当一个名为myBean的bean在所有的scope中都不存在时Q输出The bean is missingQ存在的话输出The bean is not missing?br />此标{有三个属性:name、property和scope?br />
logic:equal, logic:notEqual, logic:lessThan, logic:greaterThan,logic:lessEqual, and logic:greaterEqual q堆logic:*equal*标签从名字上p知道意思,它们使用h有些W拙?br />有如下属性:name、property、scope、value、cookie、header、parameter?br />
<logic:equal name="bean" property="doubleProperty" value="<%= doub1 %>"> equal </logic:equal> <logic:greaterEqual name="bean" property="doubleProperty" value="<%= doub1 %>"> greaterEqual </logic:greaterEqual>
logic:present和logic:notPresent 查header、request parameter、cookie、JavaBean或JavaBean propertie是否存在且不{于null。另外还可以查当前用Lw䆾Q用属性user和role?br />其它的属性有Qname、property、scope、cookie、header、parameter?br />
<logic:notPresent name="myBean" property="prop" scope="page"> The bean property bean.prop is present </logic:notPresent>
上段代码查在page作用域内名ؓmyBean的bean是否有一个prop属性?br />
logic:match和logic:notMatch 比较两字W串是否相等Q可以比较字W串的开始的、结或其中的某个部分?br />location属性:指定从某个位|开始进行比较?br />其它的属性有Qname、property、scope、value、cookie、header、parameter?br />下面的例子是查浏览器cdQ?br />
<logic:match header="User-Agent" value="Mozilla"> Mozilla! </logic:match> <logic:notMatch header="User-Agent" value="Mozilla"> Not Mozilla :( </logic:notMatch>
查bean属性是否匹?hello world"字符Ԍ
<logic:match name="bean" property="stringProperty" value="hello world"> Hello World! </logic:match> <logic:notMatch name="bean" property="stringProperty" value="hello world"> I'm so sad and lonely. </logic:notMatch>
查名?name"的请求参数是否是"xyz"的子字符Ԍ但是子字W串必须?xyz"的烦引位|?开?也就是说子字W串必须?y"?yz")Q?br />
<logic:match parameter="name" value="xyz" location="1"> The parameter name is a sub-string of the string xyz from index 1 </logic:match>
?) 循环cd
logic:iterate 重复嵌套在此标签体内的指定集合的元素Q集合必Mؓ如下cdQarray 、Collection(包括ArrayList和VectorQ、Enumeration、Iterator、Map(包括HashMap、Hashtable和TreeMap)。例如:
<logic:iterate id="employee" name="department" property="employees" scope= "request"> ?br /> <bean:write name="employee" property="username" /> ?br /> <bean:write name="employee" property="name" /> ?br /> <bean:write name="employee" property="phone" /> ?br /> </logic:iterate>
上面的代码P代了一个employee的集合,是department属性employees的一个集合,作用域ؓrequest?br /> Z输出W五个到W十个employeeQ需要用length和offset属性:
<logic:iterate id="employee" name="department" property="employees" scope= "request" length ="10" offset ="5"> ?br /> <bean:write name="employee" property="username" /> ?br /> <bean:write name="employee" property="name" /> ?br /> <bean:write name="employee" property="phone" /> ?br /> </logic:iterate>
你可以定义一个变量保存当前的索引|
<ol> <logic:iterate id="element" name="bean" property="stringArray" indexId ="index"> <li> <em> <bean:write name="element"/> </em> [<bean:write name="index"/>]</li> </logic:iterate> </ol>
?) 转发/重定向类?/font>
logic:forward和logic:redirect logic:forward标签和jsp:forward标签和相|但它可以使用global forward中的一个ActionForwardQ?/font>
<logic:forward name="login" /> ---------------------------------------------------------------------------------------------------------------------------------- 与上面相关的global forward中的代码Q?br /> <global-forwards> <forward name="login" path="/loginForm.jsp"/> </global-forwards>
logic:redirect标签和上面的标签cMQ但它默认调用的Ҏ是response.sendRedirect()Q取代了上面的requestDispatcher.forward()。最大的不同是它支持所有html:link标签的属性,所以你能够?/font>
定request参数Q?/font>
<logic:redirect name="login" paramId="employeeId" paramName="employee"
]]> l合struts和hibernate谈J2EE架构的数据表C[转蝲] http://www.tkk7.com/wyz191/articles/92154.htmljava_蝈蝈 java_蝈蝈 Sat, 06 Jan 2007 02:06:00 GMT http://www.tkk7.com/wyz191/articles/92154.html http://www.tkk7.com/wyz191/comments/92154.html http://www.tkk7.com/wyz191/articles/92154.html#Feedback 0 http://www.tkk7.com/wyz191/comments/commentRss/92154.html http://www.tkk7.com/wyz191/services/trackbacks/92154.html ?struts+ hibernate q种l构中,是不应该把Hibernate产生的PO直接传递给JSP的,不管他是IteratorQ还是ListQ这是一个设计错误? 我来谈谈在J2EE架构中各层的数据表示ҎQ? Web层的数据表示是FormBeanQ数据来源于HTML Form POST 业务层的数据表示是VO 持久层的数据表示是POQ其数据来源于数据库Q持久层的数据表CZ如CMP 在一个规范的J2EE架构中,不同层的数据表示应该被限制在层内Q而不应该扩散到其它层Q这样可以降低层间的耦合性,提高J2EE架构整体的可l护性和可扩展性。比如说Web层的逻辑q行了修改,那么只需要修改FormBean的结构,而不需要触动业务层和持久层的代码修攏V同hQ当数据库表q行了小的调_那么也只需要修Ҏ久层数据表示Q而不需要触动业务层代码和Web层代码? 不过׃Hibernate的强大功能,例如动态生成POQPO的状态管理可以脱SessionQ得在应用了Hibernate的J2EE框架中,PO完全可以充当VOQ因此我们下面把PO和VO合ƈQ统UCؓPO? 先来谈谈ActionFormBean和持久层的PO之间的重大区别? 在简单的应用中,ActionFormBean和PO几乎是没有区别,所以很多hq脆是用ActionFormBean来充当POQ于是ActionFormBean从JSP面到Servlet控制层再C务层Q然后穿q持久层Q最后一直映到数据库表。真是一竿子捅到了底Q? 但是在复杂的应用中,ActionFormBean和PO是分ȝQ他们也不可能一栗ActionFormBean是和|页里面的Form表单一一对应的,Form里面有什么元素,Bean里面有什么属性。而PO和数据库表对应,因此如果数据库表不修改,那么PO也不会修改,如果面的流E和数据库表字段对应关系不一_那么你又如何能够使用ActionFormBean来取代PO呢? 比如说吧Q用h册页面要求注册用L基本信息Q因此HTML Form里面包含了基本信息属性,于是你需要一个ActionFormBean来一一对应(注意Q是一一对应)Q每个Bean属性对应一个文本框或者选择框什么的? 而用戯个持久对象呢Q他的属性和ActionFormBean有什么明显不同呢Q他会有一些ActionFormBean所没有的集合属性,比如说用L权限属性,用户的组属性,用户的帖子等{。另外还有可能的是在ActionFormBean里面?个属性,分别是用LFirst Name, Middle Name, Last NameQ而在我的Userq个持久对象中就是一?Name 对象属性? 假设我的注册面原来只要你提供First NameQ那么ActionFormBeanp一个属性,后来我要你提供全名,你要改ActionFormBeanQ加两个属性。但是这个时候PO是不应该修改_因ؓ数据库没有改? 那么在一个完整的J2EEpȝ中应该如何进行合理的设计呢? JSP(View) - ActionFormBean(Module) - Action(Control) ActionFormBean是Web层的数据表示Q它和HTML面Form对应Q只要Web面的操作流E发生改变,它就要相应的q行修改Q它不应该也不能被传递到业务层和持久层,否则一旦页面修改,会一直牵q到业务层和持久层的大面U的代码q行修改Q对于Y件的可维护性和可扩展性而言Q是一个灾难,Actiont是他的边界Q到此ؓ止! Action(Web Control) - Business Bean - DAO - ORM -DB 而PO则是业务层和持久层的数据表示Q它在业务层和持久层之间q行动Q他不应该也不能被传递到Web层的View中去Q而ActionServlet是他的边界Q到此ؓ止! 然后来看一看整个架构的程Q? 当用户通过览器访问网,提交了一个页面。于是Action拿到了这个FormBeanQ他会把FormBean属性读出来Q然后构造一个PO对象Q再调用业务层的Beanc,完成了注册操作,重定向到成功面。而业务层Bean收到q个PO对象之后Q调用DAO接口ҎQ进行持久对象的持久化操作? 当用h询某个会员的信息的时候,他用全名q行查询Q于是Action得到一个UserNameFormBean包括?个属性,分别是first name, middle name, last nameQ然后Action把UserNameFormBean?个属性读出来Q构造Name对象Q再调用业务BeanQ把Name对象传递给业务BeanQ进行查询? 业务Bean取得Name(注意: Name对象只是User的一个属?对象之后调用DAO接口Q返回一个User的PO对象Q注意这个User不同于在Web层用的UserFormBeanQ他有很多集合属性滴。然后业务Bean把User对象q回lAction? Action拿到User之后Q把User的基本属性取?集合属性如果不需要就免了)Q构造UserFormBeanQ然后把UserFormBean request.setAttribute(...)Q然后重定向到查询结果页面? 查询面拿到request对象里面的ActionFormBeanQ自动调用tag昄之? ȝQ? FormBean是Web层的数据表示Q他不能被传递到业务层;PO是持久层的数据表C,在特定情况下Q例如Hibernate中,他可以取代VO出现在业务层Q但是不POq是VO都必限制在业务层内使用Q最多到达Web层的ControlQ绝不能被扩散到View厅R? FormBean和PO之间的数据{化是在Action中进行滴? BTW: JDO1.xq不能像Hibernate功能q样强大QPO不能q持久层,所以必d业务层用VOQ因此必d业务层进行大量的VO和PO的{化操作,相对于Hibernate来说Q编E比较烦琐? 当然咯,理论是一回事Q实际操作也不一定非要这样干Q你可以自行取舍Q在实际目中灵zM点,增加一点bad smellQ提高开发效率。只不过在大型项目中最好还是严丝合~,不然的话Q改版的时候会痛苦的很滴?br />
]]> struts-Html 标签库[转蝲] http://www.tkk7.com/wyz191/articles/html_form.htmljava_蝈蝈 java_蝈蝈 Tue, 26 Dec 2006 05:01:00 GMT http://www.tkk7.com/wyz191/articles/html_form.html http://www.tkk7.com/wyz191/comments/90077.html http://www.tkk7.com/wyz191/articles/html_form.html#Feedback 0 http://www.tkk7.com/wyz191/comments/commentRss/90077.html http://www.tkk7.com/wyz191/services/trackbacks/90077.html
官方文档
Q?/font>
http://struts.apache.org/1.2.9/userGuide/struts-html.html
与form相关的标{括 标{本w以及所有必d含在其中的标{。比如,和标{ְ是和form相关的标{,因ؓ如果不把它们攑ֈ一个form中它们就没有意义?br /><form>标签 标签用于生成一个HTML form。用该标签时必遵循许多规则?br /> 首先Q标{中必须包含一个action属性,它是q个标签中唯一必需的属性。如果不具备该属性则JSP面会抛Z个异常。之后你必须l这个action属性指定一个有效倹{一个有效值是指应用程序的Struts配置文g中元素里的Q何一个子元素的访问\径。而且相应的元素中必须有一个name属性,它的值是form bean的名U?br /> 例如Q如果你有这样一个标{: <html:form action=\"/login\" > 那么你的Struts配置文g的元素中必须有一个如下显CZؓ_体的元素: <action-mappings> <action path=\"/login\" type=\"com.javapro.struts.LoginAction\" name=\"loginForm\" scope=\"request\" input=\"/login.jsp\"> <forward name=\"success\" path=\"/mainMenu.jsp\"/> </action> . . . </action-mappings> q就是说一个form标签是和form bean相关联的?br /> 另一个要遵@的规则是QQ何包含在<form>中用来接收用戯入的标签Q?lt;text>?lt;password>?lt;hidden>?lt;textarea>?lt;radio>?lt;checkbox>?lt;select>Q必d相关的form bean中有一个指定的属性倹{比如,如果你有一个属性D指定为“username”的<text>标签Q那么相关的form bean中也必须有一个名为“username”的属性。输?lt;text>标签中的g被用于生成form bean的userName属性?br /> 除了上面所讲的属性之外,<form>标签q有一些不是必M加上更好的“次要”的属性。比如,你可以用focus属性来生成JavaScriptQ它会“定焦”(focusQ到该form所包含的一个元素上。用focus属性时你需要给它指定元素的名称。比如,以下代码是定焦在W二个Text元素上的Q?lt;body> <html:form action=\"/login\" focus=\"password\"> User Name: <html:text property=\"userName\"/> <br>Password: <html:text property=\"password\"/> <br><html:submit/> </html:form> </body> 该段代码会被转换成: <body> <form name=\"loginForm\" method=\"post\" action=\"/myStrutsApp6/login.do\"> User Name: <input type=\"text\" name=\"userName\" value=\"\"> <br>Password: <input type=\"text\" name=\"password\" value=\"\"> <br><input type=\"submit\" value=\"Submit\"> </form> <script language=\"JavaScript\" type=\"text/javascript\"> <!-- if (document.forms[\"loginForm\"].elements[ \"password\"].type != \"hidden\") document.forms[\"loginForm\"].elements[ \"password\"].focus() // --> </script> </body> 注意Q?lt;form>标签中method属性的~省值是POST。另外,有没有看到这个标{ֺ是如何徏立JavaScript来定焦到password元素上的? q也是该库让人着qL地方之一。你不用担心如何在客Lq行~程Q它会帮你自动生成?br /> 在运行前面的例子时还要注意,你必L一个包含userName和password属性的相关form。?br /><text>标签 <text>标签用于生成一个文本的输入区域。它必须包含和相关form bean中的相同属性对应的“property”属性。该标签只有在嵌入到一?lt;form>标签中时才有效?br /> 例如Q?lt;html:text property=\"userName\"/> 会被转换成: <input type=\"text\" name=\"userName\" value=\"\"><password>标签 <password>标签用于生成一个口令字Qtype passwordQ的输入区域。它必须包含和相关form bean中的相同属性对应的“property”属性。该标签只有在嵌入到一?lt;form>标签中时才有效。该标签中的一个很重要的属性是“redisplay”,它用于重新显CZ前输入到q个区域中的倹{该属性的~省gؓtrue。然而,Z使password不能被重新显C,你或许希望将该属性的D为false?br /> 例如Q?lt;html:password property=\"password\" redisplay=\"false\"/> 会被转换? <input type=\"password\" name=\"password\" value=\"\"><hidden>标签 <hidden>标签用于生成一个隐藏文本的输入区域。它必须包含和相关form bean中的相同属性对应的“property”属性。该标签只有在嵌入到一?lt;form>标签中时才有效: 例如Q?lt;html:hidden property=\"userName\"/> 会被转换? <input type=\"hidden\" name=\"userName\" value=\"\"><textarea>标签 <textarea>标签用于生成一个文本区元素Qtext area elementQ。它必须包含和相关form bean中的相同属性对应的“property”属性?br /> 比如Q?lt;html:textarea property=\"details\" cols=\"80\" rows=\"20\" value=\"Enter details here\"/> 会被转换成: <textarea name=\"details\" cols=\"80\" rows=\"20\">Enter details here</textarea><radio>标签 <html:radio>标记用来昄HTML单选钮控gQ属性如下:
属?/font>
描述
Name
Bean的名Uͼ其属性会被用来确定单选钮是否以选中的状态显C。如果没有设|,用与q个内嵌表单相关的ActionFrom bean的名U?/font>
property
当表单被提交旉回到服务器的请求参数的名称Q以及用来确定单选钮是否以被选中状态进行显C的bean属性的名称
Value
当单选钮被选中时返回到服务器的?/font>
<radio>标签用于昄一个单选按钮(radio buttonQ。它必须包含“value”属性。比如这D代码: <html:radio property=\"title\" value=\"1\"/>Mr. <html:radio property=\"title\" value=\"2\"/>Ms. <html:radio property=\"title\" value=\"3\"/>Dr. 会被转换成这LHTMLQ?lt;input type=\"radio\" name=\"title\" value=\"1\">Mr. <input type=\"radio\" name=\"title\" value=\"2\">Ms. <input type=\"radio\" name=\"title\" value=\"3\">Dr. <checkbox>标签 <checkbox>标签用于昄checkboxcd的输入区域。比如: <html:checkbox property= \"notify\"/>Please send me notification 会被转换成: <input type=\"checkbox\" name=\"notify\" value=\"on\">Please send me notification<submit>标签 <submit>标签用于生成提交cdQtype submitQ的输入区域。比如: <html:submit value=\"Login\"/> 会被转换成: <input type=\"submit\" value=\"Login\"><reset>标签 <reset>标签用于生成重置cdQtype resetQ的输入区域。比如: <html:reset/> 会被转换成: <input type=\"reset\" value=\"Reset\"><option>标签 <option>标签用于昄select box中的一个选项。参照下面的<select>标签?br /><select>标签 <select>标签用于昄一个包含零个或更多选项的HTML选择元素。它必须被嵌入一?lt;form>标签中才有效。下面这个例子将说明如何使用该标{: <html:select property=\"color\" size=\"3\"> <html:option value= \"r\">red</html:option> <html:option value= \"g\">green</html:option> <html:option value=
\"b\">blue</html:option> </html:select>会被转换成: <select name=\"color\" size=\"3\"><option value=\"r\">red</option> <option value=\"g\">green</option> <option value=\"b\">blue</option> </select><html:file>标签 <html:file>标签需要注意以下几点: aQ?lt;html:file>必须嵌套?lt;html:form>标签中. bQ?lt;html:form>标签的method属性必设为"postQ. cQ?lt;html:form>标签的编码类型enctype属性必设为"multipart/form-dataQ. dQ?lt;html:file>标签必须讄property属性,q个属性和ActionForm Bean中FormFilecL的属性对应. 在ActionForm Bean中设|FormFile属?br />/** *The file that the user has uploaded */ private FormFile file; public FormFile getFile(){ return this.file; } public void setFile(FormFile file){ this.file file; } 在ActioncM处理文g上传 String dir = servlet.getServletContext().getRealPath("/upload"); HtmlFileForm hff = (HtmlFileForm)form; FormFile file = hff.getFile(); if(file == null) return mapping.findForward("error"); String fname = file.getFileName(); String size = Integer.toString(file.getFileSize())+"bytes"; InputStream streamIn = file.getInputStream(); OutputStream streamOut = new FileOutputStream(dir+"/"+fname); int bytesRead = 0; byte[] buffer = new byte[8192]; while((bytesRead = streamIn.read(buffer,0,8192)) != -1){ streamOut.write(buffer,0,bytesRead); } streamOut.clase(); streamIn.close(); ]]>
վ֩ģ壺
Ƭ߹ۿѹۿȫ
|
ŮѹۿˬˬˬƵ |
77777ҹþö |
ˬˬƬav |
ҹվѰ߹ۿ |
Ļһ |
ŷߵӰ |
ŷ |
ˬֻڵƵ
|
պ ɫ ͼվ |
www.999ƷƵۿ |
ŷ |
˾Ʒþþþþۺ
|
Ʒһ߾þ |
߿Ƭ˳Ƶ |
91ƷƵ |
Ƶۿ
|
Ʒþþþþ
|
ձ |
AV |
һɫƵ |
һ |
õӰ߹ۿ |
ѹۿɫƬ |
ƷŮþþ |
þþþAVۿ |
ݲɫAѹۿ |
ŮվƵ |
ŷղվ |
պһ߲ |
ŮڰǿͼƬ |
avһվ
|
Ƭѹۿ |
һaƬþëƬ
|
һ |
Ůڵվ |
þþƷѹƬС |
˳˳ۺ |
鶹VAѾƷ |
ƷСƵapp |
Ƶַ |