??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲超碰97人人做人人爱,精品日韩在线一区,国产精品一区不卡http://www.aygfsteel.com/jdo/category/24569.htmlzh-cnSat, 25 Aug 2007 19:44:13 GMTSat, 25 Aug 2007 19:44:13 GMT60tomcat下中文的d解决http://www.aygfsteel.com/jdo/articles/139346.html蓝色q默蓝色q默Sat, 25 Aug 2007 16:03:00 GMThttp://www.aygfsteel.com/jdo/articles/139346.htmlhttp://www.aygfsteel.com/jdo/comments/139346.htmlhttp://www.aygfsteel.com/jdo/articles/139346.html#Feedback0http://www.aygfsteel.com/jdo/comments/commentRss/139346.htmlhttp://www.aygfsteel.com/jdo/services/trackbacks/139346.html(一)    JSP面上是中文Q但是看的是后是qQ?br />解决的办法就是在JSP面的编码的地方<%@ page language="java" contentType="text/html;charset=GBK" %>Q因为Jsp转成Java文g时的~码问题Q默认的话有的服务器是ISO-8859-1Q如果一个JSP中直接输入了中文QJsp把它当作ISO8859-1来处理是肯定有问题的Q这一点,我们可以通过查看Jasper所生成的Java中间文g来确?br />(?    当用Request对象获取客户提交的汉字代码的时候,会出Cؕ码:
解决的办法是Q要配置一个filter,也就是一个Servelet的过滤器Q代码如下:
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.UnavailableException;

/**
 * Example filter that sets the character encoding to be used in parsing the
 * incoming request
 */
public class SetCharacterEncodingFilter implements Filter {

    /**
     * Take this filter out of service.
     */
    public void destroy() {
    }
    /**
     * Select and set (if specified) the character encoding to be used to
     * interpret request parameters for this request.
     */
    public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain)throws IOException, ServletException {

    request.setCharacterEncoding("GBK");

    // 传递控制到下一个过滤器
    chain.doFilter(request, response);
    }

    public void init(FilterConfig filterConfig) throws ServletException {
    }
}
配置web.xml
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>SetCharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
如果你的q是出现q种情况的话你就往下看看是不是你出CW四中情况,你的Form提交的数据是不是用get提交的,一般来说用post提交的话是没有问题的Q如果是的话Q你q看第四中解决的办法?br />q有是对含有汉字字W的信息q行处理Q处理的代码是:
package dbJavaBean;

public class CodingConvert
{   
 public CodingConvert()
 {
  //
 }
 public String toGb(String uniStr){
     String gbStr = "";
     if(uniStr == null){
   uniStr = "";
     }
     try{
   byte[] tempByte = uniStr.getBytes("ISO8859_1");
   gbStr = new String(tempByte,"GB2312");
     }
  catch(Exception ex){
    }
     return gbStr;
 }
   
 public String toUni(String gbStr){
     String uniStr = "";
     if(gbStr == null){
   gbStr = "";
     }
     try{
   byte[] tempByte = gbStr.getBytes("GB2312");
   uniStr = new String(tempByte,"ISO8859_1");
     }catch(Exception ex){
    }
    return uniStr;
 }
}
你也可以在直接的转换Q首先你获取的字符串用ISO-8859-1q行~码Q然后将q个~码存放C个字节数l中Q然后将q个数组转化成字W串对象可以了Q例如:
String str=request.getParameter(“girl?;
Byte B[]=str.getBytes(“ISO-8859-1?;
Str=new String(B);
通过上述转换的话Q提交的M信息都能正确的显C?br />(?    在Formgeth在服务端用request. getParameter(“name?时返回的是ؕ码;按tomcat的做法设|Filter也没有用或者用request.setCharacterEncoding("GBK");也不用问题是出在处理参C递的Ҏ上:如果在servlet中用doGet(HttpServletRequest request, HttpServletResponse response)Ҏq行处理的话前面即是写了:
request.setCharacterEncoding("GBK");
response.setContentType("text/html;charset=GBK");
也是不v作用的,q回的中文还是ؕ码!Q!如果把这个函数改成doPost(HttpServletRequest request, HttpServletResponse response)一切就OK了?br />同样Q在用两个JSP面处理表单输入之所以能昄中文是因为用的是postҎ传递的Q改成getҎ依旧不行?br />由此可见在servlet中用doGet()Ҏ或是在JSP中用getҎq行处理要注意。这毕竟涉及到要通过览器传递参C息,很有可能引v常用字符集的冲突或是不匹配?br />解决的办法是Q?br />1) 打开tomcat的server.xml文gQ找到区块,加入如下一行: 
URIEncoding=”GBK”?br />完整的应如下Q?br /><Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"/> 

2)重启tomcat,一切OK?br />需要加入的原因大家可以ȝI?TOMCAT_HOME/webapps/tomcat-docs/config/http.html下的q个文g可以知道原因了。需要注意的是:q个地方如果你要是用UTF-8的时候在传递的q程中在Tomcat中也是要出现q的情况,如果不行的话换别的字符集?br />
(?    JSP面上有中文Q按钮上面也有中文,但是通过服务器查看页面的时候出Cؕ码:
     解决的办法是Q首先在JSP文g中不应该直接包含本地化的消息文本Q而是应该通过<bean:message>标签从Resource Bundle中获得文本。应该把你的中文文本攑ֈApplication.properties文g中,q个文g攑֜WEB-INF/classes/*下,例如我在面里有姓名Q年龄两个label,我首先就是要Z个Application.propertiesQ里面的内容应该是name=”姓名” age=”年龄?然后我把q个文g攑ֈWEB-INF/classes/properties/下,接下来根据Application.properties文gQ对他进行编码{化,创徏一个中文资源文Ӟ假定名字是Application_cn.properties。在JDK中提供了native2ascii命oQ他能够实现字符~码的{换。在DOS环境中找C攄Application.properties的这个文件的目录Q在DOS环境中执行一下命令,生成按GBK~码的中文资源文件Application_cn.propertiesQnative2ascii ?encoding gbk Application.properties Application_cn.properties执行以上命o以后生成如下内容的Application_cn.properties文gQname=\u59d3\u540d age=\u5e74\u9f84,在Struts-config.xml中配|:<message-resources parameter="properties.Application_cn"/>。到q一步,基本上完成了一大半Q接着你就要在JSP面上写<%@ page language="java" contentType="text/html;charset=GBK" %>,到名字的那个label是要?lt;bean:message key=”name?gt;,q样的化在页面上出现的时候就会出C文的姓名Q年龄这个也是一P按钮上汉字的处理也是同样的?br />(?    写入到数据库是ؕ码:
解决的方法:要配|一个filter,也就是一个Servelet的过滤器Q代码如同第二种时候一栗?br />如果你是通过JDBC直接链接数据库的时候,配置的代码如下:jdbc:mysql://localhost:3306/workshopdb?useUnicode=true&characterEncoding=GBKQ这样保证到数据库中的代码是不是q?br />如果你是通过数据源链接的化你不能按照q样的写法了Q首先你p写在配置文g中,在tomcat 5.0.19中配|数据源的地Ҏ在C:\Tomcat 5.0\conf\Catalina\localhostq个下面Q我建立的工E是workshopQ放|的目录是webapp下面,workshop.xml的配|文件如下:
<!-- insert this Context element into server.xml -->

<Context path="/workshop" docBase="workshop" debug="0"
reloadable="true" >

  <Resource name="jdbc/WorkshopDB"
               auth="Container"
               type="javax.sql.DataSource" />

  <ResourceParams name="jdbc/WorkshopDB">
    <parameter>
      <name>factory</name>
      <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
    </parameter>
    <parameter>
      <name>maxActive</name>
      <value>100</value>
    </parameter>
    <parameter>
      <name>maxIdle</name>
      <value>30</value>
    </parameter>

    
    <parameter>
      <name>maxWait</name>
      <value>10000</value>
    </parameter>

      <parameter>
     <name>username</name>
     <value>root</value>
    </parameter>
    <parameter>
     <name>password</name>
     <value></value>
    </parameter>

    <!-- Class name for mm.mysql JDBC driver -->
    <parameter>
       <name>driverClassName</name>
       <value>com.mysql.jdbc.Driver</value>
</parameter>
   <parameter>
      <name>url</name>
 <value><![CDATA[jdbc:mysql://localhost:3306/workshopdb?useUnicode=true&characterEncoding=GBK]]></value>
    </parameter>
  </ResourceParams>

</Context>
_体的地方要特别的注意,和JDBC直接链接的时候是有区别的Q如果你是配|正的化,当你输入中文的时候到数据库中是中文了,有一点要注意的是你在昄数据的页面也是要?lt;%@ page language="java" contentType="text/html;charset=GBK" %>q行代码的。需要注意的是有的前台的人员在写代码的是后用Dreamver写的Q写了一个Form的时候把他改成了一个jspQ这h一个地方要注意了,那就是在Dreamver中Action的提交方式是request的,你需要把他该q来Q因为在jsp的提交的q程中紧紧就是POST和GET两种方式Q但是这两种方式提交的代码在~码斚wq是有很大不同的Q这个在后面的地方进行说明?

以上是我在开发系l中解决中文的问题,不知道能不能解决大家的问题,旉匆忙Q没有及时完善,文笔也不是很好,有些地方估计是词不达意。大家可以给我意见,希望能共同进步?br />

蓝色q默 2007-08-26 00:03 发表评论
]]>
AJAXAnywhere ȝhttp://www.aygfsteel.com/jdo/articles/136520.html蓝色q默蓝色q默Mon, 13 Aug 2007 14:49:00 GMThttp://www.aygfsteel.com/jdo/articles/136520.htmlhttp://www.aygfsteel.com/jdo/comments/136520.htmlhttp://www.aygfsteel.com/jdo/articles/136520.html#Feedback0http://www.aygfsteel.com/jdo/comments/commentRss/136520.htmlhttp://www.aygfsteel.com/jdo/services/trackbacks/136520.htmlAjaxAnywhere被设计成能够把Q何一套现存的JSPlg转换成AJAX感知lg而不需要复杂的JavaScript~码.它利用标{把Web面单地划分成几个区?然后使用AjaxAnywhere来刷新那些需要被更新地区?br />2,ajaxanywhere学习有两天了。ajaxanywhere与jsp,servlet,struts都能配合使用得很好。但是也有一些问题?p>q几天找了一些ajax的开源,感觉ajaxtags功能有限且实现复杂,很难和其他框枉成。strutstags
? 很对路但是提供的例子里竟然没有strutsconfig.xmlq行不v来,没办法,我只好{向ajaxanywhere,用了一天的旉才把 ajaxanywhere与servlet,struts框架分别l成hQ处理主要集中在aa.jsQ不是不用写jsQ而是只要写少量的js可以实? 复杂的调用。感觉很单?/p>

但是它也有不之处,Demo中deServerSide.jsp例子?4下后竟然L了,sourceforge论坛?br />294条记录竟然没有一个h发现Q我和其他几个同事用他们提供的|上Demo也是一P提了q个
问题一时半会也没有{。看来,q也是js牛h才能真正玩的通的Qؓ什么这么说呢?因ؓ一旦出
了问题就要研Iaa.js了。说是不用自己写jsQ但实际上还是要把aa.js研究透了才敢用到目中?br />

下面把我q两天的所学做一下ȝQ?br />2.1 从配|上来讲Q?br /> ajaxanywhere没有tld文gQ但是他需要在web.xml中配|一个filterQ这p够了?br />   <filter>
        <filter-name>AjaxAnywhere</filter-name>
        <filter-class>org.ajaxanywhere.AAFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>AjaxAnywhere</filter-name>
        <url-pattern>*.jsf</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>AjaxAnywhere</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
     <filter-mapping>
        <filter-name>AjaxAnywhere</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-mapping>
  值得注意的是Q只有通过此filter的request url才能够用它的功能,所以要保需要此功能的url能够通过此filterQ我刚开始的时候写了一个servlet与ajaxanywhere? jsp面联合使用Q但L抱错Q“说q回的类型ƈ不是text/xml”类型,后来
我想肯定是要求servlet必须q回text/xmlcd了,于是在servlet的末֢加了一句话Q?br />response.setContentType("text/xml; charset=UTF-8");心想q回没错了吧Q没惛_q行时仍旧显C“返回类型不?br />text/xml”,q是面的js报的错误Q也是在返回信息到了页面,叉分析q回数据的时候报的错误。仔l检查了servlet
讄q回cd的那句话q没有错误?/p>

  原来问题出在servlet的mapping上面Q设|了一?xxxx没有?.do"(q时q没有struts环境?Q这样一来,serveltq? 回给面的responseq没有被AjAxanywhere Filter截获Q当然就没有没有被处理过Q具体内部处理不太清楚)Q于是就Z上面的错误?br /> 解决Ҏ很简单,把所有需要ajaxanywhere的servlet  mapping配置成一个比较特D的后缀Q例如localServlet.ajq样?br />web.xml中配|AjaxAnywhereqo器的filer-mapping 增加一?br />     <filter-mapping>
        <filter-name>AjaxAnywhere</filter-name>
        <url-pattern>*.aj</url-pattern>
    </filter-mapping>
q样所有的后缀为aj的servlet都可以使用上此Filter了。错误就没有了。okQ上面讲了ajaxanywhere + servlet 的方法?/p>

2.2 配置ajaxanywhere + struts .
  配置也比较简单。在struts的配|正的基础上,只需要配|ajaxanywhere的filterQ增加一个mappingQ如果struts ActionServlet配置了mapping *.xx ,那么表示所与后~为xx的url都经qAcitonServlet来处理,好,ajaxanywhere要求所有的
url在进入AciontServlet之前首先q入他的FilterQ离开ActionServlet之后也要首先q入他的FilterQ而不是直接返回页面?br />q样Q只要在ajaxanywhere filter的mapping后面增加
     <filter-mapping>
        <filter-name>AjaxAnywhere</filter-name>
        <url-pattern>*.xx</url-pattern>
    </filter-mapping>
卛_。这样就能和struts配置使用了?/p>

2.3 配置ajaxanywhere + jsf
  例子中也讲到了与jsf配合使用的方法,jsf我没有用q,但是配置ajaxanywhere要做得就是增加一个filter-mapping而已。假? jsf的后~?.jsf,那么只需要在 ajaxanywhere filter中增加一个此后缀的mappingQ就ok了?/p>

2.4 ajaxanywhere + * + jstl
 于jstl连用实际上是与jspq用Q但是把jstl也融合进来需要注意,ajaxanywhere Demo例子中的web.xml
 不兼容jstl,所以除了要把必要的jar文gtld文g拯到项目之外,q要把web.xml的头部进行修改,原来是这样写?br /> <web-app>..... ,必须要修Ҏ
 <web-app xmlns="http://java.sun.com/xml/ns/j2ee q样才行?br /> 否则你会发现一个特别奇怪的错误Q例?lt;c:forEach items="sdfsd" var="item">${item.value}</c:forEach>
 是不@环显C,但是<c:out value="xxxx"/>却可以运行,当时懵了。修改了web.xml之后׃切正怺^_^

 

3Qajaxanywhere的目录结构和文g的特艌Ӏ?br /> 和普通的目的区别就在三个地方:
 3.1 /aa/aa.js 里面包含了ajaxanywhere必须使用的javascript对象和方法。这个文件必ȝQ?br />  而且每个jsp面都要引用他,如果x入用就有必要对里面的方法有所了解?br /> 
 3.2   多了一个FilterQ一个ajaxanywhere.jarQ对E序员是透明的?/p>

 3.3   jsp面要引入lib<%@ taglib uri="  单用时只需要配|好<aa:zone>,
  然后当GetҎQ链接蟩转)Q某标签的onclick中调用“ajaxAnywhere.getAJAX(目标url)”?br />  当PostҎQ表单提交)Ӟ首先配置form名字Q例如,ajaxAnywhere.formName = "main"
    在表单里调用“ajaxAnywhere.submitAJAX();”或者干脆设|一个能够自动submit
    的input按钮例如<intput type="image"><input type="submit">׃么都不用写,也能提交?/p>

4Q具体用方法:
 4.1 jsp面上:
  定义h区域Q?lt;aa:zone name="xxxx">来定义一个区域?br />  可以在jsp面上“指定”刷新区域,他和“定义”刷新区域的区别在于Q定义了不一定会被刷斎ͼ定义?br />   又被指定的刷新区域才能被h。通过覆盖js中AjaxAnywere对象的ajaxAnywhere.getZonesToReload
   Ҏ来指定刷新区域。例如,
   ajaxAnywhere.getZonesToReload = function () {
           return "zone,1"
      };
   指定了两块刷新区域?br />  在刷新区域显C新的内容:
   h区域里面Q用动态脚本(scripletQjstlQ从requestQ或其他范围Q获得服务端q回的新的数据,
   q显C。(推荐使用jstl比scriptlet更简z)?/p>

 4.2 服务端:
  不论是Servletq是Actionq是直接使用jsp做服务端Q代码都是一L?br />  必须有的几行代码是:
  if (AAUtils.isAjaxRequest(request)){
        AAUtils.addZonesToRefresh(request, "xxxx");//q句话也可以不写如果jsp面已经指定了刷新区?br />  }
  然后q回一个List攑ֈrequest或者其他范围内Q供面昄?br />  
       注意Q?br />   服务端代码不必用设|context-type为xmlQ没有必要。因为通过ajaxanywhere filter可以做到q一炏V?br /> 
5Q定制js
 5.1 如何在response未q回期间不显C默认的“loading...”(蓝色囑ֱQ?
  通过在jsp面里覆?ajaxAnywhere.showLoadingMessage = function() {}q设|ؓI?br /> 
 5.2 如何修改默认的loading。。。图片ؓ其他囄Q?br />  通过在jsp面里覆?ajaxAnywhere.showLoadingMessage QhideLoadingMessage,Ҏ?br />  ajaxAnywhere.showLoadingMessage = function() {

    var img = document.getElementById("myImg");
    if (img == null) {
        img = document.createElement("img");
        document.body.appendChild(img);
        img.id = "myImg";
       
       
        img.src="psyline.gif";
        img.style.position = "absolute";
        img.style.border = "1 solid black";
        img.style.top = 0;
        img.style.left = documet.body.offsetLeft;
    }
   
    img.style.display = "";
 }

 /**
 *  Default sample loading message hide function. Overrride it if you like.
 */
 AjaxAnywhere.prototype.hideLoadingMessage = function() {
     var img = document.getElementById("myImg");
     if (img != null)
         img.style.display = "none";
 }
 好,q样把把默认图片替换成其他囄了?br /> 
 5.3 如何修改loading囄的显CZؓ之ؓ相对位置Q?br />  只需要配|topQleftQ例?
 ajaxAnywhere.showLoadingMessage = function() {
    var div = document.getElementById("testshowdiv");
    if (div == null) {
        div = document.createElement("DIV");
        document.body.appendChild(div);
        div.id = "testshowdiv";
        div.innerHTML = "<img src='shc.gif' border=0/>";
        div.style.position = "absolute";
        div.style.border = "1 solid black";
        div.style.color = "white";
        div.style.backgroundColor = "blue";
        div.style.width = "100px";
        div.style.heigth = "50px";
        div.style.fontFamily = "Arial, Helvetica, sans-serif";
        div.style.fontWeight = "bold";
        div.style.fontSize = "11px";
    }
 //注意Q如果alink没有定义Q那么就始终昄q度条了。有时抱错,有时不抱错?br />    div.style.top = document.all.alink.offsetTop;
    div.style.left =document.all.alink.offsetWidth-170; // 如果不减Q在屏幕上就看不C?br />    div.style.display = "";
   
    }
 
 /**
 *  Default sample loading message hide function. Overrride it if you like.
 */
 AjaxAnywhere.prototype.hideLoadingMessage = function() {
     var div = document.getElementById("testshowdiv");
     if (div != null)
         div.style.display = "none";
 }
 
5.4 如果讄默认的弹出框。在上次h被忽略后Q默认会弹出一个框Q如果让不让他出来?
 只需要覆盖或者直接在aa。js中修?br /> ajaxAnywhere.handlePrevousRequestAborted = function() {
       // alert("攑ּ上一ơ的提交");//或者什么都不作
    }

5.5 如何处理异常弹出框?
 只需要覆?br /> ajaxAnywhere.handleException = function(type, details) {
        alert("出异怺: \n\n\n ***************\n"+details.substring(0,350)+"\n...\n\n     ***************");
    }
5.6 如何处理错误弹出框?
 只需要覆?br /> ajaxAnywhere.handleHttpErrorCode = function(code) {
        alert("q回错误: \n \n \n ***************\n错误?" + code+"\n\n ***************");
    }

5.7 如何定时h指定区域Q?br /> ajax定时h执行得更象普通的jsQ?br /> // 指定定期执行的刷新所指向的url
 function go() {
        ajaxAnywhere.getAJAX('demo.jsp');
    }
 //指定h区域
    ajaxAnywhere.getZonesToReload = function () {
        return "zone,1"
    };
 //指定h之后的动?br />    ajaxAnywhere.onAfterResponseProcessing = function () {
        window.setTimeout("go();", 1000);
     //setInterval("go()",1000);
    }
 //隐藏loading囄
    ajaxAnywhere.showLoadingMessage = function(){};
 //调用h后的动作
    ajaxAnywhere.onAfterResponseProcessing();
 q样构成了一个@环?/p>

 与普通的js定时执行某个操作q没有什么不同,只不q通过在定时操作中使用ajaxQ可以调用非客户端的E序Q即后台E序。而普通的定时执行却做不来?br /> 
6Q一些与ajaxanywhere无关的技术?br /> 6.1 struts动态form
 ajaxanywhere 不是必须指定formNameQ因为它默认使用forms[0]当作提交的formQ这q不保险Q一个页面可能有多个formQ,所以有必要指定 formNameQstruts?lt;html:form>标签Q必struts-config配置了form时才行,没有必要使用 ActionForm时可以定义一个空的DynaActionForm,例如Q?br /> <form-bean name="localeform" type="org.apache.struts.action.DynaActionForm">
    <form-property name="nnn" type="java.lang.String"/> //q句话也可以没有。即没有属性的form
   </form-bean>
 q样׃必多定义一个类了,动态form与ajaxanywhere配合得很好?/p>

 6.2 struts DispatchAction
 ajax与strutsDispatchAction配合得也很好?/p>

ȝQ?br /> 比较ajax tagsQstruts ajaxtagQ还是ajaxanywhere比较好些?br /> ajaxtags是基于组件的Q能实现的功能有限。struts ajaxtags我用了之后感觉复杂。好了,暂时写q么多,以后的实늻验就在ajaxanywhere的补充了?br /> 下蝲地址Q?a >http://ajaxanywhere.sourceforge.net/index.html



蓝色q默 2007-08-13 22:49 发表评论
]]>
struts+ajaxhttp://www.aygfsteel.com/jdo/articles/136304.html蓝色q默蓝色q默Mon, 13 Aug 2007 02:24:00 GMThttp://www.aygfsteel.com/jdo/articles/136304.htmlhttp://www.aygfsteel.com/jdo/comments/136304.htmlhttp://www.aygfsteel.com/jdo/articles/136304.html#Feedback0http://www.aygfsteel.com/jdo/comments/commentRss/136304.htmlhttp://www.aygfsteel.com/jdo/services/trackbacks/136304.html
   标准的struts是同步交互的,客户端提交请求到Action,服务端处理后findforward()h整个面,ajax是异步交?面通过 xmlHttpRequest提交一个后台线E到服务?服务端处理后xml或者html写回客户?客户端回调函数随卛_新内存中的dom?
 
   ׃ajax不用h整个面,且每ơ回调函数直接更新内?所以速度非常?且客户体验很丰富,比如用ajax可以很容易实现菜单联?因ؓ它只更新? U菜?上一U菜单根本不会受影响,在jsp中意味着不用兛_面h时其它表单元素的选择?,另外q有一点ajax是客L的技?对struts? 架构不会影响(客户端的提交可以用ajax提交到servlet,也可以沿用struts方式提交到Action?,因此很容易想到将ajax? Strutsl合h,q两者的优势.

   用ajax+struts的架构有一些需要注意的问题,q是我在目中的一些感?在这里写出来,供各位同仁参?

   1:设计面跌{的操作不要用ajax.ajax主要是用于异步交?所以它是同一个页面的操作,在xmlHttpRequest.open()Ҏ? "get"Ҏ明确表示是从服务端获?"post"Ҏ虽然表示提交,但主要用于浏览器url隐藏参数的具体?在ajax的servlet中用 response.sendRedirect()Ҏ是无效的,原页面会ȝ后台servlet的相?因此MISpȝ中的新增,修改{需要到另一个页? 的操作都应该用传l的form.submit()的方式提交页?

    2:在ajax传参时要特别注意\",\'q些字符,其是一个参C含多个字D늚情况,量不要?$','%'{特D字W来分割.在servlet? getParameter()的时候会出问?比如你的参数是param1="dkfjdslf"+form1.text1.value;而你? text1中的字符串含有\"字符,那\"后面?br />都传不q去?我们目中遇到过q种情况,找了很久才发现参数只传了一部分.如果参数不全的情况首先检查其中是否有Ҏ字符.

    3:struts和ajax合用时有时会出现strutsh整个面l果把ajax效果覆盖了的情况,比如我们的翻늻件是会提交整个表单到原页?q? 时如果客户做了ajax的其它操?页q回时这些效果就都没有了.我的是在面中用<input type=hidden>元素保留ajax的主要效?每次ajax回调函数q回时更新该元素,q样x重新提交了该面也可以通过 request.getParameter()取到ajax效果元素的?在我们项目中是把每次的查询sql语句做ؓhidden元素保存了的,因此每次 页后下U表格或者其它表单元素仍可以通过该sql取得.

   4:ajax大部分是js脚本,js脚本的调试比较麻?主要的办法就是alert()和iE左下脚的错误提示,一般来说大部分的脚本错误都在语法上,? 如select1.options[1]写成了select1.option[1]什么的,看资料上有IE有Dom Inspector可以查看内存中的dom树结?在google上搜Internet Explorer developer toolbar),用这些第三方的工具可以帮我们调试ajax

   5:有时候strust在request中setAttribute的东西会跟ajax传的parameter冲突(比如上头提到的sql,在新增操作完 后返回查询页面时,struts会在request.setAttribute("sql",sql), 而原查询面的下U菜单查询等ajax操作会传?sql="+sql的方式传?q样两个sql会冲H?我的? request.getParameter("sql")==null?request.getAttribute("sql"):request.getParameter ("sql"),首先保证本页面的异步操作,再考虑其它面的蟩转操?

   好了,暂且写这些吧,其中有些可能各位高h看v来是废话,那请毫不留情的斧?在此各位同仁中U国庆愉?和我一样国庆加班的同事们n体健?万事如意.


蓝色q默 2007-08-13 10:24 发表评论
]]>
Struts模块化编E教E?/title><link>http://www.aygfsteel.com/jdo/articles/134926.html</link><dc:creator>蓝色q默</dc:creator><author>蓝色q默</author><pubDate>Tue, 07 Aug 2007 05:10:00 GMT</pubDate><guid>http://www.aygfsteel.com/jdo/articles/134926.html</guid><wfw:comment>http://www.aygfsteel.com/jdo/comments/134926.html</wfw:comment><comments>http://www.aygfsteel.com/jdo/articles/134926.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/jdo/comments/commentRss/134926.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/jdo/services/trackbacks/134926.html</trackback:ping><description><![CDATA[ <span id="wmqeeuq" class="myp111"> <font id="zoom"> <b>1、前a</b> <br /> <br />STRUTS是标准的"模型2"的WEB应用框架Q其中的ActionServlet代表?模型2"MVC设计模式中的"控制? 。STRUTS应用E序一般用JSP代码生成用户界面Q这些代码不包括M商业逻辑Q代表了MVC中的”VIEW”部分。需要执行商业逻辑的用L面中 的表单或链会?控制? ActionServlet接收和处理。在STRUTS中,只有一个ActionServlet实例Q这个实例将接收和处理应用中的相关用户交互请求? ActionServlet实例选择和调用相应的ACTIONcL处理商业逻辑。在设计模式上,ACTIONc被UCؓ“控制辅助者”,它将修改 JavaBeansQ这些JavaBeans是MVC中的?model”部分。本文将分析在STRUTS中进行模块化~程的具体细节?<br /><br /><b>2、样例描q?/b><br /><br />我们作一个模块编E的例子Q这个例子包括三个模块,~省模块、registration模块和approval模块。缺省模块下有资? index.htmlQ我们用它来连接其它两个模块。registration模块和approval模块的编E类|都包含一个index.jsp? 一个结果jspQresult.jsp。下面是目录l构Q?<br /><br /><center><img src="http://tech.ccidnet.com/pub/attachment/2004/1/269764.jpg" height="424" width="533" /></center><br /><br />目录l构表明Qstruts的模块由配置文g、javac?q里者action和formc?和资源文件构成,另外各模块可以共享web.xmlQmessage Q这里是applicatonResources.propertiesQ文件? <br /><br />我们的例子的界面交互囑֏以表C如下: <br /><br /><center><img src="http://tech.ccidnet.com/pub/attachment/2004/1/269765.jpg" height="352" width="539" /></center><p><br /><br />~省模块的index.html包括两个链接Q分别连接两个模块的index.jsp资源Qregistration模块的index.jsp? 交后Q如果验证失败会重新q回到该模块的index.jspQ否则用资源resultok.jsp昄注册成功的结果。模块approval? index.jsp提交后进入到resultok.jsp的界面,昄批准与否的结果?<br /><br />我们从应用程序的文gl成和交互两斚w的模块情况对我们要实现的例子q行了比较清晰的l织Q下面我们讲解如何在struts中实现模块化~程? </p></font> </span> <p> <b>3、STRUTS的模块化机制</b> <br /> <br />我们讲解STRUTS的相关配|,q些配置大部分与模块化编E有关系Q有些没关系但对理解STRUTSE序有利? <br /><br />3.1 ActionServlet参数 <br /><br />ActionServlet有好多参数可供设|,STRUTS在WEB应用部v描述W中定义q些参数Q? <br /><br />·Config——逗号盔R的应用上下文相对的配|文件的路径Q这些配|文件包含了STRUTS WEB应用的缺省模块的讄。缺省gؓ /WEB-INF/struts-config.xmlQ? <br />·config/${module} -逗号盔R的应用上下文相对的配|文件的路径Q这些配|文件包含了STRUTS WEB应用?{module}模块的设|。这个模块的前缀?${module}Q多个config/${module}参数定义了多个STRUTS WEB应用模块Q? <br />·convertNull - 如果q个参数的gؓ true, 数值型Java 包装c(比如java.lang.IntegerQ的初始值将会是nullQ而不?。缺省值[false] <br />·rulesets-逗号盔R的附加的org.apache.commons.digester.RuleSet列表QDigester在分析配|文件时Q除了针Ҏ准的配置元素的RuleSet之外Q还会利用这些对象来分析配置文gQ这h供了一个配|扩展机制? <br />·validatin - 指示我们是否使用验证型的XML分析器来处理配置文gQ缺省gؓ [true] <br /><br />3.2 配置文g <br /><br />我们说STRUTS针对每个模块可以有一个或多个配置文gQ这些配|文件用XML来书写,下面是标准的配置文gXML的元素解释? <br /><br />3.2.1 元素 action <br /><br />q个元素描述了一个ActionMapping 对象Q这个对象将用来处理用户针对某个模块相对应的URI 的请求? <br /><br /><img src="http://tech.ccidnet.com/pub/attachment/2004/1/269845.jpg" height="558" width="668" /><br /><br /><br /><br />3.2.2元素 action-mappings <br /><br />q个元素描述了一个ActionMapping 对象集,cd是org.apache.struts.action.ActionMapping。与STRUTS的ActionServlet 注册的URL模式匚w的用戯求将具体地被q些ActionMapping 对象处理。子元素定义了各个ActionMapping对象?<br /><br /><img src="http://tech.ccidnet.com/pub/attachment/2004/1/269851.jpg" height="168" width="666" /><br /><br />3.2.3元素 controller <br /><br />q个元素描述了一个struts模块q行环境的配|——ControllerConfig bean <br /><br /><img src="http://tech.ccidnet.com/pub/attachment/2004/1/269852.jpg" height="506" width="670" /><br /><br /><img src="http://tech.ccidnet.com/pub/attachment/2004/1/269853.jpg" height="426" width="617" /><br /><br /><img src="http://tech.ccidnet.com/pub/attachment/2004/1/269854.jpg" height="361" width="669" /><br /><br /><br /><br />3.2.4 元素 data-source <br /><br />q个元素描述了一个DataSource 对象——JDBC 2.0 标准扩展。这个对象将被保存在应用上下文中Q而且可以象JavaBean 一栯讄? <br /><br /><img src="http://tech.ccidnet.com/pub/attachment/2004/1/269855.jpg" height="360" width="669" /><br /><br />3.2.5 元素 exception <br /><br />q个元素向strutspȝZ个exceptioncd注册了一个ExceptionHandler? <br /><br /><img src="http://tech.ccidnet.com/pub/attachment/2004/1/269856.jpg" height="487" width="671" /><br /><br />3.2.6 元素 form-bean <br /><br />q个元素定义了一个ActionForm[org.apache.struts.action.ActionForm子类Q这个定义被"action"元素所引用? <br /><br /><img src="http://tech.ccidnet.com/pub/attachment/2004/1/269857.jpg" height="259" width="670" /><br /><br />3.2.7 元素 form-property <br /><br />q个元素描述了一个配|DynaActionForm 或其子类的JavaBean属性。当q个元素的父元素"form-bean" ?type" ?[org.apache.struts.action.DynaActionForm] 或其子类时有效。如果用了一个定制的DynaActionForm 子类Q父元素"form-bean" ?dynamic"属性必设? "true"?<br /><br /><img src="http://tech.ccidnet.com/pub/attachment/2004/1/269846.jpg" height="337" width="668" /><br /><br />3.2.8 元素 forward <br /><br />q个元素描述了一个ActionForward 对象Q这个对象将被Action的doPerformq回。在代码中一般用一个逻辑名字来引用ActionForward 对象。一?forward" 可以用来描述全局或局部ActionForwards. 全局?forwardsҎ块内所有的Action 对象有效Q局部forwards 嵌套?action></action> 元素内,只能被相应的ActionMapping 中的Action讉K? <br /><br /><img src="http://tech.ccidnet.com/pub/attachment/2004/1/269847.jpg" height="464" width="661" /><br /><br />3.2.9元素 message-resources <br /><br /><img src="http://tech.ccidnet.com/pub/attachment/2004/1/269848.jpg" height="464" width="666" /><br /><br />3.2.10元素 plug-in <br /><br /><img src="http://tech.ccidnet.com/pub/attachment/2004/1/269849.jpg" height="152" width="671" /><br /><br />3.2.11 元素 set-property <br /><br /><img src="http://tech.ccidnet.com/pub/attachment/2004/1/269850.jpg" height="132" width="666" />  <br /><br /></p> <p> <b>目录Q? <br /><br /><a >4、模块定?/a><br /><a >5、模块选择</a><br /><a >6、ȝ</a><br /><br /></b> <br /> <br /> <a name="1"> <b>4、模块定?/b> </a> <br /> <br />通过上面对STRUTS的模块化机制的讲解,我们现在可以开始实现我们的模块化例子程序了? <br /><br />4.1 Actionservlet参数 <br /><br />我们在struts的web.xml中定义模块。下面的代码定义了三个模块:~省模块Qapproval和registration模块Q前~分别是”?/approval?registration? <br /><br /><ccid_nobr></ccid_nobr></p> <table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400"> <tbody> <tr> <td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"> <pre> <ccid_code> </ccid_code><web-app><br /> <servlet><br /> <servlet-name>action</servlet-name><br /> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class><br /> <init-param><br /> <param-name>config</param-name><br /> <param-value>/WEB-INF/struts-config.xml</param-value><br /> </init-param><br /> <init-param><br /> <param-name>config/approval</param-name><br /> <param-value>/WEB-INF/struts-config-approval.xml</param-value><br /> </init-param><br /> <init-param><br /> <param-name>config/registration</param-name><br /> <param-value>/WEB-INF/struts-config-registration.xml</param-value><br /> </init-param><br /> </init-param><br /> <load-on-startup>1</load-on-startup><br /> </servlet> <servlet-mapping><br /> <servlet-name>action</servlet-name><br /> <url-pattern>*.do</url-pattern><br /> </servlet-mapping><br /> </web-app></pre> </td> </tr> </tbody> </table> <br /> <br />q样在初始化actionservlet的过E中Qservletcontext的属性中׃有这L属性键/值关p: <br /><br /><center><img src="http://tech.ccidnet.com/pub/attachment/2004/1/270101.jpg" height="212" width="506" /></center><p><br /><br />4.2 approval模块配置文g <br /><br />下面是approval模块的配|文Ӟ定义了form和actionQ以及相应的forward? <br /><br /><ccid_nobr></ccid_nobr></p><table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code></ccid_code><?xml version="1.0" encoding="UTF-8"?><br /><!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//<br /> DTD Struts Configuration 1.1//EN" <br />"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"><br /><struts-config><br /> <form-beans><br /> <form-bean name="approvalForm" type="com.i505.struts.approval.form.ApprovalForm"><br /> </form-bean><br /> </form-beans><br /> <action-mappings><br /> <action<br /> attribute="approvalForm"<br /> name="approvalForm"<br /> input="/index.jsp"<br /> path="/approval"<br /> scope="request"<br /> type="com.i505.struts.approval.action.ApprovalAction"><br /> <forward name="success" contextRelative="false" path="/resultok.jsp" /><br /> </action><br /> </action-mappings><br /></struts-config></pre></td></tr></tbody></table><br /><br />4.3 registration模块配置文g <br /><br />下面是registration模块的配|文Ӟ定义了form和actionQ以及相应的message-resources和forward? <br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code></ccid_code><?xml version="1.0" encoding="UTF-8"?><br /><!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//<br /> DTD Struts Configuration 1.1//EN" <br />"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"><br /><struts-config><br /> <form-beans><br /> <form-bean name="registrationForm" type="com.i505.struts.registration.form.RegistrationForm" /><br /> </form-beans><br /> <action-mappings><br /> <action<br /> attribute="registrationForm"<br /> input="/index.jsp"<br /> name="registrationForm"<br /> path="/registration"<br /> type="com.i505.struts.registration.action.RegistrationAction"><br /> <forward name="success" path="/resultok.jsp" /><br /> </action><br /> </action-mappings><br /> <message-resources parameter="com.i505.struts.ApplicationResources"/><br /> </struts-config></pre></td></tr></tbody></table><br /><br /><a name="2"><b>5、模块选择</b></a><br /><br />本节主要讲述struts中如何选择模块Q实现模块的真正q作的? <br /><br />5.1 action的模块选择 <br /><br />当我们在览器中使用http://hostaddress/contextpath/module/action.do式样的的url?actionservlet会根据module选择模块对象Q下面是actionservlet处理httph的代码: <br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code></ccid_code>protected void process(HttpServletRequest request,<br /> HttpServletResponse response)<br /> throws IOException, ServletException {<br /> RequestUtils.selectModule(request, getServletContext());<br />       getRequestProcessor(getModuleConfig(request)).process<br /> (request, response);<br /> }</pre></td></tr></tbody></table><br /><br />RequestUtils.selectModule函数用下面的代码把url中的模块前缀Q下面代码的prefix代表上面url式样中的/moduleQ指定的模块对象保存在request属性中Q这个模块对象就成了处理q个h的当前模块对象: <br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code></ccid_code>// Expose the resources for this module<br /> ModuleConfig config = (ModuleConfig)<br /> context.getAttribute(Globals.MODULE_KEY + prefix);<br /> if (config != null) {<br /> request.setAttribute(Globals.MODULE_KEY, config);<br /> }<br /> else {<br /> request.removeAttribute(Globals.MODULE_KEY);<br /> }</pre></td></tr></tbody></table><br /><br />5.2 资源的模块化 <br /><br />资源Q比如jspQ的模块化是指资源可以按照模块一hl织Q比如approval模块的资源可以放在approval目录下,而registration模块的资源则攑֜registration目录下,~省模块的资源放在webroot下? <br /><br />url讉Kq些资源很简?url式样? http://hostaddress/contextpath/module/xxx.jsp。对于input和forward讉Kq些资源Q我们只需 直接写相对于模块路径下的路径Q注意它们必M?”开头。如果forward是相对servletcontext的,则要加上模块路径?<br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code></ccid_code><action-mappings><br /> <action<br /> attribute="registrationForm"<br /> input="/index.jsp"<br /> name="registrationForm"<br /> path="/registration"<br /> type="com.i505.struts.registration.action.RegistrationAction"><br /> <forward name="success" path="/resultok.jsp" /><br /> </action><br /> </action-mappings></pre></td></tr></tbody></table><br /><br />5.3 Formtag中表单action url的生? <br /><br />对于模块~程Qstruts在formtag的action属性好像有些问题,q些问题出现在struts没有考虑直接讉Kjsp时的情况。应? forward和直接访问这两种环境是不同的Q主要是直接讉Kq些JSPQrequest属性中没有模块对象Q而forward讉Kq些jsp? request属性中有模块对象。我们需要修改代码,使得在生action属性时不受jsp所在环境的影响Q也是我们在formtag? action属性中指定模块Q而不是request中得到模块。下面是registration模块的index.jsp的代码,它的formtag? action属性包括了模块的前~/registrationQ?<br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code></ccid_code><%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%><br /> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%><br /> <head><br /><title>甌注册</title><br /><%@ page contentType="text/html;charset=GB2312" %><br /> </head><br /><body><br /><html:form action="/registration/registration.do" ><br />      姓名Q?lt;html:text property="name" /><html:errors property="name"/><br /><br /><br />      q龄Q?lt;html:text property="age" /><html:errors property="age"/><br /><br /><br />      <html:submit /><br /></html:form><br /></body><br /></html></pre></td></tr></tbody></table><br /><br />下面我们来修改struts的相关代码达到这个效果? <br /><br />5.3.1 Formtag <br /><br />Formtag的setAction识别form tag的acton属性的module前缀Qƈ分离出真正的模块相对的action路径Qlookup直接从ServletContext中获取模块配|对象? <br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code></ccid_code>private String getActionPath(String action) {<br />            String temp = action.trim();<br />            String x;      <br />       int pos=0;<br />            if(!temp.startsWith("/")) temp = "/"+ temp;<br />            pos = temp.indexOf("/", 1);<br />            if(pos<=0) return action;<br />                        <br /> return temp.substring(pos);      }<br />private String getModulePrefix(String action) {<br />            String result;<br />            int pos;<br />            String temp=action.trim();<br />            if(!temp.startsWith("/")) {<br />                  temp= "/"+temp;<br />            }<br />            pos = temp.indexOf("/", 1);<br />            if(pos<=1) return "";<br />            else<br />             return temp.substring(0, pos);<br />                  }<br />public void setAction(String action)<br /> {this.modulePrefix = this.getModulePrefix(action);<br />            this.action = this.getActionPath(action);<br /> }<br />protected void lookup() throws JspException {<br />            //我们直接从ServletContext中获取模块配|对?br />                  moduleConfig = (ModuleConfig)<br /> pageContext.getServletContext().getAttribute(Globals.MODULE_KEY + modulePrefix);<br />      …}<br /> rotected String renderFormStartElement() {<br /> HttpServletResponse response =<br /> (HttpServletResponse) this.pageContext.getResponse();<br /> StringBuffer results = new StringBuffer("<form");<br /> results.append(" name=\"");<br /> results.append(beanName);<br /> results.append("\""); <br /> results.append(" method=\"");<br /> results.append(method == null ? "post" : method);<br /> results.append("\" action=\"");<br />//我们的action已经L了modulePrefixQ所以我们得重新加上<br /> results.append(<br /> response.encodeURL(<br /> RequestUtils.getActionMappingURL(this.modulePrefix+ this.action, this.pageContext)));<br /> ?br />}</pre></td></tr></tbody></table><br /><br />5.3.2 Requestutils <br /><br />Requestutils的getActionMappingURL主要用作附加servletcontext 路径Q因为我们现在在action参数附加了modulePrefix路径Q所以没必要再追加模块前~? <br /><br /><ccid_nobr></ccid_nobr><table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400"><tbody><tr><td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6"><pre><ccid_code></ccid_code>public static String getActionMappingURL(String action, PageContext pageContext)<br /> {<br /> HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();<br /> StringBuffer value = new StringBuffer(request.getContextPath());<br /> ModuleConfig config =<br /> (ModuleConfig) pageContext.getRequest().getAttribute(Globals.MODULE_KEY);<br />//我们jsp中的formtag的action属性已l表CZ模块Q所以我们不能再q加模块?/<br /> if (config != null) { <br /> //<br /> value.append(config.getPrefix());<br /> // }<br /> // Use our servlet mapping, if one is specified<br /> String servletMapping =<br /> (String) pageContext.getAttribute(Globals.SERVLET_KEY,<br /> PageContext.APPLICATION_SCOPE);<br /> if (servletMapping != null) {<br /> String queryString = null;<br /> int question = action.indexOf("?");<br /> if (question >= 0) {<br /> queryString = action.substring(question);<br /> }<br /> String actionMapping = getActionMappingName(action);<br /> if (servletMapping.startsWith("*.")) {<br /> value.append(actionMapping);<br /> value.append(servletMapping.substring(1));<br /> } else if (servletMapping.endsWith("/*")) {<br /> value.append(servletMapping.substring(0, servletMapping.length() - 2));<br /> value.append(actionMapping);<br /> } else if (servletMapping.equals("/")) {<br /> value.append(actionMapping);<br /> }<br /> if (queryString != null) {<br /> value.append(queryString);<br /> }<br /> }<br /> else {<br /> if (!action.startsWith("/")) {<br /> value.append("/");<br /> }<br /> value.append(action);<br /> }<br /> // Return the completed value<br /> return (value.toString());<br /> }</pre></td></tr></tbody></table><br /><br /><a name="3"><b>6、ȝ</b></a><br /><br />模块化编E有利于提高~程效率Q但是struts中的模块化支持有些小问题Q本文详l分析了struts支持模块化编E的机制Qƈ作了些修改,? 望对大家有帮助。另外如果我们可以把其改qؓ模块化的相关的东西可以打成一个包q行动态部|Ԍ比如approval.marQ的话,那将会更加有用? <img src ="http://www.aygfsteel.com/jdo/aggbug/134926.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jdo/" target="_blank">蓝色q默</a> 2007-08-07 13:10 <a href="http://www.aygfsteel.com/jdo/articles/134926.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">̨</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ǹ</a>| <a href="http://" target="_blank">Ǹ</a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ϴ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͨ</a>| <a href="http://" target="_blank">ɳ</a>| <a href="http://" target="_blank">̨</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">麣</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̨</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">º</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˶</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ȳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ĭ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͩ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ľ</a>| <a href="http://" target="_blank">ϻ</a>| <a href="http://" target="_blank">Ӳ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>