??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲成a人片在线观看无码,亚洲一区AV无码少妇电影☆,亚洲国产成人久久笫一页http://www.tkk7.com/wyz191/category/18594.html走向一条通往JAVA的不归\...zh-cnThu, 22 Nov 2007 02:37:56 GMTThu, 22 Nov 2007 02:37:56 GMT60jstl与strutsl合http://www.tkk7.com/wyz191/articles/101340.htmljava_蝈蝈java_蝈蝈Fri, 02 Mar 2007 00:50:00 GMThttp://www.tkk7.com/wyz191/articles/101340.htmlhttp://www.tkk7.com/wyz191/comments/101340.htmlhttp://www.tkk7.com/wyz191/articles/101340.html#Feedback0http://www.tkk7.com/wyz191/comments/commentRss/101340.htmlhttp://www.tkk7.com/wyz191/services/trackbacks/101340.html阅读全文

java_蝈蝈 2007-03-02 08:50 发表评论
]]>
用Struts的Token机制解决表单重复提交 http://www.tkk7.com/wyz191/articles/99354.htmljava_蝈蝈java_蝈蝈Sun, 11 Feb 2007 23:50:00 GMThttp://www.tkk7.com/wyz191/articles/99354.htmlhttp://www.tkk7.com/wyz191/comments/99354.htmlhttp://www.tkk7.com/wyz191/articles/99354.html#Feedback0http://www.tkk7.com/wyz191/comments/commentRss/99354.htmlhttp://www.tkk7.com/wyz191/services/trackbacks/99354.htmlStruts的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页面用jstlQStruts复杂View层,Spring在Service层提供事务控ӞIbatis是用来代?a >JDBCQ所有页面的讉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 



java_蝈蝈 2007-02-12 07:50 发表评论
]]>
Struts-Bean 标签?[转蝲]http://www.tkk7.com/wyz191/articles/struts_bean.htmljava_蝈蝈java_蝈蝈Wed, 10 Jan 2007 03:52:00 GMThttp://www.tkk7.com/wyz191/articles/struts_bean.htmlhttp://www.tkk7.com/wyz191/comments/92863.htmlhttp://www.tkk7.com/wyz191/articles/struts_bean.html#Feedback0http://www.tkk7.com/wyz191/comments/commentRss/92863.htmlhttp://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?
  1. 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>

  2. 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 />
  3. 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" />

  4. 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>


  5. bean:pageQ把Jsp中的内部对象做ؓ脚本变量?br />
    <bean:page id="requestObj" property="request"/> 

  6. 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 />
  7. bean:sizeQ得到存储在array、collection或map中的数目Q类型ؓjava.lang.Integer?br />
     <bean:size id="count" name="employees" />

  8. 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"/>

  9. bean:writeQ以字符串Ş式输出bean的属性倹{?br />filter属性:设ؓtrueӞHTML保留字{换ؓ实体("<" 转换?&lt);
    ignore属性:如果对象不存在,不会抛出异常?br />
     <bean:write name="userRegistration" property="email" scope="request"/>


java_蝈蝈 2007-01-10 11:52 发表评论
]]>
用Validator查你的表?http://www.tkk7.com/wyz191/articles/struts_validator.htmljava_蝈蝈java_蝈蝈Tue, 09 Jan 2007 17:07:00 GMThttp://www.tkk7.com/wyz191/articles/struts_validator.htmlhttp://www.tkk7.com/wyz191/comments/92795.htmlhttp://www.tkk7.com/wyz191/articles/struts_validator.html#Feedback0http://www.tkk7.com/wyz191/comments/commentRss/92795.htmlhttp://www.tkk7.com/wyz191/services/trackbacks/92795.html阅读全文

java_蝈蝈 2007-01-10 01:07 发表评论
]]>
JSTL与Struts的结合(十)[转蝲]http://www.tkk7.com/wyz191/articles/92387.htmljava_蝈蝈java_蝈蝈Mon, 08 Jan 2007 07:26:00 GMThttp://www.tkk7.com/wyz191/articles/92387.htmlhttp://www.tkk7.com/wyz191/comments/92387.htmlhttp://www.tkk7.com/wyz191/articles/92387.html#Feedback0http://www.tkk7.com/wyz191/comments/commentRss/92387.htmlhttp://www.tkk7.com/wyz191/services/trackbacks/92387.html阅读全文

java_蝈蝈 2007-01-08 15:26 发表评论
]]>
W??Struts与表现层技术的l合[转蝲]http://www.tkk7.com/wyz191/articles/92385.htmljava_蝈蝈java_蝈蝈Mon, 08 Jan 2007 07:25:00 GMThttp://www.tkk7.com/wyz191/articles/92385.htmlhttp://www.tkk7.com/wyz191/comments/92385.htmlhttp://www.tkk7.com/wyz191/articles/92385.html#Feedback0http://www.tkk7.com/wyz191/comments/commentRss/92385.htmlhttp://www.tkk7.com/wyz191/services/trackbacks/92385.html阅读全文

java_蝈蝈 2007-01-08 15:25 发表评论
]]>
Struts-Logic 标签库[转蝲]http://www.tkk7.com/wyz191/articles/struts-logic.htmljava_蝈蝈java_蝈蝈Sun, 07 Jan 2007 08:04:00 GMThttp://www.tkk7.com/wyz191/articles/struts-logic.htmlhttp://www.tkk7.com/wyz191/comments/92227.htmlhttp://www.tkk7.com/wyz191/articles/struts-logic.html#Feedback0http://www.tkk7.com/wyz191/comments/commentRss/92227.htmlhttp://www.tkk7.com/wyz191/services/trackbacks/92227.html Struts-Logic 标签?/font>
 

此标{ֺ可以分ؓ三种cdQ条件、@环、{?重定向?br />
一.) 条gcd

  1. 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 />
  2. 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> 

  3. 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 />
  4. 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>&nbsp;
 [<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"


java_蝈蝈 2007-01-07 16:04 发表评论
]]>
l合struts和hibernate谈J2EE架构的数据表C[转蝲] http://www.tkk7.com/wyz191/articles/92154.htmljava_蝈蝈java_蝈蝈Sat, 06 Jan 2007 02:06:00 GMThttp://www.tkk7.com/wyz191/articles/92154.htmlhttp://www.tkk7.com/wyz191/comments/92154.htmlhttp://www.tkk7.com/wyz191/articles/92154.html#Feedback0http://www.tkk7.com/wyz191/comments/commentRss/92154.htmlhttp://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 />



java_蝈蝈 2007-01-06 10:06 发表评论
]]>struts-Html 标签库[转蝲]http://www.tkk7.com/wyz191/articles/html_form.htmljava_蝈蝈java_蝈蝈Tue, 26 Dec 2006 05:01:00 GMThttp://www.tkk7.com/wyz191/articles/html_form.htmlhttp://www.tkk7.com/wyz191/comments/90077.htmlhttp://www.tkk7.com/wyz191/articles/html_form.html#Feedback0http://www.tkk7.com/wyz191/comments/commentRss/90077.htmlhttp://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();


摘自Qblog.csdn.net


java_蝈蝈 2006-12-26 13:01 发表评论
]]>
վ֩ģ壺 Ƭ߹ۿѹۿȫ | ŮѹۿˬˬˬƵ| 77777ҹþö| ˬˬƬav| ҹվѰ߹ۿ| Ļһ| ŷߵӰ| ŷ| ˬֻڵƵ | պ ɫ ͼվ| www.999ƷƵۿ| ŷ| ޹˾Ʒþþþþۺ | ޾Ʒһ߾þ| ߿Ƭ˳Ƶ| 91޾ƷƵ| Ƶۿ | ޾Ʒþþþþ | ձ| AV| һɫƵ| һ| õӰ߹ۿ| ѹۿɫƬ| ƷŮþþ| þþþAVۿ| ݲɫAѹۿ| ŮվƵ| ŷղվ| պһ߲| ŮڰǿͼƬ| avһվ | Ƭѹۿ| һaƬþëƬ | һ| Ůڵվ| þþƷѹƬС| ˳˳ۺ| 鶹VAѾƷ| ƷСƵapp| Ƶַ|